From 05d304b7c9f594f4b40ac6fbe398e870fc2adb8f Mon Sep 17 00:00:00 2001 From: hongshibao Date: Sun, 25 Oct 2015 18:31:16 +0800 Subject: [PATCH] add Backup class --- CMakeLists.txt | 2 + include/SQLiteCpp/Backup.h | 66 +++++++++++++++++++++++++++ src/Backup.cpp | 93 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 161 insertions(+) create mode 100644 include/SQLiteCpp/Backup.h create mode 100644 src/Backup.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e198ba..90a328f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,6 +90,7 @@ set(SQLITECPP_SRC ${PROJECT_SOURCE_DIR}/src/Database.cpp ${PROJECT_SOURCE_DIR}/src/Statement.cpp ${PROJECT_SOURCE_DIR}/src/Transaction.cpp + ${PROJECT_SOURCE_DIR}/src/Backup.cpp ) source_group(src FILES ${SQLITECPP_SRC}) @@ -102,6 +103,7 @@ set(SQLITECPP_INC ${PROJECT_SOURCE_DIR}/include/SQLiteCpp/Exception.h ${PROJECT_SOURCE_DIR}/include/SQLiteCpp/Statement.h ${PROJECT_SOURCE_DIR}/include/SQLiteCpp/Transaction.h + ${PROJECT_SOURCE_DIR}/include/SQLiteCpp/Backup.h ) source_group(inc FILES ${SQLITECPP_INC}) diff --git a/include/SQLiteCpp/Backup.h b/include/SQLiteCpp/Backup.h new file mode 100644 index 0000000..d4dd5e0 --- /dev/null +++ b/include/SQLiteCpp/Backup.h @@ -0,0 +1,66 @@ +/** + * @file Backup.h + * @ingroup SQLiteCpp + * @brief Management of a SQLite Database Backup. + * + * Copyright (c) 2015 Shibao HONG (shibaohong@outlook.com) + * + * Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt + * or copy at http://opensource.org/licenses/MIT) + */ +#pragma once + +#include + +#include + +#include + +namespace SQLite +{ + +class Backup +{ +public: + Backup(Database& aDestDatabase, + const char* apDestDatabaseName, + Database& aSrcDatabase, + const char* apSrcDatabaseName); + + Backup(Database& aDestDatabase, + const std::string& aDestDatabaseName, + Database& aSrcDatabase, + const std::string& aSrcDatabaseName); + + Backup(Database& aDestDatabase, + Database& aSrcDatabase); + + virtual ~Backup() noexcept; + + int executeStep(const int aNumPage = -1); + + int remainingPageCount(); + + int totalPageCount(); + + /** + * @brief Return raw pointer to SQLite Database Backup Handle. + * + * This is often needed to mix this wrapper with other libraries or for advance usage not supported by SQLiteCpp. + */ + inline sqlite3_backup* getHandle() const noexcept // nothrow + { + return mpSQLiteBackup; + } + +private: + /// @{ Backup must be non-copyable + Backup(const Backup&); + Backup& operator=(const Backup&); + /// @} + +private: + sqlite3_backup* mpSQLiteBackup; +}; + +} // namespace SQLite diff --git a/src/Backup.cpp b/src/Backup.cpp new file mode 100644 index 0000000..60f22e6 --- /dev/null +++ b/src/Backup.cpp @@ -0,0 +1,93 @@ +/** + * @file Backup.cpp + * @ingroup SQLiteCpp + * @brief Management of a SQLite Database Backup. + * + * Copyright (c) 2015 Shibao HONG (shibaohong@outlook.com) + * + * Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt + * or copy at http://opensource.org/licenses/MIT) + */ + +#include + +#include + +#include + +namespace SQLite +{ + +Backup::Backup(Database& aDestDatabase, + const char *apDestDatabaseName, + Database& aSrcDatabase, + const char *apSrcDatabaseName) : + mpSQLiteBackup(NULL) +{ + mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(), + apDestDatabaseName, + aSrcDatabase.getHandle(), + apSrcDatabaseName); + if (NULL == mpSQLiteBackup) + { + std::string strerr = sqlite3_errmsg(aDestDatabase.getHandle()); + throw SQLite::Exception(strerr); + } +} + +Backup::Backup(Database &aDestDatabase, + const std::string &aDestDatabaseName, + Database &aSrcDatabase, + const std::string &aSrcDatabaseName) : + mpSQLiteBackup(NULL) +{ + mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(), + aDestDatabaseName.c_str(), + aSrcDatabase.getHandle(), + aSrcDatabaseName.c_str()); + if (NULL == mpSQLiteBackup) + { + std::string strerr = sqlite3_errmsg(aDestDatabase.getHandle()); + throw SQLite::Exception(strerr); + } +} + +Backup::Backup(Database &aDestDatabase, Database &aSrcDatabase) : + mpSQLiteBackup(NULL) +{ + mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(), + "main", + aSrcDatabase.getHandle(), + "main"); + if (NULL == mpSQLiteBackup) + { + std::string strerr = sqlite3_errmsg(aDestDatabase.getHandle()); + throw SQLite::Exception(strerr); + } +} + +Backup::~Backup() noexcept +{ + if (NULL != mpSQLiteBackup) + { + sqlite3_backup_finish(mpSQLiteBackup); + } +} + +int Backup::executeStep(const int aNumPage) +{ + const int res = sqlite3_backup_step(mpSQLiteBackup, aNumPage); + return res; +} + +int Backup::remainingPageCount() +{ + return sqlite3_backup_remaining(mpSQLiteBackup); +} + +int Backup::totalPageCount() +{ + return sqlite3_backup_pagecount(mpSQLiteBackup); +} + +} // namespace SQLite