aboutsummaryrefslogtreecommitdiff
path: root/3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.cpp')
-rw-r--r--3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.cpp b/3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.cpp
new file mode 100644
index 0000000..2a8857a
--- /dev/null
+++ b/3rdparty/sqlitecpp/source/SQLiteCpp/Transaction.cpp
@@ -0,0 +1,83 @@
+/**
+ * @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 ([email protected])
+ *
+ * Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt
+ * or copy at http://opensource.org/licenses/MIT)
+ */
+#include <SQLiteCpp/Transaction.h>
+
+#include <SQLiteCpp/Database.h>
+#include <SQLiteCpp/Assertion.h>
+
+#include <sqlite3.h>
+
+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