mirror of https://github.com/stella-emu/stella.git
RAII wrapper for sqlite transactions, better transaction handling in key value repo.
This commit is contained in:
parent
884d46a45f
commit
c75fcfae13
|
@ -18,6 +18,7 @@
|
||||||
#include "KeyValueRepositorySqlite.hxx"
|
#include "KeyValueRepositorySqlite.hxx"
|
||||||
#include "Logger.hxx"
|
#include "Logger.hxx"
|
||||||
#include "SqliteError.hxx"
|
#include "SqliteError.hxx"
|
||||||
|
#include "SqliteTransaction.hxx"
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
KeyValueRepositorySqlite::KeyValueRepositorySqlite(
|
KeyValueRepositorySqlite::KeyValueRepositorySqlite(
|
||||||
|
@ -51,9 +52,9 @@ std::map<string, Variant> KeyValueRepositorySqlite::load()
|
||||||
void KeyValueRepositorySqlite::save(const std::map<string, Variant>& values)
|
void KeyValueRepositorySqlite::save(const std::map<string, Variant>& values)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
myStmtInsert->reset();
|
SqliteTransaction tx(myDb);
|
||||||
|
|
||||||
myDb.exec("BEGIN TRANSACTION");
|
myStmtInsert->reset();
|
||||||
|
|
||||||
for (const auto& pair: values) {
|
for (const auto& pair: values) {
|
||||||
(*myStmtInsert)
|
(*myStmtInsert)
|
||||||
|
@ -64,7 +65,7 @@ void KeyValueRepositorySqlite::save(const std::map<string, Variant>& values)
|
||||||
myStmtInsert->reset();
|
myStmtInsert->reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
myDb.exec("COMMIT");
|
tx.commit();
|
||||||
}
|
}
|
||||||
catch (SqliteError err) {
|
catch (SqliteError err) {
|
||||||
Logger::log(err.message, 1);
|
Logger::log(err.message, 1);
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// SSSS tt lll lll
|
||||||
|
// SS SS tt ll ll
|
||||||
|
// SS tttttt eeee ll ll aaaa
|
||||||
|
// SSSS tt ee ee ll ll aa
|
||||||
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||||
|
// SS SS tt ee ll ll aa aa
|
||||||
|
// SSSS ttt eeeee llll llll aaaaa
|
||||||
|
//
|
||||||
|
// Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony
|
||||||
|
// and the Stella Team
|
||||||
|
//
|
||||||
|
// See the file "License.txt" for information on usage and redistribution of
|
||||||
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
#include "SqliteTransaction.hxx"
|
||||||
|
#include "SqliteDatabase.hxx"
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
SqliteTransaction::SqliteTransaction(SqliteDatabase& db)
|
||||||
|
: myDb(db),
|
||||||
|
myTransactionClosed(false)
|
||||||
|
{
|
||||||
|
myDb.exec("BEGIN TRANSACTION");
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
SqliteTransaction::~SqliteTransaction()
|
||||||
|
{
|
||||||
|
if (!myTransactionClosed) rollback();
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void SqliteTransaction::commit()
|
||||||
|
{
|
||||||
|
if (myTransactionClosed) return;
|
||||||
|
|
||||||
|
myTransactionClosed = true;
|
||||||
|
myDb.exec("COMMIT TRANSACTION");
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void SqliteTransaction::rollback()
|
||||||
|
{
|
||||||
|
if (myTransactionClosed) return;
|
||||||
|
|
||||||
|
myTransactionClosed = true;
|
||||||
|
myDb.exec("ROLLBACK TRANSACTION");
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// SSSS tt lll lll
|
||||||
|
// SS SS tt ll ll
|
||||||
|
// SS tttttt eeee ll ll aaaa
|
||||||
|
// SSSS tt ee ee ll ll aa
|
||||||
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||||
|
// SS SS tt ee ll ll aa aa
|
||||||
|
// SSSS ttt eeeee llll llll aaaaa
|
||||||
|
//
|
||||||
|
// Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony
|
||||||
|
// and the Stella Team
|
||||||
|
//
|
||||||
|
// See the file "License.txt" for information on usage and redistribution of
|
||||||
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
#ifndef SQLITE_TRANSACTION_HXX
|
||||||
|
#define SQLITE_TRANSACTION_HXX
|
||||||
|
|
||||||
|
class SqliteDatabase;
|
||||||
|
|
||||||
|
class SqliteTransaction {
|
||||||
|
public:
|
||||||
|
|
||||||
|
SqliteTransaction(SqliteDatabase& db);
|
||||||
|
|
||||||
|
~SqliteTransaction();
|
||||||
|
|
||||||
|
void commit();
|
||||||
|
|
||||||
|
void rollback();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
SqliteDatabase& myDb;
|
||||||
|
|
||||||
|
bool myTransactionClosed;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
SqliteTransaction(const SqliteTransaction&) = delete;
|
||||||
|
SqliteTransaction(SqliteTransaction&&) = delete;
|
||||||
|
SqliteTransaction& operator=(const SqliteTransaction&) = delete;
|
||||||
|
SqliteTransaction& operator=(SqliteTransaction&&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SQLITE_TRANSACTION_HXX
|
|
@ -4,7 +4,8 @@ MODULE_OBJS := \
|
||||||
src/common/repository/sqlite/KeyValueRepositorySqlite.o \
|
src/common/repository/sqlite/KeyValueRepositorySqlite.o \
|
||||||
src/common/repository/sqlite/SettingsDb.o \
|
src/common/repository/sqlite/SettingsDb.o \
|
||||||
src/common/repository/sqlite/SqliteDatabase.o \
|
src/common/repository/sqlite/SqliteDatabase.o \
|
||||||
src/common/repository/sqlite/SqliteStatement.o
|
src/common/repository/sqlite/SqliteStatement.o \
|
||||||
|
src/common/repository/sqlite/SqliteTransaction.o
|
||||||
|
|
||||||
MODULE_DIRS += \
|
MODULE_DIRS += \
|
||||||
src/common/repository/sqlite
|
src/common/repository/sqlite
|
||||||
|
|
Loading…
Reference in New Issue