2017-02-24 77 views
0

我在電子中使用我自己的sqlite3.dll。所以我需要用'ffi'註冊sqlite3的所有函數,我需要使用它。到現在爲止,它工作得很好。防爆爲sqlite3_exec,我在FFI如下無法在電子應用程序的sqlite3中創建虛擬表格

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內核源代碼中,但它們默認情況下未啓用。 爲了讓他們使用下面的兩個開關編譯器命令行:

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

感謝:

-DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS 

然後你就可以按如下方式使用它。這解決了我的問題。你是天使 –

相關問題