summaryrefslogtreecommitdiffstats
path: root/common/storage_lmdb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/storage_lmdb.cpp')
-rw-r--r--common/storage_lmdb.cpp74
1 files changed, 42 insertions, 32 deletions
diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp
index e49ecae..08eea37 100644
--- a/common/storage_lmdb.cpp
+++ b/common/storage_lmdb.cpp
@@ -62,6 +62,44 @@ int getErrorCode(int e)
62 return -1; 62 return -1;
63} 63}
64 64
65static QList<QByteArray> getDatabaseNames(MDB_txn *transaction)
66{
67 if (!transaction) {
68 SinkWarning() << "Invalid transaction";
69 return QList<QByteArray>();
70 }
71 int rc;
72 QList<QByteArray> list;
73 MDB_dbi dbi;
74 if ((rc = mdb_dbi_open(transaction, nullptr, 0, &dbi) == 0)) {
75 MDB_val key;
76 MDB_val data;
77 MDB_cursor *cursor;
78
79 mdb_cursor_open(transaction, dbi, &cursor);
80 if ((rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST)) == 0) {
81 list << QByteArray::fromRawData((char *)key.mv_data, key.mv_size);
82 while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
83 list << QByteArray::fromRawData((char *)key.mv_data, key.mv_size);
84 }
85 } else {
86 //Normal if we don't have any databases yet
87 if (rc == MDB_NOTFOUND) {
88 rc = 0;
89 }
90 if (rc) {
91 SinkWarning() << "Failed to get a value" << rc;
92 }
93 }
94 mdb_cursor_close(cursor);
95 } else {
96 SinkWarning() << "Failed to open db" << rc << QByteArray(mdb_strerror(rc));
97 }
98 return list;
99
100}
101
102
65class DataStore::NamedDatabase::Private 103class DataStore::NamedDatabase::Private
66{ 104{
67public: 105public:
@@ -291,7 +329,8 @@ int DataStore::NamedDatabase::scan(const QByteArray &k, const std::function<bool
291 329
292 rc = mdb_cursor_open(d->transaction, d->dbi, &cursor); 330 rc = mdb_cursor_open(d->transaction, d->dbi, &cursor);
293 if (rc) { 331 if (rc) {
294 Error error(d->name.toLatin1() + d->db, getErrorCode(rc), QByteArray("Error during mdb_cursor open: ") + QByteArray(mdb_strerror(rc))); 332 //Invalid arguments can mean that the transaction doesn't contain the db dbi
333 Error error(d->name.toLatin1() + d->db, getErrorCode(rc), QByteArray("Error during mdb_cursor_open: ") + QByteArray(mdb_strerror(rc)) + ". Key: " + k);
295 errorHandler ? errorHandler(error) : d->defaultErrorHandler(error); 334 errorHandler ? errorHandler(error) : d->defaultErrorHandler(error);
296 return 0; 335 return 0;
297 } 336 }
@@ -459,7 +498,6 @@ public:
459 498
460 MDB_env *env; 499 MDB_env *env;
461 MDB_txn *transaction; 500 MDB_txn *transaction;
462 MDB_dbi dbi;
463 bool requestedRead; 501 bool requestedRead;
464 std::function<void(const DataStore::Error &error)> defaultErrorHandler; 502 std::function<void(const DataStore::Error &error)> defaultErrorHandler;
465 QString name; 503 QString name;
@@ -590,8 +628,7 @@ static bool ensureCorrectDb(DataStore::NamedDatabase &database, const QByteArray
590 } 628 }
591 return false; 629 return false;
592 }, 630 },
593 [](const DataStore::Error &error) -> bool{ 631 [&](const DataStore::Error &) {
594 return false;
595 }, false); 632 }, false);
596 //This is the first time we open this database in a write transaction, write the db name 633 //This is the first time we open this database in a write transaction, write the db name
597 if (!count) { 634 if (!count) {
@@ -649,35 +686,8 @@ QList<QByteArray> DataStore::Transaction::getDatabaseNames() const
649 SinkWarning() << "Invalid transaction"; 686 SinkWarning() << "Invalid transaction";
650 return QList<QByteArray>(); 687 return QList<QByteArray>();
651 } 688 }
689 return Sink::Storage::getDatabaseNames(d->transaction);
652 690
653 int rc;
654 QList<QByteArray> list;
655 Q_ASSERT(d->transaction);
656 if ((rc = mdb_dbi_open(d->transaction, nullptr, 0, &d->dbi) == 0)) {
657 MDB_val key;
658 MDB_val data;
659 MDB_cursor *cursor;
660
661 mdb_cursor_open(d->transaction, d->dbi, &cursor);
662 if ((rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST)) == 0) {
663 list << QByteArray::fromRawData((char *)key.mv_data, key.mv_size);
664 while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
665 list << QByteArray::fromRawData((char *)key.mv_data, key.mv_size);
666 }
667 } else {
668 //Normal if we don't have any databases yet
669 if (rc == MDB_NOTFOUND) {
670 rc = 0;
671 }
672 if (rc) {
673 SinkWarning() << "Failed to get a value" << rc;
674 }
675 }
676 mdb_cursor_close(cursor);
677 } else {
678 SinkWarning() << "Failed to open db" << rc << QByteArray(mdb_strerror(rc));
679 }
680 return list;
681} 691}
682 692
683 693