无法在电子应用程序的 sqlite3 中创建虚拟 table
Unable to create virtual table in sqlite3 in electron app
我在 electron 中使用我自己的 sqlite3.dll。所以我需要用我需要使用的 'ffi' 注册 sqlite3 的所有功能。到目前为止,它工作得很好。例如 sqlite3_exec,我在 ffi 中注册如下
var lib = ffi.library('sqlite3',sqlite3_exec': ['int', [sqlite3Ptr, 'string', 'pointer', 'pointer', stringPtr]],)
在使用时我按如下方式使用它:
var res = lib.sqlite3_exec(dbHandle, query, null, null, null);
效果很好。
现在我需要创建虚拟 table。因此,当我尝试使用相同的代码创建虚拟 table 时,出现错误。做了一些研究,知道我需要用 ffi 注册一个函数,这将允许我创建虚拟 table.
函数如下:
'sqlite3_create_module': ['int',[sqlite3Ptr, 'string', 'pointer', 'pointer']]
这基本上是C语法,我需要将以下模块的地址作为第三个参数传递
static sqlite3_module module = {
.iVersion = 1,
.xCreate = test_CreateConnect,
.xConnect = test_CreateConnect,
.xBestIndex = test_BestIndex,
.xDisconnect = test_DisconnectDestroy,
.xDestroy = test_DisconnectDestroy,
.xOpen = test_Open,
.xClose = test_Close,
.xFilter = test_Filter,
.xNext = test_Next,
.xEof = test_Eof,
.xColumn = test_Column,
.xRowid = test_Rowid,
.xRename = test_Rename,
};
它是C语法的,我已经尽量改成JS语法了,但还是不行。
因此,如果您对此有任何解决方案,请提供帮助。
如果它是关于使用 fts3 或 fts4 创建虚拟 table 那么您不需要使用 sqlite3 注册模块,因为 FTS3 和 FTS4 包含在 SQLite 核心源代码中,但它们没有被启用默认。
要启用它们,请在编译器命令行中使用以下两个开关:
-DSQLITE_ENABLE_FTS3
-DSQLITE_ENABLE_FTS3_PARENTHESIS
那么就可以这样使用了:
sqlite3 = ref.types.void; // we don't know what the layout of "sqlite3" looks like
sqlite3_stmt = ref.types.void;
sqlite3Ptr = ref.refType(sqlite3);
sqlite3PtrPtr = ref.refType(sqlite3Ptr);
stringPtr = ref.refType(ref.types.CString);
stmtPtr = ref.refType(sqlite3_stmt);
stmtPtrPtr = ref.refType(stmtPtr) ;
// binding to a few "libsqlite3" functions...
libsqlite3 = ffi.Library('sqlite3', {
'sqlite3_open': ['int', ['string', sqlite3PtrPtr]],
'sqlite3_close': ['int', [sqlite3Ptr]],
'sqlite3_exec': ['int', [sqlite3Ptr, 'string', 'pointer', 'pointer', stringPtr]],
'sqlite3_changes': ['int', [sqlite3Ptr]],
'sqlite3_user_add': ['int', [sqlite3Ptr, 'string', 'string', 'int', 'int']],
'sqlite3_user_authenticate': ['int', [sqlite3Ptr, 'string', 'string', 'int']],
'sqlite3_prepare_v2': ['int',[sqlite3Ptr, 'string', 'int', stmtPtrPtr, stringPtr]],
'sqlite3_bind_blob': [ 'int', [stmtPtr, 'int', 'string' , 'int', 'pointer'] ],
'sqlite3_step':[ 'int', [stringPtr] ],
'sqlite3_finalize': ['int', [stringPtr]],
'sqlite3_column_bytes': ['string',[stringPtr,'int']],
'sqlite3_column_blob': ['string',[stringPtr,'int']]
});
dbHandle = dbPtrPtr.deref();
var queryvtab = "CREATE VIRTUAL TABLE virtual_table_name USING fts3()";
var commr = libsqlite3.sqlite3_exec(dbHandle, queryvtab, null, null, null);
我在 electron 中使用我自己的 sqlite3.dll。所以我需要用我需要使用的 'ffi' 注册 sqlite3 的所有功能。到目前为止,它工作得很好。例如 sqlite3_exec,我在 ffi 中注册如下
var lib = ffi.library('sqlite3',sqlite3_exec': ['int', [sqlite3Ptr, 'string', 'pointer', 'pointer', stringPtr]],)
在使用时我按如下方式使用它:
var res = lib.sqlite3_exec(dbHandle, query, null, null, null);
效果很好。
现在我需要创建虚拟 table。因此,当我尝试使用相同的代码创建虚拟 table 时,出现错误。做了一些研究,知道我需要用 ffi 注册一个函数,这将允许我创建虚拟 table.
函数如下:
'sqlite3_create_module': ['int',[sqlite3Ptr, 'string', 'pointer', 'pointer']]
这基本上是C语法,我需要将以下模块的地址作为第三个参数传递
static sqlite3_module module = {
.iVersion = 1,
.xCreate = test_CreateConnect,
.xConnect = test_CreateConnect,
.xBestIndex = test_BestIndex,
.xDisconnect = test_DisconnectDestroy,
.xDestroy = test_DisconnectDestroy,
.xOpen = test_Open,
.xClose = test_Close,
.xFilter = test_Filter,
.xNext = test_Next,
.xEof = test_Eof,
.xColumn = test_Column,
.xRowid = test_Rowid,
.xRename = test_Rename,
};
它是C语法的,我已经尽量改成JS语法了,但还是不行。
因此,如果您对此有任何解决方案,请提供帮助。
如果它是关于使用 fts3 或 fts4 创建虚拟 table 那么您不需要使用 sqlite3 注册模块,因为 FTS3 和 FTS4 包含在 SQLite 核心源代码中,但它们没有被启用默认。 要启用它们,请在编译器命令行中使用以下两个开关:
-DSQLITE_ENABLE_FTS3
-DSQLITE_ENABLE_FTS3_PARENTHESIS
那么就可以这样使用了:
sqlite3 = ref.types.void; // we don't know what the layout of "sqlite3" looks like
sqlite3_stmt = ref.types.void;
sqlite3Ptr = ref.refType(sqlite3);
sqlite3PtrPtr = ref.refType(sqlite3Ptr);
stringPtr = ref.refType(ref.types.CString);
stmtPtr = ref.refType(sqlite3_stmt);
stmtPtrPtr = ref.refType(stmtPtr) ;
// binding to a few "libsqlite3" functions...
libsqlite3 = ffi.Library('sqlite3', {
'sqlite3_open': ['int', ['string', sqlite3PtrPtr]],
'sqlite3_close': ['int', [sqlite3Ptr]],
'sqlite3_exec': ['int', [sqlite3Ptr, 'string', 'pointer', 'pointer', stringPtr]],
'sqlite3_changes': ['int', [sqlite3Ptr]],
'sqlite3_user_add': ['int', [sqlite3Ptr, 'string', 'string', 'int', 'int']],
'sqlite3_user_authenticate': ['int', [sqlite3Ptr, 'string', 'string', 'int']],
'sqlite3_prepare_v2': ['int',[sqlite3Ptr, 'string', 'int', stmtPtrPtr, stringPtr]],
'sqlite3_bind_blob': [ 'int', [stmtPtr, 'int', 'string' , 'int', 'pointer'] ],
'sqlite3_step':[ 'int', [stringPtr] ],
'sqlite3_finalize': ['int', [stringPtr]],
'sqlite3_column_bytes': ['string',[stringPtr,'int']],
'sqlite3_column_blob': ['string',[stringPtr,'int']]
});
dbHandle = dbPtrPtr.deref();
var queryvtab = "CREATE VIRTUAL TABLE virtual_table_name USING fts3()";
var commr = libsqlite3.sqlite3_exec(dbHandle, queryvtab, null, null, null);