From 8f0dda5eab181b0f14f2652b4e984aaaae3f258c Mon Sep 17 00:00:00 2001 From: rtk0c Date: Mon, 27 Jun 2022 18:27:13 -0700 Subject: Start from a clean slate --- 3rdparty/sqlitecpp/source/SQLiteCpp/Assertion.h | 46 -- 3rdparty/sqlitecpp/source/SQLiteCpp/Backup.cpp | 83 --- 3rdparty/sqlitecpp/source/SQLiteCpp/Backup.h | 127 ---- 3rdparty/sqlitecpp/source/SQLiteCpp/Column.cpp | 122 ---- 3rdparty/sqlitecpp/source/SQLiteCpp/Column.h | 291 --------- 3rdparty/sqlitecpp/source/SQLiteCpp/Database.cpp | 452 ------------- 3rdparty/sqlitecpp/source/SQLiteCpp/Database.h | 594 ----------------- 3rdparty/sqlitecpp/source/SQLiteCpp/Exception.cpp | 47 -- 3rdparty/sqlitecpp/source/SQLiteCpp/Exception.h | 92 --- 3rdparty/sqlitecpp/source/SQLiteCpp/ExecuteMany.h | 90 --- 3rdparty/sqlitecpp/source/SQLiteCpp/SQLiteCpp.h | 44 -- 3rdparty/sqlitecpp/source/SQLiteCpp/Savepoint.cpp | 65 -- 3rdparty/sqlitecpp/source/SQLiteCpp/Savepoint.h | 95 --- 3rdparty/sqlitecpp/source/SQLiteCpp/Statement.cpp | 368 ----------- 3rdparty/sqlitecpp/source/SQLiteCpp/Statement.h | 714 --------------------- .../sqlitecpp/source/SQLiteCpp/Transaction.cpp | 83 --- 3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.h | 95 --- 3rdparty/sqlitecpp/source/SQLiteCpp/Utils.h | 31 - 3rdparty/sqlitecpp/source/SQLiteCpp/VariadicBind.h | 98 --- 19 files changed, 3537 deletions(-) delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Assertion.h delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Backup.cpp delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Backup.h delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Column.cpp delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Column.h delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Database.cpp delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Database.h delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Exception.cpp delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Exception.h delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/ExecuteMany.h delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/SQLiteCpp.h delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Savepoint.cpp delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Savepoint.h delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Statement.cpp delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Statement.h delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.cpp delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.h delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/Utils.h delete mode 100644 3rdparty/sqlitecpp/source/SQLiteCpp/VariadicBind.h (limited to '3rdparty/sqlitecpp/source/SQLiteCpp') diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Assertion.h b/3rdparty/sqlitecpp/source/SQLiteCpp/Assertion.h deleted file mode 100644 index b6d00be..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Assertion.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @file Assertion.h - * @ingroup SQLiteCpp - * @brief Definition of the SQLITECPP_ASSERT() macro. - * - * Copyright (c) 2012-2021 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) - */ -#pragma once - -#include - - -/** - * SQLITECPP_ASSERT SQLITECPP_ASSERT() is used in destructors, where exceptions shall not be thrown - * - * Define SQLITECPP_ENABLE_ASSERT_HANDLER at the project level - * and define a SQLite::assertion_failed() assertion handler - * to tell SQLiteC++ to use it instead of assert() when an assertion fail. -*/ -#ifdef SQLITECPP_ENABLE_ASSERT_HANDLER - -// if an assert handler is provided by user code, use it instead of assert() -namespace SQLite -{ - // declaration of the assert handler to define in user code - void assertion_failed(const char* apFile, const long apLine, const char* apFunc, - const char* apExpr, const char* apMsg); - -#ifdef _MSC_VER - #define __func__ __FUNCTION__ -#endif -// call the assert handler provided by user code -#define SQLITECPP_ASSERT(expression, message) \ - if (!(expression)) SQLite::assertion_failed(__FILE__, __LINE__, __func__, #expression, message) -} // namespace SQLite - -#else - -// if no assert handler provided by user code, use standard assert() -// (note: in release mode assert() does nothing) -#define SQLITECPP_ASSERT(expression, message) assert(expression && message) - -#endif diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Backup.cpp b/3rdparty/sqlitecpp/source/SQLiteCpp/Backup.cpp deleted file mode 100644 index 183d314..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Backup.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @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-2021 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 - -#include - -#include - -namespace SQLite -{ - -// Initialize resource for SQLite database backup -Backup::Backup(Database& aDestDatabase, - const char* apDestDatabaseName, - Database& aSrcDatabase, - const char* apSrcDatabaseName) -{ - mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(), - apDestDatabaseName, - aSrcDatabase.getHandle(), - apSrcDatabaseName); - if (nullptr == mpSQLiteBackup) - { - // If an error occurs, the error code and message are attached to the destination database connection. - throw SQLite::Exception(aDestDatabase.getHandle()); - } -} - -Backup::Backup(Database& aDestDatabase, - const std::string& aDestDatabaseName, - Database& aSrcDatabase, - const std::string& aSrcDatabaseName) : - Backup(aDestDatabase, aDestDatabaseName.c_str(), aSrcDatabase, aSrcDatabaseName.c_str()) -{ -} - -Backup::Backup(Database &aDestDatabase, Database &aSrcDatabase) : - Backup(aDestDatabase, "main", aSrcDatabase, "main") -{ -} - -// Release resource for SQLite database backup -Backup::~Backup() -{ - if (mpSQLiteBackup) - { - 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); - if (SQLITE_OK != res && SQLITE_DONE != res && SQLITE_BUSY != res && SQLITE_LOCKED != res) - { - 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); -} - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Backup.h b/3rdparty/sqlitecpp/source/SQLiteCpp/Backup.h deleted file mode 100644 index 21ad662..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Backup.h +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @file Backup.h - * @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-2021 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) - */ -#pragma once - -#include - -#include - -// Forward declaration to avoid inclusion of in a header -struct sqlite3_backup; - -namespace SQLite -{ - -/** - * @brief RAII encapsulation of a SQLite Database Backup process. - * - * A Backup object is used to backup a source database file to a destination database file - * in a safe and online way. - * - * See also the a reference implementation of live backup taken from the official site: - * https://www.sqlite.org/backup.html - */ -class Backup -{ -public: - /** - * @brief Initialize a SQLite Backup object. - * - * Initialize a SQLite Backup object for the source database and destination database. - * The database name is "main" for the main database, "temp" for the temporary database, - * or the name specified after the AS keyword in an ATTACH statement for an attached database. - * - * Exception is thrown in case of error, then the Backup object is NOT constructed. - * - * @param[in] aDestDatabase Destination database connection - * @param[in] apDestDatabaseName Destination database name - * @param[in] aSrcDatabase Source database connection - * @param[in] apSrcDatabaseName Source database name - * - * @throw SQLite::Exception in case of error - */ - Backup(Database& aDestDatabase, - const char* apDestDatabaseName, - Database& aSrcDatabase, - const char* apSrcDatabaseName); - - /** - * @brief Initialize a SQLite Backup object. - * - * Initialize a SQLite Backup object for source database and destination database. - * The database name is "main" for the main database, "temp" for the temporary database, - * or the name specified after the AS keyword in an ATTACH statement for an attached database. - * - * Exception is thrown in case of error, then the Backup object is NOT constructed. - * - * @param[in] aDestDatabase Destination database connection - * @param[in] aDestDatabaseName Destination database name - * @param[in] aSrcDatabase Source database connection - * @param[in] aSrcDatabaseName Source database name - * - * @throw SQLite::Exception in case of error - */ - Backup(Database& aDestDatabase, - const std::string& aDestDatabaseName, - Database& aSrcDatabase, - const std::string& aSrcDatabaseName); - - /** - * @brief Initialize a SQLite Backup object for main databases. - * - * Initialize a SQLite Backup object for source database and destination database. - * Backup the main databases between the source and the destination. - * - * Exception is thrown in case of error, then the Backup object is NOT constructed. - * - * @param[in] aDestDatabase Destination database connection - * @param[in] aSrcDatabase Source database connection - * - * @throw SQLite::Exception in case of error - */ - Backup(Database& aDestDatabase, - Database& aSrcDatabase); - - // Backup is non-copyable - Backup(const Backup&) = delete; - Backup& operator=(const Backup&) = delete; - - /// Release the SQLite Backup resource. - ~Backup(); - - /** - * @brief Execute a step of backup with a given number of source pages to be copied - * - * Exception is thrown when SQLITE_IOERR_XXX, SQLITE_NOMEM, or SQLITE_READONLY is returned - * in sqlite3_backup_step(). These errors are considered fatal, so there is no point - * in retrying the call to executeStep(). - * - * @param[in] aNumPage The number of source pages to be copied, with a negative value meaning all remaining source pages - * - * @return SQLITE_OK/SQLITE_DONE/SQLITE_BUSY/SQLITE_LOCKED - * - * @throw SQLite::Exception in case of error - */ - int executeStep(const int aNumPage = -1); - - /// Return the number of source pages still to be backed up as of the most recent call to executeStep(). - int getRemainingPageCount(); - - /// Return the total number of pages in the source database as of the most recent call to executeStep(). - int getTotalPageCount(); - -private: - // TODO: use std::unique_ptr with a custom deleter to call sqlite3_backup_finish() - sqlite3_backup* mpSQLiteBackup = nullptr; ///< Pointer to SQLite Database Backup Handle -}; - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Column.cpp b/3rdparty/sqlitecpp/source/SQLiteCpp/Column.cpp deleted file mode 100644 index f5dc0d9..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Column.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/** - * @file Column.cpp - * @ingroup SQLiteCpp - * @brief Encapsulation of a Column in a row of the result pointed by the prepared SQLite::Statement. - * - * Copyright (c) 2012-2021 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 - -#include - -#include - - -namespace SQLite -{ - -const int INTEGER = SQLITE_INTEGER; -const int FLOAT = SQLITE_FLOAT; -const int TEXT = SQLITE_TEXT; -const int BLOB = SQLITE_BLOB; -const int Null = SQLITE_NULL; - - -// Encapsulation of a Column in a row of the result pointed by the prepared Statement. -Column::Column(const Statement::TStatementPtr& aStmtPtr, int aIndex) : - mStmtPtr(aStmtPtr), - mIndex(aIndex) -{ - if (!aStmtPtr) - { - throw SQLite::Exception("Statement was destroyed"); - } -} - -// Return the named assigned to this result column (potentially aliased) -const char* Column::getName() const noexcept -{ - return sqlite3_column_name(mStmtPtr.get(), mIndex); -} - -#ifdef SQLITE_ENABLE_COLUMN_METADATA -// Return the name of the table column that is the origin of this result column -const char* Column::getOriginName() const noexcept -{ - return sqlite3_column_origin_name(mStmtPtr.get(), mIndex); -} -#endif - -// Return the integer value of the column specified by its index starting at 0 -int Column::getInt() const noexcept -{ - return sqlite3_column_int(mStmtPtr.get(), mIndex); -} - -// Return the unsigned integer value of the column specified by its index starting at 0 -unsigned Column::getUInt() const noexcept -{ - return static_cast(getInt64()); -} - -// Return the 64bits integer value of the column specified by its index starting at 0 -long long Column::getInt64() const noexcept -{ - return sqlite3_column_int64(mStmtPtr.get(), mIndex); -} - -// Return the double value of the column specified by its index starting at 0 -double Column::getDouble() const noexcept -{ - return sqlite3_column_double(mStmtPtr.get(), mIndex); -} - -// Return a pointer to the text value (NULL terminated string) of the column specified by its index starting at 0 -const char* Column::getText(const char* apDefaultValue /* = "" */) const noexcept -{ - auto pText = reinterpret_cast(sqlite3_column_text(mStmtPtr.get(), mIndex)); - return (pText?pText:apDefaultValue); -} - -// Return a pointer to the blob value (*not* NULL terminated) of the column specified by its index starting at 0 -const void* Column::getBlob() const noexcept -{ - return sqlite3_column_blob(mStmtPtr.get(), mIndex); -} - -// Return a std::string to a TEXT or BLOB column -std::string Column::getString() const -{ - // Note: using sqlite3_column_blob and not sqlite3_column_text - // - no need for sqlite3_column_text to add a \0 on the end, as we're getting the bytes length directly - auto data = static_cast(sqlite3_column_blob(mStmtPtr.get(), mIndex)); - - // SQLite docs: "The safest policy is to invoke… sqlite3_column_blob() followed by sqlite3_column_bytes()" - // Note: std::string is ok to pass nullptr as first arg, if length is 0 - return std::string(data, sqlite3_column_bytes(mStmtPtr.get(), mIndex)); -} - -// Return the type of the value of the column -int Column::getType() const noexcept -{ - return sqlite3_column_type(mStmtPtr.get(), mIndex); -} - -// Return the number of bytes used by the text value of the column -int Column::getBytes() const noexcept -{ - return sqlite3_column_bytes(mStmtPtr.get(), mIndex); -} - -// Standard std::ostream inserter -std::ostream& operator<<(std::ostream& aStream, const Column& aColumn) -{ - aStream.write(aColumn.getText(), aColumn.getBytes()); - return aStream; -} - - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Column.h b/3rdparty/sqlitecpp/source/SQLiteCpp/Column.h deleted file mode 100644 index bc349f9..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Column.h +++ /dev/null @@ -1,291 +0,0 @@ -/** - * @file Column.h - * @ingroup SQLiteCpp - * @brief Encapsulation of a Column in a row of the result pointed by the prepared SQLite::Statement. - * - * Copyright (c) 2012-2021 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) - */ -#pragma once - -#include -#include - -#include -#include -#include // For INT_MAX - -// Forward declarations to avoid inclusion of in a header -struct sqlite3_stmt; - -namespace SQLite -{ - -extern const int INTEGER; ///< SQLITE_INTEGER -extern const int FLOAT; ///< SQLITE_FLOAT -extern const int TEXT; ///< SQLITE_TEXT -extern const int BLOB; ///< SQLITE_BLOB -extern const int Null; ///< SQLITE_NULL - -/** - * @brief Encapsulation of a Column in a row of the result pointed by the prepared Statement. - * - * A Column is a particular field of SQLite data in the current row of result - * of the Statement : it points to a single cell. - * - * Its value can be expressed as a text, and, when applicable, as a numeric - * (integer or floating point) or a binary blob. - * - * Thread-safety: a Column object shall not be shared by multiple threads, because : - * 1) in the SQLite "Thread Safe" mode, "SQLite can be safely used by multiple threads - * provided that no single database connection is used simultaneously in two or more threads." - * 2) the SQLite "Serialized" mode is not supported by SQLiteC++, - * because of the way it shares the underling SQLite precompiled statement - * in a custom shared pointer (See the inner class "Statement::Ptr"). - */ -class Column -{ -public: - /** - * @brief Encapsulation of a Column in a Row of the result. - * - * @param[in] aStmtPtr Shared pointer to the prepared SQLite Statement Object. - * @param[in] aIndex Index of the column in the row of result, starting at 0 - */ - explicit Column(const Statement::TStatementPtr& aStmtPtr, int aIndex); - - // default destructor: the finalization will be done by the destructor of the last shared pointer - // default copy constructor and assignment operator are perfectly suited : - // they copy the Statement::Ptr which in turn increments the reference counter. - - /** - * @brief Return a pointer to the named assigned to this result column (potentially aliased) - * - * @see getOriginName() to get original column name (not aliased) - */ - const char* getName() const noexcept; - -#ifdef SQLITE_ENABLE_COLUMN_METADATA - /** - * @brief Return a pointer to the table column name that is the origin of this result column - * - * Require definition of the SQLITE_ENABLE_COLUMN_METADATA preprocessor macro : - * - when building the SQLite library itself (which is the case for the Debian libsqlite3 binary for instance), - * - and also when compiling this wrapper. - */ - const char* getOriginName() const noexcept; -#endif - - /// Return the integer value of the column. - int getInt() const noexcept; - /// Return the 32bits unsigned integer value of the column (note that SQLite3 does not support unsigned 64bits). - unsigned getUInt() const noexcept; - /// Return the 64bits integer value of the column (note that SQLite3 does not support unsigned 64bits). - long long getInt64() const noexcept; - /// Return the double (64bits float) value of the column - double getDouble() const noexcept; - /** - * @brief Return a pointer to the text value (NULL terminated string) of the column. - * - * @warning The value pointed at is only valid while the statement is valid (ie. not finalized), - * thus you must copy it before using it beyond its scope (to a std::string for instance). - */ - const char* getText(const char* apDefaultValue = "") const noexcept; - /** - * @brief Return a pointer to the binary blob value of the column. - * - * @warning The value pointed at is only valid while the statement is valid (ie. not finalized), - * thus you must copy it before using it beyond its scope (to a std::string for instance). - */ - const void* getBlob() const noexcept; - /** - * @brief Return a std::string for a TEXT or BLOB column. - * - * Note this correctly handles strings that contain null bytes. - */ - std::string getString() const; - - /** - * @brief Return the type of the value of the column - * - * Return either SQLite::INTEGER, SQLite::FLOAT, SQLite::TEXT, SQLite::BLOB, or SQLite::Null. - * - * @warning After a type conversion (by a call to a getXxx on a Column of a Yyy type), - * the value returned by sqlite3_column_type() is undefined. - */ - int getType() const noexcept; - - /// Test if the column is an integer type value (meaningful only before any conversion) - bool isInteger() const noexcept - { - return (SQLite::INTEGER == getType()); - } - /// Test if the column is a floating point type value (meaningful only before any conversion) - bool isFloat() const noexcept - { - return (SQLite::FLOAT == getType()); - } - /// Test if the column is a text type value (meaningful only before any conversion) - bool isText() const noexcept - { - return (SQLite::TEXT == getType()); - } - /// Test if the column is a binary blob type value (meaningful only before any conversion) - bool isBlob() const noexcept - { - return (SQLite::BLOB == getType()); - } - /// Test if the column is NULL (meaningful only before any conversion) - bool isNull() const noexcept - { - return (SQLite::Null == getType()); - } - - /** - * @brief Return the number of bytes used by the text (or blob) value of the column - * - * Return either : - * - size in bytes (not in characters) of the string returned by getText() without the '\0' terminator - * - size in bytes of the string representation of the numerical value (integer or double) - * - size in bytes of the binary blob returned by getBlob() - * - 0 for a NULL value - */ - int getBytes() const noexcept; - - /// Alias returning the number of bytes used by the text (or blob) value of the column - int size() const noexcept - { - return getBytes (); - } - - /// Inline cast operator to char - operator char() const - { - return static_cast(getInt()); - } - /// Inline cast operator to unsigned char - operator unsigned char() const - { - return static_cast(getInt()); - } - /// Inline cast operator to short - operator short() const - { - return static_cast(getInt()); - } - /// Inline cast operator to unsigned short - operator unsigned short() const - { - return static_cast(getInt()); - } - - /// Inline cast operator to int - operator int() const - { - return getInt(); - } - /// Inline cast operator to 32bits unsigned integer - operator unsigned int() const - { - return getUInt(); - } -#if (LONG_MAX == INT_MAX) // 4 bytes "long" type means the data model is ILP32 or LLP64 (Win64 Visual C++ and MinGW) - /// Inline cast operator to 32bits long - operator long() const - { - return getInt(); - } - /// Inline cast operator to 32bits unsigned long - operator unsigned long() const - { - return getUInt(); - } -#else // 8 bytes "long" type means the data model is LP64 (Most Unix-like, Windows when using Cygwin; z/OS) - /// Inline cast operator to 64bits long when the data model of the system is LP64 (Linux 64 bits...) - operator long() const - { - return getInt64(); - } -#endif - - /// Inline cast operator to 64bits integer - operator long long() const - { - return getInt64(); - } - /// Inline cast operator to double - operator double() const - { - return getDouble(); - } - /** - * @brief Inline cast operator to char* - * - * @see getText - */ - operator const char*() const - { - return getText(); - } - /** - * @brief Inline cast operator to void* - * - * @see getBlob - */ - operator const void*() const - { - return getBlob(); - } - - /** - * @brief Inline cast operator to std::string - * - * Handles BLOB or TEXT, which may contain null bytes within - * - * @see getString - */ - operator std::string() const - { - return getString(); - } - -private: - Statement::TStatementPtr mStmtPtr; ///< Shared Pointer to the prepared SQLite Statement Object - int mIndex; ///< Index of the column in the row of result, starting at 0 -}; - -/** - * @brief Standard std::ostream text inserter - * - * Insert the text value of the Column object, using getText(), into the provided stream. - * - * @param[in] aStream Stream to use - * @param[in] aColumn Column object to insert into the provided stream - * - * @return Reference to the stream used - */ -std::ostream& operator<<(std::ostream& aStream, const Column& aColumn); - -#if __cplusplus >= 201402L || (defined(_MSC_VER) && _MSC_VER >= 1900) // c++14: Visual Studio 2015 - -// Create an instance of T from the first N columns, see declaration in Statement.h for full details -template -T Statement::getColumns() -{ - checkRow(); - checkIndex(N - 1); - return getColumns(std::make_integer_sequence{}); -} - -// Helper function called by getColums -template -T Statement::getColumns(const std::integer_sequence) -{ - return T{Column(mpPreparedStatement, Is)...}; -} - -#endif - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Database.cpp b/3rdparty/sqlitecpp/source/SQLiteCpp/Database.cpp deleted file mode 100644 index eb76c88..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Database.cpp +++ /dev/null @@ -1,452 +0,0 @@ -/** - * @file Database.cpp - * @ingroup SQLiteCpp - * @brief Management of a SQLite Database Connection. - * - * Copyright (c) 2012-2021 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 - -#include -#include -#include -#include - -#include -#include -#include - -#ifndef SQLITE_DETERMINISTIC -#define SQLITE_DETERMINISTIC 0x800 -#endif // SQLITE_DETERMINISTIC - - -namespace SQLite -{ - -const int OPEN_READONLY = SQLITE_OPEN_READONLY; -const int OPEN_READWRITE = SQLITE_OPEN_READWRITE; -const int OPEN_CREATE = SQLITE_OPEN_CREATE; -const int OPEN_URI = SQLITE_OPEN_URI; -const int OPEN_MEMORY = SQLITE_OPEN_MEMORY; -const int OPEN_NOMUTEX = SQLITE_OPEN_NOMUTEX; -const int OPEN_FULLMUTEX = SQLITE_OPEN_FULLMUTEX; -const int OPEN_SHAREDCACHE = SQLITE_OPEN_SHAREDCACHE; -const int OPEN_PRIVATECACHE = SQLITE_OPEN_PRIVATECACHE; -#if SQLITE_VERSION_NUMBER >= 3031000 -const int OPEN_NOFOLLOW = SQLITE_OPEN_NOFOLLOW; -#else -const int OPEN_NOFOLLOW = 0; -#endif - -const int OK = SQLITE_OK; - -const char* VERSION = SQLITE_VERSION; -const int VERSION_NUMBER = SQLITE_VERSION_NUMBER; - -// Return SQLite version string using runtime call to the compiled library -const char* getLibVersion() noexcept -{ - return sqlite3_libversion(); -} - -// Return SQLite version number using runtime call to the compiled library -int getLibVersionNumber() noexcept -{ - return sqlite3_libversion_number(); -} - - -// Open the provided database UTF-8 filename with SQLite::OPEN_xxx provided flags. -Database::Database(const char* apFilename, - const int aFlags /* = SQLite::OPEN_READONLY*/, - const int aBusyTimeoutMs /* = 0 */, - const char* apVfs /* = nullptr*/) : - mFilename(apFilename) -{ - sqlite3* handle; - const int ret = sqlite3_open_v2(apFilename, &handle, aFlags, apVfs); - mSQLitePtr.reset(handle); - if (SQLITE_OK != ret) - { - throw SQLite::Exception(handle, ret); - } - if (aBusyTimeoutMs > 0) - { - setBusyTimeout(aBusyTimeoutMs); - } -} - -// Deleter functor to use with smart pointers to close the SQLite database connection in an RAII fashion. -void Database::Deleter::operator()(sqlite3* apSQLite) -{ - const int ret = sqlite3_close(apSQLite); // Calling sqlite3_close() with a nullptr argument is a harmless no-op. - - // Avoid unreferenced variable warning when build in release mode - (void) ret; - - // Only case of error is SQLITE_BUSY: "database is locked" (some statements are not finalized) - // Never throw an exception in a destructor : - SQLITECPP_ASSERT(SQLITE_OK == ret, "database is locked"); // See SQLITECPP_ENABLE_ASSERT_HANDLER -} - -/** - * @brief Set a busy handler that sleeps for a specified amount of time when a table is locked. - * - * This is useful in multithreaded program to handle case where a table is locked for writting by a thread. - * Any other thread cannot access the table and will receive a SQLITE_BUSY error: - * setting a timeout will wait and retry up to the time specified before returning this SQLITE_BUSY error. - * Reading the value of timeout for current connection can be done with SQL query "PRAGMA busy_timeout;". - * Default busy timeout is 0ms. - * - * @param[in] aBusyTimeoutMs Amount of milliseconds to wait before returning SQLITE_BUSY - * - * @throw SQLite::Exception in case of error - */ -void Database::setBusyTimeout(const int aBusyTimeoutMs) -{ - const int ret = sqlite3_busy_timeout(getHandle(), aBusyTimeoutMs); - check(ret); -} - -// Shortcut to execute one or multiple SQL statements without results (UPDATE, INSERT, ALTER, COMMIT, CREATE...). -// Return the number of changes. -int Database::exec(const char* apQueries) -{ - const int ret = tryExec(apQueries); - check(ret); - - // Return the number of rows modified by those SQL statements (INSERT, UPDATE or DELETE only) - return sqlite3_changes(getHandle()); -} - -int Database::tryExec(const char* apQueries) noexcept -{ - return sqlite3_exec(getHandle(), apQueries, nullptr, nullptr, nullptr); -} - -// Shortcut to execute a one step query and fetch the first column of the result. -// WARNING: Be very careful with this dangerous method: you have to -// make a COPY OF THE result, else it will be destroy before the next line -// (when the underlying temporary Statement and Column objects are destroyed) -// this is an issue only for pointer type result (ie. char* and blob) -// (use the Column copy-constructor) -Column Database::execAndGet(const char* apQuery) -{ - Statement query(*this, apQuery); - (void)query.executeStep(); // Can return false if no result, which will throw next line in getColumn() - return query.getColumn(0); -} - -// Shortcut to test if a table exists. -bool Database::tableExists(const char* apTableName) -{ - Statement query(*this, "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?"); - query.bind(1, apTableName); - (void)query.executeStep(); // Cannot return false, as the above query always return a result - return (1 == query.getColumn(0).getInt()); -} - -// Get the rowid of the most recent successful INSERT into the database from the current connection. -long long Database::getLastInsertRowid() const noexcept -{ - return sqlite3_last_insert_rowid(getHandle()); -} - -// Get number of rows modified by last INSERT, UPDATE or DELETE statement (not DROP table). -int Database::getChanges() const noexcept -{ - return sqlite3_changes(getHandle()); -} - -// Get total number of rows modified by all INSERT, UPDATE or DELETE statement since connection. -int Database::getTotalChanges() const noexcept -{ - return sqlite3_total_changes(getHandle()); -} - -// Return the numeric result code for the most recent failed API call (if any). -int Database::getErrorCode() const noexcept -{ - return sqlite3_errcode(getHandle()); -} - -// Return the extended numeric result code for the most recent failed API call (if any). -int Database::getExtendedErrorCode() const noexcept -{ - return sqlite3_extended_errcode(getHandle()); -} - -// Return UTF-8 encoded English language explanation of the most recent failed API call (if any). -const char* Database::getErrorMsg() const noexcept -{ - return sqlite3_errmsg(getHandle()); -} - -// Attach a custom function to your sqlite database. Assumes UTF8 text representation. -// Parameter details can be found here: http://www.sqlite.org/c3ref/create_function.html -void Database::createFunction(const char* apFuncName, - int aNbArg, - bool abDeterministic, - void* apApp, - void (*apFunc)(sqlite3_context *, int, sqlite3_value **), - void (*apStep)(sqlite3_context *, int, sqlite3_value **) /* = nullptr */, - void (*apFinal)(sqlite3_context *) /* = nullptr */, // NOLINT(readability/casting) - void (*apDestroy)(void *) /* = nullptr */) -{ - int textRep = SQLITE_UTF8; - // optimization if deterministic function (e.g. of nondeterministic function random()) - if (abDeterministic) - { - textRep = textRep | SQLITE_DETERMINISTIC; - } - const int ret = sqlite3_create_function_v2(getHandle(), apFuncName, aNbArg, textRep, - apApp, apFunc, apStep, apFinal, apDestroy); - check(ret); -} - -// Load an extension into the sqlite database. Only affects the current connection. -// Parameter details can be found here: http://www.sqlite.org/c3ref/load_extension.html -void Database::loadExtension(const char* apExtensionName, const char *apEntryPointName) -{ -#ifdef SQLITE_OMIT_LOAD_EXTENSION - // Unused - (void)apExtensionName; - (void)apEntryPointName; - - throw SQLite::Exception("sqlite extensions are disabled"); -#else -#ifdef SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION // Since SQLite 3.13 (2016-05-18): - // Security warning: - // It is recommended that the SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION method be used to enable only this interface. - // The use of the sqlite3_enable_load_extension() interface should be avoided to keep the SQL load_extension() - // disabled and prevent SQL injections from giving attackers access to extension loading capabilities. - // (NOTE: not using nullptr: cannot pass object of non-POD type 'std::__1::nullptr_t' through variadic function) - int ret = sqlite3_db_config(getHandle(), SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, NULL); // NOTE: not using nullptr -#else - int ret = sqlite3_enable_load_extension(getHandle(), 1); -#endif - check(ret); - - ret = sqlite3_load_extension(getHandle(), apExtensionName, apEntryPointName, 0); - check(ret); -#endif -} - -// Set the key for the current sqlite database instance. -void Database::key(const std::string& aKey) const -{ - int passLen = static_cast(aKey.length()); -#ifdef SQLITE_HAS_CODEC - if (passLen > 0) - { - const int ret = sqlite3_key(getHandle(), aKey.c_str(), passLen); - check(ret); - } -#else // SQLITE_HAS_CODEC - if (passLen > 0) - { - throw SQLite::Exception("No encryption support, recompile with SQLITE_HAS_CODEC to enable."); - } -#endif // SQLITE_HAS_CODEC -} - -// Reset the key for the current sqlite database instance. -void Database::rekey(const std::string& aNewKey) const -{ -#ifdef SQLITE_HAS_CODEC - int passLen = aNewKey.length(); - if (passLen > 0) - { - const int ret = sqlite3_rekey(getHandle(), aNewKey.c_str(), passLen); - check(ret); - } - else - { - const int ret = sqlite3_rekey(getHandle(), nullptr, 0); - check(ret); - } -#else // SQLITE_HAS_CODEC - static_cast(aNewKey); // silence unused parameter warning - throw SQLite::Exception("No encryption support, recompile with SQLITE_HAS_CODEC to enable."); -#endif // SQLITE_HAS_CODEC -} - -// Test if a file contains an unencrypted database. -bool Database::isUnencrypted(const std::string& aFilename) -{ - if (aFilename.empty()) - { - throw SQLite::Exception("Could not open database, the aFilename parameter was empty."); - } - - std::ifstream fileBuffer(aFilename.c_str(), std::ios::in | std::ios::binary); - char header[16]; - if (fileBuffer.is_open()) - { - fileBuffer.seekg(0, std::ios::beg); - fileBuffer.getline(header, 16); - fileBuffer.close(); - } - else - { - throw SQLite::Exception("Error opening file: " + aFilename); - } - - return strncmp(header, "SQLite format 3\000", 16) == 0; -} - -// Parse header data from a database. -Header Database::getHeaderInfo(const std::string& aFilename) -{ - Header h; - unsigned char buf[100]; - char* pBuf = reinterpret_cast(&buf[0]); - char* pHeaderStr = reinterpret_cast(&h.headerStr[0]); - - if (aFilename.empty()) - { - throw SQLite::Exception("Filename parameter is empty"); - } - - { - std::ifstream fileBuffer(aFilename.c_str(), std::ios::in | std::ios::binary); - if (fileBuffer.is_open()) - { - fileBuffer.seekg(0, std::ios::beg); - fileBuffer.read(pBuf, 100); - fileBuffer.close(); - if (fileBuffer.gcount() < 100) - { - throw SQLite::Exception("File " + aFilename + " is too short"); - } - } - else - { - throw SQLite::Exception("Error opening file " + aFilename); - } - } - - // If the "magic string" can't be found then header is invalid, corrupt or unreadable - memcpy(pHeaderStr, pBuf, 16); - pHeaderStr[15] = '\0'; - if (strncmp(pHeaderStr, "SQLite format 3", 15) != 0) - { - throw SQLite::Exception("Invalid or encrypted SQLite header in file " + aFilename); - } - - h.pageSizeBytes = (buf[16] << 8) | buf[17]; - h.fileFormatWriteVersion = buf[18]; - h.fileFormatReadVersion = buf[19]; - h.reservedSpaceBytes = buf[20]; - h.maxEmbeddedPayloadFrac = buf[21]; - h.minEmbeddedPayloadFrac = buf[22]; - h.leafPayloadFrac = buf[23]; - - h.fileChangeCounter = - (buf[24] << 24) | - (buf[25] << 16) | - (buf[26] << 8) | - (buf[27] << 0); - - h.databaseSizePages = - (buf[28] << 24) | - (buf[29] << 16) | - (buf[30] << 8) | - (buf[31] << 0); - - h.firstFreelistTrunkPage = - (buf[32] << 24) | - (buf[33] << 16) | - (buf[34] << 8) | - (buf[35] << 0); - - h.totalFreelistPages = - (buf[36] << 24) | - (buf[37] << 16) | - (buf[38] << 8) | - (buf[39] << 0); - - h.schemaCookie = - (buf[40] << 24) | - (buf[41] << 16) | - (buf[42] << 8) | - (buf[43] << 0); - - h.schemaFormatNumber = - (buf[44] << 24) | - (buf[45] << 16) | - (buf[46] << 8) | - (buf[47] << 0); - - h.defaultPageCacheSizeBytes = - (buf[48] << 24) | - (buf[49] << 16) | - (buf[50] << 8) | - (buf[51] << 0); - - h.largestBTreePageNumber = - (buf[52] << 24) | - (buf[53] << 16) | - (buf[54] << 8) | - (buf[55] << 0); - - h.databaseTextEncoding = - (buf[56] << 24) | - (buf[57] << 16) | - (buf[58] << 8) | - (buf[59] << 0); - - h.userVersion = - (buf[60] << 24) | - (buf[61] << 16) | - (buf[62] << 8) | - (buf[63] << 0); - - h.incrementalVaccumMode = - (buf[64] << 24) | - (buf[65] << 16) | - (buf[66] << 8) | - (buf[67] << 0); - - h.applicationId = - (buf[68] << 24) | - (buf[69] << 16) | - (buf[70] << 8) | - (buf[71] << 0); - - h.versionValidFor = - (buf[92] << 24) | - (buf[93] << 16) | - (buf[94] << 8) | - (buf[95] << 0); - - h.sqliteVersion = - (buf[96] << 24) | - (buf[97] << 16) | - (buf[98] << 8) | - (buf[99] << 0); - - return h; -} - -void Database::backup(const char* apFilename, BackupType aType) -{ - // Open the database file identified by apFilename - Database otherDatabase(apFilename, SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE); - - // For a 'Save' operation, data is copied from the current Database to the other. A 'Load' is the reverse. - Database& src = (aType == Save ? *this : otherDatabase); - Database& dest = (aType == Save ? otherDatabase : *this); - - // Set up the backup procedure to copy between the "main" databases of each connection - Backup bkp(dest, src); - bkp.executeStep(); // Execute all steps at once - - // RAII Finish Backup an Close the other Database -} - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Database.h b/3rdparty/sqlitecpp/source/SQLiteCpp/Database.h deleted file mode 100644 index 7ee45d8..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Database.h +++ /dev/null @@ -1,594 +0,0 @@ -/** - * @file Database.h - * @ingroup SQLiteCpp - * @brief Management of a SQLite Database Connection. - * - * Copyright (c) 2012-2021 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) - */ -#pragma once - -#include - -// c++17: MinGW GCC version > 8 -// c++17: Visual Studio 2017 version 15.7 -// c++17: macOS unless targetting compatibility with macOS < 10.15 -#if __cplusplus >= 201703L - #if defined(__MINGW32__) || defined(__MINGW64__) - #if __GNUC__ > 8 // MinGW requires GCC version > 8 for std::filesystem - #define SQLITECPP_HAVE_STD_FILESYSTEM - #endif - #elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 - // macOS clang won't less us touch std::filesystem if we're targetting earlier than 10.15 - #else - #define SQLITECPP_HAVE_STD_FILESYSTEM - #endif -#elif defined(_MSVC_LANG) && _MSVC_LANG >= 201703L - #define SQLITECPP_HAVE_STD_FILESYSTEM -#endif - -#ifdef SQLITECPP_HAVE_STD_FILESYSTEM -#include -#endif // c++17 and a suitable compiler - -#include -#include - -// Forward declarations to avoid inclusion of in a header -struct sqlite3; -struct sqlite3_context; - -#ifndef SQLITE_USE_LEGACY_STRUCT // Since SQLITE 3.19 (used by default since SQLiteCpp 2.1.0) -typedef struct sqlite3_value sqlite3_value; -#else // Before SQLite 3.19 (legacy struct forward declaration can be activated with CMake SQLITECPP_LEGACY_STRUCT var) -struct Mem; -typedef struct Mem sqlite3_value; -#endif - - -namespace SQLite -{ - -// Those public constants enable most usages of SQLiteCpp without including in the client application. - -/// The database is opened in read-only mode. If the database does not already exist, an error is returned. -extern const int OPEN_READONLY; // SQLITE_OPEN_READONLY -/// The database is opened for reading and writing if possible, or reading only if the file is write protected -/// by the operating system. In either case the database must already exist, otherwise an error is returned. -extern const int OPEN_READWRITE; // SQLITE_OPEN_READWRITE -/// With OPEN_READWRITE: The database is opened for reading and writing, and is created if it does not already exist. -extern const int OPEN_CREATE; // SQLITE_OPEN_CREATE -/// Enable URI filename interpretation, parsed according to RFC 3986 (ex. "file:data.db?mode=ro&cache=private") -extern const int OPEN_URI; // SQLITE_OPEN_URI -/// Open in memory database -extern const int OPEN_MEMORY; // SQLITE_OPEN_MEMORY -/// Open database in multi-thread threading mode -extern const int OPEN_NOMUTEX; // SQLITE_OPEN_NOMUTEX -/// Open database with thread-safety in serialized threading mode -extern const int OPEN_FULLMUTEX; // SQLITE_OPEN_FULLMUTEX -/// Open database with shared cache enabled -extern const int OPEN_SHAREDCACHE; // SQLITE_OPEN_SHAREDCACHE -/// Open database with shared cache disabled -extern const int OPEN_PRIVATECACHE; // SQLITE_OPEN_PRIVATECACHE -/// Database filename is not allowed to be a symbolic link (Note: only since SQlite 3.31.0 from 2020-01-22) -extern const int OPEN_NOFOLLOW; // SQLITE_OPEN_NOFOLLOW - - -extern const int OK; ///< SQLITE_OK (used by check() bellow) - -extern const char* VERSION; ///< SQLITE_VERSION string from the sqlite3.h used at compile time -extern const int VERSION_NUMBER; ///< SQLITE_VERSION_NUMBER from the sqlite3.h used at compile time - -/// Return SQLite version string using runtime call to the compiled library -const char* getLibVersion() noexcept; -/// Return SQLite version number using runtime call to the compiled library -int getLibVersionNumber() noexcept; - -// Public structure for representing all fields contained within the SQLite header. -// Official documentation for fields: https://www.sqlite.org/fileformat.html#the_database_header -struct Header { - unsigned char headerStr[16]; - unsigned int pageSizeBytes; - unsigned char fileFormatWriteVersion; - unsigned char fileFormatReadVersion; - unsigned char reservedSpaceBytes; - unsigned char maxEmbeddedPayloadFrac; - unsigned char minEmbeddedPayloadFrac; - unsigned char leafPayloadFrac; - unsigned long fileChangeCounter; - unsigned long databaseSizePages; - unsigned long firstFreelistTrunkPage; - unsigned long totalFreelistPages; - unsigned long schemaCookie; - unsigned long schemaFormatNumber; - unsigned long defaultPageCacheSizeBytes; - unsigned long largestBTreePageNumber; - unsigned long databaseTextEncoding; - unsigned long userVersion; - unsigned long incrementalVaccumMode; - unsigned long applicationId; - unsigned long versionValidFor; - unsigned long sqliteVersion; -}; - -/** - * @brief RAII management of a SQLite Database Connection. - * - * A Database object manage a list of all SQLite Statements associated with the - * underlying SQLite 3 database connection. - * - * Resource Acquisition Is Initialization (RAII) means that the Database Connection - * is opened in the constructor and closed in the destructor, so that there is - * no need to worry about memory management or the validity of the underlying SQLite Connection. - * - * Thread-safety: a Database object shall not be shared by multiple threads, because : - * 1) in the SQLite "Thread Safe" mode, "SQLite can be safely used by multiple threads - * provided that no single database connection is used simultaneously in two or more threads." - * 2) the SQLite "Serialized" mode is not supported by SQLiteC++, - * because of the way it shares the underling SQLite precompiled statement - * in a custom shared pointer (See the inner class "Statement::Ptr"). - */ -class Database -{ - friend class Statement; // Give Statement constructor access to the mSQLitePtr Connection Handle - -public: - /** - * @brief Open the provided database UTF-8 filename. - * - * Uses sqlite3_open_v2() with readonly default flag, which is the opposite behavior - * of the old sqlite3_open() function (READWRITE+CREATE). - * This makes sense if you want to use it on a readonly filesystem - * or to prevent creation of a void file when a required file is missing. - * - * Exception is thrown in case of error, then the Database object is NOT constructed. - * - * @param[in] apFilename UTF-8 path/uri to the database file ("filename" sqlite3 parameter) - * @param[in] aFlags SQLite::OPEN_READONLY/SQLite::OPEN_READWRITE/SQLite::OPEN_CREATE... - * @param[in] aBusyTimeoutMs Amount of milliseconds to wait before returning SQLITE_BUSY (see setBusyTimeout()) - * @param[in] apVfs UTF-8 name of custom VFS to use, or nullptr for sqlite3 default - * - * @throw SQLite::Exception in case of error - */ - Database(const char* apFilename, - const int aFlags = SQLite::OPEN_READONLY, - const int aBusyTimeoutMs = 0, - const char* apVfs = nullptr); - - /** - * @brief Open the provided database UTF-8 filename. - * - * Uses sqlite3_open_v2() with readonly default flag, which is the opposite behavior - * of the old sqlite3_open() function (READWRITE+CREATE). - * This makes sense if you want to use it on a readonly filesystem - * or to prevent creation of a void file when a required file is missing. - * - * Exception is thrown in case of error, then the Database object is NOT constructed. - * - * @param[in] aFilename UTF-8 path/uri to the database file ("filename" sqlite3 parameter) - * @param[in] aFlags SQLite::OPEN_READONLY/SQLite::OPEN_READWRITE/SQLite::OPEN_CREATE... - * @param[in] aBusyTimeoutMs Amount of milliseconds to wait before returning SQLITE_BUSY (see setBusyTimeout()) - * @param[in] aVfs UTF-8 name of custom VFS to use, or empty string for sqlite3 default - * - * @throw SQLite::Exception in case of error - */ - Database(const std::string& aFilename, - const int aFlags = SQLite::OPEN_READONLY, - const int aBusyTimeoutMs = 0, - const std::string& aVfs = "") : - Database(aFilename.c_str(), aFlags, aBusyTimeoutMs, aVfs.empty() ? nullptr : aVfs.c_str()) - { - } - - #ifdef SQLITECPP_HAVE_STD_FILESYSTEM - - /** - * @brief Open the provided database std::filesystem::path. - * - * @note This feature requires std=C++17 - * - * Uses sqlite3_open_v2() with readonly default flag, which is the opposite behavior - * of the old sqlite3_open() function (READWRITE+CREATE). - * This makes sense if you want to use it on a readonly filesystem - * or to prevent creation of a void file when a required file is missing. - * - * Exception is thrown in case of error, then the Database object is NOT constructed. - * - * @param[in] apFilename Path/uri to the database file ("filename" sqlite3 parameter) - * @param[in] aFlags SQLite::OPEN_READONLY/SQLite::OPEN_READWRITE/SQLite::OPEN_CREATE... - * @param[in] aBusyTimeoutMs Amount of milliseconds to wait before returning SQLITE_BUSY (see setBusyTimeout()) - * @param[in] apVfs UTF-8 name of custom VFS to use, or nullptr for sqlite3 default - * - * @throw SQLite::Exception in case of error - */ - Database(const std::filesystem::path& apFilename, - const int aFlags = SQLite::OPEN_READONLY, - const int aBusyTimeoutMs = 0, - const std::string& aVfs = "") : - Database(reinterpret_cast(apFilename.u8string().c_str()), - aFlags, aBusyTimeoutMs, aVfs.empty() ? nullptr : aVfs.c_str()) - { - } - - #endif // have std::filesystem - - // Database is non-copyable - Database(const Database&) = delete; - Database& operator=(const Database&) = delete; - - // Database is movable - Database(Database&& aDatabase) = default; - Database& operator=(Database&& aDatabase) = default; - - /** - * @brief Close the SQLite database connection. - * - * All SQLite statements must have been finalized before, - * so all Statement objects must have been unregistered. - * - * @warning assert in case of error - */ - ~Database() = default; - - // Deleter functor to use with smart pointers to close the SQLite database connection in an RAII fashion. - struct Deleter - { - void operator()(sqlite3* apSQLite); - }; - - /** - * @brief Set a busy handler that sleeps for a specified amount of time when a table is locked. - * - * This is useful in multithreaded program to handle case where a table is locked for writing by a thread. - * Any other thread cannot access the table and will receive a SQLITE_BUSY error: - * setting a timeout will wait and retry up to the time specified before returning this SQLITE_BUSY error. - * Reading the value of timeout for current connection can be done with SQL query "PRAGMA busy_timeout;". - * Default busy timeout is 0ms. - * - * @param[in] aBusyTimeoutMs Amount of milliseconds to wait before returning SQLITE_BUSY - * - * @throw SQLite::Exception in case of error - */ - void setBusyTimeout(const int aBusyTimeoutMs); - - /** - * @brief Shortcut to execute one or multiple statements without results. Return the number of changes. - * - * This is useful for any kind of statements other than the Data Query Language (DQL) "SELECT" : - * - Data Manipulation Language (DML) statements "INSERT", "UPDATE" and "DELETE" - * - Data Definition Language (DDL) statements "CREATE", "ALTER" and "DROP" - * - Data Control Language (DCL) statements "GRANT", "REVOKE", "COMMIT" and "ROLLBACK" - * - * @see Database::tryExec() to execute, returning the sqlite result code - * @see Statement::exec() to handle precompiled statements (for better performances) without results - * @see Statement::executeStep() to handle "SELECT" queries with results - * - * @param[in] apQueries one or multiple UTF-8 encoded, semicolon-separate SQL statements - * - * @return number of rows modified by the *last* INSERT, UPDATE or DELETE statement (beware of multiple statements) - * @warning undefined for CREATE or DROP table: returns the value of a previous INSERT, UPDATE or DELETE statement. - * - * @throw SQLite::Exception in case of error - */ - int exec(const char* apQueries); - - /** - * @brief Shortcut to execute one or multiple statements without results. - * - * This is useful for any kind of statements other than the Data Query Language (DQL) "SELECT" : - * - Data Manipulation Language (DML) statements "INSERT", "UPDATE" and "DELETE" - * - Data Definition Language (DDL) statements "CREATE", "ALTER" and "DROP" - * - Data Control Language (DCL) statements "GRANT", "REVOKE", "COMMIT" and "ROLLBACK" - * - * @see Database::tryExec() to execute, returning the sqlite result code - * @see Statement::exec() to handle precompiled statements (for better performances) without results - * @see Statement::executeStep() to handle "SELECT" queries with results - * - * @param[in] aQueries one or multiple UTF-8 encoded, semicolon-separate SQL statements - * - * @return number of rows modified by the *last* INSERT, UPDATE or DELETE statement (beware of multiple statements) - * @warning undefined for CREATE or DROP table: returns the value of a previous INSERT, UPDATE or DELETE statement. - * - * @throw SQLite::Exception in case of error - */ - int exec(const std::string& aQueries) - { - return exec(aQueries.c_str()); - } - - /** - * @brief Try to execute one or multiple statements, returning the sqlite result code. - * - * This is useful for any kind of statements other than the Data Query Language (DQL) "SELECT" : - * - Data Manipulation Language (DML) statements "INSERT", "UPDATE" and "DELETE" - * - Data Definition Language (DDL) statements "CREATE", "ALTER" and "DROP" - * - Data Control Language (DCL) statements "GRANT", "REVOKE", "COMMIT" and "ROLLBACK" - * - * @see exec() to execute, returning number of rows modified - * - * @param[in] aQueries one or multiple UTF-8 encoded, semicolon-separate SQL statements - * - * @return the sqlite result code. - */ - int tryExec(const char* apQueries) noexcept; - - /** - * @brief Try to execute one or multiple statements, returning the sqlite result code. - * - * This is useful for any kind of statements other than the Data Query Language (DQL) "SELECT" : - * - Data Manipulation Language (DML) statements "INSERT", "UPDATE" and "DELETE" - * - Data Definition Language (DDL) statements "CREATE", "ALTER" and "DROP" - * - Data Control Language (DCL) statements "GRANT", "REVOKE", "COMMIT" and "ROLLBACK" - * - * @see exec() to execute, returning number of rows modified - * - * @param[in] aQueries one or multiple UTF-8 encoded, semicolon-separate SQL statements - * - * @return the sqlite result code. - */ - int tryExec(const std::string aQueries) noexcept - { - return tryExec(aQueries.c_str()); - } - - /** - * @brief Shortcut to execute a one step query and fetch the first column of the result. - * - * This is a shortcut to execute a simple statement with a single result. - * This should be used only for non reusable queries (else you should use a Statement with bind()). - * This should be used only for queries with expected results (else an exception is fired). - * - * @warning WARNING: Be very careful with this dangerous method: you have to - * make a COPY OF THE result, else it will be destroy before the next line - * (when the underlying temporary Statement and Column objects are destroyed) - * - * @see also Statement class for handling queries with multiple results - * - * @param[in] apQuery an UTF-8 encoded SQL query - * - * @return a temporary Column object with the first column of result. - * - * @throw SQLite::Exception in case of error - */ - Column execAndGet(const char* apQuery); - - /** - * @brief Shortcut to execute a one step query and fetch the first column of the result. - * - * This is a shortcut to execute a simple statement with a single result. - * This should be used only for non reusable queries (else you should use a Statement with bind()). - * This should be used only for queries with expected results (else an exception is fired). - * - * @warning WARNING: Be very careful with this dangerous method: you have to - * make a COPY OF THE result, else it will be destroy before the next line - * (when the underlying temporary Statement and Column objects are destroyed) - * - * @see also Statement class for handling queries with multiple results - * - * @param[in] aQuery an UTF-8 encoded SQL query - * - * @return a temporary Column object with the first column of result. - * - * @throw SQLite::Exception in case of error - */ - Column execAndGet(const std::string& aQuery) - { - return execAndGet(aQuery.c_str()); - } - - /** - * @brief Shortcut to test if a table exists. - * - * Table names are case sensitive. - * - * @param[in] apTableName an UTF-8 encoded case sensitive Table name - * - * @return true if the table exists. - * - * @throw SQLite::Exception in case of error - */ - bool tableExists(const char* apTableName); - - /** - * @brief Shortcut to test if a table exists. - * - * Table names are case sensitive. - * - * @param[in] aTableName an UTF-8 encoded case sensitive Table name - * - * @return true if the table exists. - * - * @throw SQLite::Exception in case of error - */ - bool tableExists(const std::string& aTableName) - { - return tableExists(aTableName.c_str()); - } - - /** - * @brief Get the rowid of the most recent successful INSERT into the database from the current connection. - * - * Each entry in an SQLite table always has a unique 64-bit signed integer key called the rowid. - * If the table has a column of type INTEGER PRIMARY KEY, then it is an alias for the rowid. - * - * @return Rowid of the most recent successful INSERT into the database, or 0 if there was none. - */ - long long getLastInsertRowid() const noexcept; - - /// Get number of rows modified by last INSERT, UPDATE or DELETE statement (not DROP table). - int getChanges() const noexcept; - - /// Get total number of rows modified by all INSERT, UPDATE or DELETE statement since connection (not DROP table). - int getTotalChanges() const noexcept; - - /// Return the numeric result code for the most recent failed API call (if any). - int getErrorCode() const noexcept; - /// Return the extended numeric result code for the most recent failed API call (if any). - int getExtendedErrorCode() const noexcept; - /// Return UTF-8 encoded English language explanation of the most recent failed API call (if any). - const char* getErrorMsg() const noexcept; - - /// Return the filename used to open the database. - const std::string& getFilename() const noexcept - { - return mFilename; - } - - /** - * @brief Return raw pointer to SQLite Database Connection Handle. - * - * This is often needed to mix this wrapper with other libraries or for advance usage not supported by SQLiteCpp. - */ - sqlite3* getHandle() const noexcept - { - return mSQLitePtr.get(); - } - - /** - * @brief Create or redefine a SQL function or aggregate in the sqlite database. - * - * This is the equivalent of the sqlite3_create_function_v2 command. - * @see http://www.sqlite.org/c3ref/create_function.html - * - * @note UTF-8 text encoding assumed. - * - * @param[in] apFuncName Name of the SQL function to be created or redefined - * @param[in] aNbArg Number of arguments in the function - * @param[in] abDeterministic Optimize for deterministic functions (most are). A random number generator is not. - * @param[in] apApp Arbitrary pointer of user data, accessible with sqlite3_user_data(). - * @param[in] apFunc Pointer to a C-function to implement a scalar SQL function (apStep & apFinal nullptr) - * @param[in] apStep Pointer to a C-function to implement an aggregate SQL function (apFunc nullptr) - * @param[in] apFinal Pointer to a C-function to implement an aggregate SQL function (apFunc nullptr) - * @param[in] apDestroy If not nullptr, then it is the destructor for the application data pointer. - * - * @throw SQLite::Exception in case of error - */ - void createFunction(const char* apFuncName, - int aNbArg, - bool abDeterministic, - void* apApp, - void (*apFunc)(sqlite3_context *, int, sqlite3_value **), - void (*apStep)(sqlite3_context *, int, sqlite3_value **) = nullptr, - void (*apFinal)(sqlite3_context *) = nullptr, // NOLINT(readability/casting) - void (*apDestroy)(void *) = nullptr); - - /** - * @brief Load a module into the current sqlite database instance. - * - * This is the equivalent of the sqlite3_load_extension call, but additionally enables - * module loading support prior to loading the requested module. - * - * @see http://www.sqlite.org/c3ref/load_extension.html - * - * @note UTF-8 text encoding assumed. - * - * @param[in] apExtensionName Name of the shared library containing extension - * @param[in] apEntryPointName Name of the entry point (nullptr to let sqlite work it out) - * - * @throw SQLite::Exception in case of error - */ - void loadExtension(const char* apExtensionName, const char* apEntryPointName); - - /** - * @brief Set the key for the current sqlite database instance. - * - * This is the equivalent of the sqlite3_key call and should thus be called - * directly after opening the database. - * Open encrypted database -> call db.key("secret") -> database ready - * - * @param[in] aKey Key to decode/encode the database - * - * @throw SQLite::Exception in case of error - */ - void key(const std::string& aKey) const; - - /** - * @brief Reset the key for the current sqlite database instance. - * - * This is the equivalent of the sqlite3_rekey call and should thus be called - * after the database has been opened with a valid key. To decrypt a - * database, call this method with an empty string. - * Open normal database -> call db.rekey("secret") -> encrypted database, database ready - * Open encrypted database -> call db.key("secret") -> call db.rekey("newsecret") -> change key, database ready - * Open encrypted database -> call db.key("secret") -> call db.rekey("") -> decrypted database, database ready - * - * @param[in] aNewKey New key to encode the database - * - * @throw SQLite::Exception in case of error - */ - void rekey(const std::string& aNewKey) const; - - /** - * @brief Test if a file contains an unencrypted database. - * - * This is a simple test that reads the first bytes of a database file and - * compares them to the standard header for unencrypted databases. If the - * header does not match the standard string, we assume that we have an - * encrypted file. - * - * @param[in] aFilename path/uri to a file - * - * @return true if the database has the standard header. - * - * @throw SQLite::Exception in case of error - */ - static bool isUnencrypted(const std::string& aFilename); - - /** - * @brief Parse SQLite header data from a database file. - * - * This function reads the first 100 bytes of a SQLite database file - * and reconstructs groups of individual bytes into the associated fields - * in a Header object. - * - * @param[in] aFilename path/uri to a file - * - * @return Header object containing file data - * - * @throw SQLite::Exception in case of error - */ - static Header getHeaderInfo(const std::string& aFilename); - - // Parse SQLite header data from a database file. - Header getHeaderInfo() - { - return getHeaderInfo(mFilename); - } - - /** - * @brief BackupType for the backup() method - */ - enum BackupType { Save, Load }; - - /** - * @brief Load or save the database content. - * - * This function is used to load the contents of a database file on disk - * into the "main" database of open database connection, or to save the current - * contents of the database into a database file on disk. - * - * @throw SQLite::Exception in case of error - */ - void backup(const char* apFilename, BackupType aType); - - /** - * @brief Check if aRet equal SQLITE_OK, else throw a SQLite::Exception with the SQLite error message - */ - void check(const int aRet) const - { - if (SQLite::OK != aRet) - { - throw SQLite::Exception(getHandle(), aRet); - } - } - -private: - // TODO: perhaps switch to having Statement sharing a pointer to the Connexion - std::unique_ptr mSQLitePtr; ///< Pointer to SQLite Database Connection Handle - std::string mFilename; ///< UTF-8 filename used to open the database -}; - - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Exception.cpp b/3rdparty/sqlitecpp/source/SQLiteCpp/Exception.cpp deleted file mode 100644 index 0dc644f..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Exception.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @file Exception.cpp - * @ingroup SQLiteCpp - * @brief Encapsulation of the error message from SQLite3 on a std::runtime_error. - * - * Copyright (c) 2012-2021 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 - -#include - - -namespace SQLite -{ - -Exception::Exception(const char* aErrorMessage, int ret) : - std::runtime_error(aErrorMessage), - mErrcode(ret), - mExtendedErrcode(-1) -{ -} - -Exception::Exception(sqlite3* apSQLite) : - std::runtime_error(sqlite3_errmsg(apSQLite)), - mErrcode(sqlite3_errcode(apSQLite)), - mExtendedErrcode(sqlite3_extended_errcode(apSQLite)) -{ -} - -Exception::Exception(sqlite3* apSQLite, int ret) : - std::runtime_error(sqlite3_errmsg(apSQLite)), - mErrcode(ret), - mExtendedErrcode(sqlite3_extended_errcode(apSQLite)) -{ -} - -// Return a string, solely based on the error code -const char* Exception::getErrorStr() const noexcept -{ - return sqlite3_errstr(mErrcode); -} - - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Exception.h b/3rdparty/sqlitecpp/source/SQLiteCpp/Exception.h deleted file mode 100644 index efd6356..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Exception.h +++ /dev/null @@ -1,92 +0,0 @@ -/** - * @file Exception.h - * @ingroup SQLiteCpp - * @brief Encapsulation of the error message from SQLite3 on a std::runtime_error. - * - * Copyright (c) 2012-2021 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) - */ -#pragma once - -#include -#include - -// Forward declaration to avoid inclusion of in a header -struct sqlite3; - -namespace SQLite -{ - - -/** - * @brief Encapsulation of the error message from SQLite3, based on std::runtime_error. - */ -class Exception : public std::runtime_error -{ -public: - /** - * @brief Encapsulation of the error message from SQLite3, based on std::runtime_error. - * - * @param[in] aErrorMessage The string message describing the SQLite error - * @param[in] ret Return value from function call that failed. - */ - Exception(const char* aErrorMessage, int ret); - - Exception(const std::string& aErrorMessage, int ret) : - Exception(aErrorMessage.c_str(), ret) - { - } - - /** - * @brief Encapsulation of the error message from SQLite3, based on std::runtime_error. - * - * @param[in] aErrorMessage The string message describing the SQLite error - */ - explicit Exception(const char* aErrorMessage) : - Exception(aErrorMessage, -1) // 0 would be SQLITE_OK, which doesn't make sense - { - } - explicit Exception(const std::string& aErrorMessage) : - Exception(aErrorMessage.c_str(), -1) // 0 would be SQLITE_OK, which doesn't make sense - { - } - - /** - * @brief Encapsulation of the error message from SQLite3, based on std::runtime_error. - * - * @param[in] apSQLite The SQLite object, to obtain detailed error messages from. - */ - explicit Exception(sqlite3* apSQLite); - - /** - * @brief Encapsulation of the error message from SQLite3, based on std::runtime_error. - * - * @param[in] apSQLite The SQLite object, to obtain detailed error messages from. - * @param[in] ret Return value from function call that failed. - */ - Exception(sqlite3* apSQLite, int ret); - - /// Return the result code (if any, otherwise -1). - int getErrorCode() const noexcept - { - return mErrcode; - } - - /// Return the extended numeric result code (if any, otherwise -1). - int getExtendedErrorCode() const noexcept - { - return mExtendedErrcode; - } - - /// Return a string, solely based on the error code - const char* getErrorStr() const noexcept; - -private: - int mErrcode; ///< Error code value - int mExtendedErrcode; ///< Detailed error code if any -}; - - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/ExecuteMany.h b/3rdparty/sqlitecpp/source/SQLiteCpp/ExecuteMany.h deleted file mode 100644 index 4e7dac9..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/ExecuteMany.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - * @file ExecuteMany.h - * @ingroup SQLiteCpp - * @brief Convenience function to execute a Statement with multiple Parameter sets - * - * Copyright (c) 2019 Maximilian Bachmann (contact@maxbachmann.de) - * Copyright (c) 2019-2021 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) - */ -#pragma once - -#if (__cplusplus >= 201402L) || ( defined(_MSC_VER) && (_MSC_VER >= 1900) ) // c++14: Visual Studio 2015 - -#include -#include - -/// @cond -#include -#include -#include - -namespace SQLite -{ -/// @endcond - -/** - * \brief Convenience function to execute a Statement with multiple Parameter sets once for each parameter set given. - * - * - * This feature requires a c++14 capable compiler. - * - * \code{.cpp} - * execute_many(db, "INSERT INTO test VALUES (?, ?)", - * 1, - * std::make_tuple(2), - * std::make_tuple(3, "three") - * ); - * \endcode - * @param aDatabase Database to use - * @param apQuery Query to use with all parameter sets - * @param aArg first tuple with parameters - * @param aParams the following tuples with parameters - */ -template -void execute_many(Database& aDatabase, const char* apQuery, Arg&& aArg, Types&&... aParams) -{ - SQLite::Statement query(aDatabase, apQuery); - bind_exec(query, std::forward(aArg)); - (void)std::initializer_list - { - ((void)reset_bind_exec(query, std::forward(aParams)), 0)... - }; -} - -/** - * \brief Convenience function to reset a statement and call bind_exec to - * bind new values to the statement and execute it - * - * This feature requires a c++14 capable compiler. - * - * @param apQuery Query to use - * @param aTuple Tuple to bind - */ -template -void reset_bind_exec(Statement& apQuery, TupleT&& aTuple) -{ - apQuery.reset(); - bind_exec(apQuery, std::forward(aTuple)); -} - -/** - * \brief Convenience function to bind values a the statement and execute it - * - * This feature requires a c++14 capable compiler. - * - * @param apQuery Query to use - * @param aTuple Tuple to bind - */ -template -void bind_exec(Statement& apQuery, TupleT&& aTuple) -{ - SQLite::bind(apQuery, std::forward(aTuple)); - while (apQuery.executeStep()) {} -} - -} // namespace SQLite - -#endif // c++14 diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/SQLiteCpp.h b/3rdparty/sqlitecpp/source/SQLiteCpp/SQLiteCpp.h deleted file mode 100644 index 161478c..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/SQLiteCpp.h +++ /dev/null @@ -1,44 +0,0 @@ -/** - * @file SQLiteCpp.h - * @ingroup SQLiteCpp - * @brief SQLiteC++ is a smart and simple C++ SQLite3 wrapper. This file is only "easy include" for other files. - * - * Include this main header file in your project to gain access to all functionality provided by the wrapper. - * - * Copyright (c) 2012-2021 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) - */ -/** - * @defgroup SQLiteCpp SQLiteC++ - * @brief SQLiteC++ is a smart and simple C++ SQLite3 wrapper. This file is only "easy include" for other files. - */ -#pragma once - - -// Include useful headers of SQLiteC++ -#include -#include -#include -#include -#include -#include - - -/** - * @brief Version numbers for SQLiteC++ are provided in the same way as sqlite3.h - * - * The [SQLITECPP_VERSION] C preprocessor macro in the SQLiteC++.h header - * evaluates to a string literal that is the SQLite version in the - * format "X.Y.Z" where X is the major version number - * and Y is the minor version number and Z is the release number. - * - * The [SQLITECPP_VERSION_NUMBER] C preprocessor macro resolves to an integer - * with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same - * numbers used in [SQLITECPP_VERSION]. - * - * WARNING: shall always be updated in sync with PROJECT_VERSION in CMakeLists.txt - */ -#define SQLITECPP_VERSION "3.01.01" // 3.1.1 -#define SQLITECPP_VERSION_NUMBER 3001001 // 3.1.1 diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Savepoint.cpp b/3rdparty/sqlitecpp/source/SQLiteCpp/Savepoint.cpp deleted file mode 100644 index b3d13a2..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Savepoint.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @file Savepoint.cpp - * @ingroup SQLiteCpp - * @brief A Savepoint is a way to group multiple SQL statements into an atomic - * secured operation. Similar to a transaction while allowing child savepoints. - * - * Copyright (c) 2020 Kelvin Hammond (hammond.kelvin@gmail.com) - * - * Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt or - * copy at http://opensource.org/licenses/MIT) - */ - -#include -#include -#include -#include - -namespace SQLite { - -// Begins the SQLite savepoint -Savepoint::Savepoint(Database& aDatabase, std::string aName) - : mDatabase(aDatabase), msName(aName), mbReleased(false) { - // workaround because you cannot bind to SAVEPOINT - // escape name for use in query - Statement stmt(mDatabase, "SELECT quote(?)"); - stmt.bind(1, msName); - stmt.executeStep(); - msName = stmt.getColumn(0).getText(); - - mDatabase.exec(std::string("SAVEPOINT ") + msName); -} - -// Safely rollback the savepoint if it has not been committed. -Savepoint::~Savepoint() { - if (!mbReleased) { - try { - rollback(); - } catch (SQLite::Exception&) { - // Never throw an exception in a destructor: error if already rolled - // back or released, but no harm is caused by this. - } - } -} - -// Release the savepoint and commit -void Savepoint::release() { - if (!mbReleased) { - mDatabase.exec(std::string("RELEASE SAVEPOINT ") + msName); - mbReleased = true; - } else { - throw SQLite::Exception("Savepoint already released or rolled back."); - } -} - -// Rollback the savepoint -void Savepoint::rollback() { - if (!mbReleased) { - mDatabase.exec(std::string("ROLLBACK TO SAVEPOINT ") + msName); - mbReleased = true; - } else { - throw SQLite::Exception("Savepoint already released or rolled back."); - } -} - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Savepoint.h b/3rdparty/sqlitecpp/source/SQLiteCpp/Savepoint.h deleted file mode 100644 index d389720..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Savepoint.h +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @file Savepoint.h - * @ingroup SQLiteCpp - * @brief A Savepoint is a way to group multiple SQL statements into an atomic - * secured operation. Similar to a transaction while allowing child savepoints. - * - * Copyright (c) 2020 Kelvin Hammond (hammond.kelvin@gmail.com) - * Copyright (c) 2020-2021 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) - */ -#pragma once - -#include - -namespace SQLite { - -// Foward declaration -class Database; - -/** - * @brief RAII encapsulation of a SQLite Savepoint. - * - * A Savepoint is a way to group multiple SQL statements into an atomic - * secureced operation; either it succeeds, with all the changes commited to the - * database file, or if it fails, all the changes are rolled back to the initial - * state at the start of the savepoint. - * - * This method also offers big performances improvements compared to - * individually executed statements. - * - * Caveats: - * - * 1) Calling COMMIT or commiting a parent transaction or RELEASE on a parent - * savepoint will cause this savepoint to be released. - * - * 2) Calling ROLLBACK or rolling back a parent savepoint will cause this - * savepoint to be rolled back. - * - * 3) This savepoint is not saved to the database until this and all savepoints - * or transaction in the savepoint stack have been released or commited. - * - * See also: https://sqlite.org/lang_savepoint.html - * - * Thread-safety: a Transaction object shall not be shared by multiple threads, - * because: - * - * 1) in the SQLite "Thread Safe" mode, "SQLite can be safely used by multiple - * threads provided that no single database connection is used simultaneously in - * two or more threads." - * - * 2) the SQLite "Serialized" mode is not supported by SQLiteC++, because of the - * way it shares the underling SQLite precompiled statement in a custom shared - * pointer (See the inner class "Statement::Ptr"). - */ - -class Savepoint { - public: - /** - * @brief Begins the SQLite savepoint - * - * @param[in] aDatabase the SQLite Database Connection - * @param[in] aName the name of the Savepoint - * - * Exception is thrown in case of error, then the Savepoint is NOT - * initiated. - */ - Savepoint(Database& aDatabase, std::string name); - - // Savepoint is non-copyable - Savepoint(const Savepoint&) = delete; - Savepoint& operator=(const Savepoint&) = delete; - - /** - * @brief Safely rollback the savepoint if it has not been commited. - */ - ~Savepoint(); - - /** - * @brief Commit and release the savepoint. - */ - void release(); - - /** - * @brief Rollback the savepoint - */ - void rollback(); - - private: - Database& mDatabase; ///< Reference to the SQLite Database Connection - std::string msName; ///< Name of the Savepoint - bool mbReleased; ///< True when release has been called -}; -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Statement.cpp b/3rdparty/sqlitecpp/source/SQLiteCpp/Statement.cpp deleted file mode 100644 index 64e16d2..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Statement.cpp +++ /dev/null @@ -1,368 +0,0 @@ -/** - * @file Statement.cpp - * @ingroup SQLiteCpp - * @brief A prepared SQLite Statement is a compiled SQL query ready to be executed, pointing to a row of result. - * - * Copyright (c) 2012-2021 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 - -#include -#include -#include -#include - -#include - -namespace SQLite -{ - -Statement::Statement(const Database& aDatabase, const char* apQuery) : - mQuery(apQuery), - mpSQLite(aDatabase.getHandle()), - mpPreparedStatement(prepareStatement()) // prepare the SQL query (needs Database friendship) -{ - mColumnCount = sqlite3_column_count(mpPreparedStatement.get()); -} - -Statement::Statement(Statement&& aStatement) noexcept : - mQuery(std::move(aStatement.mQuery)), - mpSQLite(aStatement.mpSQLite), - mpPreparedStatement(std::move(aStatement.mpPreparedStatement)), - mColumnCount(aStatement.mColumnCount), - mbHasRow(aStatement.mbHasRow), - mbDone(aStatement.mbDone), - mColumnNames(std::move(aStatement.mColumnNames)) -{ - aStatement.mpSQLite = nullptr; - aStatement.mColumnCount = 0; - aStatement.mbHasRow = false; - aStatement.mbDone = false; -} - -// Reset the statement to make it ready for a new execution (see also #clearBindings() bellow) -void Statement::reset() -{ - const int ret = tryReset(); - check(ret); -} - -int Statement::tryReset() noexcept -{ - mbHasRow = false; - mbDone = false; - return sqlite3_reset(mpPreparedStatement.get()); -} - -// Clears away all the bindings of a prepared statement (can be associated with #reset() above). -void Statement::clearBindings() -{ - const int ret = sqlite3_clear_bindings(getPreparedStatement()); - check(ret); -} - -int Statement::getIndex(const char * const apName) const -{ - return sqlite3_bind_parameter_index(getPreparedStatement(), apName); -} - -// Bind an 32bits int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement -void Statement::bind(const int aIndex, const int32_t aValue) -{ - const int ret = sqlite3_bind_int(getPreparedStatement(), aIndex, aValue); - check(ret); -} - -// Bind a 32bits unsigned int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement -void Statement::bind(const int aIndex, const uint32_t aValue) -{ - const int ret = sqlite3_bind_int64(getPreparedStatement(), aIndex, aValue); - check(ret); -} - -// Bind a 64bits int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement -void Statement::bind(const int aIndex, const int64_t aValue) -{ - const int ret = sqlite3_bind_int64(getPreparedStatement(), aIndex, aValue); - check(ret); -} - -// Bind a double (64bits float) value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement -void Statement::bind(const int aIndex, const double aValue) -{ - const int ret = sqlite3_bind_double(getPreparedStatement(), aIndex, aValue); - check(ret); -} - -// Bind a string value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement -void Statement::bind(const int aIndex, const std::string& aValue) -{ - const int ret = sqlite3_bind_text(getPreparedStatement(), aIndex, aValue.c_str(), - static_cast(aValue.size()), SQLITE_TRANSIENT); - check(ret); -} - -// Bind a text value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement -void Statement::bind(const int aIndex, const char* apValue) -{ - const int ret = sqlite3_bind_text(getPreparedStatement(), aIndex, apValue, -1, SQLITE_TRANSIENT); - check(ret); -} - -// Bind a binary blob value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement -void Statement::bind(const int aIndex, const void* apValue, const int aSize) -{ - const int ret = sqlite3_bind_blob(getPreparedStatement(), aIndex, apValue, aSize, SQLITE_TRANSIENT); - check(ret); -} - -// Bind a string value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement -void Statement::bindNoCopy(const int aIndex, const std::string& aValue) -{ - const int ret = sqlite3_bind_text(getPreparedStatement(), aIndex, aValue.c_str(), - static_cast(aValue.size()), SQLITE_STATIC); - check(ret); -} - -// Bind a text value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement -void Statement::bindNoCopy(const int aIndex, const char* apValue) -{ - const int ret = sqlite3_bind_text(getPreparedStatement(), aIndex, apValue, -1, SQLITE_STATIC); - check(ret); -} - -// Bind a binary blob value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement -void Statement::bindNoCopy(const int aIndex, const void* apValue, const int aSize) -{ - const int ret = sqlite3_bind_blob(getPreparedStatement(), aIndex, apValue, aSize, SQLITE_STATIC); - check(ret); -} - -// Bind a NULL value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement -void Statement::bind(const int aIndex) -{ - const int ret = sqlite3_bind_null(getPreparedStatement(), aIndex); - check(ret); -} - - -// Execute a step of the query to fetch one row of results -bool Statement::executeStep() -{ - const int ret = tryExecuteStep(); - if ((SQLITE_ROW != ret) && (SQLITE_DONE != ret)) // on row or no (more) row ready, else it's a problem - { - if (ret == sqlite3_errcode(mpSQLite)) - { - throw SQLite::Exception(mpSQLite, ret); - } - else - { - throw SQLite::Exception("Statement needs to be reseted", ret); - } - } - - return mbHasRow; // true only if one row is accessible by getColumn(N) -} - -// Execute a one-step query with no expected result, and return the number of changes. -int Statement::exec() -{ - const int ret = tryExecuteStep(); - if (SQLITE_DONE != ret) // the statement has finished executing successfully - { - if (SQLITE_ROW == ret) - { - throw SQLite::Exception("exec() does not expect results. Use executeStep."); - } - else if (ret == sqlite3_errcode(mpSQLite)) - { - throw SQLite::Exception(mpSQLite, ret); - } - else - { - throw SQLite::Exception("Statement needs to be reseted", ret); - } - } - - // Return the number of rows modified by those SQL statements (INSERT, UPDATE or DELETE) - return sqlite3_changes(mpSQLite); -} - -int Statement::tryExecuteStep() noexcept -{ - if (mbDone) - { - return SQLITE_MISUSE; // Statement needs to be reseted ! - } - - const int ret = sqlite3_step(mpPreparedStatement.get()); - if (SQLITE_ROW == ret) // one row is ready : call getColumn(N) to access it - { - mbHasRow = true; - } - else - { - mbHasRow = false; - mbDone = SQLITE_DONE == ret; // check if the query has finished executing - } - return ret; -} - - -// Return a copy of the column data specified by its index starting at 0 -// (use the Column copy-constructor) -Column Statement::getColumn(const int aIndex) const -{ - checkRow(); - checkIndex(aIndex); - - // Share the Statement Object handle with the new Column created - return Column(mpPreparedStatement, aIndex); -} - -// Return a copy of the column data specified by its column name starting at 0 -// (use the Column copy-constructor) -Column Statement::getColumn(const char* apName) const -{ - checkRow(); - const int index = getColumnIndex(apName); - - // Share the Statement Object handle with the new Column created - return Column(mpPreparedStatement, index); -} - -// Test if the column is NULL -bool Statement::isColumnNull(const int aIndex) const -{ - checkRow(); - checkIndex(aIndex); - return (SQLITE_NULL == sqlite3_column_type(getPreparedStatement(), aIndex)); -} - -bool Statement::isColumnNull(const char* apName) const -{ - checkRow(); - const int index = getColumnIndex(apName); - return (SQLITE_NULL == sqlite3_column_type(getPreparedStatement(), index)); -} - -// Return the named assigned to the specified result column (potentially aliased) -const char* Statement::getColumnName(const int aIndex) const -{ - checkIndex(aIndex); - return sqlite3_column_name(getPreparedStatement(), aIndex); -} - -#ifdef SQLITE_ENABLE_COLUMN_METADATA -// Return the named assigned to the specified result column (potentially aliased) -const char* Statement::getColumnOriginName(const int aIndex) const -{ - checkIndex(aIndex); - return sqlite3_column_origin_name(getPreparedStatement(), aIndex); -} -#endif - -// Return the index of the specified (potentially aliased) column name -int Statement::getColumnIndex(const char* apName) const -{ - // Build the map of column index by name on first call - if (mColumnNames.empty()) - { - for (int i = 0; i < mColumnCount; ++i) - { - const char* pName = sqlite3_column_name(getPreparedStatement(), i); - mColumnNames[pName] = i; - } - } - - const auto iIndex = mColumnNames.find(apName); - if (iIndex == mColumnNames.end()) - { - throw SQLite::Exception("Unknown column name."); - } - - return iIndex->second; -} - -const char * Statement::getColumnDeclaredType(const int aIndex) const -{ - checkIndex(aIndex); - const char * result = sqlite3_column_decltype(getPreparedStatement(), aIndex); - if (!result) - { - throw SQLite::Exception("Could not determine declared column type."); - } - else - { - return result; - } -} - -// Get number of rows modified by last INSERT, UPDATE or DELETE statement (not DROP table). -int Statement::getChanges() const noexcept -{ - return sqlite3_changes(mpSQLite); -} - -int Statement::getBindParameterCount() const noexcept -{ - return sqlite3_bind_parameter_count(mpPreparedStatement.get()); -} - -// Return the numeric result code for the most recent failed API call (if any). -int Statement::getErrorCode() const noexcept -{ - return sqlite3_errcode(mpSQLite); -} - -// Return the extended numeric result code for the most recent failed API call (if any). -int Statement::getExtendedErrorCode() const noexcept -{ - return sqlite3_extended_errcode(mpSQLite); -} - -// Return UTF-8 encoded English language explanation of the most recent failed API call (if any). -const char* Statement::getErrorMsg() const noexcept -{ - return sqlite3_errmsg(mpSQLite); -} - -// Return a UTF-8 string containing the SQL text of prepared statement with bound parameters expanded. -std::string Statement::getExpandedSQL() const { - char* expanded = sqlite3_expanded_sql(getPreparedStatement()); - std::string expandedString(expanded); - sqlite3_free(expanded); - return expandedString; -} - -// Prepare SQLite statement object and return shared pointer to this object -Statement::TStatementPtr Statement::prepareStatement() -{ - sqlite3_stmt* statement; - const int ret = sqlite3_prepare_v2(mpSQLite, mQuery.c_str(), static_cast(mQuery.size()), &statement, nullptr); - if (SQLITE_OK != ret) - { - throw SQLite::Exception(mpSQLite, ret); - } - return Statement::TStatementPtr(statement, [](sqlite3_stmt* stmt) - { - sqlite3_finalize(stmt); - }); -} - -// Return prepered statement object or throw -sqlite3_stmt* Statement::getPreparedStatement() const -{ - sqlite3_stmt* ret = mpPreparedStatement.get(); - if (ret) - { - return ret; - } - throw SQLite::Exception("Statement was not prepared."); -} - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Statement.h b/3rdparty/sqlitecpp/source/SQLiteCpp/Statement.h deleted file mode 100644 index c81e215..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Statement.h +++ /dev/null @@ -1,714 +0,0 @@ -/** - * @file Statement.h - * @ingroup SQLiteCpp - * @brief A prepared SQLite Statement is a compiled SQL query ready to be executed, pointing to a row of result. - * - * Copyright (c) 2012-2021 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) - */ -#pragma once - -#include -#include // SQLITECPP_PURE_FUNC - -#include -#include -#include - -// Forward declarations to avoid inclusion of in a header -struct sqlite3; -struct sqlite3_stmt; - - -namespace SQLite -{ - - -// Forward declaration -class Database; -class Column; - -extern const int OK; ///< SQLITE_OK - -/** - * @brief RAII encapsulation of a prepared SQLite Statement. - * - * A Statement is a compiled SQL query ready to be executed step by step - * to provide results one row at a time. - * - * Resource Acquisition Is Initialization (RAII) means that the Statement - * is compiled in the constructor and finalized in the destructor, so that there is - * no need to worry about memory management or the validity of the underlying SQLite Statement. - * - * Thread-safety: a Statement object shall not be shared by multiple threads, because : - * 1) in the SQLite "Thread Safe" mode, "SQLite can be safely used by multiple threads - * provided that no single database connection is used simultaneously in two or more threads." - * 2) the SQLite "Serialized" mode is not supported by SQLiteC++, - * because of the way it shares the underling SQLite precompiled statement - * in a custom shared pointer (See the inner class "Statement::Ptr"). - */ -class Statement -{ -public: - /** - * @brief Compile and register the SQL query for the provided SQLite Database Connection - * - * @param[in] aDatabase the SQLite Database Connection - * @param[in] apQuery an UTF-8 encoded query string - * - * Exception is thrown in case of error, then the Statement object is NOT constructed. - */ - Statement(const Database& aDatabase, const char* apQuery); - - /** - * @brief Compile and register the SQL query for the provided SQLite Database Connection - * - * @param[in] aDatabase the SQLite Database Connection - * @param[in] aQuery an UTF-8 encoded query string - * - * Exception is thrown in case of error, then the Statement object is NOT constructed. - */ - Statement(const Database& aDatabase, const std::string& aQuery) : - Statement(aDatabase, aQuery.c_str()) - {} - - /** - * @brief Move an SQLite statement. - * - * @param[in] aStatement Statement to move - */ - Statement(Statement&& aStatement) noexcept; - Statement& operator=(Statement&& aStatement) noexcept = default; - - // Statement is non-copyable - Statement(const Statement&) = delete; - Statement& operator=(const Statement&) = delete; - - /// Finalize and unregister the SQL query from the SQLite Database Connection. - /// The finalization will be done by the destructor of the last shared pointer - ~Statement() = default; - - /// Reset the statement to make it ready for a new execution. Throws an exception on error. - void reset(); - - /// Reset the statement. Returns the sqlite result code instead of throwing an exception on error. - int tryReset() noexcept; - - /** - * @brief Clears away all the bindings of a prepared statement. - * - * Contrary to the intuition of many, reset() does not reset the bindings on a prepared statement. - * Use this routine to reset all parameters to NULL. - */ - void clearBindings(); // throw(SQLite::Exception) - - //////////////////////////////////////////////////////////////////////////// - // Bind a value to a parameter of the SQL statement, - // in the form "?" (unnamed), "?NNN", ":VVV", "@VVV" or "$VVV". - // - // Can use the parameter index, starting from "1", to the higher NNN value, - // or the complete parameter name "?NNN", ":VVV", "@VVV" or "$VVV" - // (prefixed with the corresponding sign "?", ":", "@" or "$") - // - // Note that for text and blob values, the SQLITE_TRANSIENT flag is used, - // which tell the sqlite library to make its own copy of the data before the bind() call returns. - // This choice is done to prevent any common misuses, like passing a pointer to a - // dynamic allocated and temporary variable (a std::string for instance). - // This is under-optimized for static data (a static text define in code) - // as well as for dynamic allocated buffer which could be transfer to sqlite - // instead of being copied. - // => if you know what you are doing, use bindNoCopy() instead of bind() - - SQLITECPP_PURE_FUNC - int getIndex(const char * const apName) const; - - /** - * @brief Bind an int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const int aIndex, const int32_t aValue); - /** - * @brief Bind a 32bits unsigned int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const int aIndex, const uint32_t aValue); - /** - * @brief Bind a 64bits int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const int aIndex, const int64_t aValue); - /** - * @brief Bind a double (64bits float) value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const int aIndex, const double aValue); - /** - * @brief Bind a string value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @note Uses the SQLITE_TRANSIENT flag, making a copy of the data, for SQLite internal use - */ - void bind(const int aIndex, const std::string& aValue); - /** - * @brief Bind a text value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @note Uses the SQLITE_TRANSIENT flag, making a copy of the data, for SQLite internal use - */ - void bind(const int aIndex, const char* apValue); - /** - * @brief Bind a binary blob value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @note Uses the SQLITE_TRANSIENT flag, making a copy of the data, for SQLite internal use - */ - void bind(const int aIndex, const void* apValue, const int aSize); - /** - * @brief Bind a string value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1). - * - * The string can contain null characters as it is binded using its size. - * - * @warning Uses the SQLITE_STATIC flag, avoiding a copy of the data. The string must remains unchanged while executing the statement. - */ - void bindNoCopy(const int aIndex, const std::string& aValue); - /** - * @brief Bind a text value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * Main usage is with null-terminated literal text (aka in code static strings) - * - * @warning Uses the SQLITE_STATIC flag, avoiding a copy of the data. The string must remains unchanged while executing the statement. - */ - void bindNoCopy(const int aIndex, const char* apValue); - /** - * @brief Bind a binary blob value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @warning Uses the SQLITE_STATIC flag, avoiding a copy of the data. The string must remains unchanged while executing the statement. - */ - void bindNoCopy(const int aIndex, const void* apValue, const int aSize); - /** - * @brief Bind a NULL value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @see clearBindings() to set all bound parameters to NULL. - */ - void bind(const int aIndex); - - /** - * @brief Bind an int value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const char* apName, const int32_t aValue) - { - bind(getIndex(apName), aValue); - } - /** - * @brief Bind a 32bits unsigned int value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const char* apName, const uint32_t aValue) - { - bind(getIndex(apName), aValue); - } - /** - * @brief Bind a 64bits int value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const char* apName, const int64_t aValue) - { - bind(getIndex(apName), aValue); - } - /** - * @brief Bind a double (64bits float) value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const char* apName, const double aValue) - { - bind(getIndex(apName), aValue); - } - /** - * @brief Bind a string value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @note Uses the SQLITE_TRANSIENT flag, making a copy of the data, for SQLite internal use - */ - void bind(const char* apName, const std::string& aValue) - { - bind(getIndex(apName), aValue); - } - /** - * @brief Bind a text value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @note Uses the SQLITE_TRANSIENT flag, making a copy of the data, for SQLite internal use - */ - void bind(const char* apName, const char* apValue) - { - bind(getIndex(apName), apValue); - } - /** - * @brief Bind a binary blob value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @note Uses the SQLITE_TRANSIENT flag, making a copy of the data, for SQLite internal use - */ - void bind(const char* apName, const void* apValue, const int aSize) - { - bind(getIndex(apName), apValue, aSize); - } - /** - * @brief Bind a string value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * The string can contain null characters as it is binded using its size. - * - * @warning Uses the SQLITE_STATIC flag, avoiding a copy of the data. The string must remains unchanged while executing the statement. - */ - void bindNoCopy(const char* apName, const std::string& aValue) - { - bindNoCopy(getIndex(apName), aValue); - } - /** - * @brief Bind a text value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * Main usage is with null-terminated literal text (aka in code static strings) - * - * @warning Uses the SQLITE_STATIC flag, avoiding a copy of the data. The string must remains unchanged while executing the statement. - */ - void bindNoCopy(const char* apName, const char* apValue) - { - bindNoCopy(getIndex(apName), apValue); - } - /** - * @brief Bind a binary blob value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @warning Uses the SQLITE_STATIC flag, avoiding a copy of the data. The string must remains unchanged while executing the statement. - */ - void bindNoCopy(const char* apName, const void* apValue, const int aSize) - { - bindNoCopy(getIndex(apName), apValue, aSize); - } - /** - * @brief Bind a NULL value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @see clearBindings() to set all bound parameters to NULL. - */ - void bind(const char* apName) // bind NULL value - { - bind(getIndex(apName)); - } - - - /** - * @brief Bind an int value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const std::string& aName, const int32_t aValue) - { - bind(aName.c_str(), aValue); - } - /** - * @brief Bind a 32bits unsigned int value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const std::string& aName, const uint32_t aValue) - { - bind(aName.c_str(), aValue); - } - /** - * @brief Bind a 64bits int value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const std::string& aName, const int64_t aValue) - { - bind(aName.c_str(), aValue); - } - /** - * @brief Bind a double (64bits float) value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - */ - void bind(const std::string& aName, const double aValue) - { - bind(aName.c_str(), aValue); - } - /** - * @brief Bind a string value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @note Uses the SQLITE_TRANSIENT flag, making a copy of the data, for SQLite internal use - */ - void bind(const std::string& aName, const std::string& aValue) - { - bind(aName.c_str(), aValue); - } - /** - * @brief Bind a text value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @note Uses the SQLITE_TRANSIENT flag, making a copy of the data, for SQLite internal use - */ - void bind(const std::string& aName, const char* apValue) - { - bind(aName.c_str(), apValue); - } - /** - * @brief Bind a binary blob value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @note Uses the SQLITE_TRANSIENT flag, making a copy of the data, for SQLite internal use - */ - void bind(const std::string& aName, const void* apValue, const int aSize) - { - bind(aName.c_str(), apValue, aSize); - } - /** - * @brief Bind a string value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * The string can contain null characters as it is binded using its size. - * - * @warning Uses the SQLITE_STATIC flag, avoiding a copy of the data. The string must remains unchanged while executing the statement. - */ - void bindNoCopy(const std::string& aName, const std::string& aValue) - { - bindNoCopy(aName.c_str(), aValue); - } - /** - * @brief Bind a text value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * Main usage is with null-terminated literal text (aka in code static strings) - * - * @warning Uses the SQLITE_STATIC flag, avoiding a copy of the data. The string must remains unchanged while executing the statement. - */ - void bindNoCopy(const std::string& aName, const char* apValue) - { - bindNoCopy(aName.c_str(), apValue); - } - /** - * @brief Bind a binary blob value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @warning Uses the SQLITE_STATIC flag, avoiding a copy of the data. The string must remains unchanged while executing the statement. - */ - void bindNoCopy(const std::string& aName, const void* apValue, const int aSize) - { - bindNoCopy(aName.c_str(), apValue, aSize); - } - /** - * @brief Bind a NULL value to a named parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement (aIndex >= 1) - * - * @see clearBindings() to set all bound parameters to NULL. - */ - void bind(const std::string& aName) // bind NULL value - { - bind(aName.c_str()); - } - - //////////////////////////////////////////////////////////////////////////// - - /** - * @brief Execute a step of the prepared query to fetch one row of results. - * - * While true is returned, a row of results is available, and can be accessed - * through the getColumn() method - * - * @see exec() execute a one-step prepared statement with no expected result - * @see tryExecuteStep() try to execute a step of the prepared query to fetch one row of results, returning the sqlite result code. - * @see Database::exec() is a shortcut to execute one or multiple statements without results - * - * @return - true (SQLITE_ROW) if there is another row ready : you can call getColumn(N) to get it - * then you have to call executeStep() again to fetch more rows until the query is finished - * - false (SQLITE_DONE) if the query has finished executing : there is no (more) row of result - * (case of a query with no result, or after N rows fetched successfully) - * - * @throw SQLite::Exception in case of error - */ - bool executeStep(); - - /** - * @brief Try to execute a step of the prepared query to fetch one row of results, returning the sqlite result code. - * - * - * - * @see exec() execute a one-step prepared statement with no expected result - * @see executeStep() execute a step of the prepared query to fetch one row of results - * @see Database::exec() is a shortcut to execute one or multiple statements without results - * - * @return the sqlite result code. - */ - int tryExecuteStep() noexcept; - - /** - * @brief Execute a one-step query with no expected result, and return the number of changes. - * - * This method is useful for any kind of statements other than the Data Query Language (DQL) "SELECT" : - * - Data Definition Language (DDL) statements "CREATE", "ALTER" and "DROP" - * - Data Manipulation Language (DML) statements "INSERT", "UPDATE" and "DELETE" - * - Data Control Language (DCL) statements "GRANT", "REVOKE", "COMMIT" and "ROLLBACK" - * - * It is similar to Database::exec(), but using a precompiled statement, it adds : - * - the ability to bind() arguments to it (best way to insert data), - * - reusing it allows for better performances (efficient for multiple insertion). - * - * @see executeStep() execute a step of the prepared query to fetch one row of results - * @see tryExecuteStep() try to execute a step of the prepared query to fetch one row of results, returning the sqlite result code. - * @see Database::exec() is a shortcut to execute one or multiple statements without results - * - * @return number of row modified by this SQL statement (INSERT, UPDATE or DELETE) - * - * @throw SQLite::Exception in case of error, or if row of results are returned while they are not expected! - */ - int exec(); - - //////////////////////////////////////////////////////////////////////////// - - /** - * @brief Return a copy of the column data specified by its index - * - * Can be used to access the data of the current row of result when applicable, - * while the executeStep() method returns true. - * - * Throw an exception if there is no row to return a Column from: - * - if provided index is out of bound - * - before any executeStep() call - * - after the last executeStep() returned false - * - after a reset() call - * - * Throw an exception if the specified index is out of the [0, getColumnCount()) range. - * - * @param[in] aIndex Index of the column, starting at 0 - * - * @note This method is not const, reflecting the fact that the returned Column object will - * share the ownership of the underlying sqlite3_stmt. - * - * @warning The resulting Column object must not be memorized "as-is". - * Is is only a wrapper around the current result row, so it is only valid - * while the row from the Statement remains valid, that is only until next executeStep() call. - * Thus, you should instead extract immediately its data (getInt(), getText()...) - * and use or copy this data for any later usage. - */ - Column getColumn(const int aIndex) const; - - /** - * @brief Return a copy of the column data specified by its column name (less efficient than using an index) - * - * Can be used to access the data of the current row of result when applicable, - * while the executeStep() method returns true. - * - * Throw an exception if there is no row to return a Column from : - * - if provided name is not one of the aliased column names - * - before any executeStep() call - * - after the last executeStep() returned false - * - after a reset() call - * - * Throw an exception if the specified name is not an on of the aliased name of the columns in the result. - * - * @param[in] apName Aliased name of the column, that is, the named specified in the query (not the original name) - * - * @note Uses a map of column names to indexes, build on first call. - * - * @note This method is not const, reflecting the fact that the returned Column object will - * share the ownership of the underlying sqlite3_stmt. - * - * @warning The resulting Column object must not be memorized "as-is". - * Is is only a wrapper around the current result row, so it is only valid - * while the row from the Statement remains valid, that is only until next executeStep() call. - * Thus, you should instead extract immediately its data (getInt(), getText()...) - * and use or copy this data for any later usage. - * - * Throw an exception if the specified name is not one of the aliased name of the columns in the result. - */ - Column getColumn(const char* apName) const; - -#if __cplusplus >= 201402L || (defined(_MSC_VER) && _MSC_VER >= 1900) // c++14: Visual Studio 2015 - /** - * @brief Return an instance of T constructed from copies of the first N columns - * - * Can be used to access the data of the current row of result when applicable, - * while the executeStep() method returns true. - * - * Throw an exception if there is no row to return a Column from: - * - if provided column count is out of bound - * - before any executeStep() call - * - after the last executeStep() returned false - * - after a reset() call - * - * Throw an exception if the specified column count is out of the [0, getColumnCount()) range. - * - * @tparam T Object type to construct - * @tparam N Number of columns - * - * @note Requires std=C++14 - */ - template - T getColumns(); - -private: - /** - * @brief Helper function used by getColumns to expand an integer_sequence used to generate - * the required Column objects - */ - template - T getColumns(const std::integer_sequence); - -public: -#endif - - /** - * @brief Test if the column value is NULL - * - * @param[in] aIndex Index of the column, starting at 0 - * - * @return true if the column value is NULL - * - * Throw an exception if the specified index is out of the [0, getColumnCount()) range. - */ - bool isColumnNull(const int aIndex) const; - - /** - * @brief Test if the column value is NULL - * - * @param[in] apName Aliased name of the column, that is, the named specified in the query (not the original name) - * - * @return true if the column value is NULL - * - * Throw an exception if the specified name is not one of the aliased name of the columns in the result. - */ - bool isColumnNull(const char* apName) const; - - /** - * @brief Return a pointer to the named assigned to the specified result column (potentially aliased) - * - * @param[in] aIndex Index of the column in the range [0, getColumnCount()). - * - * @see getColumnOriginName() to get original column name (not aliased) - * - * Throw an exception if the specified index is out of the [0, getColumnCount()) range. - */ - const char* getColumnName(const int aIndex) const; - -#ifdef SQLITE_ENABLE_COLUMN_METADATA - /** - * @brief Return a pointer to the table column name that is the origin of the specified result column - * - * Require definition of the SQLITE_ENABLE_COLUMN_METADATA preprocessor macro : - * - when building the SQLite library itself (which is the case for the Debian libsqlite3 binary for instance), - * - and also when compiling this wrapper. - * - * Throw an exception if the specified index is out of the [0, getColumnCount()) range. - */ - const char* getColumnOriginName(const int aIndex) const; -#endif - - /** - * @brief Return the index of the specified (potentially aliased) column name - * - * @param[in] apName Aliased name of the column, that is, the named specified in the query (not the original name) - * - * @note Uses a map of column names to indexes, build on first call. - * - * Throw an exception if the specified name is not known. - */ - int getColumnIndex(const char* apName) const; - - - /** - * @brief Return the declared type of the specified result column for a SELECT statement. - * - * This is the type given at creation of the column and not the actual data type. - * SQLite stores data types dynamically for each value and not per column. - * - * @param[in] aIndex Index of the column in the range [0, getColumnCount()). - * - * Throw an exception if the type can't be determined because: - * - the specified index is out of the [0, getColumnCount()) range - * - the statement is not a SELECT query - * - the column at aIndex is not a table column but an expression or subquery - */ - const char * getColumnDeclaredType(const int aIndex) const; - - - /// Get number of rows modified by last INSERT, UPDATE or DELETE statement (not DROP table). - int getChanges() const noexcept; - - - //////////////////////////////////////////////////////////////////////////// - - /// Return the UTF-8 SQL Query. - const std::string& getQuery() const - { - return mQuery; - } - - // Return a UTF-8 string containing the SQL text of prepared statement with bound parameters expanded. - std::string getExpandedSQL() const; - - /// Return the number of columns in the result set returned by the prepared statement - int getColumnCount() const - { - return mColumnCount; - } - /// true when a row has been fetched with executeStep() - bool hasRow() const - { - return mbHasRow; - } - /// true when the last executeStep() had no more row to fetch - bool isDone() const - { - return mbDone; - } - - /// Return the number of bind parameters in the statement - int getBindParameterCount() const noexcept; - - /// Return the numeric result code for the most recent failed API call (if any). - int getErrorCode() const noexcept; - /// Return the extended numeric result code for the most recent failed API call (if any). - int getExtendedErrorCode() const noexcept; - /// Return UTF-8 encoded English language explanation of the most recent failed API call (if any). - const char* getErrorMsg() const noexcept; - - /// Shared pointer to SQLite Prepared Statement Object - using TStatementPtr = std::shared_ptr; - -private: - /** - * @brief Check if a return code equals SQLITE_OK, else throw a SQLite::Exception with the SQLite error message - * - * @param[in] aRet SQLite return code to test against the SQLITE_OK expected value - */ - void check(const int aRet) const - { - if (SQLite::OK != aRet) - { - throw SQLite::Exception(mpSQLite, aRet); - } - } - - /** - * @brief Check if there is a row of result returned by executeStep(), else throw a SQLite::Exception. - */ - void checkRow() const - { - if (false == mbHasRow) - { - throw SQLite::Exception("No row to get a column from. executeStep() was not called, or returned false."); - } - } - - /** - * @brief Check if there is a Column index is in the range of columns in the result. - */ - void checkIndex(const int aIndex) const - { - if ((aIndex < 0) || (aIndex >= mColumnCount)) - { - throw SQLite::Exception("Column index out of range."); - } - } - - /** - * @brief Prepare statement object. - * - * @return Shared pointer to prepared statement object - */ - TStatementPtr prepareStatement(); - - /** - * @brief Return a prepared statement object. - * - * Throw an exception if the statement object was not prepared. - * @return raw pointer to Prepared Statement Object - */ - sqlite3_stmt* getPreparedStatement() const; - - std::string mQuery; //!< UTF-8 SQL Query - sqlite3* mpSQLite; //!< Pointer to SQLite Database Connection Handle - TStatementPtr mpPreparedStatement; //!< Shared Pointer to the prepared SQLite Statement Object - int mColumnCount{0}; //!< Number of columns in the result of the prepared statement - bool mbHasRow{false}; //!< true when a row has been fetched with executeStep() - bool mbDone{false}; //!< true when the last executeStep() had no more row to fetch - - /// Map of columns index by name (mutable so getColumnIndex can be const) - mutable std::map mColumnNames{}; -}; - - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.cpp b/3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.cpp deleted file mode 100644 index 2a8857a..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file Transaction.cpp - * @ingroup SQLiteCpp - * @brief A Transaction is way to group multiple SQL statements into an atomic secured operation. - * - * Copyright (c) 2012-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 - -#include -#include - -#include - -namespace SQLite -{ - - -// Begins the SQLite transaction -Transaction::Transaction(Database& aDatabase, TransactionBehavior behavior) : - mDatabase(aDatabase), - mbCommited(false) -{ - const char *stmt; - switch (behavior) { - case TransactionBehavior::DEFERRED: - stmt = "BEGIN DEFERRED"; - break; - case TransactionBehavior::IMMEDIATE: - stmt = "BEGIN IMMEDIATE"; - break; - case TransactionBehavior::EXCLUSIVE: - stmt = "BEGIN EXCLUSIVE"; - break; - default: - throw SQLite::Exception("invalid/unknown transaction behavior", SQLITE_ERROR); - } - mDatabase.exec(stmt); -} - -// Begins the SQLite transaction -Transaction::Transaction(Database &aDatabase) : - mDatabase(aDatabase), - mbCommited(false) -{ - mDatabase.exec("BEGIN"); -} - -// Safely rollback the transaction if it has not been committed. -Transaction::~Transaction() -{ - if (false == mbCommited) - { - try - { - mDatabase.exec("ROLLBACK"); - } - catch (SQLite::Exception&) - { - // Never throw an exception in a destructor: error if already rollbacked, but no harm is caused by this. - } - } -} - -// Commit the transaction. -void Transaction::commit() -{ - if (false == mbCommited) - { - mDatabase.exec("COMMIT"); - mbCommited = true; - } - else - { - throw SQLite::Exception("Transaction already committed."); - } -} - - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.h b/3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.h deleted file mode 100644 index d7f26ca..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.h +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @file Transaction.h - * @ingroup SQLiteCpp - * @brief A Transaction is way to group multiple SQL statements into an atomic secured operation. - * - * Copyright (c) 2012-2021 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) - */ -#pragma once - -#include - - -namespace SQLite -{ - - -// Forward declaration -class Database; - -/** - * @brief Transaction behaviors when opening an SQLite transaction. - * Names correspond directly to the behavior. - */ -enum class TransactionBehavior { - DEFERRED, - IMMEDIATE, - EXCLUSIVE, -}; - -/** - * @brief RAII encapsulation of a SQLite Transaction. - * - * A Transaction is a way to group multiple SQL statements into an atomic secured operation; - * either it succeeds, with all the changes committed to the database file, - * or if it fails, all the changes are rolled back to the initial state. - * - * Resource Acquisition Is Initialization (RAII) means that the Transaction - * begins in the constructor and is rollbacked in the destructor, so that there is - * no need to worry about memory management or the validity of the underlying SQLite Connection. - * - * This method also offers big performances improvements compared to individually executed statements. - * - * Thread-safety: a Transaction object shall not be shared by multiple threads, because : - * 1) in the SQLite "Thread Safe" mode, "SQLite can be safely used by multiple threads - * provided that no single database connection is used simultaneously in two or more threads." - * 2) the SQLite "Serialized" mode is not supported by SQLiteC++, - * because of the way it shares the underling SQLite precompiled statement - * in a custom shared pointer (See the inner class "Statement::Ptr"). - */ -class Transaction -{ -public: - /** - * @brief Begins the SQLite transaction using the default transaction behavior. - * - * @param[in] aDatabase the SQLite Database Connection - * - * Exception is thrown in case of error, then the Transaction is NOT initiated. - */ - explicit Transaction(Database& aDatabase); - - /** - * @brief Begins the SQLite transaction with the specified behavior. - * - * @param[in] aDatabase the SQLite Database Connection - * @param[in] behavior the requested transaction behavior - * - * Exception is thrown in case of error, then the Transaction is NOT initiated. - */ - explicit Transaction(Database& aDatabase, TransactionBehavior behavior); - - // Transaction is non-copyable - Transaction(const Transaction&) = delete; - Transaction& operator=(const Transaction&) = delete; - - /** - * @brief Safely rollback the transaction if it has not been committed. - */ - ~Transaction(); - - /** - * @brief Commit the transaction. - */ - void commit(); - -private: - Database& mDatabase; ///< Reference to the SQLite Database Connection - bool mbCommited; ///< True when commit has been called -}; - - -} // namespace SQLite diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Utils.h b/3rdparty/sqlitecpp/source/SQLiteCpp/Utils.h deleted file mode 100644 index f053b3f..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/Utils.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @file Utils.h - * @ingroup SQLiteCpp - * @brief Definition of the SQLITECPP_PURE_FUNC macro. - * - * Copyright (c) 2012-2020 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) - */ -#pragma once - -// macro taken from https://github.com/nemequ/hedley/blob/master/hedley.h that was in public domain at this time -#if defined(__GNUC__) || defined(__GNUG__) || defined(__clang__) ||\ -(defined(__INTEL_COMPILER) && __INTEL_COMPILER > 1600) ||\ -(defined(__ARMCC_VERSION) && __ARMCC_VERSION > 4010000) ||\ -(\ - defined(__TI_COMPILER_VERSION__) && (\ - __TI_COMPILER_VERSION__ > 8003000 ||\ - (__TI_COMPILER_VERSION__ > 7003000 && defined(__TI_GNU_ATTRIBUTE_SUPPORT__))\ - )\ -) -#if defined(__has_attribute) -#if !defined(SQLITECPP_PURE_FUNC) && __has_attribute(pure) -#define SQLITECPP_PURE_FUNC __attribute__((pure)) -#endif -#endif -#endif -#if !defined(SQLITECPP_PURE_FUNC) -#define SQLITECPP_PURE_FUNC -#endif diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/VariadicBind.h b/3rdparty/sqlitecpp/source/SQLiteCpp/VariadicBind.h deleted file mode 100644 index e82b436..0000000 --- a/3rdparty/sqlitecpp/source/SQLiteCpp/VariadicBind.h +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @file VariadicBind.h - * @ingroup SQLiteCpp - * @brief Convenience function for Statement::bind(...) - * - * Copyright (c) 2016 Paul Dreik (github@pauldreik.se) - * Copyright (c) 2016-2021 Sebastien Rombauts (sebastien.rombauts@gmail.com) - * Copyright (c) 2019 Maximilian Bachmann (contact@maxbachmann.de) - * - * Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt - * or copy at http://opensource.org/licenses/MIT) - */ -#pragma once - -#include - -#if (__cplusplus >= 201402L) || ( defined(_MSC_VER) && (_MSC_VER >= 1900) ) // c++14: Visual Studio 2015 -#include -#endif // c++14 - -/// @cond -#include -#include - -namespace SQLite -{ -/// @endcond - -/** - * \brief Convenience function for calling Statement::bind(...) once for each argument given. - * - * This takes care of incrementing the index between each calls to bind. - * - * This feature requires a c++11 capable compiler. - * - * \code{.cpp} - * SQLite::Statement stm("SELECT * FROM MyTable WHERE colA>? && colB=? && colC -void bind(SQLite::Statement& query, const Args& ... args) -{ - int pos = 0; - (void)std::initializer_list{ - ((void)query.bind(++pos, std::forward(args)), 0)... - }; -} - -#if (__cplusplus >= 201402L) || ( defined(_MSC_VER) && (_MSC_VER >= 1900) ) // c++14: Visual Studio 2015 - -/** - * \brief Convenience function for calling Statement::bind(...) once for each parameter of a tuple, - * by forwarding them to the variadic template - * - * This feature requires a c++14 capable compiler. - * - * \code{.cpp} - * SQLite::Statement stm("SELECT * FROM MyTable WHERE colA>? && colB=? && colC -void bind(SQLite::Statement& query, const std::tuple &tuple) -{ - bind(query, tuple, std::index_sequence_for()); -} - -/** - * \brief Convenience function for calling Statement::bind(...) once for each parameter of a tuple, - * by forwarding them to the variadic template. This function is just needed to convert the tuples - * to parameter packs - * - * This feature requires a c++14 capable compiler. - * - * @param query statement - * @param tuple tuple with values to bind - */ -template -void bind(SQLite::Statement& query, const std::tuple &tuple, std::index_sequence) -{ - bind(query, std::get(tuple)...); -} -#endif // c++14 - -} // namespace SQLite -- cgit v1.2.3-70-g09d2