[Mono.Data.Sqlite] Add support for custom collation functions in MonoTouch.
[mono.git] / mcs / class / Mono.Data.Sqlite / Mono.Data.Sqlite_2.0 / SQLiteFunction.cs
index aac979e03f278b8e415ae34194d0c798edbf1243..6aefe804586af9c963af74e3a548331662b97c94 100644 (file)
@@ -508,8 +508,14 @@ namespace Mono.Data.Sqlite
 \r
         if (pr.FuncType != FunctionType.Collation)\r
           sqlbase.CreateFunction(pr.Name, pr.Arguments, (f is SqliteFunctionEx), f._InvokeFunc, f._StepFunc, f._FinalFunc);\r
-        else\r
-          sqlbase.CreateCollation(pr.Name, f._CompareFunc, f._CompareFunc16);\r
+        else {\r
+#if MONOTOUCH\r
+          GCHandle handle = GCHandle.Alloc (f);\r
+          sqlbase.CreateCollation(pr.Name, collation_callback, collation_callback16, GCHandle.ToIntPtr (handle));\r
+#else\r
+          sqlbase.CreateCollation(pr.Name, f._CompareFunc, f._CompareFunc16, IntPtr.Zero);\r
+#endif\r
+        }\r
 \r
 \r
         lFunctions.Add(f);\r
@@ -520,6 +526,24 @@ namespace Mono.Data.Sqlite
 \r
       return arFunctions;\r
     }\r
+\r
+#if MONOTOUCH\r
+    [MonoTouch.MonoPInvokeCallback (typeof (SQLiteCollation))]\r
+    internal static int collation_callback (IntPtr puser, int len1, IntPtr pv1, int len2, IntPtr pv2)\r
+    {\r
+      var handle = GCHandle.FromIntPtr (puser);\r
+      var func = (SqliteFunction) handle.Target;\r
+      return func._CompareFunc (IntPtr.Zero, len1, pv1, len2, pv2);\r
+    }\r
+\r
+    [MonoTouch.MonoPInvokeCallback (typeof (SQLiteCollation))]\r
+    internal static int collation_callback16 (IntPtr puser, int len1, IntPtr pv1, int len2, IntPtr pv2)\r
+    {\r
+      var handle = GCHandle.FromIntPtr (puser);\r
+      var func = (SqliteFunction) handle.Target;\r
+      return func._CompareFunc16 (IntPtr.Zero, len1, pv1, len2, pv2);\r
+    }\r
+#endif\r
   }\r
 \r
   /// <summary>\r