传递给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
);
谢谢你在这方面的帮助。
最重要的是,您需要一个委托来声明回调指针,如下所示。
[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);
这些都是困难的东西。剩下的只是细节。