2012-05-04 21 views
2

我想用Windows的「自定義資源」功能將存儲在SQLite數據庫中的相當大量的數據嵌入到我的二進制文件中。 (這是一個日誌記錄工具的白名單)SQLite的確支持in memory databases,但它看起來可能僅限於創建全新的數據庫;並且似乎不支持從內存緩衝區讀取;但我不積極。是否可以使用內存緩衝區(或PE資源)來備份只讀SQLite數據庫?

數據庫是否支持這樣的事情? (由於其他原因,我必須嵌入SQLite,所以它也可以用於白名單...)

+3

我沒有回答你的問題。我確實有解決您的問題的方法:將sql命令存儲在資源中,然後將該腳本傳遞給SQLite引擎。 –

+0

@Robᵩ:是的,那樣會起作用,但是如果那樣做了,那麼我就不能預先生成索引或其他類似的東西並嵌入它們 - 它們必須在飛行中完成,這將會很昂貴。 (使用SQLite而不是像協議緩衝區這樣的常規序列化工具的一半要點是可以很容易地嵌入預生成的標記) –

回答

3

sqlite文檔http://www.sqlite.org/backup.html的聯機備份部分有一些代碼可以做你想做的事情(即轉儲在內存數據庫文件,或重新加載文件到內存數據庫)。這應該允許您將預先編制索引的數據庫保存到一個文件中,該文件可以添加到資源中並在運行時加載到內存中。

這是有問題的代碼(從上面的鏈接頁面直抄)

/* 
** This function is used to load the contents of a database file on disk 
** into the "main" database of open database connection pInMemory, or 
** to save the current contents of the database opened by pInMemory into 
** a database file on disk. pInMemory is probably an in-memory database, 
** but this function will also work fine if it is not. 
** 
** Parameter zFilename points to a nul-terminated string containing the 
** name of the database file on disk to load from or save to. If parameter 
** isSave is non-zero, then the contents of the file zFilename are 
** overwritten with the contents of the database opened by pInMemory. If 
** parameter isSave is zero, then the contents of the database opened by 
** pInMemory are replaced by data loaded from the file zFilename. 
** 
** If the operation is successful, SQLITE_OK is returned. Otherwise, if 
** an error occurs, an SQLite error code is returned. 
*/ 
int loadOrSaveDb(sqlite3 *pInMemory, const char *zFilename, int isSave){ 
    int rc;     /* Function return code */ 
    sqlite3 *pFile;   /* Database connection opened on zFilename */ 
    sqlite3_backup *pBackup; /* Backup object used to copy data */ 
    sqlite3 *pTo;    /* Database to copy to (pFile or pInMemory) */ 
    sqlite3 *pFrom;   /* Database to copy from (pFile or pInMemory) */ 

    /* Open the database file identified by zFilename. Exit early if this fails 
    ** for any reason. */ 
    rc = sqlite3_open(zFilename, &pFile); 
    if(rc==SQLITE_OK){ 

    /* If this is a 'load' operation (isSave==0), then data is copied 
    ** from the database file just opened to database pInMemory. 
    ** Otherwise, if this is a 'save' operation (isSave==1), then data 
    ** is copied from pInMemory to pFile. Set the variables pFrom and 
    ** pTo accordingly. */ 
    pFrom = (isSave ? pInMemory : pFile); 
    pTo = (isSave ? pFile  : pInMemory); 

    /* Set up the backup procedure to copy from the "main" database of 
    ** connection pFile to the main database of connection pInMemory. 
    ** If something goes wrong, pBackup will be set to NULL and an error 
    ** code and message left in connection pTo. 
    ** 
    ** If the backup object is successfully created, call backup_step() 
    ** to copy data from pFile to pInMemory. Then call backup_finish() 
    ** to release resources associated with the pBackup object. If an 
    ** error occurred, then an error code and message will be left in 
    ** connection pTo. If no error occurred, then the error code belonging 
    ** to pTo is set to SQLITE_OK. 
    */ 
    pBackup = sqlite3_backup_init(pTo, "main", pFrom, "main"); 
    if(pBackup){ 
     (void)sqlite3_backup_step(pBackup, -1); 
     (void)sqlite3_backup_finish(pBackup); 
    } 
    rc = sqlite3_errcode(pTo); 
    } 

    /* Close the database connection opened on database file zFilename 
    ** and return the result of this function. */ 
    (void)sqlite3_close(pFile); 
    return rc; 
} 
相關問題