summaryrefslogtreecommitdiffstats
path: root/common/storage_lmdb.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2015-08-19 10:15:22 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2015-08-19 10:15:22 +0200
commitb6502ce1137b3ef7af8a908a9fa5d8fbeed6ed32 (patch)
tree20cb05a5534f9272583dd240872eb4717864d02d /common/storage_lmdb.cpp
parente19bad87f43caf602793d8297562804b17383f7d (diff)
downloadsink-b6502ce1137b3ef7af8a908a9fa5d8fbeed6ed32.tar.gz
sink-b6502ce1137b3ef7af8a908a9fa5d8fbeed6ed32.zip
Moved opening of transactions and database interfaces into the txn
Diffstat (limited to 'common/storage_lmdb.cpp')
-rw-r--r--common/storage_lmdb.cpp62
1 files changed, 24 insertions, 38 deletions
diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp
index 86d76a0..0618d61 100644
--- a/common/storage_lmdb.cpp
+++ b/common/storage_lmdb.cpp
@@ -52,10 +52,9 @@ int getErrorCode(int e)
52class Storage::Transaction::Private 52class Storage::Transaction::Private
53{ 53{
54public: 54public:
55 Private(MDB_txn *_txn, MDB_dbi _dbi, bool _allowDuplicates, const std::function<void(const Storage::Error &error)> &_defaultErrorHandler, const QString &_name, MDB_env *_env) 55 Private(bool _requestRead, bool _allowDuplicates, const std::function<void(const Storage::Error &error)> &_defaultErrorHandler, const QString &_name, MDB_env *_env)
56 : env(_env), 56 : env(_env),
57 transaction(_txn), 57 requestedRead(_requestRead),
58 dbi(_dbi),
59 allowDuplicates(_allowDuplicates), 58 allowDuplicates(_allowDuplicates),
60 defaultErrorHandler(_defaultErrorHandler), 59 defaultErrorHandler(_defaultErrorHandler),
61 name(_name), 60 name(_name),
@@ -74,6 +73,7 @@ public:
74 MDB_env *env; 73 MDB_env *env;
75 MDB_txn *transaction; 74 MDB_txn *transaction;
76 MDB_dbi dbi; 75 MDB_dbi dbi;
76 bool requestedRead;
77 bool allowDuplicates; 77 bool allowDuplicates;
78 std::function<void(const Storage::Error &error)> defaultErrorHandler; 78 std::function<void(const Storage::Error &error)> defaultErrorHandler;
79 QString name; 79 QString name;
@@ -81,6 +81,22 @@ public:
81 bool error; 81 bool error;
82 int autoCommitInterval; 82 int autoCommitInterval;
83 int modificationCounter; 83 int modificationCounter;
84
85 void startTransaction()
86 {
87 const int rc = mdb_txn_begin(env, NULL, requestedRead ? MDB_RDONLY : 0, &transaction);
88 if (rc) {
89 defaultErrorHandler(Error(name.toLatin1(), ErrorCodes::GenericError, "Error while opening transaction: " + QByteArray(mdb_strerror(rc))));
90 }
91 }
92
93 void openDatabase()
94 {
95 const int rc = mdb_dbi_open(transaction, NULL, allowDuplicates ? MDB_DUPSORT : 0, &dbi);
96 if (rc) {
97 defaultErrorHandler(Error(name.toLatin1(), ErrorCodes::GenericError, "Error while opening database: " + QByteArray(mdb_strerror(rc))));
98 }
99 }
84}; 100};
85 101
86Storage::Transaction::Transaction() 102Storage::Transaction::Transaction()
@@ -92,7 +108,8 @@ Storage::Transaction::Transaction()
92Storage::Transaction::Transaction(Transaction::Private *prv) 108Storage::Transaction::Transaction(Transaction::Private *prv)
93 : d(prv) 109 : d(prv)
94{ 110{
95 111 d->startTransaction();
112 d->openDatabase();
96} 113}
97 114
98Storage::Transaction::~Transaction() 115Storage::Transaction::~Transaction()
@@ -177,21 +194,8 @@ bool Storage::Transaction::write(const QByteArray &sKey, const QByteArray &sValu
177 d->modificationCounter++; 194 d->modificationCounter++;
178 if (d->modificationCounter >= d->autoCommitInterval) { 195 if (d->modificationCounter >= d->autoCommitInterval) {
179 commit(); 196 commit();
180 197 d->startTransaction();
181 MDB_txn *txn; 198 d->openDatabase();
182 rc = mdb_txn_begin(d->env, NULL, 0, &txn);
183 if (!rc) {
184 //TODO: Move opening of dbi into Transaction for different named databases
185 MDB_dbi dbi;
186 rc = mdb_dbi_open(txn, NULL, d->allowDuplicates ? MDB_DUPSORT : 0, &dbi);
187 if (rc) {
188 errorHandler(Error(d->name.toLatin1(), ErrorCodes::GenericError, "Error while opening transaction: " + QByteArray(mdb_strerror(rc))));
189 } else {
190 d->transaction = txn;
191 d->dbi = dbi;
192 }
193 }
194
195 d->modificationCounter = 0; 199 d->modificationCounter = 0;
196 } 200 }
197 } 201 }
@@ -412,25 +416,7 @@ Storage::Transaction Storage::createTransaction(AccessMode type, const std::func
412 return Transaction(); 416 return Transaction();
413 } 417 }
414 418
415 int rc; 419 return Transaction(new Transaction::Private(requestedRead, d->allowDuplicates, defaultErrorHandler(), d->name, d->env));
416 MDB_txn *txn;
417 rc = mdb_txn_begin(d->env, NULL, requestedRead ? MDB_RDONLY : 0, &txn);
418 if (!rc) {
419 //TODO: Move opening of dbi into Transaction for different named databases
420 MDB_dbi dbi;
421 rc = mdb_dbi_open(txn, NULL, d->allowDuplicates ? MDB_DUPSORT : 0, &dbi);
422 if (rc) {
423 errorHandler(Error(d->name.toLatin1(), ErrorCodes::GenericError, "Error while opening transaction: " + QByteArray(mdb_strerror(rc))));
424 return Transaction();
425 }
426 return Transaction(new Transaction::Private(txn, dbi, d->allowDuplicates, defaultErrorHandler(), d->name, d->env));
427 } else {
428 if (rc) {
429 errorHandler(Error(d->name.toLatin1(), ErrorCodes::GenericError, "Error while beginning transaction: " + QByteArray(mdb_strerror(rc))));
430 return Transaction();
431 }
432 }
433 return Transaction();
434} 420}
435 421
436qint64 Storage::diskUsage() const 422qint64 Storage::diskUsage() const