// 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
#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
#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
#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
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
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
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
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
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
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