Невозможно создать виртуальную таблицу в sqlite3 в электронном приложении

Я использую свой собственный sqlite3.dll в электронном виде. Поэтому мне нужно зарегистрировать все функции sqlite3 с "ffi", которые мне нужно использовать. До сих пор это работало довольно хорошо. Ex для 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);

Работает отлично.

Теперь мне нужно создать виртуальную таблицу. Поэтому, когда я пытаюсь создать виртуальную таблицу с тем же кодом, я получаю сообщение об ошибке. Провел небольшое исследование и узнал, что мне нужно зарегистрировать функцию в ffi, которая позволит мне создавать виртуальные таблицы.

функция выглядит следующим образом:

'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, насколько это возможно, но все равно ничего положительного.

Так что, если у вас есть какое-либо решение для этого, пожалуйста, помогите.

1 ответ

Решение

Если речь идет о создании виртуальной таблицы с использованием fts3 или fts4, вам не нужно регистрировать модуль с помощью 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);
Другие вопросы по тегам