SQLite - Как я могу выполнить текущее инкрементное резервное копирование из базы данных IN-MEMORY в базу данных файловой системы? - PullRequest
1 голос
/ 13 марта 2019

Я работаю с базой данных IN-MEMORY.
Когда моя программа запускается, я загружаю данные из базы данных файловой системы в свою базу данных IN-MEMORY.
С этого момента и далее я работаю напрямую с IN-MEMORY db.
Это сделано для достижения высокой производительности.

Кроме того, у меня есть требование, что моя исходная файловая система db будет обновляться каждые несколько секунд.

Для этого я пытался использовать API резервного копирования SQLite .Идея заключалась в том, чтобы создать рабочий поток, который будет сохранять последние модификации каждые несколько секунд:

void WorkerThread()
{
    // Initialize SQLite online-backup ONCE:
    p = sqlite3_backup_init(...);

    loop{
        Sleep(few seconds);

        // Save only intermediate changes (?)
        sqlite3_backup_step(p, -1); // Backup all modifications from last time

    }  while( program is running);

    // Program is exiting...
    sqlite3_backup_finish(p);
}

Проблема, которую я обнаружил, заключалась в том, что этот API нельзя использовать последовательно :
первый вызов sqlite3_backup_step() сохранит всю базу данных, но любые последующие вызовы после изменения некоторых данных ничего не сохранят (!).

Мой вопрос:
Существует ли эффективный и инкрементный способ для поддержания внешней базы данных файловой системы в актуальном состоянии с последним состоянием IN-MEMORY db?

Эффективный и инкрементальный в том смысле, что я могу вызывать его каждые ~ n секунд, и он будет сохранять только самые последние изменения , сделанные с момента его последнего сохранения.

...