From 5f7262f5c410cf3f36116c221d28dd393664228d Mon Sep 17 00:00:00 2001 From: Aaron Seigo Date: Tue, 9 Dec 2014 22:01:35 +0100 Subject: add another read method and expose a basic error handler for convenience also, add some todos --- common/storage.h | 7 ++++--- common/storage_common.cpp | 7 ++++++- common/storage_lmdb.cpp | 23 ++++++++++++----------- 3 files changed, 22 insertions(+), 15 deletions(-) (limited to 'common') diff --git a/common/storage.h b/common/storage.h index 83c307c..a051043 100644 --- a/common/storage.h +++ b/common/storage.h @@ -32,16 +32,17 @@ public: const std::function &resultHandler); void read(const std::string &sKey, const std::function &resultHandler, - const std::function &errors); + const std::function &errorHandler); void read(const std::string &sKey, const std::function &resultHandler); void read(const std::string &sKey, const std::function & resultHandler, const std::function &errorHandler); void scan(const std::string &sKey, const std::function &resultHandler); - void scan(const std::string &sKey, - const std::function & resultHandler, + void scan(const char *keyData, uint keySize, + const std::function &resultHandler, const std::function &errorHandler); + static std::function basicErrorHandler(); qint64 diskUsage() const; void removeFromDisk() const; private: diff --git a/common/storage_common.cpp b/common/storage_common.cpp index 246611c..6263bf2 100644 --- a/common/storage_common.cpp +++ b/common/storage_common.cpp @@ -9,6 +9,11 @@ void errorHandler(const Storage::Error &error) std::cerr << "Read error in " << error.store << ", code " << error.code << ", message: " << error.message << std::endl; } +std::function Storage::basicErrorHandler() +{ + return errorHandler; +} + void Storage::read(const std::string &sKey, const std::function &resultHandler) { read(sKey, resultHandler, &errorHandler); @@ -21,6 +26,6 @@ void Storage::read(const std::string &sKey, const std::function &resultHandler) { - scan(sKey, resultHandler, &errorHandler); + scan(sKey.data(), sKey.size(), resultHandler, &errorHandler); } diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp index 95af3a2..2bffcd7 100644 --- a/common/storage_lmdb.cpp +++ b/common/storage_lmdb.cpp @@ -204,19 +204,18 @@ void Storage::read(const std::string &sKey, const std::string resultValue(static_cast(ptr), size); return resultHandler(resultValue); }, errorHandler); -// std::cout << "key: " << resultKey << " data: " << resultValue << std::endl; } void Storage::read(const std::string &sKey, const std::function &resultHandler, const std::function &errorHandler) { - scan(sKey, [resultHandler](void *keyPtr, int keySize, void *valuePtr, int valueSize) { + scan(sKey.data(), sKey.size(), [resultHandler](void *keyPtr, int keySize, void *valuePtr, int valueSize) { return resultHandler(valuePtr, valueSize); }, errorHandler); } -void Storage::scan(const std::string &sKey, +void Storage::scan(const char *keyData, uint keySize, const std::function &resultHandler, const std::function &errorHandler) { @@ -231,8 +230,8 @@ void Storage::scan(const std::string &sKey, MDB_val data; MDB_cursor *cursor; - key.mv_size = sKey.size(); - key.mv_data = (void*)sKey.data(); + key.mv_data = (void*)keyData; + key.mv_size = keySize; const bool implicitTransaction = !d->transaction; if (implicitTransaction) { @@ -251,11 +250,13 @@ void Storage::scan(const std::string &sKey, return; } - if (sKey.empty()) { - rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST); - while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { - if (!resultHandler(key.mv_data, key.mv_size, data.mv_data, data.mv_size)) { - break; + if (!keyData || keySize == 0) { + if ((rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST)) == 0 && + resultHandler(key.mv_data, key.mv_size, data.mv_data, data.mv_size)) { + while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { + if (!resultHandler(key.mv_data, key.mv_size, data.mv_data, data.mv_size)) { + break; + } } } @@ -267,7 +268,7 @@ void Storage::scan(const std::string &sKey, if ((rc = mdb_cursor_get(cursor, &key, &data, MDB_SET)) == 0) { resultHandler(key.mv_data, key.mv_size, data.mv_data, data.mv_size); } else { - std::cout << "couldn't find value " << sKey << " " << std::endl; + std::cout << "couldn't find value " << std::string(keyData, keySize) << std::endl; } } -- cgit v1.2.3