резервная копия базы данных sqlite c++

Я хочу, чтобы в памяти работала база данных sqlite.

Я могу загрузить базу данных на основе файлов в базу данных в памяти, я могу сделать резервную копию базы данных на основе файлов, но что не удается, так это резервное копирование базы данных в памяти в файл.

Я проверил оба примера, представленные здесь: https://www.sqlite.org/backup.html.

Я имею в виду, я использовал эти примеры. Результат всегда SQLITE_OK для всех вызовов функций sqlite, за исключением 101 для

sqlite3_backup_step

во 2-м примере. Чтобы убедиться, что нет ошибки, я проверил базу данных памяти, содержащую таблицы и данные. В этом случае. Кроме того, использование той же функции резервного копирования очень хорошо работает для файловой базы данных.

Пока я мог исследовать эту линию

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);
}

person nullptr    schedule 07.03.2016    source источник


Ответы (1)


База данных в памяти не имеет страниц, потому что она пуста.

Подключенная база данных остается отдельной, т. е. ее данные не объединяются в резервную копию.

Чтобы создать резервную копию подключенной БД, вы должны указать ее имя (а не «основную») в sqlite3_backup_init().

person CL.    schedule 07.03.2016
comment
Я знаю (как я описал, в нем нет страниц), но какой должен быть вывод? Моя исходная база данных в памяти не пуста (непосредственно перед резервным копированием она создается с 1 таблицей, 5 столбцами и 500 вставленными строками), но резервная копия пуста: ни таблиц, ни данных. - person nullptr; 07.03.2016