diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-08-19 10:15:22 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-08-19 10:15:22 +0200 |
commit | b6502ce1137b3ef7af8a908a9fa5d8fbeed6ed32 (patch) | |
tree | 20cb05a5534f9272583dd240872eb4717864d02d /common/storage_lmdb.cpp | |
parent | e19bad87f43caf602793d8297562804b17383f7d (diff) | |
download | sink-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.cpp | 62 |
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) | |||
52 | class Storage::Transaction::Private | 52 | class Storage::Transaction::Private |
53 | { | 53 | { |
54 | public: | 54 | public: |
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 | ||
86 | Storage::Transaction::Transaction() | 102 | Storage::Transaction::Transaction() |
@@ -92,7 +108,8 @@ Storage::Transaction::Transaction() | |||
92 | Storage::Transaction::Transaction(Transaction::Private *prv) | 108 | Storage::Transaction::Transaction(Transaction::Private *prv) |
93 | : d(prv) | 109 | : d(prv) |
94 | { | 110 | { |
95 | 111 | d->startTransaction(); | |
112 | d->openDatabase(); | ||
96 | } | 113 | } |
97 | 114 | ||
98 | Storage::Transaction::~Transaction() | 115 | Storage::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 | ||
436 | qint64 Storage::diskUsage() const | 422 | qint64 Storage::diskUsage() const |