1 /********************************************************
\r
2 * ADO.NET 2.0 Data Provider for SQLite Version 3.X
\r
3 * Written by Robert Simpson (robert@blackcastlesoft.com)
\r
5 * Released to the public domain, use at your own risk!
\r
6 ********************************************************/
\r
8 namespace Mono.Data.Sqlite
\r
11 using System.Runtime.InteropServices;
\r
14 /// Alternate SQLite3 object, overriding many text behaviors to support UTF-16 (Unicode)
\r
16 internal class SQLite3_UTF16 : SQLite3
\r
18 internal SQLite3_UTF16(SQLiteDateFormats fmt)
\r
24 /// Overrides SqliteConvert.ToString() to marshal UTF-16 strings instead of UTF-8
\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
31 return UTF16ToString(b, nbytelen);
\r
34 public static string UTF16ToString(IntPtr b, int nbytelen)
\r
36 if (nbytelen == 0 || b == IntPtr.Zero) return "";
\r
39 return Marshal.PtrToStringUni(b);
\r
41 return Marshal.PtrToStringUni(b, nbytelen / 2);
\r
44 internal override void Open(string strFilename, SQLiteOpenFlagsEnum flags, int maxPoolSize, bool usePool)
\r
46 if (_sql != null) return;
\r
51 _fileName = strFilename;
\r
52 _sql = SqliteConnectionPool.Remove(strFilename, maxPoolSize, out _poolVersion);
\r
59 #if !SQLITE_STANDARD
\r
60 int n = UnsafeNativeMethods.sqlite3_open16_interop(ToUTF8(strFilename), (int)flags, out db);
\r
62 if ((flags & SQLiteOpenFlagsEnum.Create) == 0 && System.IO.File.Exists(strFilename) == false)
\r
63 throw new SqliteException((int)SQLiteErrorCode.CantOpen, strFilename);
\r
65 int n = UnsafeNativeMethods.sqlite3_open16(strFilename, out db);
\r
67 if (n > 0) throw new SqliteException(n, null);
\r
71 _functionsArray = SqliteFunction.BindFunctions(this);
\r
74 internal override void Bind_DateTime(SqliteStatement stmt, int index, DateTime dt)
\r
76 Bind_Text(stmt, index, ToString(dt));
\r
79 internal override void Bind_Text(SqliteStatement stmt, int index, string value)
\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
85 internal override DateTime GetDateTime(SqliteStatement stmt, int index)
\r
87 return ToDateTime(GetText(stmt, index));
\r
90 internal override string ColumnName(SqliteStatement stmt, int index)
\r
92 #if !SQLITE_STANDARD
\r
94 return UTF16ToString(UnsafeNativeMethods.sqlite3_column_name16_interop(stmt._sqlite_stmt, index, out len), len);
\r
96 return UTF16ToString(UnsafeNativeMethods.sqlite3_column_name16(stmt._sqlite_stmt, index), -1);
\r
100 internal override string GetText(SqliteStatement stmt, int index)
\r
102 #if !SQLITE_STANDARD
\r
104 return UTF16ToString(UnsafeNativeMethods.sqlite3_column_text16_interop(stmt._sqlite_stmt, index, out len), len);
\r
106 return UTF16ToString(UnsafeNativeMethods.sqlite3_column_text16(stmt._sqlite_stmt, index), -1);
\r
110 internal override string ColumnOriginalName(SqliteStatement stmt, int index)
\r
112 #if !SQLITE_STANDARD
\r
114 return UTF16ToString(UnsafeNativeMethods.sqlite3_column_origin_name16_interop(stmt._sqlite_stmt, index, out len), len);
\r
116 return UTF16ToString(UnsafeNativeMethods.sqlite3_column_origin_name16(stmt._sqlite_stmt, index), -1);
\r
120 internal override string ColumnDatabaseName(SqliteStatement stmt, int index)
\r
122 #if !SQLITE_STANDARD
\r
124 return UTF16ToString(UnsafeNativeMethods.sqlite3_column_database_name16_interop(stmt._sqlite_stmt, index, out len), len);
\r
126 return UTF16ToString(UnsafeNativeMethods.sqlite3_column_database_name16(stmt._sqlite_stmt, index), -1);
\r
130 internal override string ColumnTableName(SqliteStatement stmt, int index)
\r
132 #if !SQLITE_STANDARD
\r
134 return UTF16ToString(UnsafeNativeMethods.sqlite3_column_table_name16_interop(stmt._sqlite_stmt, index, out len), len);
\r
136 return UTF16ToString(UnsafeNativeMethods.sqlite3_column_table_name16(stmt._sqlite_stmt, index), -1);
\r
140 internal override string GetParamValueText(IntPtr ptr)
\r
142 #if !SQLITE_STANDARD
\r
144 return UTF16ToString(UnsafeNativeMethods.sqlite3_value_text16_interop(ptr, out len), len);
\r
146 return UTF16ToString(UnsafeNativeMethods.sqlite3_value_text16(ptr), -1);
\r
150 internal override void ReturnError(IntPtr context, string value)
\r
152 UnsafeNativeMethods.sqlite3_result_error16(context, value, value.Length * 2);
\r
155 internal override void ReturnText(IntPtr context, string value)
\r
157 UnsafeNativeMethods.sqlite3_result_text16(context, value, value.Length * 2, (IntPtr)(-1));
\r