将啥传递给 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 任意指针的主要内容,如果未能解决你的问题,请参考以下文章
应该将啥传递给 if() 以打印“Hello World”?
Equatable 的子类将啥传递给超级(Equatable 类)?