2010-06-21 Rodrigo Kumpera <rkumpera@novell.com>
[mono.git] / mcs / class / Mono.Data.Sqlite / Mono.Data.Sqlite_2.0 / SQLite3_UTF16.cs
index 3b259e5149e4cc78d8543b9d65332b946c8bb06f..6ad8762b77667e80a0607906244496df5553ff61 100644 (file)
-//
-// 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