Merge pull request #2274 from esdrubal/udpclientreceive
[mono.git] / mcs / class / Mono.Data.Sqlite / Mono.Data.Sqlite_2.0 / SQLite3_UTF16.cs
1 /********************************************************\r
2  * ADO.NET 2.0 Data Provider for SQLite Version 3.X\r
3  * Written by Robert Simpson (robert@blackcastlesoft.com)\r
4  * \r
5  * Released to the public domain, use at your own risk!\r
6  ********************************************************/\r
7 \r
8 namespace Mono.Data.Sqlite\r
9 {\r
10   using System;\r
11   using System.Runtime.InteropServices;\r
12 \r
13   /// <summary>\r
14   /// Alternate SQLite3 object, overriding many text behaviors to support UTF-16 (Unicode)\r
15   /// </summary>\r
16   internal class SQLite3_UTF16 : SQLite3\r
17   {\r
18     internal SQLite3_UTF16(SQLiteDateFormats fmt)\r
19       : base(fmt)\r
20     {\r
21     }\r
22 \r
23     /// <summary>\r
24     /// Overrides SqliteConvert.ToString() to marshal UTF-16 strings instead of UTF-8\r
25     /// </summary>\r
26     /// <param name="b">A pointer to a UTF-16 string</param>\r
27     /// <param name="nbytelen">The length (IN BYTES) of the string</param>\r
28     /// <returns>A .NET string</returns>\r
29     public override string ToString(IntPtr b, int nbytelen)\r
30     {\r
31       return UTF16ToString(b, nbytelen);\r
32     }\r
33 \r
34     public static string UTF16ToString(IntPtr b, int nbytelen)\r
35     {\r
36       if (nbytelen == 0 || b == IntPtr.Zero) return "";\r
37 \r
38       if (nbytelen == -1)\r
39         return Marshal.PtrToStringUni(b);\r
40       else\r
41         return Marshal.PtrToStringUni(b, nbytelen / 2);\r
42     }\r
43 \r
44     internal override void Open(string strFilename, SQLiteOpenFlagsEnum flags, int maxPoolSize, bool usePool)\r
45     {\r
46       if (_sql != null) return;\r
47 \r
48       _usePool = usePool;\r
49       if (usePool)\r
50       {\r
51         _fileName = strFilename;\r
52         _sql = SqliteConnectionPool.Remove(strFilename, maxPoolSize, out _poolVersion);\r
53       }\r
54 \r
55       if (_sql == null)\r
56       {\r
57         IntPtr db;\r
58 \r
59 #if !SQLITE_STANDARD\r
60         int n = UnsafeNativeMethods.sqlite3_open16_interop(ToUTF8(strFilename), (int)flags, out db);\r
61 #else\r
62         if ((flags & SQLiteOpenFlagsEnum.Create) == 0 && System.IO.File.Exists(strFilename) == false)\r
63           throw new SqliteException((int)SQLiteErrorCode.CantOpen, strFilename);\r
64 \r
65         int n = UnsafeNativeMethods.sqlite3_open16(strFilename, out db);\r
66 #endif\r
67         if (n > 0) throw new SqliteException(n, null);\r
68 \r
69         _sql = db;\r
70       }\r
71       _functionsArray = SqliteFunction.BindFunctions(this);\r
72     }\r
73 \r
74     internal override void Bind_DateTime(SqliteStatement stmt, int index, DateTime dt)\r
75     {\r
76       Bind_Text(stmt, index, ToString(dt));\r
77     }\r
78 \r
79     internal override void Bind_Text(SqliteStatement stmt, int index, string value)\r
80     {\r
81       int n = UnsafeNativeMethods.sqlite3_bind_text16(stmt._sqlite_stmt, index, value, value.Length * 2, (IntPtr)(-1));\r
82       if (n > 0) throw new SqliteException(n, SQLiteLastError());\r
83     }\r
84 \r
85     internal override DateTime GetDateTime(SqliteStatement stmt, int index)\r
86     {\r
87       return ToDateTime(GetText(stmt, index));\r
88     }\r
89 \r
90     internal override string ColumnName(SqliteStatement stmt, int index)\r
91     {\r
92 #if !SQLITE_STANDARD\r
93       int len;\r
94       return UTF16ToString(UnsafeNativeMethods.sqlite3_column_name16_interop(stmt._sqlite_stmt, index, out len), len);\r
95 #else\r
96       return UTF16ToString(UnsafeNativeMethods.sqlite3_column_name16(stmt._sqlite_stmt, index), -1);\r
97 #endif\r
98     }\r
99 \r
100     internal override string GetText(SqliteStatement stmt, int index)\r
101     {\r
102 #if !SQLITE_STANDARD\r
103       int len;\r
104       return UTF16ToString(UnsafeNativeMethods.sqlite3_column_text16_interop(stmt._sqlite_stmt, index, out len), len);\r
105 #else\r
106       return UTF16ToString(UnsafeNativeMethods.sqlite3_column_text16(stmt._sqlite_stmt, index), -1);\r
107 #endif\r
108     }\r
109 \r
110     internal override string ColumnOriginalName(SqliteStatement stmt, int index)\r
111     {\r
112 #if !SQLITE_STANDARD\r
113       int len;\r
114       return UTF16ToString(UnsafeNativeMethods.sqlite3_column_origin_name16_interop(stmt._sqlite_stmt, index, out len), len);\r
115 #elif MONOTOUCH\r
116       throw new NotImplementedException ();\r
117 #else\r
118       return UTF16ToString(UnsafeNativeMethods.sqlite3_column_origin_name16(stmt._sqlite_stmt, index), -1);\r
119 #endif\r
120     }\r
121 \r
122     internal override string ColumnDatabaseName(SqliteStatement stmt, int index)\r
123     {\r
124 #if !SQLITE_STANDARD\r
125       int len;\r
126       return UTF16ToString(UnsafeNativeMethods.sqlite3_column_database_name16_interop(stmt._sqlite_stmt, index, out len), len);\r
127 #elif MONOTOUCH\r
128       throw new NotImplementedException ();\r
129 #else\r
130       return UTF16ToString(UnsafeNativeMethods.sqlite3_column_database_name16(stmt._sqlite_stmt, index), -1);\r
131 #endif\r
132     }\r
133 \r
134     internal override string ColumnTableName(SqliteStatement stmt, int index)\r
135     {\r
136 #if !SQLITE_STANDARD\r
137       int len;\r
138       return UTF16ToString(UnsafeNativeMethods.sqlite3_column_table_name16_interop(stmt._sqlite_stmt, index, out len), len);\r
139 #elif MONOTOUCH\r
140       throw new NotImplementedException ();\r
141 #else\r
142       return UTF16ToString(UnsafeNativeMethods.sqlite3_column_table_name16(stmt._sqlite_stmt, index), -1);\r
143 #endif\r
144     }\r
145 \r
146     internal override string GetParamValueText(IntPtr ptr)\r
147     {\r
148 #if !SQLITE_STANDARD\r
149       int len;\r
150       return UTF16ToString(UnsafeNativeMethods.sqlite3_value_text16_interop(ptr, out len), len);\r
151 #else\r
152       return UTF16ToString(UnsafeNativeMethods.sqlite3_value_text16(ptr), -1);\r
153 #endif\r
154     }\r
155 \r
156     internal override void ReturnError(IntPtr context, string value)\r
157     {\r
158       UnsafeNativeMethods.sqlite3_result_error16(context, value, value.Length * 2);\r
159     }\r
160 \r
161     internal override void ReturnText(IntPtr context, string value)\r
162     {\r
163       UnsafeNativeMethods.sqlite3_result_text16(context, value, value.Length * 2, (IntPtr)(-1));\r
164     }\r
165   }\r
166 }\r