[jit] Fix the saving of the 'cfg->ret_var_set' flag when inlining, it was set to...
[mono.git] / mcs / class / Mono.Data.Sqlite / Mono.Data.Sqlite_2.0 / SQLite3.cs
index 82a40ed6c8a1efc6c0a95ab55b5e7884ca7e9b94..6b2ee13e03a86fed9d1c387bf2dbb38b85bdd904 100644 (file)
@@ -125,9 +125,9 @@ namespace Mono.Data.Sqlite
        // Compatibility with versions < 3.5.0\r
         int n;\r
 \r
-       try {\r
+       if (UnsafeNativeMethods.use_sqlite3_open_v2) {\r
                n = UnsafeNativeMethods.sqlite3_open_v2(ToUTF8(strFilename), out db, (int)flags, IntPtr.Zero);\r
-       } catch (EntryPointNotFoundException) {\r
+       } else {\r
                Console.WriteLine ("Your sqlite3 version is old - please upgrade to at least v3.5.0!");\r
                n = UnsafeNativeMethods.sqlite3_open (ToUTF8 (strFilename), out db);\r
        }\r
@@ -499,6 +499,8 @@ namespace Mono.Data.Sqlite
 #if !SQLITE_STANDARD\r
       int len;\r
       return UTF8ToString(UnsafeNativeMethods.sqlite3_column_origin_name_interop(stmt._sqlite_stmt, index, out len), len);\r
+#elif MONOTOUCH\r
+      throw new NotImplementedException ();\r
 #else\r
       return UTF8ToString(UnsafeNativeMethods.sqlite3_column_origin_name(stmt._sqlite_stmt, index), -1);\r
 #endif\r
@@ -509,6 +511,8 @@ namespace Mono.Data.Sqlite
 #if !SQLITE_STANDARD\r
       int len;\r
       return UTF8ToString(UnsafeNativeMethods.sqlite3_column_database_name_interop(stmt._sqlite_stmt, index, out len), len);\r
+#elif MONOTOUCH\r
+      throw new NotImplementedException ();\r
 #else\r
       return UTF8ToString(UnsafeNativeMethods.sqlite3_column_database_name(stmt._sqlite_stmt, index), -1);\r
 #endif\r
@@ -519,6 +523,8 @@ namespace Mono.Data.Sqlite
 #if !SQLITE_STANDARD\r
       int len;\r
       return UTF8ToString(UnsafeNativeMethods.sqlite3_column_table_name_interop(stmt._sqlite_stmt, index, out len), len);\r
+#elif MONOTOUCH\r
+      throw new NotImplementedException ();\r
 #else\r
       return UTF8ToString(UnsafeNativeMethods.sqlite3_column_table_name(stmt._sqlite_stmt, index), -1);\r
 #endif\r
@@ -652,11 +658,37 @@ namespace Mono.Data.Sqlite
       return UnsafeNativeMethods.sqlite3_aggregate_count(context);\r
     }\r
 \r
+#if MONOTOUCH\r
+    class FunctionData {\r
+      public SQLiteCallback Func;\r
+      public SQLiteCallback FuncStep;\r
+      public SQLiteFinalCallback FuncFinal;\r
+    }\r
+#endif\r
+\r
     internal override void CreateFunction(string strFunction, int nArgs, bool needCollSeq, SQLiteCallback func, SQLiteCallback funcstep, SQLiteFinalCallback funcfinal)\r
     {\r
       int n;\r
 \r
-#if !SQLITE_STANDARD\r
+#if MONOTOUCH\r
+      var data = new FunctionData();\r
+      data.Func = func;\r
+      data.FuncStep = funcstep;\r
+      data.FuncFinal = funcfinal;\r
+      SQLiteCallback func_callback = func == null ? null : new SQLiteCallback(scalar_callback);\r
+      SQLiteCallback funcstep_callback = funcstep == null ? null : new SQLiteCallback(step_callback);\r
+      SQLiteFinalCallback funcfinal_callback = funcfinal == null ? null : new SQLiteFinalCallback(final_callback);\r
+\r
+      IntPtr user_data;\r
+      user_data = GCHandle.ToIntPtr(GCHandle.Alloc(data));\r
+      n = UnsafeNativeMethods.sqlite3_create_function_v2(_sql, ToUTF8(strFunction), nArgs, 4, user_data, func_callback, funcstep_callback, funcfinal_callback, destroy_callback);\r
+\r
+      if (n == 0) {\r
+        // sqlite3_create_function_v2 will call 'destroy_callback' if it fails, so we need to recreate the gchandle here.\r
+        user_data = GCHandle.ToIntPtr(GCHandle.Alloc(data));\r
+        n = UnsafeNativeMethods.sqlite3_create_function_v2(_sql, ToUTF8(strFunction), nArgs, 1, user_data, func_callback, funcstep_callback, funcfinal_callback, destroy_callback);\r
+      }\r
+#elif !SQLITE_STANDARD\r
       n = UnsafeNativeMethods.sqlite3_create_function_interop(_sql, ToUTF8(strFunction), nArgs, 4, IntPtr.Zero, func, funcstep, funcfinal, (needCollSeq == true) ? 1 : 0);\r
       if (n == 0) n = UnsafeNativeMethods.sqlite3_create_function_interop(_sql, ToUTF8(strFunction), nArgs, 1, IntPtr.Zero, func, funcstep, funcfinal, (needCollSeq == true) ? 1 : 0);\r
 #else\r
@@ -666,13 +698,45 @@ namespace Mono.Data.Sqlite
       if (n > 0) throw new SqliteException(n, SQLiteLastError());\r
     }\r
 \r
-    internal override void CreateCollation(string strCollation, SQLiteCollation func, SQLiteCollation func16)\r
+    internal override void CreateCollation(string strCollation, SQLiteCollation func, SQLiteCollation func16, IntPtr user_data)\r
     {\r
-      int n = UnsafeNativeMethods.sqlite3_create_collation(_sql, ToUTF8(strCollation), 2, IntPtr.Zero, func16);\r
-      if (n == 0) UnsafeNativeMethods.sqlite3_create_collation(_sql, ToUTF8(strCollation), 1, IntPtr.Zero, func);\r
+      int n = UnsafeNativeMethods.sqlite3_create_collation(_sql, ToUTF8(strCollation), 2, user_data, func16);\r
+      if (n == 0) UnsafeNativeMethods.sqlite3_create_collation(_sql, ToUTF8(strCollation), 1, user_data, func);\r
       if (n > 0) throw new SqliteException(n, SQLiteLastError());\r
     }\r
 \r
+#if MONOTOUCH\r
+    [Mono.Util.MonoPInvokeCallback(typeof(SQLiteCallback))]\r
+    internal static void scalar_callback(IntPtr context, int nArgs, IntPtr argsptr)\r
+    {\r
+      var handle = GCHandle.FromIntPtr (UnsafeNativeMethods.sqlite3_user_data(context));\r
+      var func = (FunctionData)handle.Target;\r
+      func.Func(context, nArgs, argsptr);\r
+    }\r
+\r
+    [Mono.Util.MonoPInvokeCallback(typeof(SQLiteCallback))]\r
+    internal static void step_callback(IntPtr context, int nArgs, IntPtr argsptr)\r
+    {\r
+      var handle = GCHandle.FromIntPtr(UnsafeNativeMethods.sqlite3_user_data(context));\r
+      var func = (FunctionData)handle.Target;\r
+      func.FuncStep(context, nArgs, argsptr);\r
+    }\r
+\r
+    [Mono.Util.MonoPInvokeCallback(typeof(SQLiteFinalCallback))]\r
+    internal static void final_callback(IntPtr context)\r
+    {\r
+      var handle = GCHandle.FromIntPtr(UnsafeNativeMethods.sqlite3_user_data(context));\r
+      var func = (FunctionData)handle.Target;\r
+      func.FuncFinal(context);\r
+    }\r
+\r
+    [Mono.Util.MonoPInvokeCallback(typeof(SQLiteFinalCallback))]\r
+    internal static void destroy_callback(IntPtr context)\r
+    {\r
+      GCHandle.FromIntPtr(context).Free();\r
+    }\r
+#endif\r
+\r
     internal override int ContextCollateCompare(CollationEncodingEnum enc, IntPtr context, string s1, string s2)\r
     {\r
 #if !SQLITE_STANDARD\r
@@ -865,6 +929,17 @@ namespace Mono.Data.Sqlite
       return UnsafeNativeMethods.sqlite3_aggregate_context(context, 1);\r
     }\r
 \r
+#if MONOTOUCH\r
+       internal override void SetPassword(byte[] passwordBytes)\r
+       {\r
+               throw new NotImplementedException ();\r
+       }\r
+\r
+       internal override void ChangePassword(byte[] newPasswordBytes)\r
+       {\r
+               throw new NotImplementedException ();\r
+       }\r
+#else\r
     internal override void SetPassword(byte[] passwordBytes)\r
     {\r
       int n = UnsafeNativeMethods.sqlite3_key(_sql, passwordBytes, passwordBytes.Length);\r
@@ -876,13 +951,14 @@ namespace Mono.Data.Sqlite
       int n = UnsafeNativeMethods.sqlite3_rekey(_sql, newPasswordBytes, (newPasswordBytes == null) ? 0 : newPasswordBytes.Length);\r
       if (n > 0) throw new SqliteException(n, SQLiteLastError());\r
     }\r
+#endif\r
                \r
 #if MONOTOUCH\r
     SQLiteUpdateCallback update_callback;\r
     SQLiteCommitCallback commit_callback;\r
     SQLiteRollbackCallback rollback_callback;\r
                \r
-    [MonoTouch.MonoPInvokeCallback (typeof (SQLiteUpdateCallback))]\r
+    [Mono.Util.MonoPInvokeCallback (typeof (SQLiteUpdateCallback))]\r
     static void update (IntPtr puser, int type, IntPtr database, IntPtr table, Int64 rowid)\r
     {\r
       SQLite3 instance = GCHandle.FromIntPtr (puser).Target as SQLite3;\r
@@ -898,7 +974,7 @@ namespace Mono.Data.Sqlite
         UnsafeNativeMethods.sqlite3_update_hook (_sql, update, GCHandle.ToIntPtr (gch));\r
     }\r
 \r
-    [MonoTouch.MonoPInvokeCallback (typeof (SQLiteCommitCallback))]\r
+    [Mono.Util.MonoPInvokeCallback (typeof (SQLiteCommitCallback))]\r
     static int commit (IntPtr puser)\r
     {\r
       SQLite3 instance = GCHandle.FromIntPtr (puser).Target as SQLite3;\r
@@ -914,7 +990,7 @@ namespace Mono.Data.Sqlite
         UnsafeNativeMethods.sqlite3_commit_hook (_sql, commit, GCHandle.ToIntPtr (gch));\r
     }\r
 \r
-    [MonoTouch.MonoPInvokeCallback (typeof (SQLiteRollbackCallback))]\r
+    [Mono.Util.MonoPInvokeCallback (typeof (SQLiteRollbackCallback))]\r
     static void rollback (IntPtr puser)\r
     {\r
       SQLite3 instance = GCHandle.FromIntPtr (puser).Target as SQLite3;\r