2016-03-07 203 views
0

我想有一些sqlite數據庫在內存中運行。sqlite備份內存數據庫C++

我可以基於文件的數據庫加載到內存數據庫, 我可以做基於文件數據庫的備份,但什麼是失敗,一個 內存數據庫備份到文件中。

我查了兩個樣本,這裏暴露: https://www.sqlite.org/backup.html

我的意思是,我用這些例子。 結果總是SQLITE_OK所有sqlite的函數調用,在第二個例子execept 101 爲

sqlite3_backup_step 

。爲了確保沒有錯誤,我檢查了具有表 和數據的內存數據庫。情況就是這樣。而且,使用相同的備份功能,對於存檔數據庫非常有效。

到目前爲止,我可以調查,這條線

nSrcPage = (int)sqlite3BtreeLastPage(p->pSrc); 

在功能

sqlite3_backup_step (sqlite3.c) 

總是返回0,所以數據庫沒有 「頁面」。

此時基於文件的數據庫返回35。

因此,似乎沒有一種副本,因爲沒有「頁」 我的內存數據庫給出;但是這個mem數據庫肯定有表 和數據。

/// failing backup 
bool backup_test_sqlite_mem2(void) 
{ 
    /// create a file db 
    sqlite3* file_db =create_db("filedb.db",true); 
    if(file_db != nullptr) 
     sqlite3_close(file_db); 

    /// we now have a database file 

    /// create an empty mem db 
    sqlite3* mem_db=create_db(":memory:",false); 

    /// attached prior created file to mem db 
    attach_db_test_sqlite_mem(mem_db,"filedb.db"); 

    /// check we have content in mem db 
    do_select(mem_db, "SELECT count(*) FROM stock","rows in backup_test_sqlite_mem2"); 

    /// finally back memdb 
    int ibackup= backupDb(mem_db,"memdb_from_attached_backup.db",nullptr); 

    /// the above backup is empty 
    return (ibackup == SQLITE_OK ? true : false); 
} 

回答

0

內存數據庫沒有頁面,因爲它是空的。

一個附加的數據庫保持分開的,即,它的數據不被合併到備份。

要備份一個數據庫連接,你必須給它的名稱(而不是「主」),以sqlite3_backup_init()

+0

我知道(因爲我描述它沒有頁面),但是應該得出什麼結論?我的內存源數據庫不是空的(就在備份之前,它是在插入1個表,5列和500行的情況下創建的),但備份是空的:沒有表,沒有數據。 – nullptr