SQLite 备份内存数据库 C++

sqlite backup memory database c++

本文关键字:C++ 数据库 内存 备份 SQLite      更新时间:2023-10-16

我想在内存中运行一些SQLite数据库。

我可以将基于文件的数据库加载到内存数据库中,我可以备份基于文件的数据库,但失败的是将内存数据库备份到文件。

我检查了两个示例,在这里公开:https://www.sqlite.org/backup.html

的意思是,我使用了这些例子。结果始终在所有 sqlite 函数调用上SQLITE_OK,exebut 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);
}

内存中数据库没有页,因为它是空的。

附加的数据库保持独立,即其数据不会合并到备份中。

要备份连接的数据库,必须将其名称(而不是"main")指定给sqlite3_backup_init()