# HG changeset patch # User Pieter Wuille # Date 1346775120 -7200 # Node ID 420276fb84b6bdbee9ee464b0e1ac3cf356c9422 # Parent 526ec2f104b06c785b4648a6c223d0c3f54fe65d Add LevelDB MemEnv support Support LevelDB memory-backed environments, and use them in unit tests. diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -652,7 +652,7 @@ uiInterface.InitMessage(_("Loading block index...")); printf("Loading block index...\n"); nStart = GetTimeMillis(); - pblocktree = new CBlockTreeDB("cr+"); + pblocktree = new CBlockTreeDB(); pcoinsdbview = new CCoinsViewDB(); pcoinsTip = new CCoinsViewCache(*pcoinsdbview); diff --git a/src/leveldb.cpp b/src/leveldb.cpp --- a/src/leveldb.cpp +++ b/src/leveldb.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -20,7 +21,7 @@ return options; } -CLevelDB::CLevelDB(const boost::filesystem::path &path) { +CLevelDB::CLevelDB(const boost::filesystem::path &path, bool fMemory) { penv = NULL; readoptions.verify_checksums = true; iteroptions.verify_checksums = true; @@ -28,8 +29,13 @@ syncoptions.sync = true; options = GetOptions(); options.create_if_missing = true; - boost::filesystem::create_directory(path); - printf("Opening LevelDB in %s\n", path.string().c_str()); + if (fMemory) { + penv = leveldb::NewMemEnv(leveldb::Env::Default()); + options.env = penv; + } else { + boost::filesystem::create_directory(path); + printf("Opening LevelDB in %s\n", path.string().c_str()); + } leveldb::Status status = leveldb::DB::Open(options, path.string(), &pdb); if (!status.ok()) throw std::runtime_error(strprintf("CLevelDB(): error opening database environment %s", status.ToString().c_str())); diff --git a/src/leveldb.h b/src/leveldb.h --- a/src/leveldb.h +++ b/src/leveldb.h @@ -69,7 +69,7 @@ leveldb::DB *pdb; public: - CLevelDB(const boost::filesystem::path &path); + CLevelDB(const boost::filesystem::path &path, bool fMemory = false); ~CLevelDB(); template bool Read(const K& key, V& value) { diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -2,6 +2,7 @@ #include #include "db.h" +#include "txdb.h" #include "main.h" #include "wallet.h" @@ -18,8 +19,13 @@ fPrintToDebugger = true; // don't want to write to debug.log file noui_connect(); bitdb.MakeMock(); - pblocktree = new CBlockTreeDB("cr+"); +#ifdef USE_LEVELDB + pblocktree = new CBlockTreeDB(true); + pcoinsdbview = new CCoinsViewDB(true); +#else + pblocktree = new CBlockTreeDB(); pcoinsdbview = new CCoinsViewDB(); +#endif pcoinsTip = new CCoinsViewCache(*pcoinsdbview); LoadBlockIndex(true); bool fFirstRun; diff --git a/src/txdb-bdb.cpp b/src/txdb-bdb.cpp --- a/src/txdb-bdb.cpp +++ b/src/txdb-bdb.cpp @@ -64,7 +64,7 @@ return Read('l', nFile); } -CCoinsViewDB::CCoinsViewDB() : db("cr+") {} +CCoinsViewDB::CCoinsViewDB() : db() {} bool CCoinsViewDB::GetCoins(uint256 txid, CCoins &coins) { return db.ReadCoins(txid, coins); } bool CCoinsViewDB::SetCoins(uint256 txid, const CCoins &coins) { return db.WriteCoins(txid, coins); } bool CCoinsViewDB::HaveCoins(uint256 txid) { return db.HaveCoins(txid); } diff --git a/src/txdb-bdb.h b/src/txdb-bdb.h --- a/src/txdb-bdb.h +++ b/src/txdb-bdb.h @@ -11,7 +11,7 @@ class CCoinsDB : public CDB { public: - CCoinsDB(const char* pszMode="r+") : CDB("coins.dat", pszMode) { } + CCoinsDB() : CDB("coins.dat", "cr+") { } private: CCoinsDB(const CCoinsDB&); void operator=(const CCoinsDB&); @@ -43,7 +43,7 @@ class CBlockTreeDB : public CDB { public: - CBlockTreeDB(const char* pszMode="r+") : CDB("blktree.dat", pszMode) { } + CBlockTreeDB() : CDB("blktree.dat", "cr+") { } private: CBlockTreeDB(const CBlockTreeDB&); void operator=(const CBlockTreeDB&); diff --git a/src/txdb-leveldb.cpp b/src/txdb-leveldb.cpp --- a/src/txdb-leveldb.cpp +++ b/src/txdb-leveldb.cpp @@ -19,7 +19,7 @@ batch.Write('B', hash); } -CCoinsViewDB::CCoinsViewDB() : db(GetDataDir() / "coins") { +CCoinsViewDB::CCoinsViewDB(bool fMemory) : db(GetDataDir() / "coins", fMemory) { } bool CCoinsViewDB::GetCoins(uint256 txid, CCoins &coins) { @@ -63,6 +63,9 @@ return db.WriteBatch(batch); } +CBlockTreeDB::CBlockTreeDB(bool fMemory) : CLevelDB(GetDataDir() / "blktree", fMemory) { +} + bool CBlockTreeDB::WriteBlockIndex(const CDiskBlockIndex& blockindex) { return Write(make_pair('b', blockindex.GetBlockHash()), blockindex); diff --git a/src/txdb-leveldb.h b/src/txdb-leveldb.h --- a/src/txdb-leveldb.h +++ b/src/txdb-leveldb.h @@ -14,7 +14,7 @@ protected: CLevelDB db; public: - CCoinsViewDB(); + CCoinsViewDB(bool fMemory = false); bool GetCoins(uint256 txid, CCoins &coins); bool SetCoins(uint256 txid, const CCoins &coins); @@ -28,7 +28,7 @@ class CBlockTreeDB : public CLevelDB { public: - CBlockTreeDB(const char* pszMode="r+") : CLevelDB(GetDataDir() / "blktree") { } + CBlockTreeDB(bool fMemory = false); private: CBlockTreeDB(const CBlockTreeDB&); void operator=(const CBlockTreeDB&);