aboutsummaryrefslogtreecommitdiff
path: root/src/leveldbwrapper.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/leveldbwrapper.h')
-rw-r--r--src/leveldbwrapper.h280
1 files changed, 0 insertions, 280 deletions
diff --git a/src/leveldbwrapper.h b/src/leveldbwrapper.h
deleted file mode 100644
index c8fc457d90..0000000000
--- a/src/leveldbwrapper.h
+++ /dev/null
@@ -1,280 +0,0 @@
-// Copyright (c) 2012-2014 The Bitcoin Core developers
-// Distributed under the MIT 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 "clientversion.h"
-#include "serialize.h"
-#include "streams.h"
-#include "util.h"
-#include "utilstrencodings.h"
-#include "version.h"
-
-#include <boost/filesystem/path.hpp>
-
-#include <leveldb/db.h>
-#include <leveldb/write_batch.h>
-
-class dbwrapper_error : public std::runtime_error
-{
-public:
- dbwrapper_error(const std::string& msg) : std::runtime_error(msg) {}
-};
-
-void HandleError(const leveldb::Status& status) throw(dbwrapper_error);
-
-/** Batch of changes queued to be written to a CDBWrapper */
-class CDBBatch
-{
- friend class CDBWrapper;
-
-private:
- leveldb::WriteBatch batch;
- const std::vector<unsigned char> *obfuscate_key;
-
-public:
- /**
- * @param[in] obfuscate_key If passed, XOR data with this key.
- */
- CDBBatch(const std::vector<unsigned char> *obfuscate_key) : obfuscate_key(obfuscate_key) { };
-
- template <typename K, typename V>
- 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;
- ssValue.Xor(*obfuscate_key);
- leveldb::Slice slValue(&ssValue[0], ssValue.size());
-
- batch.Put(slKey, slValue);
- }
-
- template <typename K>
- 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 CDBIterator
-{
-private:
- leveldb::Iterator *piter;
- const std::vector<unsigned char> *obfuscate_key;
-
-public:
-
- /**
- * @param[in] piterIn The original leveldb iterator.
- * @param[in] obfuscate_key If passed, XOR data with this key.
- */
- CDBIterator(leveldb::Iterator *piterIn, const std::vector<unsigned char>* obfuscate_key) :
- piter(piterIn), obfuscate_key(obfuscate_key) { };
- ~CDBIterator();
-
- bool Valid();
-
- void SeekToFirst();
-
- template<typename K> void Seek(const K& key) {
- CDataStream ssKey(SER_DISK, CLIENT_VERSION);
- ssKey.reserve(ssKey.GetSerializeSize(key));
- ssKey << key;
- leveldb::Slice slKey(&ssKey[0], ssKey.size());
- piter->Seek(slKey);
- }
-
- void Next();
-
- template<typename K> bool GetKey(K& key) {
- leveldb::Slice slKey = piter->key();
- try {
- CDataStream ssKey(slKey.data(), slKey.data() + slKey.size(), SER_DISK, CLIENT_VERSION);
- ssKey >> key;
- } catch(std::exception &e) {
- return false;
- }
- return true;
- }
-
- unsigned int GetKeySize() {
- return piter->key().size();
- }
-
- template<typename V> bool GetValue(V& value) {
- leveldb::Slice slValue = piter->value();
- try {
- CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION);
- ssValue.Xor(*obfuscate_key);
- ssValue >> value;
- } catch(std::exception &e) {
- return false;
- }
- return true;
- }
-
- unsigned int GetValueSize() {
- return piter->value().size();
- }
-
-};
-
-class CDBWrapper
-{
-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;
-
- //! a key used for optional XOR-obfuscation of the database
- std::vector<unsigned char> obfuscate_key;
-
- //! the key under which the obfuscation key is stored
- static const std::string OBFUSCATE_KEY_KEY;
-
- //! the length of the obfuscate key in number of bytes
- static const unsigned int OBFUSCATE_KEY_NUM_BYTES;
-
- std::vector<unsigned char> CreateObfuscateKey() const;
-
-public:
- /**
- * @param[in] path Location in the filesystem where leveldb data will be stored.
- * @param[in] nCacheSize Configures various leveldb cache settings.
- * @param[in] fMemory If true, use leveldb's memory environment.
- * @param[in] fWipe If true, remove all existing data.
- * @param[in] obfuscate If true, store data obfuscated via simple XOR. If false, XOR
- * with a zero'd byte array.
- */
- CDBWrapper(const boost::filesystem::path& path, size_t nCacheSize, bool fMemory = false, bool fWipe = false, bool obfuscate = false);
- ~CDBWrapper();
-
- template <typename K, typename V>
- bool Read(const K& key, V& value) const throw(dbwrapper_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());
- HandleError(status);
- }
- try {
- CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION);
- ssValue.Xor(obfuscate_key);
- ssValue >> value;
- } catch (const std::exception&) {
- return false;
- }
- return true;
- }
-
- template <typename K, typename V>
- bool Write(const K& key, const V& value, bool fSync = false) throw(dbwrapper_error)
- {
- CDBBatch batch(&obfuscate_key);
- batch.Write(key, value);
- return WriteBatch(batch, fSync);
- }
-
- template <typename K>
- bool Exists(const K& key) const throw(dbwrapper_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());
- HandleError(status);
- }
- return true;
- }
-
- template <typename K>
- bool Erase(const K& key, bool fSync = false) throw(dbwrapper_error)
- {
- CDBBatch batch(&obfuscate_key);
- batch.Erase(key);
- return WriteBatch(batch, fSync);
- }
-
- bool WriteBatch(CDBBatch& batch, bool fSync = false) throw(dbwrapper_error);
-
- // not available for LevelDB; provide for compatibility with BDB
- bool Flush()
- {
- return true;
- }
-
- bool Sync() throw(dbwrapper_error)
- {
- CDBBatch batch(&obfuscate_key);
- return WriteBatch(batch, true);
- }
-
- CDBIterator *NewIterator()
- {
- return new CDBIterator(pdb->NewIterator(iteroptions), &obfuscate_key);
- }
-
- /**
- * Return true if the database managed by this class contains no entries.
- */
- bool IsEmpty();
-
- /**
- * Accessor for obfuscate_key.
- */
- const std::vector<unsigned char>& GetObfuscateKey() const;
-
- /**
- * Return the obfuscate_key as a hex-formatted string.
- */
- std::string GetObfuscateKeyHex() const;
-
-};
-
-#endif // BITCOIN_LEVELDBWRAPPER_H
-