From 363dae6a64321f5083103968bb461c5731bdd0e0 Mon Sep 17 00:00:00 2001 From: Vlad Gluhovsky Date: Tue, 7 Jul 2015 17:00:56 +0200 Subject: [PATCH] levelDB for whisper --- libwhisper/WhisperDB.cpp | 90 +++++++++++++++++++++++++++++++++++ libwhisper/WhisperDB.h | 50 +++++++++++++++++++ test/libwhisper/whisperDB.cpp | 70 +++++++++++++++++++++++++++ 3 files changed, 210 insertions(+) create mode 100644 libwhisper/WhisperDB.cpp create mode 100644 libwhisper/WhisperDB.h create mode 100644 test/libwhisper/whisperDB.cpp diff --git a/libwhisper/WhisperDB.cpp b/libwhisper/WhisperDB.cpp new file mode 100644 index 000000000..e5d40e571 --- /dev/null +++ b/libwhisper/WhisperDB.cpp @@ -0,0 +1,90 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ +/** @file WhisperDB.cpp +* @author Vladislav Gluhovsky +* @date July 2015 + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include "WhisperDB.h" + +using namespace std; +using namespace dev; +using namespace dev::shh; +using namespace dev::eth; + +WhisperDB::WhisperDB() +{ + string path = Defaults::dbPath(); + boost::filesystem::create_directories(path); + ldb::Options o; + o.create_if_missing = true; + ldb::DB::Open(o, path + "/whisper", &m_db); +} + +WhisperDB::~WhisperDB() +{ + delete m_db; +} + +bool WhisperDB::put(dev::h256 const& _key, string const& _value) +{ + string s = _key.hex(); + string cropped = s.substr(s.size() - 8); + leveldb::Status status = m_db->Put(m_writeOptions, s, _value); + if (status.ok()) + cdebug << "Whisper DB put:" << cropped << _value; + else + cdebug << "Whisper DB put failed:" << status.ToString() << "key:" << cropped; + + return status.ok(); +} + +string WhisperDB::get(dev::h256 const& _key) const +{ + string ret; + string s = _key.hex(); + string cropped = s.substr(s.size() - 8); + leveldb::Status status = m_db->Get(m_readOptions, s, &ret); + if (status.ok()) + cdebug << "Whisper DB get:" << cropped << ret; + else + cdebug << "Whisper DB get failed:" << status.ToString() << "key:" << cropped; + + return ret; +} + +bool WhisperDB::erase(dev::h256 const& _key) +{ + string s = _key.hex(); + string cropped = s.substr(s.size() - 8); + leveldb::Status status = m_db->Delete(m_writeOptions, s); + if (status.ok()) + cdebug << "Whisper DB erase:" << cropped; + else + cdebug << "Whisper DB erase failed:" << status.ToString() << "key:" << cropped; + + return status.ok(); +} diff --git a/libwhisper/WhisperDB.h b/libwhisper/WhisperDB.h new file mode 100644 index 000000000..70b65ef84 --- /dev/null +++ b/libwhisper/WhisperDB.h @@ -0,0 +1,50 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ +/** @file WhisperDB.h +* @author Vladislav Gluhovsky +* @date July 2015 + */ + +#pragma once + +#include +#include +#include "Common.h" + +namespace dev +{ +namespace shh +{ + +class WhisperDB +{ + public: + WhisperDB(); + ~WhisperDB(); + + bool put(dev::h256 const& _key, std::string const& _value); + bool erase(dev::h256 const& _key); + std::string get(dev::h256 const& _key) const; + +private: + ldb::ReadOptions m_readOptions; + ldb::WriteOptions m_writeOptions; + ldb::DB* m_db = nullptr; +}; + +} +} \ No newline at end of file diff --git a/test/libwhisper/whisperDB.cpp b/test/libwhisper/whisperDB.cpp new file mode 100644 index 000000000..4b821e0c5 --- /dev/null +++ b/test/libwhisper/whisperDB.cpp @@ -0,0 +1,70 @@ +/* +This file is part of cpp-ethereum. + +cpp-ethereum is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +cpp-ethereum is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with cpp-ethereum. If not, see . +*/ +/** @file whisperMessage.cpp +* @author Vladislav Gluhovsky +* @date July 2015 +*/ + +#include +#include + +using namespace std; +using namespace dev; +using namespace dev::shh; + +BOOST_AUTO_TEST_SUITE(whisperDB) + +BOOST_AUTO_TEST_CASE(first) +{ + VerbosityHolder setTemporaryLevel(10); + cnote << "Testing Whisper DB..."; + + WhisperDB db; + + h256 h1(0x12345678); + h256 h2(0xBADD00DE); + + string s; + string const text1 = "lorem_ipsum"; + string const text2 = "dolor_sit_amet"; + + db.erase(h1); + db.erase(h2); + + db.put(h1, text2); + s = db.get(h2); + BOOST_REQUIRE(s.empty()); + s = db.get(h1); + BOOST_REQUIRE(!s.compare(text2)); + + db.put(h1, text1); + s = db.get(h2); + BOOST_REQUIRE(s.empty()); + s = db.get(h1); + BOOST_REQUIRE(!s.compare(text1)); + + db.put(h2, text2); + s = db.get(h2); + BOOST_REQUIRE(!s.compare(text2)); + s = db.get(h1); + BOOST_REQUIRE(!s.compare(text1)); + + db.erase(h1); + db.erase(h2); +} + +BOOST_AUTO_TEST_SUITE_END()