From 2f504b6f264c90ded6b0226a565301da97d3918f Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 15 Dec 2015 09:05:58 +0100 Subject: Added a way to gather some db statistics. --- common/storage.h | 4 ++++ common/storage_lmdb.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) (limited to 'common') 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: return (d != nullptr); } + qint64 getSize(); + private: friend Transaction; NamedDatabase(NamedDatabase& other); @@ -123,6 +125,8 @@ public: bool commit(const std::function &errorHandler = std::function()); void abort(); + QList getDatabaseNames() const; + NamedDatabase openDatabase(const QByteArray &name = QByteArray("default"), const std::function &errorHandler = std::function(), bool allowDuplicates = false) const; 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, return; } +qint64 Storage::NamedDatabase::getSize() +{ + if (!d || !d->transaction) { + return -1; + } + + int rc; + MDB_stat stat; + rc = mdb_stat(d->transaction, d->dbi, &stat); + if (rc) { + qWarning() << "Something went wrong " << rc; + } + // std::cout << "overflow_pages: " << stat.ms_overflow_pages << std::endl; + // std::cout << "page size: " << stat.ms_psize << std::endl; + // std::cout << "branch_pages: " << stat.ms_branch_pages << std::endl; + // std::cout << "leaf_pages: " << stat.ms_leaf_pages << std::endl; + // std::cout << "depth: " << stat.ms_depth << std::endl; + // std::cout << "entries: " << stat.ms_entries << std::endl; + return stat.ms_psize * (stat.ms_leaf_pages + stat.ms_branch_pages + stat.ms_overflow_pages); +} + @@ -428,9 +449,34 @@ Storage::NamedDatabase Storage::Transaction::openDatabase(const QByteArray &db, return Storage::NamedDatabase(p); } +QList Storage::Transaction::getDatabaseNames() const +{ + if (!d) { + qWarning() << "Invalid transaction"; + return QList(); + } + int rc; + QList list; + if ((rc = mdb_dbi_open(d->transaction, nullptr, 0, &d->dbi) == 0)) { + MDB_val key; + MDB_val data; + MDB_cursor *cursor; - + rc = mdb_cursor_open(d->transaction, d->dbi, &cursor); + if ((rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST)) == 0) { + list << QByteArray::fromRawData((char*)key.mv_data, key.mv_size); + while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { + list << QByteArray::fromRawData((char*)key.mv_data, key.mv_size); + } + } else { + qWarning() << "Failed to get a value" << rc; + } + } else { + qWarning() << "Failed to open db" << rc << QByteArray(mdb_strerror(rc)); + } + return list; +} -- cgit v1.2.3