Remove BDB block database support
This commit is contained in:
parent
beeb57610c
commit
4ca60bba5c
11 changed files with 78 additions and 351 deletions
|
@ -90,33 +90,23 @@ contains(BITCOIN_NEED_QT_PLUGINS, 1) {
|
||||||
QTPLUGIN += qcncodecs qjpcodecs qtwcodecs qkrcodecs qtaccessiblewidgets
|
QTPLUGIN += qcncodecs qjpcodecs qtwcodecs qkrcodecs qtaccessiblewidgets
|
||||||
}
|
}
|
||||||
|
|
||||||
contains(USE_LEVELDB, -) {
|
INCLUDEPATH += src/leveldb/include src/leveldb/helpers
|
||||||
message(Building without LevelDB)
|
LIBS += $$PWD/src/leveldb/libleveldb.a $$PWD/src/leveldb/libmemenv.a
|
||||||
SOURCES += src/txdb-bdb.cpp
|
!windows {
|
||||||
HEADERS += src/txdb-bdb.h
|
genleveldb.commands = cd $$PWD/src/leveldb ; $(MAKE) libleveldb.a libmemenv.a
|
||||||
} else {
|
} else {
|
||||||
message(Building with LevelDB)
|
# make an educated guess about what the ranlib command is called
|
||||||
DEFINES += USE_LEVELDB
|
isEmpty(QMAKE_RANLIB) {
|
||||||
INCLUDEPATH += src/leveldb/include src/leveldb/helpers
|
QMAKE_RANLIB = $$replace(QMAKE_STRIP, strip, ranlib)
|
||||||
LIBS += $$PWD/src/leveldb/libleveldb.a $$PWD/src/leveldb/libmemenv.a
|
|
||||||
SOURCES += src/leveldb.cpp src/txdb-leveldb.cpp
|
|
||||||
HEADERS += src/leveldb.h src/txdb-leveldb.h
|
|
||||||
!windows {
|
|
||||||
genleveldb.commands = cd $$PWD/src/leveldb ; $(MAKE) libleveldb.a libmemenv.a
|
|
||||||
} else {
|
|
||||||
# make an educated guess about what the ranlib command is called
|
|
||||||
isEmpty(QMAKE_RANLIB) {
|
|
||||||
QMAKE_RANLIB = $$replace(QMAKE_STRIP, strip, ranlib)
|
|
||||||
}
|
|
||||||
genleveldb.commands = cd $$PWD/src/leveldb ; CC=$$QMAKE_CC CXX=$$QMAKE_CXX TARGET_OS=OS_WINDOWS_CROSSCOMPILE CXXFLAGS="-I$$BOOST_INCLUDE_PATH" LDFLAGS="-L$$BOOST_LIB_PATH" $(MAKE) libleveldb.a libmemenv.a ; $$QMAKE_RANLIB $$PWD/src/leveldb/libleveldb.a ; $$QMAKE_RANLIB $$PWD/src/leveldb/libmemenv.a
|
|
||||||
}
|
}
|
||||||
genleveldb.target = $$PWD/src/leveldb/libleveldb.a
|
genleveldb.commands = cd $$PWD/src/leveldb ; CC=$$QMAKE_CC CXX=$$QMAKE_CXX TARGET_OS=OS_WINDOWS_CROSSCOMPILE CXXFLAGS="-I$$BOOST_INCLUDE_PATH" LDFLAGS="-L$$BOOST_LIB_PATH" $(MAKE) libleveldb.a libmemenv.a ; $$QMAKE_RANLIB $$PWD/src/leveldb/libleveldb.a ; $$QMAKE_RANLIB $$PWD/src/leveldb/libmemenv.a
|
||||||
genleveldb.depends = FORCE
|
|
||||||
PRE_TARGETDEPS += $$PWD/src/leveldb/libleveldb.a
|
|
||||||
QMAKE_EXTRA_TARGETS += genleveldb
|
|
||||||
# Gross ugly hack that depends on qmake internals, unfortunately there's no other way to do it.
|
|
||||||
QMAKE_CLEAN += $$PWD/src/leveldb/libleveldb.a; cd $$PWD/src/leveldb ; $(MAKE) clean
|
|
||||||
}
|
}
|
||||||
|
genleveldb.target = $$PWD/src/leveldb/libleveldb.a
|
||||||
|
genleveldb.depends = FORCE
|
||||||
|
PRE_TARGETDEPS += $$PWD/src/leveldb/libleveldb.a
|
||||||
|
QMAKE_EXTRA_TARGETS += genleveldb
|
||||||
|
# Gross ugly hack that depends on qmake internals, unfortunately there's no other way to do it.
|
||||||
|
QMAKE_CLEAN += $$PWD/src/leveldb/libleveldb.a; cd $$PWD/src/leveldb ; $(MAKE) clean
|
||||||
|
|
||||||
# regenerate src/build.h
|
# regenerate src/build.h
|
||||||
!windows|contains(USE_BUILD_INFO, 1) {
|
!windows|contains(USE_BUILD_INFO, 1) {
|
||||||
|
@ -202,7 +192,9 @@ HEADERS += src/qt/bitcoingui.h \
|
||||||
src/qt/rpcconsole.h \
|
src/qt/rpcconsole.h \
|
||||||
src/version.h \
|
src/version.h \
|
||||||
src/netbase.h \
|
src/netbase.h \
|
||||||
src/clientversion.h
|
src/clientversion.h \
|
||||||
|
src/txdb.h \
|
||||||
|
src/leveldb.h
|
||||||
|
|
||||||
SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
|
SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
|
||||||
src/qt/transactiontablemodel.cpp \
|
src/qt/transactiontablemodel.cpp \
|
||||||
|
@ -262,7 +254,9 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
|
||||||
src/qt/notificator.cpp \
|
src/qt/notificator.cpp \
|
||||||
src/qt/qtipcserver.cpp \
|
src/qt/qtipcserver.cpp \
|
||||||
src/qt/rpcconsole.cpp \
|
src/qt/rpcconsole.cpp \
|
||||||
src/noui.cpp
|
src/noui.cpp \
|
||||||
|
src/leveldb.cpp \
|
||||||
|
src/txdb.cpp
|
||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
src/qt/bitcoin.qrc
|
src/qt/bitcoin.qrc
|
||||||
|
|
|
@ -6,7 +6,6 @@ DEPSDIR:=/usr/i586-mingw32msvc
|
||||||
|
|
||||||
USE_UPNP:=0
|
USE_UPNP:=0
|
||||||
USE_IPV6:=1
|
USE_IPV6:=1
|
||||||
USE_LEVELDB:=1
|
|
||||||
|
|
||||||
INCLUDEPATHS= \
|
INCLUDEPATHS= \
|
||||||
-I"$(CURDIR)" \
|
-I"$(CURDIR)" \
|
||||||
|
@ -83,21 +82,18 @@ OBJS= \
|
||||||
obj/util.o \
|
obj/util.o \
|
||||||
obj/wallet.o \
|
obj/wallet.o \
|
||||||
obj/walletdb.o \
|
obj/walletdb.o \
|
||||||
obj/noui.o
|
obj/noui.o \
|
||||||
|
obj/leveldb.o \
|
||||||
|
obj/txdb.o
|
||||||
|
|
||||||
all: bitcoind.exe
|
all: bitcoind.exe
|
||||||
|
|
||||||
ifdef USE_LEVELDB
|
|
||||||
LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a
|
LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a
|
||||||
DEFS += -I"$(CURDIR)/leveldb/include" -DUSE_LEVELDB
|
DEFS += -I"$(CURDIR)/leveldb/include"
|
||||||
DEFS += -I"$(CURDIR)/leveldb/helpers"
|
DEFS += -I"$(CURDIR)/leveldb/helpers"
|
||||||
OBJS += obj/leveldb.o obj/txdb-leveldb.o
|
|
||||||
leveldb/libleveldb.a:
|
leveldb/libleveldb.a:
|
||||||
@echo "Building LevelDB ..."; cd leveldb; TARGET_OS=OS_WINDOWS_CROSSCOMPILE CXXFLAGS="-I$(INCLUDEPATHS)" LDFLAGS="-L$(LIBPATHS)" make libleveldb.a libmemenv.a; cd ..
|
@echo "Building LevelDB ..."; cd leveldb; TARGET_OS=OS_WINDOWS_CROSSCOMPILE CXXFLAGS="-I$(INCLUDEPATHS)" LDFLAGS="-L$(LIBPATHS)" make libleveldb.a libmemenv.a; cd ..
|
||||||
obj/leveldb.o: leveldb/libleveldb.a
|
obj/leveldb.o: leveldb/libleveldb.a
|
||||||
else
|
|
||||||
OBJS += obj/txdb-bdb.o
|
|
||||||
endif
|
|
||||||
|
|
||||||
obj/build.h: FORCE
|
obj/build.h: FORCE
|
||||||
/bin/sh ../share/genbuild.sh obj/build.h
|
/bin/sh ../share/genbuild.sh obj/build.h
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
USE_UPNP:=0
|
USE_UPNP:=0
|
||||||
USE_IPV6:=1
|
USE_IPV6:=1
|
||||||
USE_LEVELDB:=1
|
|
||||||
|
|
||||||
INCLUDEPATHS= \
|
INCLUDEPATHS= \
|
||||||
-I"C:\boost-1.50.0-mgw" \
|
-I"C:\boost-1.50.0-mgw" \
|
||||||
|
@ -79,7 +78,9 @@ OBJS= \
|
||||||
obj/util.o \
|
obj/util.o \
|
||||||
obj/wallet.o \
|
obj/wallet.o \
|
||||||
obj/walletdb.o \
|
obj/walletdb.o \
|
||||||
obj/noui.o
|
obj/noui.o \
|
||||||
|
obj/leveldb.o \
|
||||||
|
obj/txdb.o
|
||||||
|
|
||||||
|
|
||||||
all: bitcoind.exe
|
all: bitcoind.exe
|
||||||
|
@ -90,17 +91,12 @@ test check: test_bitcoin.exe FORCE
|
||||||
#
|
#
|
||||||
# LevelDB support
|
# LevelDB support
|
||||||
#
|
#
|
||||||
ifdef USE_LEVELDB
|
|
||||||
LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a
|
LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a
|
||||||
DEFS += $(addprefix -I,$(CURDIR)/leveldb/include) -DUSE_LEVELDB
|
DEFS += $(addprefix -I,$(CURDIR)/leveldb/include)
|
||||||
DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers)
|
DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers)
|
||||||
OBJS += obj/leveldb.o obj/txdb-leveldb.o
|
|
||||||
leveldb/libleveldb.a:
|
leveldb/libleveldb.a:
|
||||||
cd leveldb; make libleveldb.a libmemenv.a; cd ..
|
cd leveldb; make libleveldb.a libmemenv.a; cd ..
|
||||||
obj/leveldb.o: leveldb/libleveldb.lib
|
obj/leveldb.o: leveldb/libleveldb.lib
|
||||||
else
|
|
||||||
OBJS += obj/txdb-bdb.o
|
|
||||||
endif
|
|
||||||
|
|
||||||
obj/%.o: %.cpp $(HEADERS)
|
obj/%.o: %.cpp $(HEADERS)
|
||||||
g++ -c $(CFLAGS) -o $@ $<
|
g++ -c $(CFLAGS) -o $@ $<
|
||||||
|
|
|
@ -21,7 +21,6 @@ LIBPATHS= \
|
||||||
|
|
||||||
USE_UPNP:=1
|
USE_UPNP:=1
|
||||||
USE_IPV6:=1
|
USE_IPV6:=1
|
||||||
USE_LEVELDB:=1
|
|
||||||
|
|
||||||
LIBS= -dead_strip
|
LIBS= -dead_strip
|
||||||
|
|
||||||
|
@ -97,7 +96,9 @@ OBJS= \
|
||||||
obj/util.o \
|
obj/util.o \
|
||||||
obj/wallet.o \
|
obj/wallet.o \
|
||||||
obj/walletdb.o \
|
obj/walletdb.o \
|
||||||
obj/noui.o
|
obj/noui.o \
|
||||||
|
obj/leveldb.o \
|
||||||
|
obj/txdb.o
|
||||||
|
|
||||||
ifndef USE_UPNP
|
ifndef USE_UPNP
|
||||||
override USE_UPNP = -
|
override USE_UPNP = -
|
||||||
|
@ -123,17 +124,12 @@ test check: test_bitcoin FORCE
|
||||||
#
|
#
|
||||||
# LevelDB support
|
# LevelDB support
|
||||||
#
|
#
|
||||||
ifdef USE_LEVELDB
|
|
||||||
LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a
|
LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a
|
||||||
DEFS += $(addprefix -I,$(CURDIR)/leveldb/include) -DUSE_LEVELDB
|
DEFS += $(addprefix -I,$(CURDIR)/leveldb/include)
|
||||||
DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers)
|
DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers)
|
||||||
OBJS += obj/leveldb.o obj/txdb-leveldb.o
|
|
||||||
leveldb/libleveldb.a:
|
leveldb/libleveldb.a:
|
||||||
@echo "Building LevelDB ..."; cd leveldb; make libleveldb.a libmemenv.a; cd ..
|
@echo "Building LevelDB ..."; cd leveldb; make libleveldb.a libmemenv.a; cd ..
|
||||||
obj/leveldb.o: leveldb/libleveldb.a
|
obj/leveldb.o: leveldb/libleveldb.a
|
||||||
else
|
|
||||||
OBJS += obj/txdb-bdb.o
|
|
||||||
endif
|
|
||||||
|
|
||||||
# auto-generated dependencies:
|
# auto-generated dependencies:
|
||||||
-include obj/*.P
|
-include obj/*.P
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
USE_UPNP:=0
|
USE_UPNP:=0
|
||||||
USE_IPV6:=1
|
USE_IPV6:=1
|
||||||
USE_LEVELDB:=1
|
|
||||||
|
|
||||||
LINK:=$(CXX)
|
LINK:=$(CXX)
|
||||||
|
|
||||||
|
@ -128,7 +127,9 @@ OBJS= \
|
||||||
obj/util.o \
|
obj/util.o \
|
||||||
obj/wallet.o \
|
obj/wallet.o \
|
||||||
obj/walletdb.o \
|
obj/walletdb.o \
|
||||||
obj/noui.o
|
obj/noui.o \
|
||||||
|
obj/leveldb.o \
|
||||||
|
obj/txdb.o
|
||||||
|
|
||||||
|
|
||||||
all: bitcoind
|
all: bitcoind
|
||||||
|
@ -139,17 +140,12 @@ test check: test_bitcoin FORCE
|
||||||
#
|
#
|
||||||
# LevelDB support
|
# LevelDB support
|
||||||
#
|
#
|
||||||
ifdef USE_LEVELDB
|
|
||||||
LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a
|
LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a
|
||||||
DEFS += $(addprefix -I,$(CURDIR)/leveldb/include) -DUSE_LEVELDB
|
DEFS += $(addprefix -I,$(CURDIR)/leveldb/include)
|
||||||
DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers)
|
DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers)
|
||||||
OBJS += obj/leveldb.o obj/txdb-leveldb.o
|
|
||||||
leveldb/libleveldb.a:
|
leveldb/libleveldb.a:
|
||||||
@echo "Building LevelDB ..."; cd leveldb; make libleveldb.a libmemenv.a; cd ..;
|
@echo "Building LevelDB ..."; cd leveldb; make libleveldb.a libmemenv.a; cd ..;
|
||||||
obj/leveldb.o: leveldb/libleveldb.a
|
obj/leveldb.o: leveldb/libleveldb.a
|
||||||
else
|
|
||||||
OBJS += obj/txdb-bdb.o
|
|
||||||
endif
|
|
||||||
|
|
||||||
# auto-generated dependencies:
|
# auto-generated dependencies:
|
||||||
-include obj/*.P
|
-include obj/*.P
|
||||||
|
|
|
@ -19,13 +19,8 @@ struct TestingSetup {
|
||||||
fPrintToDebugger = true; // don't want to write to debug.log file
|
fPrintToDebugger = true; // don't want to write to debug.log file
|
||||||
noui_connect();
|
noui_connect();
|
||||||
bitdb.MakeMock();
|
bitdb.MakeMock();
|
||||||
#ifdef USE_LEVELDB
|
|
||||||
pblocktree = new CBlockTreeDB(true);
|
pblocktree = new CBlockTreeDB(true);
|
||||||
pcoinsdbview = new CCoinsViewDB(true);
|
pcoinsdbview = new CCoinsViewDB(true);
|
||||||
#else
|
|
||||||
pblocktree = new CBlockTreeDB();
|
|
||||||
pcoinsdbview = new CCoinsViewDB();
|
|
||||||
#endif
|
|
||||||
pcoinsTip = new CCoinsViewCache(*pcoinsdbview);
|
pcoinsTip = new CCoinsViewCache(*pcoinsdbview);
|
||||||
LoadBlockIndex(true);
|
LoadBlockIndex(true);
|
||||||
bool fFirstRun;
|
bool fFirstRun;
|
||||||
|
|
171
src/txdb-bdb.cpp
171
src/txdb-bdb.cpp
|
@ -1,171 +0,0 @@
|
||||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
||||||
// Copyright (c) 2009-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 "txdb-bdb.h"
|
|
||||||
|
|
||||||
bool CCoinsDB::HaveCoins(uint256 hash) {
|
|
||||||
assert(!fClient);
|
|
||||||
return Exists(make_pair('c', hash));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCoinsDB::ReadCoins(uint256 hash, CCoins &coins) {
|
|
||||||
assert(!fClient);
|
|
||||||
return Read(make_pair('c', hash), coins);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCoinsDB::WriteCoins(uint256 hash, const CCoins &coins) {
|
|
||||||
assert(!fClient);
|
|
||||||
if (coins.IsPruned())
|
|
||||||
return Erase(make_pair('c', hash));
|
|
||||||
else
|
|
||||||
return Write(make_pair('c', hash), coins);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCoinsDB::ReadHashBestChain(uint256& hashBestChain)
|
|
||||||
{
|
|
||||||
return Read('B', hashBestChain);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCoinsDB::WriteHashBestChain(uint256 hashBestChain)
|
|
||||||
{
|
|
||||||
return Write('B', hashBestChain);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBlockTreeDB::WriteBlockIndex(const CDiskBlockIndex& blockindex)
|
|
||||||
{
|
|
||||||
return Write(make_pair('b', blockindex.GetBlockHash()), blockindex);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBlockTreeDB::ReadBestInvalidWork(CBigNum& bnBestInvalidWork)
|
|
||||||
{
|
|
||||||
return Read('I', bnBestInvalidWork);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBlockTreeDB::WriteBestInvalidWork(CBigNum bnBestInvalidWork)
|
|
||||||
{
|
|
||||||
return Write('I', bnBestInvalidWork);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBlockTreeDB::WriteBlockFileInfo(int nFile, const CBlockFileInfo &info) {
|
|
||||||
return Write(make_pair('f', nFile), info);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBlockTreeDB::ReadBlockFileInfo(int nFile, CBlockFileInfo &info) {
|
|
||||||
return Read(make_pair('f', nFile), info);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBlockTreeDB::WriteLastBlockFile(int nFile) {
|
|
||||||
return Write('l', nFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBlockTreeDB::ReadLastBlockFile(int &nFile) {
|
|
||||||
return Read('l', nFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
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); }
|
|
||||||
CBlockIndex *CCoinsViewDB::GetBestBlock() {
|
|
||||||
uint256 hashBestChain;
|
|
||||||
if (!db.ReadHashBestChain(hashBestChain))
|
|
||||||
return NULL;
|
|
||||||
std::map<uint256, CBlockIndex*>::iterator it = mapBlockIndex.find(hashBestChain);
|
|
||||||
if (it == mapBlockIndex.end())
|
|
||||||
return NULL;
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
bool CCoinsViewDB::SetBestBlock(CBlockIndex *pindex) { return db.WriteHashBestChain(pindex->GetBlockHash()); }
|
|
||||||
bool CCoinsViewDB::BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex) {
|
|
||||||
printf("Committing %u changed transactions to coin database...\n", (unsigned int)mapCoins.size());
|
|
||||||
|
|
||||||
if (!db.TxnBegin())
|
|
||||||
return false;
|
|
||||||
bool fOk = true;
|
|
||||||
for (std::map<uint256, CCoins>::const_iterator it = mapCoins.begin(); it != mapCoins.end(); it++) {
|
|
||||||
fOk = db.WriteCoins(it->first, it->second);
|
|
||||||
if (!fOk)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (fOk)
|
|
||||||
fOk = db.WriteHashBestChain(pindex->GetBlockHash());
|
|
||||||
|
|
||||||
if (!fOk)
|
|
||||||
db.TxnAbort();
|
|
||||||
else
|
|
||||||
fOk = db.TxnCommit();
|
|
||||||
|
|
||||||
return fOk;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool CBlockTreeDB::LoadBlockIndexGuts()
|
|
||||||
{
|
|
||||||
// Get database cursor
|
|
||||||
Dbc* pcursor = GetCursor();
|
|
||||||
if (!pcursor)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Load mapBlockIndex
|
|
||||||
unsigned int fFlags = DB_SET_RANGE;
|
|
||||||
loop
|
|
||||||
{
|
|
||||||
// Read next record
|
|
||||||
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
|
|
||||||
if (fFlags == DB_SET_RANGE)
|
|
||||||
ssKey << make_pair('b', uint256(0));
|
|
||||||
CDataStream ssValue(SER_DISK, CLIENT_VERSION);
|
|
||||||
int ret = ReadAtCursor(pcursor, ssKey, ssValue, fFlags);
|
|
||||||
fFlags = DB_NEXT;
|
|
||||||
if (ret == DB_NOTFOUND)
|
|
||||||
break;
|
|
||||||
else if (ret != 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Unserialize
|
|
||||||
|
|
||||||
try {
|
|
||||||
char chType;
|
|
||||||
ssKey >> chType;
|
|
||||||
if (chType == 'b' && !fRequestShutdown)
|
|
||||||
{
|
|
||||||
CDiskBlockIndex diskindex;
|
|
||||||
ssValue >> diskindex;
|
|
||||||
|
|
||||||
// Construct block index object
|
|
||||||
CBlockIndex* pindexNew = InsertBlockIndex(diskindex.GetBlockHash());
|
|
||||||
pindexNew->pprev = InsertBlockIndex(diskindex.hashPrev);
|
|
||||||
pindexNew->nHeight = diskindex.nHeight;
|
|
||||||
pindexNew->nFile = diskindex.nFile;
|
|
||||||
pindexNew->nDataPos = diskindex.nDataPos;
|
|
||||||
pindexNew->nUndoPos = diskindex.nUndoPos;
|
|
||||||
pindexNew->nVersion = diskindex.nVersion;
|
|
||||||
pindexNew->hashMerkleRoot = diskindex.hashMerkleRoot;
|
|
||||||
pindexNew->nTime = diskindex.nTime;
|
|
||||||
pindexNew->nBits = diskindex.nBits;
|
|
||||||
pindexNew->nNonce = diskindex.nNonce;
|
|
||||||
pindexNew->nStatus = diskindex.nStatus;
|
|
||||||
pindexNew->nTx = diskindex.nTx;
|
|
||||||
|
|
||||||
// Watch for genesis block
|
|
||||||
if (pindexGenesisBlock == NULL && diskindex.GetBlockHash() == hashGenesisBlock)
|
|
||||||
pindexGenesisBlock = pindexNew;
|
|
||||||
|
|
||||||
if (!pindexNew->CheckIndex())
|
|
||||||
return error("LoadBlockIndex() : CheckIndex failed: %s", pindexNew->ToString().c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
break; // if shutdown requested or finished loading block index
|
|
||||||
}
|
|
||||||
} // try
|
|
||||||
catch (std::exception &e) {
|
|
||||||
return error("%s() : deserialize error", __PRETTY_FUNCTION__);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pcursor->close();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
||||||
// Copyright (c) 2009-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_TXDB_BDB_H
|
|
||||||
#define BITCOIN_TXDB_BDB_H
|
|
||||||
|
|
||||||
#include "db.h"
|
|
||||||
|
|
||||||
/** Access to the transaction database (coins.dat) */
|
|
||||||
class CCoinsDB : public CDB
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CCoinsDB() : CDB("coins.dat", "cr+") { }
|
|
||||||
private:
|
|
||||||
CCoinsDB(const CCoinsDB&);
|
|
||||||
void operator=(const CCoinsDB&);
|
|
||||||
public:
|
|
||||||
bool ReadCoins(uint256 hash, CCoins &coins);
|
|
||||||
bool WriteCoins(uint256 hash, const CCoins& coins);
|
|
||||||
bool HaveCoins(uint256 hash);
|
|
||||||
bool ReadHashBestChain(uint256& hashBestChain);
|
|
||||||
bool WriteHashBestChain(uint256 hashBestChain);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** CCoinsView backed by a CCoinsDB */
|
|
||||||
class CCoinsViewDB : public CCoinsView
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
CCoinsDB db;
|
|
||||||
public:
|
|
||||||
CCoinsViewDB();
|
|
||||||
|
|
||||||
bool GetCoins(uint256 txid, CCoins &coins);
|
|
||||||
bool SetCoins(uint256 txid, const CCoins &coins);
|
|
||||||
bool HaveCoins(uint256 txid);
|
|
||||||
CBlockIndex *GetBestBlock();
|
|
||||||
bool SetBestBlock(CBlockIndex *pindex);
|
|
||||||
bool BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Access to the block database (blktree.dat) */
|
|
||||||
class CBlockTreeDB : public CDB
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CBlockTreeDB() : CDB("blktree.dat", "cr+") { }
|
|
||||||
private:
|
|
||||||
CBlockTreeDB(const CBlockTreeDB&);
|
|
||||||
void operator=(const CBlockTreeDB&);
|
|
||||||
public:
|
|
||||||
bool WriteBlockIndex(const CDiskBlockIndex& blockindex);
|
|
||||||
bool ReadBestInvalidWork(CBigNum& bnBestInvalidWork);
|
|
||||||
bool WriteBestInvalidWork(CBigNum bnBestInvalidWork);
|
|
||||||
bool ReadBlockFileInfo(int nFile, CBlockFileInfo &fileinfo);
|
|
||||||
bool WriteBlockFileInfo(int nFile, const CBlockFileInfo &fileinfo);
|
|
||||||
bool ReadLastBlockFile(int &nFile);
|
|
||||||
bool WriteLastBlockFile(int nFile);
|
|
||||||
bool LoadBlockIndexGuts();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // BITCOIN_TXDB_BDB_H
|
|
|
@ -1,47 +0,0 @@
|
||||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
||||||
// Copyright (c) 2009-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_TXDB_LEVELDB_H
|
|
||||||
#define BITCOIN_TXDB_LEVELDB_H
|
|
||||||
|
|
||||||
#include "main.h"
|
|
||||||
#include "leveldb.h"
|
|
||||||
|
|
||||||
/** CCoinsView backed by the LevelDB coin database (coins/) */
|
|
||||||
class CCoinsViewDB : public CCoinsView
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
CLevelDB db;
|
|
||||||
public:
|
|
||||||
CCoinsViewDB(bool fMemory = false);
|
|
||||||
|
|
||||||
bool GetCoins(uint256 txid, CCoins &coins);
|
|
||||||
bool SetCoins(uint256 txid, const CCoins &coins);
|
|
||||||
bool HaveCoins(uint256 txid);
|
|
||||||
CBlockIndex *GetBestBlock();
|
|
||||||
bool SetBestBlock(CBlockIndex *pindex);
|
|
||||||
bool BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex);
|
|
||||||
bool GetStats(CCoinsStats &stats);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Access to the block database (blktree/) */
|
|
||||||
class CBlockTreeDB : public CLevelDB
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CBlockTreeDB(bool fMemory = false);
|
|
||||||
private:
|
|
||||||
CBlockTreeDB(const CBlockTreeDB&);
|
|
||||||
void operator=(const CBlockTreeDB&);
|
|
||||||
public:
|
|
||||||
bool WriteBlockIndex(const CDiskBlockIndex& blockindex);
|
|
||||||
bool ReadBestInvalidWork(CBigNum& bnBestInvalidWork);
|
|
||||||
bool WriteBestInvalidWork(const CBigNum& bnBestInvalidWork);
|
|
||||||
bool ReadBlockFileInfo(int nFile, CBlockFileInfo &fileinfo);
|
|
||||||
bool WriteBlockFileInfo(int nFile, const CBlockFileInfo &fileinfo);
|
|
||||||
bool ReadLastBlockFile(int &nFile);
|
|
||||||
bool WriteLastBlockFile(int nFile);
|
|
||||||
bool LoadBlockIndexGuts();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // BITCOIN_TXDB_LEVELDB_H
|
|
|
@ -3,7 +3,7 @@
|
||||||
// Distributed under the MIT/X11 software license, see the accompanying
|
// Distributed under the MIT/X11 software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#include "txdb-leveldb.h"
|
#include "txdb.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
49
src/txdb.h
49
src/txdb.h
|
@ -2,13 +2,46 @@
|
||||||
// Copyright (c) 2009-2012 The Bitcoin developers
|
// Copyright (c) 2009-2012 The Bitcoin developers
|
||||||
// Distributed under the MIT/X11 software license, see the accompanying
|
// Distributed under the MIT/X11 software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
#ifndef BITCOIN_TXDB_H
|
#ifndef BITCOIN_TXDB_LEVELDB_H
|
||||||
#define BITCOIN_TXDB_H
|
#define BITCOIN_TXDB_LEVELDB_H
|
||||||
|
|
||||||
#ifdef USE_LEVELDB
|
#include "main.h"
|
||||||
#include "txdb-leveldb.h"
|
#include "leveldb.h"
|
||||||
#else
|
|
||||||
#include "txdb-bdb.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // BITCOIN_TXDB_H
|
/** CCoinsView backed by the LevelDB coin database (coins/) */
|
||||||
|
class CCoinsViewDB : public CCoinsView
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
CLevelDB db;
|
||||||
|
public:
|
||||||
|
CCoinsViewDB(bool fMemory = false);
|
||||||
|
|
||||||
|
bool GetCoins(uint256 txid, CCoins &coins);
|
||||||
|
bool SetCoins(uint256 txid, const CCoins &coins);
|
||||||
|
bool HaveCoins(uint256 txid);
|
||||||
|
CBlockIndex *GetBestBlock();
|
||||||
|
bool SetBestBlock(CBlockIndex *pindex);
|
||||||
|
bool BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex);
|
||||||
|
bool GetStats(CCoinsStats &stats);
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Access to the block database (blktree/) */
|
||||||
|
class CBlockTreeDB : public CLevelDB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CBlockTreeDB(bool fMemory = false);
|
||||||
|
private:
|
||||||
|
CBlockTreeDB(const CBlockTreeDB&);
|
||||||
|
void operator=(const CBlockTreeDB&);
|
||||||
|
public:
|
||||||
|
bool WriteBlockIndex(const CDiskBlockIndex& blockindex);
|
||||||
|
bool ReadBestInvalidWork(CBigNum& bnBestInvalidWork);
|
||||||
|
bool WriteBestInvalidWork(const CBigNum& bnBestInvalidWork);
|
||||||
|
bool ReadBlockFileInfo(int nFile, CBlockFileInfo &fileinfo);
|
||||||
|
bool WriteBlockFileInfo(int nFile, const CBlockFileInfo &fileinfo);
|
||||||
|
bool ReadLastBlockFile(int &nFile);
|
||||||
|
bool WriteLastBlockFile(int nFile);
|
||||||
|
bool LoadBlockIndexGuts();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BITCOIN_TXDB_LEVELDB_H
|
||||||
|
|
Loading…
Reference in a new issue