2019-06-26 16:11:16 +00:00
|
|
|
/**
|
|
|
|
* @file Backup.cpp
|
|
|
|
* @ingroup SQLiteCpp
|
|
|
|
* @brief Backup is used to backup a database file in a safe and online way.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2015 Shibao HONG (shibaohong@outlook.com)
|
|
|
|
* Copyright (c) 2015-2019 Sebastien Rombauts (sebastien.rombauts@gmail.com)
|
|
|
|
*
|
|
|
|
* Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt
|
|
|
|
* or copy at http://opensource.org/licenses/MIT)
|
|
|
|
*/
|
|
|
|
#include <SQLiteCpp/Backup.h>
|
|
|
|
#include <SQLiteCpp/Exception.h>
|
|
|
|
#include <sqlite3.h>
|
2019-06-27 03:32:09 +00:00
|
|
|
namespace SQLite {
|
2019-06-26 16:11:16 +00:00
|
|
|
// Initialize resource for SQLite database backup
|
2019-06-27 03:32:09 +00:00
|
|
|
Backup::Backup(Database& aDestDatabase,
|
|
|
|
const char* apDestDatabaseName,
|
|
|
|
Database& aSrcDatabase,
|
|
|
|
const char* apSrcDatabaseName)
|
|
|
|
: mpSQLiteBackup(NULL)
|
2019-06-26 16:11:16 +00:00
|
|
|
{
|
|
|
|
mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(),
|
2019-06-27 03:32:09 +00:00
|
|
|
apDestDatabaseName,
|
|
|
|
aSrcDatabase.getHandle(),
|
|
|
|
apSrcDatabaseName);
|
|
|
|
if (NULL == mpSQLiteBackup) {
|
2019-06-26 16:11:16 +00:00
|
|
|
// If an error occurs, the error code and message are attached to the destination database connection.
|
|
|
|
throw SQLite::Exception(aDestDatabase.getHandle());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Initialize resource for SQLite database backup
|
2019-06-27 03:32:09 +00:00
|
|
|
Backup::Backup(Database& aDestDatabase,
|
|
|
|
const std::string& aDestDatabaseName,
|
|
|
|
Database& aSrcDatabase,
|
|
|
|
const std::string& aSrcDatabaseName)
|
|
|
|
: mpSQLiteBackup(NULL)
|
2019-06-26 16:11:16 +00:00
|
|
|
{
|
|
|
|
mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(),
|
2019-06-27 03:32:09 +00:00
|
|
|
aDestDatabaseName.c_str(),
|
|
|
|
aSrcDatabase.getHandle(),
|
|
|
|
aSrcDatabaseName.c_str());
|
|
|
|
if (NULL == mpSQLiteBackup) {
|
2019-06-26 16:11:16 +00:00
|
|
|
// If an error occurs, the error code and message are attached to the destination database connection.
|
|
|
|
throw SQLite::Exception(aDestDatabase.getHandle());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Initialize resource for SQLite database backup
|
2019-06-27 03:32:09 +00:00
|
|
|
Backup::Backup(Database& aDestDatabase, Database& aSrcDatabase)
|
|
|
|
: mpSQLiteBackup(NULL)
|
2019-06-26 16:11:16 +00:00
|
|
|
{
|
|
|
|
mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(),
|
2019-06-27 03:32:09 +00:00
|
|
|
"main",
|
|
|
|
aSrcDatabase.getHandle(),
|
|
|
|
"main");
|
|
|
|
if (NULL == mpSQLiteBackup) {
|
2019-06-26 16:11:16 +00:00
|
|
|
// If an error occurs, the error code and message are attached to the destination database connection.
|
|
|
|
throw SQLite::Exception(aDestDatabase.getHandle());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Release resource for SQLite database backup
|
|
|
|
Backup::~Backup()
|
|
|
|
{
|
2019-06-27 03:32:09 +00:00
|
|
|
if (NULL != mpSQLiteBackup) {
|
2019-06-26 16:11:16 +00:00
|
|
|
sqlite3_backup_finish(mpSQLiteBackup);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Execute backup step with a given number of source pages to be copied
|
|
|
|
int Backup::executeStep(const int aNumPage /* = -1 */)
|
|
|
|
{
|
|
|
|
const int res = sqlite3_backup_step(mpSQLiteBackup, aNumPage);
|
2019-06-27 03:32:09 +00:00
|
|
|
if (SQLITE_OK != res && SQLITE_DONE != res && SQLITE_BUSY != res && SQLITE_LOCKED != res) {
|
2019-06-26 16:11:16 +00:00
|
|
|
throw SQLite::Exception(sqlite3_errstr(res), res);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
// Get the number of remaining source pages to be copied in this backup process
|
|
|
|
int Backup::getRemainingPageCount()
|
|
|
|
{
|
|
|
|
return sqlite3_backup_remaining(mpSQLiteBackup);
|
|
|
|
}
|
|
|
|
// Get the number of total source pages to be copied in this backup process
|
|
|
|
int Backup::getTotalPageCount()
|
|
|
|
{
|
|
|
|
return sqlite3_backup_pagecount(mpSQLiteBackup);
|
|
|
|
}
|
2019-06-27 03:32:09 +00:00
|
|
|
} // namespace SQLite
|