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
+ [MonoTouch.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
+ [MonoTouch.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
+ [MonoTouch.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
+ [MonoTouch.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
#endif\r
internal static extern int sqlite3_create_function(IntPtr db, byte[] strName, int nArgs, int nType, IntPtr pvUser, SQLiteCallback func, SQLiteCallback fstep, SQLiteFinalCallback ffinal);\r
\r
+#if !PLATFORM_COMPACTFRAMEWORK\r
+ [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
+#else\r
+ [DllImport(SQLITE_DLL)]\r
+#endif\r
+ internal static extern int sqlite3_create_function_v2(IntPtr db, byte[] strName, int nArgs, int nType, IntPtr pvUser, SQLiteCallback func, SQLiteCallback fstep, SQLiteFinalCallback ffinal, SQLiteFinalCallback fdestroy);\r
+\r
#if !PLATFORM_COMPACTFRAMEWORK\r
[DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
#else\r
[DllImport(SQLITE_DLL)]\r
#endif\r
internal static extern int sqlite3_config (SQLiteConfig config);\r
- \r
+\r
+#if !PLATFORM_COMPACTFRAMEWORK\r
+ [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
+#else\r
+ [DllImport(SQLITE_DLL)]\r
+#endif\r
+ internal static extern IntPtr sqlite3_user_data (IntPtr context);\r
+\r
#if !PLATFORM_COMPACTFRAMEWORK\r
[DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
#else\r