-//
-// Mono.Data.Sqlite.SQLite3_UTF16.cs
-//
-// Author(s):
-// Robert Simpson (robert@blackcastlesoft.com)
-//
-// Adapted and modified for the Mono Project by
-// Marek Habersack (grendello@gmail.com)
-//
-//
-// Copyright (C) 2006 Novell, Inc (http://www.novell.com)
-// Copyright (C) 2007 Marek Habersack
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-/********************************************************
- * ADO.NET 2.0 Data Provider for SQLite Version 3.X
- * Written by Robert Simpson (robert@blackcastlesoft.com)
- *
- * Released to the public domain, use at your own risk!
- ********************************************************/
-#if NET_2_0
-namespace Mono.Data.Sqlite
-{
- using System;
- using System.Runtime.InteropServices;
-
- /// <summary>
- /// Alternate Sqlite3 object, overriding many text behaviors to support UTF-16 (Unicode)
- /// </summary>
- internal class Sqlite3_UTF16 : Sqlite3
- {
- internal Sqlite3_UTF16(SqliteDateFormats fmt)
- : base(fmt)
- {
- }
-
- /// <summary>
- /// Overrides SqliteConvert.ToString() to marshal UTF-16 strings instead of UTF-8
- /// </summary>
- /// <param name="b">A pointer to a UTF-16 string</param>
- /// <param name="nbytelen">The length (IN BYTES) of the string</param>
- /// <returns>A .NET string</returns>
- public override string ToString(IntPtr b)
- {
- return Marshal.PtrToStringUni(b);
- }
-
- internal override string Version
- {
- get
- {
- return base.ToString(UnsafeNativeMethods.sqlite3_libversion());
- }
- }
-
- internal override void Open(string strFilename)
- {
- if (_sql != IntPtr.Zero) return;
- int n = UnsafeNativeMethods.sqlite3_open16(strFilename, out _sql);
- if (n > 0) throw new SqliteException(n, SqliteLastError());
-
- _functionsArray = SqliteFunction.BindFunctions(this);
- }
-
- internal override string SqliteLastError()
- {
- return ToString(UnsafeNativeMethods.sqlite3_errmsg16(_sql));
- }
-
- internal override void Bind_DateTime(SqliteStatement stmt, int index, DateTime dt)
- {
- Bind_Text(stmt, index, ToString(dt));
- }
-
- internal override string Bind_ParamName(SqliteStatement stmt, int index)
- {
- return base.ToString(UnsafeNativeMethods.sqlite3_bind_parameter_name(stmt._sqlite_stmt, index));
- }
-
- internal override void Bind_Text(SqliteStatement stmt, int index, string value)
- {
- int n = UnsafeNativeMethods.sqlite3_bind_text16(stmt._sqlite_stmt, index, value, value.Length * 2, -1);
- if (n > 0) throw new SqliteException(n, SqliteLastError());
- }
-
- internal override string ColumnName(SqliteStatement stmt, int index)
- {
- return ToString(UnsafeNativeMethods.sqlite3_column_name16(stmt._sqlite_stmt, index));
- }
-
- internal override DateTime GetDateTime(SqliteStatement stmt, int index)
- {
- return ToDateTime(GetText(stmt, index));
- }
- internal override string GetText(SqliteStatement stmt, int index)
- {
- return ToString (UnsafeNativeMethods.sqlite3_column_text16(stmt._sqlite_stmt, index));
- }
-
- internal override string ColumnOriginalName(SqliteStatement stmt, int index)
- {
- return ToString(UnsafeNativeMethods.sqlite3_column_origin_name16(stmt._sqlite_stmt, index));
- }
-
- internal override string ColumnDatabaseName(SqliteStatement stmt, int index)
- {
- return ToString(UnsafeNativeMethods.sqlite3_column_database_name16(stmt._sqlite_stmt, index));
- }
-
- internal override string ColumnTableName(SqliteStatement stmt, int index)
- {
- return ToString(UnsafeNativeMethods.sqlite3_column_table_name16(stmt._sqlite_stmt, index));
- }
-
- internal override IntPtr CreateFunction(string strFunction, int nArgs, SqliteCallback func, SqliteCallback funcstep, SqliteCallback funcfinal)
- {
- // FIXME: the function interface below is not supported in the mainstream version of sqlite. Need to rewrite the C# API to
- // use the mainstream sqlite. The cookie needs to be allocated in C#
- IntPtr nCookie;
-
- int n = UnsafeNativeMethods.sqlite3_create_function16(_sql, strFunction, nArgs, 4, func, funcstep, funcfinal, out nCookie);
- if (n > 0) throw new SqliteException(n, SqliteLastError());
-
- return nCookie;
- }
-
- internal override IntPtr CreateCollation(string strCollation, SqliteCollation func)
- {
- // FIXME: the function interface below is not supported in the mainstream version of sqlite. Need to rewrite the C# API to
- // use the mainstream sqlite. The cookie needs to be allocated in C#
- IntPtr nCookie;
-
- int n = UnsafeNativeMethods.sqlite3_create_collation16(_sql, strCollation, 4, 0, func, out nCookie);
- if (n > 0) throw new SqliteException(n, SqliteLastError());
-
- return nCookie;
- }
-
- internal override string GetParamValueText(IntPtr ptr)
- {
- return ToString(UnsafeNativeMethods.sqlite3_value_text16(ptr));
- }
-
- internal override void ReturnError(IntPtr context, string value)
- {
- UnsafeNativeMethods.sqlite3_result_error16(context, value, value.Length);
- }
-
- internal override void ReturnText(IntPtr context, string value)
- {
- UnsafeNativeMethods.sqlite3_result_text16(context, value, value.Length, (IntPtr)(-1));
- }
- }
-}
-#endif
+/********************************************************\r
+ * ADO.NET 2.0 Data Provider for SQLite Version 3.X\r
+ * Written by Robert Simpson (robert@blackcastlesoft.com)\r
+ * \r
+ * Released to the public domain, use at your own risk!\r
+ ********************************************************/\r
+\r
+namespace Mono.Data.Sqlite\r
+{\r
+ using System;\r
+ using System.Runtime.InteropServices;\r
+\r
+ /// <summary>\r
+ /// Alternate SQLite3 object, overriding many text behaviors to support UTF-16 (Unicode)\r
+ /// </summary>\r
+ internal class SQLite3_UTF16 : SQLite3\r
+ {\r
+ internal SQLite3_UTF16(SQLiteDateFormats fmt)\r
+ : base(fmt)\r
+ {\r
+ }\r
+\r
+ /// <summary>\r
+ /// Overrides SqliteConvert.ToString() to marshal UTF-16 strings instead of UTF-8\r
+ /// </summary>\r
+ /// <param name="b">A pointer to a UTF-16 string</param>\r
+ /// <param name="nbytelen">The length (IN BYTES) of the string</param>\r
+ /// <returns>A .NET string</returns>\r
+ public override string ToString(IntPtr b, int nbytelen)\r
+ {\r
+ return UTF16ToString(b, nbytelen);\r
+ }\r
+\r
+ public static string UTF16ToString(IntPtr b, int nbytelen)\r
+ {\r
+ if (nbytelen == 0 || b == IntPtr.Zero) return "";\r
+\r
+ if (nbytelen == -1)\r
+ return Marshal.PtrToStringUni(b);\r
+ else\r
+ return Marshal.PtrToStringUni(b, nbytelen / 2);\r
+ }\r
+\r
+ internal override void Open(string strFilename, SQLiteOpenFlagsEnum flags, int maxPoolSize, bool usePool)\r
+ {\r
+ if (_sql != null) return;\r
+\r
+ _usePool = usePool;\r
+ if (usePool)\r
+ {\r
+ _fileName = strFilename;\r
+ _sql = SqliteConnectionPool.Remove(strFilename, maxPoolSize, out _poolVersion);\r
+ }\r
+\r
+ if (_sql == null)\r
+ {\r
+ IntPtr db;\r
+\r
+#if !SQLITE_STANDARD\r
+ int n = UnsafeNativeMethods.sqlite3_open16_interop(ToUTF8(strFilename), (int)flags, out db);\r
+#else\r
+ if ((flags & SQLiteOpenFlagsEnum.Create) == 0 && System.IO.File.Exists(strFilename) == false)\r
+ throw new SqliteException((int)SQLiteErrorCode.CantOpen, strFilename);\r
+\r
+ int n = UnsafeNativeMethods.sqlite3_open16(strFilename, out db);\r
+#endif\r
+ if (n > 0) throw new SqliteException(n, null);\r
+\r
+ _sql = db;\r
+ }\r
+ _functionsArray = SqliteFunction.BindFunctions(this);\r
+ }\r
+\r
+ internal override void Bind_DateTime(SqliteStatement stmt, int index, DateTime dt)\r
+ {\r
+ Bind_Text(stmt, index, ToString(dt));\r
+ }\r
+\r
+ internal override void Bind_Text(SqliteStatement stmt, int index, string value)\r
+ {\r
+ int n = UnsafeNativeMethods.sqlite3_bind_text16(stmt._sqlite_stmt, index, value, value.Length * 2, (IntPtr)(-1));\r
+ if (n > 0) throw new SqliteException(n, SQLiteLastError());\r
+ }\r
+\r
+ internal override DateTime GetDateTime(SqliteStatement stmt, int index)\r
+ {\r
+ return ToDateTime(GetText(stmt, index));\r
+ }\r
+\r
+ internal override string ColumnName(SqliteStatement stmt, int index)\r
+ {\r
+#if !SQLITE_STANDARD\r
+ int len;\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_column_name16_interop(stmt._sqlite_stmt, index, out len), len);\r
+#else\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_column_name16(stmt._sqlite_stmt, index), -1);\r
+#endif\r
+ }\r
+\r
+ internal override string GetText(SqliteStatement stmt, int index)\r
+ {\r
+#if !SQLITE_STANDARD\r
+ int len;\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_column_text16_interop(stmt._sqlite_stmt, index, out len), len);\r
+#else\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_column_text16(stmt._sqlite_stmt, index), -1);\r
+#endif\r
+ }\r
+\r
+ internal override string ColumnOriginalName(SqliteStatement stmt, int index)\r
+ {\r
+#if !SQLITE_STANDARD\r
+ int len;\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_column_origin_name16_interop(stmt._sqlite_stmt, index, out len), len);\r
+#else\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_column_origin_name16(stmt._sqlite_stmt, index), -1);\r
+#endif\r
+ }\r
+\r
+ internal override string ColumnDatabaseName(SqliteStatement stmt, int index)\r
+ {\r
+#if !SQLITE_STANDARD\r
+ int len;\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_column_database_name16_interop(stmt._sqlite_stmt, index, out len), len);\r
+#else\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_column_database_name16(stmt._sqlite_stmt, index), -1);\r
+#endif\r
+ }\r
+\r
+ internal override string ColumnTableName(SqliteStatement stmt, int index)\r
+ {\r
+#if !SQLITE_STANDARD\r
+ int len;\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_column_table_name16_interop(stmt._sqlite_stmt, index, out len), len);\r
+#else\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_column_table_name16(stmt._sqlite_stmt, index), -1);\r
+#endif\r
+ }\r
+\r
+ internal override string GetParamValueText(IntPtr ptr)\r
+ {\r
+#if !SQLITE_STANDARD\r
+ int len;\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_value_text16_interop(ptr, out len), len);\r
+#else\r
+ return UTF16ToString(UnsafeNativeMethods.sqlite3_value_text16(ptr), -1);\r
+#endif\r
+ }\r
+\r
+ internal override void ReturnError(IntPtr context, string value)\r
+ {\r
+ UnsafeNativeMethods.sqlite3_result_error16(context, value, value.Length * 2);\r
+ }\r
+\r
+ internal override void ReturnText(IntPtr context, string value)\r
+ {\r
+ UnsafeNativeMethods.sqlite3_result_text16(context, value, value.Length * 2, (IntPtr)(-1));\r
+ }\r
+ }\r
+}\r