diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/storage.h | 4 | ||||
-rw-r--r-- | common/storage_lmdb.cpp | 48 |
2 files changed, 51 insertions, 1 deletions
diff --git a/common/storage.h b/common/storage.h index a4137ce..22bf06c 100644 --- a/common/storage.h +++ b/common/storage.h | |||
@@ -106,6 +106,8 @@ public: | |||
106 | return (d != nullptr); | 106 | return (d != nullptr); |
107 | } | 107 | } |
108 | 108 | ||
109 | qint64 getSize(); | ||
110 | |||
109 | private: | 111 | private: |
110 | friend Transaction; | 112 | friend Transaction; |
111 | NamedDatabase(NamedDatabase& other); | 113 | NamedDatabase(NamedDatabase& other); |
@@ -123,6 +125,8 @@ public: | |||
123 | bool commit(const std::function<void(const Storage::Error &error)> &errorHandler = std::function<void(const Storage::Error &error)>()); | 125 | bool commit(const std::function<void(const Storage::Error &error)> &errorHandler = std::function<void(const Storage::Error &error)>()); |
124 | void abort(); | 126 | void abort(); |
125 | 127 | ||
128 | QList<QByteArray> getDatabaseNames() const; | ||
129 | |||
126 | NamedDatabase openDatabase(const QByteArray &name = QByteArray("default"), const std::function<void(const Storage::Error &error)> &errorHandler = std::function<void(const Storage::Error &error)>(), bool allowDuplicates = false) const; | 130 | NamedDatabase openDatabase(const QByteArray &name = QByteArray("default"), const std::function<void(const Storage::Error &error)> &errorHandler = std::function<void(const Storage::Error &error)>(), bool allowDuplicates = false) const; |
127 | 131 | ||
128 | Transaction(Transaction&& other) : d(other.d) | 132 | Transaction(Transaction&& other) : d(other.d) |
diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp index a247e38..e32618b 100644 --- a/common/storage_lmdb.cpp +++ b/common/storage_lmdb.cpp | |||
@@ -318,6 +318,27 @@ void Storage::NamedDatabase::findLatest(const QByteArray &k, | |||
318 | return; | 318 | return; |
319 | } | 319 | } |
320 | 320 | ||
321 | qint64 Storage::NamedDatabase::getSize() | ||
322 | { | ||
323 | if (!d || !d->transaction) { | ||
324 | return -1; | ||
325 | } | ||
326 | |||
327 | int rc; | ||
328 | MDB_stat stat; | ||
329 | rc = mdb_stat(d->transaction, d->dbi, &stat); | ||
330 | if (rc) { | ||
331 | qWarning() << "Something went wrong " << rc; | ||
332 | } | ||
333 | // std::cout << "overflow_pages: " << stat.ms_overflow_pages << std::endl; | ||
334 | // std::cout << "page size: " << stat.ms_psize << std::endl; | ||
335 | // std::cout << "branch_pages: " << stat.ms_branch_pages << std::endl; | ||
336 | // std::cout << "leaf_pages: " << stat.ms_leaf_pages << std::endl; | ||
337 | // std::cout << "depth: " << stat.ms_depth << std::endl; | ||
338 | // std::cout << "entries: " << stat.ms_entries << std::endl; | ||
339 | return stat.ms_psize * (stat.ms_leaf_pages + stat.ms_branch_pages + stat.ms_overflow_pages); | ||
340 | } | ||
341 | |||
321 | 342 | ||
322 | 343 | ||
323 | 344 | ||
@@ -428,9 +449,34 @@ Storage::NamedDatabase Storage::Transaction::openDatabase(const QByteArray &db, | |||
428 | return Storage::NamedDatabase(p); | 449 | return Storage::NamedDatabase(p); |
429 | } | 450 | } |
430 | 451 | ||
452 | QList<QByteArray> Storage::Transaction::getDatabaseNames() const | ||
453 | { | ||
454 | if (!d) { | ||
455 | qWarning() << "Invalid transaction"; | ||
456 | return QList<QByteArray>(); | ||
457 | } | ||
431 | 458 | ||
459 | int rc; | ||
460 | QList<QByteArray> list; | ||
461 | if ((rc = mdb_dbi_open(d->transaction, nullptr, 0, &d->dbi) == 0)) { | ||
462 | MDB_val key; | ||
463 | MDB_val data; | ||
464 | MDB_cursor *cursor; | ||
432 | 465 | ||
433 | 466 | rc = mdb_cursor_open(d->transaction, d->dbi, &cursor); | |
467 | if ((rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST)) == 0) { | ||
468 | list << QByteArray::fromRawData((char*)key.mv_data, key.mv_size); | ||
469 | while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { | ||
470 | list << QByteArray::fromRawData((char*)key.mv_data, key.mv_size); | ||
471 | } | ||
472 | } else { | ||
473 | qWarning() << "Failed to get a value" << rc; | ||
474 | } | ||
475 | } else { | ||
476 | qWarning() << "Failed to open db" << rc << QByteArray(mdb_strerror(rc)); | ||
477 | } | ||
478 | return list; | ||
479 | } | ||
434 | 480 | ||
435 | 481 | ||
436 | 482 | ||