From b64187d05f327992c304836fe1fc1d276ec80c36 Mon Sep 17 00:00:00 2001 From: Brandon Dahler Date: Tue, 5 Nov 2013 19:58:43 -0600 Subject: Rename leveldb.{h,cpp} to leveldbwrapper.{h,cpp}. --- src/Makefile.am | 4 +- src/leveldb.cpp | 77 ------------------------ src/leveldb.h | 154 ------------------------------------------------ src/leveldbwrapper.cpp | 77 ++++++++++++++++++++++++ src/leveldbwrapper.h | 155 +++++++++++++++++++++++++++++++++++++++++++++++++ src/txdb.cpp | 2 +- src/txdb.h | 6 +- 7 files changed, 238 insertions(+), 237 deletions(-) delete mode 100644 src/leveldb.cpp delete mode 100644 src/leveldb.h create mode 100644 src/leveldbwrapper.cpp create mode 100644 src/leveldbwrapper.h diff --git a/src/Makefile.am b/src/Makefile.am index 508063d5e2..b09c656597 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,7 +15,7 @@ DIST_SUBDIRS = . qt test BITCOIN_CORE_H = addrman.h alert.h allocators.h base58.h bignum.h \ bitcoinrpc.h bloom.h chainparams.h checkpoints.h checkqueue.h \ clientversion.h compat.h core.h crypter.h db.h hash.h init.h \ - key.h keystore.h leveldb.h limitedmap.h main.h miner.h mruset.h \ + key.h keystore.h leveldbwrapper.h limitedmap.h main.h miner.h mruset.h \ netbase.h net.h protocol.h script.h serialize.h sync.h threadsafety.h \ txdb.h txmempool.h ui_interface.h uint256.h util.h version.h walletdb.h wallet.h @@ -33,7 +33,7 @@ version.o: obj/build.h libbitcoin_a_SOURCES = addrman.cpp alert.cpp allocators.cpp bitcoinrpc.cpp bloom.cpp \ chainparams.cpp checkpoints.cpp core.cpp crypter.cpp db.cpp hash.cpp \ - init.cpp key.cpp keystore.cpp leveldb.cpp main.cpp miner.cpp \ + init.cpp key.cpp keystore.cpp leveldbwrapper.cpp main.cpp miner.cpp \ netbase.cpp net.cpp noui.cpp protocol.cpp rpcblockchain.cpp rpcdump.cpp \ rpcmining.cpp rpcnet.cpp rpcrawtransaction.cpp rpcwallet.cpp script.cpp \ sync.cpp txdb.cpp txmempool.cpp util.cpp version.cpp wallet.cpp walletdb.cpp $(JSON_H) \ diff --git a/src/leveldb.cpp b/src/leveldb.cpp deleted file mode 100644 index fb202367c4..0000000000 --- a/src/leveldb.cpp +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2012 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "leveldb.h" -#include "util.h" - -#include -#include -#include -#include - -#include - -void HandleError(const leveldb::Status &status) throw(leveldb_error) { - if (status.ok()) - return; - LogPrintf("%s\n", status.ToString().c_str()); - if (status.IsCorruption()) - throw leveldb_error("Database corrupted"); - if (status.IsIOError()) - throw leveldb_error("Database I/O error"); - if (status.IsNotFound()) - throw leveldb_error("Database entry missing"); - throw leveldb_error("Unknown database error"); -} - -static leveldb::Options GetOptions(size_t nCacheSize) { - leveldb::Options options; - options.block_cache = leveldb::NewLRUCache(nCacheSize / 2); - options.write_buffer_size = nCacheSize / 4; // up to two write buffers may be held in memory simultaneously - options.filter_policy = leveldb::NewBloomFilterPolicy(10); - options.compression = leveldb::kNoCompression; - options.max_open_files = 64; - return options; -} - -CLevelDB::CLevelDB(const boost::filesystem::path &path, size_t nCacheSize, bool fMemory, bool fWipe) { - penv = NULL; - readoptions.verify_checksums = true; - iteroptions.verify_checksums = true; - iteroptions.fill_cache = false; - syncoptions.sync = true; - options = GetOptions(nCacheSize); - options.create_if_missing = true; - if (fMemory) { - penv = leveldb::NewMemEnv(leveldb::Env::Default()); - options.env = penv; - } else { - if (fWipe) { - LogPrintf("Wiping LevelDB in %s\n", path.string().c_str()); - leveldb::DestroyDB(path.string(), options); - } - boost::filesystem::create_directory(path); - LogPrintf("Opening LevelDB in %s\n", path.string().c_str()); - } - leveldb::Status status = leveldb::DB::Open(options, path.string(), &pdb); - HandleError(status); - LogPrintf("Opened LevelDB successfully\n"); -} - -CLevelDB::~CLevelDB() { - delete pdb; - pdb = NULL; - delete options.filter_policy; - options.filter_policy = NULL; - delete options.block_cache; - options.block_cache = NULL; - delete penv; - options.env = NULL; -} - -bool CLevelDB::WriteBatch(CLevelDBBatch &batch, bool fSync) throw(leveldb_error) { - leveldb::Status status = pdb->Write(fSync ? syncoptions : writeoptions, &batch.batch); - HandleError(status); - return true; -} diff --git a/src/leveldb.h b/src/leveldb.h deleted file mode 100644 index 7daddeb493..0000000000 --- a/src/leveldb.h +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright (c) 2012 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_LEVELDB_H -#define BITCOIN_LEVELDB_H - -#include "serialize.h" -#include "util.h" - -#include -#include - -#include - -class leveldb_error : public std::runtime_error -{ -public: - leveldb_error(const std::string &msg) : std::runtime_error(msg) {} -}; - -void HandleError(const leveldb::Status &status) throw(leveldb_error); - -// Batch of changes queued to be written to a CLevelDB -class CLevelDBBatch -{ - friend class CLevelDB; - -private: - leveldb::WriteBatch batch; - -public: - template void Write(const K& key, const V& value) { - CDataStream ssKey(SER_DISK, CLIENT_VERSION); - ssKey.reserve(ssKey.GetSerializeSize(key)); - ssKey << key; - leveldb::Slice slKey(&ssKey[0], ssKey.size()); - - CDataStream ssValue(SER_DISK, CLIENT_VERSION); - ssValue.reserve(ssValue.GetSerializeSize(value)); - ssValue << value; - leveldb::Slice slValue(&ssValue[0], ssValue.size()); - - batch.Put(slKey, slValue); - } - - template void Erase(const K& key) { - CDataStream ssKey(SER_DISK, CLIENT_VERSION); - ssKey.reserve(ssKey.GetSerializeSize(key)); - ssKey << key; - leveldb::Slice slKey(&ssKey[0], ssKey.size()); - - batch.Delete(slKey); - } -}; - -class CLevelDB -{ -private: - // custom environment this database is using (may be NULL in case of default environment) - leveldb::Env *penv; - - // database options used - leveldb::Options options; - - // options used when reading from the database - leveldb::ReadOptions readoptions; - - // options used when iterating over values of the database - leveldb::ReadOptions iteroptions; - - // options used when writing to the database - leveldb::WriteOptions writeoptions; - - // options used when sync writing to the database - leveldb::WriteOptions syncoptions; - - // the database itself - leveldb::DB *pdb; - -public: - CLevelDB(const boost::filesystem::path &path, size_t nCacheSize, bool fMemory = false, bool fWipe = false); - ~CLevelDB(); - - template bool Read(const K& key, V& value) throw(leveldb_error) { - CDataStream ssKey(SER_DISK, CLIENT_VERSION); - ssKey.reserve(ssKey.GetSerializeSize(key)); - ssKey << key; - leveldb::Slice slKey(&ssKey[0], ssKey.size()); - - std::string strValue; - leveldb::Status status = pdb->Get(readoptions, slKey, &strValue); - if (!status.ok()) { - if (status.IsNotFound()) - return false; - LogPrintf("LevelDB read failure: %s\n", status.ToString().c_str()); - HandleError(status); - } - try { - CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION); - ssValue >> value; - } catch(std::exception &e) { - return false; - } - return true; - } - - template bool Write(const K& key, const V& value, bool fSync = false) throw(leveldb_error) { - CLevelDBBatch batch; - batch.Write(key, value); - return WriteBatch(batch, fSync); - } - - template bool Exists(const K& key) throw(leveldb_error) { - CDataStream ssKey(SER_DISK, CLIENT_VERSION); - ssKey.reserve(ssKey.GetSerializeSize(key)); - ssKey << key; - leveldb::Slice slKey(&ssKey[0], ssKey.size()); - - std::string strValue; - leveldb::Status status = pdb->Get(readoptions, slKey, &strValue); - if (!status.ok()) { - if (status.IsNotFound()) - return false; - LogPrintf("LevelDB read failure: %s\n", status.ToString().c_str()); - HandleError(status); - } - return true; - } - - template bool Erase(const K& key, bool fSync = false) throw(leveldb_error) { - CLevelDBBatch batch; - batch.Erase(key); - return WriteBatch(batch, fSync); - } - - bool WriteBatch(CLevelDBBatch &batch, bool fSync = false) throw(leveldb_error); - - // not available for LevelDB; provide for compatibility with BDB - bool Flush() { - return true; - } - - bool Sync() throw(leveldb_error) { - CLevelDBBatch batch; - return WriteBatch(batch, true); - } - - // not exactly clean encapsulation, but it's easiest for now - leveldb::Iterator *NewIterator() { - return pdb->NewIterator(iteroptions); - } -}; - -#endif // BITCOIN_LEVELDB_H diff --git a/src/leveldbwrapper.cpp b/src/leveldbwrapper.cpp new file mode 100644 index 0000000000..399208e66c --- /dev/null +++ b/src/leveldbwrapper.cpp @@ -0,0 +1,77 @@ +// Copyright (c) 2012-2013 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "leveldbwrapper.h" +#include "util.h" + +#include +#include +#include +#include + +#include + +void HandleError(const leveldb::Status &status) throw(leveldb_error) { + if (status.ok()) + return; + LogPrintf("%s\n", status.ToString().c_str()); + if (status.IsCorruption()) + throw leveldb_error("Database corrupted"); + if (status.IsIOError()) + throw leveldb_error("Database I/O error"); + if (status.IsNotFound()) + throw leveldb_error("Database entry missing"); + throw leveldb_error("Unknown database error"); +} + +static leveldb::Options GetOptions(size_t nCacheSize) { + leveldb::Options options; + options.block_cache = leveldb::NewLRUCache(nCacheSize / 2); + options.write_buffer_size = nCacheSize / 4; // up to two write buffers may be held in memory simultaneously + options.filter_policy = leveldb::NewBloomFilterPolicy(10); + options.compression = leveldb::kNoCompression; + options.max_open_files = 64; + return options; +} + +CLevelDBWrapper::CLevelDBWrapper(const boost::filesystem::path &path, size_t nCacheSize, bool fMemory, bool fWipe) { + penv = NULL; + readoptions.verify_checksums = true; + iteroptions.verify_checksums = true; + iteroptions.fill_cache = false; + syncoptions.sync = true; + options = GetOptions(nCacheSize); + options.create_if_missing = true; + if (fMemory) { + penv = leveldb::NewMemEnv(leveldb::Env::Default()); + options.env = penv; + } else { + if (fWipe) { + LogPrintf("Wiping LevelDB in %s\n", path.string().c_str()); + leveldb::DestroyDB(path.string(), options); + } + boost::filesystem::create_directory(path); + LogPrintf("Opening LevelDB in %s\n", path.string().c_str()); + } + leveldb::Status status = leveldb::DB::Open(options, path.string(), &pdb); + HandleError(status); + LogPrintf("Opened LevelDB successfully\n"); +} + +CLevelDBWrapper::~CLevelDBWrapper() { + delete pdb; + pdb = NULL; + delete options.filter_policy; + options.filter_policy = NULL; + delete options.block_cache; + options.block_cache = NULL; + delete penv; + options.env = NULL; +} + +bool CLevelDBWrapper::WriteBatch(CLevelDBBatch &batch, bool fSync) throw(leveldb_error) { + leveldb::Status status = pdb->Write(fSync ? syncoptions : writeoptions, &batch.batch); + HandleError(status); + return true; +} diff --git a/src/leveldbwrapper.h b/src/leveldbwrapper.h new file mode 100644 index 0000000000..b4cc53b50b --- /dev/null +++ b/src/leveldbwrapper.h @@ -0,0 +1,155 @@ +// Copyright (c) 2012-2013 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_LEVELDBWRAPPER_H +#define BITCOIN_LEVELDBWRAPPER_H + +#include "serialize.h" +#include "util.h" + +#include +#include + +#include + +class leveldb_error : public std::runtime_error +{ +public: + leveldb_error(const std::string &msg) : std::runtime_error(msg) {} +}; + +void HandleError(const leveldb::Status &status) throw(leveldb_error); + +// Batch of changes queued to be written to a CLevelDBWrapper +class CLevelDBBatch +{ + friend class CLevelDBWrapper; + +private: + leveldb::WriteBatch batch; + +public: + template void Write(const K& key, const V& value) { + CDataStream ssKey(SER_DISK, CLIENT_VERSION); + ssKey.reserve(ssKey.GetSerializeSize(key)); + ssKey << key; + leveldb::Slice slKey(&ssKey[0], ssKey.size()); + + CDataStream ssValue(SER_DISK, CLIENT_VERSION); + ssValue.reserve(ssValue.GetSerializeSize(value)); + ssValue << value; + leveldb::Slice slValue(&ssValue[0], ssValue.size()); + + batch.Put(slKey, slValue); + } + + template void Erase(const K& key) { + CDataStream ssKey(SER_DISK, CLIENT_VERSION); + ssKey.reserve(ssKey.GetSerializeSize(key)); + ssKey << key; + leveldb::Slice slKey(&ssKey[0], ssKey.size()); + + batch.Delete(slKey); + } +}; + +class CLevelDBWrapper +{ +private: + // custom environment this database is using (may be NULL in case of default environment) + leveldb::Env *penv; + + // database options used + leveldb::Options options; + + // options used when reading from the database + leveldb::ReadOptions readoptions; + + // options used when iterating over values of the database + leveldb::ReadOptions iteroptions; + + // options used when writing to the database + leveldb::WriteOptions writeoptions; + + // options used when sync writing to the database + leveldb::WriteOptions syncoptions; + + // the database itself + leveldb::DB *pdb; + +public: + CLevelDBWrapper(const boost::filesystem::path &path, size_t nCacheSize, bool fMemory = false, bool fWipe = false); + ~CLevelDBWrapper(); + + template bool Read(const K& key, V& value) throw(leveldb_error) { + CDataStream ssKey(SER_DISK, CLIENT_VERSION); + ssKey.reserve(ssKey.GetSerializeSize(key)); + ssKey << key; + leveldb::Slice slKey(&ssKey[0], ssKey.size()); + + std::string strValue; + leveldb::Status status = pdb->Get(readoptions, slKey, &strValue); + if (!status.ok()) { + if (status.IsNotFound()) + return false; + LogPrintf("LevelDB read failure: %s\n", status.ToString().c_str()); + HandleError(status); + } + try { + CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION); + ssValue >> value; + } catch(std::exception &e) { + return false; + } + return true; + } + + template bool Write(const K& key, const V& value, bool fSync = false) throw(leveldb_error) { + CLevelDBBatch batch; + batch.Write(key, value); + return WriteBatch(batch, fSync); + } + + template bool Exists(const K& key) throw(leveldb_error) { + CDataStream ssKey(SER_DISK, CLIENT_VERSION); + ssKey.reserve(ssKey.GetSerializeSize(key)); + ssKey << key; + leveldb::Slice slKey(&ssKey[0], ssKey.size()); + + std::string strValue; + leveldb::Status status = pdb->Get(readoptions, slKey, &strValue); + if (!status.ok()) { + if (status.IsNotFound()) + return false; + LogPrintf("LevelDB read failure: %s\n", status.ToString().c_str()); + HandleError(status); + } + return true; + } + + template bool Erase(const K& key, bool fSync = false) throw(leveldb_error) { + CLevelDBBatch batch; + batch.Erase(key); + return WriteBatch(batch, fSync); + } + + bool WriteBatch(CLevelDBBatch &batch, bool fSync = false) throw(leveldb_error); + + // not available for LevelDB; provide for compatibility with BDB + bool Flush() { + return true; + } + + bool Sync() throw(leveldb_error) { + CLevelDBBatch batch; + return WriteBatch(batch, true); + } + + // not exactly clean encapsulation, but it's easiest for now + leveldb::Iterator *NewIterator() { + return pdb->NewIterator(iteroptions); + } +}; + +#endif // BITCOIN_LEVELDBWRAPPER_H diff --git a/src/txdb.cpp b/src/txdb.cpp index 27d6caf4d9..f459f0c71a 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -66,7 +66,7 @@ bool CCoinsViewDB::BatchWrite(const std::map &mapCoins, CBlockI return db.WriteBatch(batch); } -CBlockTreeDB::CBlockTreeDB(size_t nCacheSize, bool fMemory, bool fWipe) : CLevelDB(GetDataDir() / "blocks" / "index", nCacheSize, fMemory, fWipe) { +CBlockTreeDB::CBlockTreeDB(size_t nCacheSize, bool fMemory, bool fWipe) : CLevelDBWrapper(GetDataDir() / "blocks" / "index", nCacheSize, fMemory, fWipe) { } bool CBlockTreeDB::WriteBlockIndex(const CDiskBlockIndex& blockindex) diff --git a/src/txdb.h b/src/txdb.h index b555be3de7..4bc2902a0b 100644 --- a/src/txdb.h +++ b/src/txdb.h @@ -6,13 +6,13 @@ #define BITCOIN_TXDB_LEVELDB_H #include "main.h" -#include "leveldb.h" +#include "leveldbwrapper.h" /** CCoinsView backed by the LevelDB coin database (chainstate/) */ class CCoinsViewDB : public CCoinsView { protected: - CLevelDB db; + CLevelDBWrapper db; public: CCoinsViewDB(size_t nCacheSize, bool fMemory = false, bool fWipe = false); @@ -26,7 +26,7 @@ public: }; /** Access to the block database (blocks/index/) */ -class CBlockTreeDB : public CLevelDB +class CBlockTreeDB : public CLevelDBWrapper { public: CBlockTreeDB(size_t nCacheSize, bool fMemory = false, bool fWipe = false); -- cgit v1.2.3