diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-01-20 23:40:23 +0100 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-01-20 23:40:23 +0100 |
commit | 4f1edeb042b9d4cfe8efe5baa0f57f4eb950fd86 (patch) | |
tree | 274a1902a8fd340476da3ec36a8c4a89cf854ff5 /common/storage_lmdb.cpp | |
parent | 31a1834a3b596a4cd2fbef8cf35adb92780bf886 (diff) | |
download | sink-4f1edeb042b9d4cfe8efe5baa0f57f4eb950fd86.tar.gz sink-4f1edeb042b9d4cfe8efe5baa0f57f4eb950fd86.zip |
Storage: support for duplicates.
Diffstat (limited to 'common/storage_lmdb.cpp')
-rw-r--r-- | common/storage_lmdb.cpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp index 591d761..bede6aa 100644 --- a/common/storage_lmdb.cpp +++ b/common/storage_lmdb.cpp | |||
@@ -39,7 +39,7 @@ namespace Akonadi2 | |||
39 | class Storage::Private | 39 | class Storage::Private |
40 | { | 40 | { |
41 | public: | 41 | public: |
42 | Private(const QString &s, const QString &name, AccessMode m); | 42 | Private(const QString &s, const QString &n, AccessMode m, bool duplicates); |
43 | ~Private(); | 43 | ~Private(); |
44 | 44 | ||
45 | QString storageRoot; | 45 | QString storageRoot; |
@@ -51,6 +51,7 @@ public: | |||
51 | AccessMode mode; | 51 | AccessMode mode; |
52 | bool readTransaction; | 52 | bool readTransaction; |
53 | bool firstOpen; | 53 | bool firstOpen; |
54 | bool allowDuplicates; | ||
54 | static QMutex sMutex; | 55 | static QMutex sMutex; |
55 | static QHash<QString, MDB_env*> sEnvironments; | 56 | static QHash<QString, MDB_env*> sEnvironments; |
56 | }; | 57 | }; |
@@ -58,14 +59,15 @@ public: | |||
58 | QMutex Storage::Private::sMutex; | 59 | QMutex Storage::Private::sMutex; |
59 | QHash<QString, MDB_env*> Storage::Private::sEnvironments; | 60 | QHash<QString, MDB_env*> Storage::Private::sEnvironments; |
60 | 61 | ||
61 | Storage::Private::Private(const QString &s, const QString &n, AccessMode m) | 62 | Storage::Private::Private(const QString &s, const QString &n, AccessMode m, bool duplicates) |
62 | : storageRoot(s), | 63 | : storageRoot(s), |
63 | name(n), | 64 | name(n), |
64 | env(0), | 65 | env(0), |
65 | transaction(0), | 66 | transaction(0), |
66 | mode(m), | 67 | mode(m), |
67 | readTransaction(false), | 68 | readTransaction(false), |
68 | firstOpen(true) | 69 | firstOpen(true), |
70 | allowDuplicates(duplicates) | ||
69 | { | 71 | { |
70 | const QString fullPath(storageRoot + '/' + name); | 72 | const QString fullPath(storageRoot + '/' + name); |
71 | QDir dir; | 73 | QDir dir; |
@@ -114,8 +116,8 @@ Storage::Private::~Private() | |||
114 | // } | 116 | // } |
115 | } | 117 | } |
116 | 118 | ||
117 | Storage::Storage(const QString &storageRoot, const QString &name, AccessMode mode) | 119 | Storage::Storage(const QString &storageRoot, const QString &name, AccessMode mode, bool allowDuplicates) |
118 | : d(new Private(storageRoot, name, mode)) | 120 | : d(new Private(storageRoot, name, mode, allowDuplicates)) |
119 | { | 121 | { |
120 | } | 122 | } |
121 | 123 | ||
@@ -166,7 +168,7 @@ bool Storage::startTransaction(AccessMode type) | |||
166 | int rc; | 168 | int rc; |
167 | rc = mdb_txn_begin(d->env, NULL, requestedRead ? MDB_RDONLY : 0, &d->transaction); | 169 | rc = mdb_txn_begin(d->env, NULL, requestedRead ? MDB_RDONLY : 0, &d->transaction); |
168 | if (!rc) { | 170 | if (!rc) { |
169 | rc = mdb_dbi_open(d->transaction, NULL, 0, &d->dbi); | 171 | rc = mdb_dbi_open(d->transaction, NULL, d->allowDuplicates ? MDB_DUPSORT : 0, &d->dbi); |
170 | } | 172 | } |
171 | 173 | ||
172 | d->firstOpen = false; | 174 | d->firstOpen = false; |
@@ -305,10 +307,10 @@ void Storage::scan(const char *keyData, uint keySize, | |||
305 | return; | 307 | return; |
306 | } | 308 | } |
307 | 309 | ||
308 | if (!keyData || keySize == 0) { | 310 | if (!keyData || keySize == 0 || d->allowDuplicates) { |
309 | if ((rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST)) == 0) { | 311 | if ((rc = mdb_cursor_get(cursor, &key, &data, d->allowDuplicates ? MDB_SET_RANGE : MDB_FIRST)) == 0) { |
310 | if (resultHandler(key.mv_data, key.mv_size, data.mv_data, data.mv_size)) { | 312 | if (resultHandler(key.mv_data, key.mv_size, data.mv_data, data.mv_size)) { |
311 | while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { | 313 | while ((rc = mdb_cursor_get(cursor, &key, &data, d->allowDuplicates ? MDB_NEXT_DUP : MDB_NEXT)) == 0) { |
312 | if (!resultHandler(key.mv_data, key.mv_size, data.mv_data, data.mv_size)) { | 314 | if (!resultHandler(key.mv_data, key.mv_size, data.mv_data, data.mv_size)) { |
313 | break; | 315 | break; |
314 | } | 316 | } |
@@ -316,7 +318,7 @@ void Storage::scan(const char *keyData, uint keySize, | |||
316 | } | 318 | } |
317 | } | 319 | } |
318 | 320 | ||
319 | //We never find the last value, but ensure we got at least one. | 321 | //We never find the last value |
320 | if (rc == MDB_NOTFOUND) { | 322 | if (rc == MDB_NOTFOUND) { |
321 | rc = 0; | 323 | rc = 0; |
322 | } | 324 | } |