summaryrefslogtreecommitdiffstats
path: root/common/storage_lmdb.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2015-01-20 23:40:23 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2015-01-20 23:40:23 +0100
commit4f1edeb042b9d4cfe8efe5baa0f57f4eb950fd86 (patch)
tree274a1902a8fd340476da3ec36a8c4a89cf854ff5 /common/storage_lmdb.cpp
parent31a1834a3b596a4cd2fbef8cf35adb92780bf886 (diff)
downloadsink-4f1edeb042b9d4cfe8efe5baa0f57f4eb950fd86.tar.gz
sink-4f1edeb042b9d4cfe8efe5baa0f57f4eb950fd86.zip
Storage: support for duplicates.
Diffstat (limited to 'common/storage_lmdb.cpp')
-rw-r--r--common/storage_lmdb.cpp22
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
39class Storage::Private 39class Storage::Private
40{ 40{
41public: 41public:
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:
58QMutex Storage::Private::sMutex; 59QMutex Storage::Private::sMutex;
59QHash<QString, MDB_env*> Storage::Private::sEnvironments; 60QHash<QString, MDB_env*> Storage::Private::sEnvironments;
60 61
61Storage::Private::Private(const QString &s, const QString &n, AccessMode m) 62Storage::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
117Storage::Storage(const QString &storageRoot, const QString &name, AccessMode mode) 119Storage::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 }