将啥传递给 sqlite create_function 任意指针

Posted

技术标签:

【中文标题】将啥传递给 sqlite create_function 任意指针【英文标题】:What to pass into sqlite_create_function arbitrary pointer将什么传递给 sqlite create_function 任意指针 【发布时间】:2014-10-05 02:40:07 【问题描述】:

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

edit 实际上,我的真正目标是在 sqlite 数据库上进行单词搜索,但这种骇人听闻的方式并没有返回我需要的结果。

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

函数的文档在这里:http://www.sqlite.org/c3ref/create_function.html,但这部分的内容是:第五个参数是任意指针。该函数的实现可以使用 sqlite3_user_data() 访问该指针。

我不认为我想用它做任何事情,我不能传递一个空值。这是我所拥有的:

    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
        );

感谢您对此的帮助。

【问题讨论】:

my real objective is to do a word search on the sqlite database您可能正在寻找SQLite full-text-search (FTS) extension 如果“sqlite-net c# wrapper”是指System.Data.SQlite,那么它提供SQLiteFunction 类供您实现用户定义的函数。 无论如何,sqlite3_create_function 的第五个参数可以是NULL。是什么让你不相信? 我尝试使用 FTS,它对于内部查询来说速度很快,但由于它用于嵌套选择,我的查询时间从 1-2 秒变为 5-8 秒,有时是 13 秒。不幸的是,由于我正在制作一个 Windows 通用应用程序,因此我无权访问 System.Data。至于为什么它不能为空,它可能是一个 VS-being-silly 事情,但它告诉我我不能传入 null。我会再试一次。 【参考方案1】:

最重要的是你需要一个委托来声明你的回调指针,像这样。

[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);

这就是所有困难的事情。其余的只是细节。

【讨论】:

以上是关于将啥传递给 sqlite create_function 任意指针的主要内容,如果未能解决你的问题,请参考以下文章

应该将啥模块实例传递给 CreateCursor 方法?

将啥传递给 clf.predict()?

应该将啥传递给 if() 以打印“Hello World”?

Equatable 的子类将啥传递给超级(Equatable 类)?

将啥传递给 Android 的 NDK 以便可以使用 OpenCV 加载图像?

Oracle 将啥 SQL 数据类型分配给“count(*)”?