From 4385c6bae1a66aa94beb703dcc16e12bdf0ebb0e Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 13 Aug 2015 22:43:36 +0200 Subject: Autocommit for the transaction --- common/storage.h | 2 ++ common/storage_lmdb.cpp | 44 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) (limited to 'common') diff --git a/common/storage.h b/common/storage.h index 9fe4e99..da225ef 100644 --- a/common/storage.h +++ b/common/storage.h @@ -59,6 +59,8 @@ public: bool commit(const std::function &errorHandler = std::function()); void abort(); + void setAutocommit(int interval); + /** * Write a value */ diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp index 983d0e2..86d76a0 100644 --- a/common/storage_lmdb.cpp +++ b/common/storage_lmdb.cpp @@ -52,14 +52,17 @@ int getErrorCode(int e) class Storage::Transaction::Private { public: - Private(MDB_txn *_txn, MDB_dbi _dbi, bool _allowDuplicates, const std::function &_defaultErrorHandler, const QString &_name) - : transaction(_txn), + Private(MDB_txn *_txn, MDB_dbi _dbi, bool _allowDuplicates, const std::function &_defaultErrorHandler, const QString &_name, MDB_env *_env) + : env(_env), + transaction(_txn), dbi(_dbi), allowDuplicates(_allowDuplicates), defaultErrorHandler(_defaultErrorHandler), name(_name), implicitCommit(false), - error(false) + error(false), + autoCommitInterval(0), + modificationCounter(0) { } @@ -68,6 +71,7 @@ public: } + MDB_env *env; MDB_txn *transaction; MDB_dbi dbi; bool allowDuplicates; @@ -75,6 +79,8 @@ public: QString name; bool implicitCommit; bool error; + int autoCommitInterval; + int modificationCounter; }; Storage::Transaction::Transaction() @@ -128,6 +134,13 @@ void Storage::Transaction::abort() d->transaction = nullptr; } +void Storage::Transaction::setAutocommit(int interval) +{ + if (d) { + d->autoCommitInterval = interval; + } +} + bool Storage::Transaction::write(const QByteArray &sKey, const QByteArray &sValue, const std::function &errorHandler) { if (!d || !d->transaction) { @@ -160,6 +173,29 @@ bool Storage::Transaction::write(const QByteArray &sKey, const QByteArray &sValu d->implicitCommit = true; } + if (d->autoCommitInterval > 0) { + d->modificationCounter++; + if (d->modificationCounter >= d->autoCommitInterval) { + commit(); + + MDB_txn *txn; + rc = mdb_txn_begin(d->env, NULL, 0, &txn); + if (!rc) { + //TODO: Move opening of dbi into Transaction for different named databases + MDB_dbi dbi; + rc = mdb_dbi_open(txn, NULL, d->allowDuplicates ? MDB_DUPSORT : 0, &dbi); + if (rc) { + errorHandler(Error(d->name.toLatin1(), ErrorCodes::GenericError, "Error while opening transaction: " + QByteArray(mdb_strerror(rc)))); + } else { + d->transaction = txn; + d->dbi = dbi; + } + } + + d->modificationCounter = 0; + } + } + return !rc; } @@ -387,7 +423,7 @@ Storage::Transaction Storage::createTransaction(AccessMode type, const std::func errorHandler(Error(d->name.toLatin1(), ErrorCodes::GenericError, "Error while opening transaction: " + QByteArray(mdb_strerror(rc)))); return Transaction(); } - return Transaction(new Transaction::Private(txn, dbi, d->allowDuplicates, defaultErrorHandler(), d->name)); + return Transaction(new Transaction::Private(txn, dbi, d->allowDuplicates, defaultErrorHandler(), d->name, d->env)); } else { if (rc) { errorHandler(Error(d->name.toLatin1(), ErrorCodes::GenericError, "Error while beginning transaction: " + QByteArray(mdb_strerror(rc)))); -- cgit v1.2.3