传递给sqlite_create_function任意指针的内容

本文关键字:指针 任意 create sqlite function | 更新日期: 2023-09-27 18:25:31

目标:将正则表达式函数绑定到sqlite数据库,因为ADO.NET解决方案在Windows Universal应用程序上不可用。

edit实际上,我真正的目标是在sqlite数据库上进行单词搜索,但这种方法很难得到我需要的结果。

好的,所以我尝试添加到sqlite的sqlite-netc#包装器中。和我不知道我在做什么,就像,这是值得模因的。这是我第一次尝试调用COM任何东西。

函数的文档如下:http://www.sqlite.org/c3ref/create_function.html,但它对这部分的说明是:第五个参数是一个任意指针。函数的实现可以使用sqlite3_user_data()访问该指针。

我认为我不想用它做任何事情,而且我不能传递null。这是我的:

    public void BindRegex(Regex regex)
    {
        CreateFunction(GetConnection().Handle, "regexp", 1, 2, null, IsMatch, null, null);
    }
    public Func<string, bool> IsMatch = text => regex.IsMatch(text);
    [DllImport("sqlite3.dll", EntryPoint = "sqlite3_create_function", CallingConvention=CallingConvention.Cdecl)]
    private static extern int CreateFunction(
        IntPtr dbHandle,
        string functionName,
        int numArgs,
        int textEncoding,
        IntPtr pApp,
        IntPtr xFunc,
        IntPtr xStep, // null
        IntPtr xFinal // null
        );

谢谢你在这方面的帮助。

传递给sqlite_create_function任意指针的内容

最重要的是,您需要一个委托来声明回调指针,如下所示。

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void UserFunctionCallback(IntPtr context, int nvalues,
  [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]IntPtr[] values);

在函数内部,您必须使用更多的Sqlite API来检索参数值并设置返回值。代码看起来像这样。

  var svalues = new string[nvalues];
  for (int x = 0; x < nvalues; ++x)
    svalues[x - 0] = sqlite3_value_text(values[x]);
  var ret = [do something here];
  sqlite3_result_text(context, ret, -1, SQLITE_TRANSIENT);

这些都是困难的东西。剩下的只是细节。