aboutsummaryrefslogtreecommitdiff
path: root/src/cryptonote_core
diff options
context:
space:
mode:
Diffstat (limited to 'src/cryptonote_core')
-rw-r--r--src/cryptonote_core/blockchain.cpp41
-rw-r--r--src/cryptonote_core/blockchain.h4
-rw-r--r--src/cryptonote_core/cryptonote_core.cpp41
3 files changed, 52 insertions, 34 deletions
diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp
index 57934b3fc..0261a5614 100644
--- a/src/cryptonote_core/blockchain.cpp
+++ b/src/cryptonote_core/blockchain.cpp
@@ -39,7 +39,6 @@
#include "tx_pool.h"
#include "blockchain.h"
#include "blockchain_db/blockchain_db.h"
-#include "blockchain_db/lmdb/db_lmdb.h"
#include "cryptonote_format_utils.h"
#include "cryptonote_boost_serialization.h"
#include "cryptonote_config.h"
@@ -65,8 +64,7 @@ using epee::string_tools::pod_to_hex;
DISABLE_VS_WARNINGS(4267)
//------------------------------------------------------------------
-// TODO: initialize m_db with a concrete implementation of BlockchainDB
-Blockchain::Blockchain(tx_memory_pool& tx_pool):m_db(), m_tx_pool(tx_pool), m_current_block_cumul_sz_limit(0), m_is_in_checkpoint_zone(false), m_is_blockchain_storing(false), m_testnet(false), m_enforce_dns_checkpoints(false)
+Blockchain::Blockchain(tx_memory_pool& tx_pool):m_db(), m_tx_pool(tx_pool), m_current_block_cumul_sz_limit(0), m_is_in_checkpoint_zone(false), m_is_blockchain_storing(false), m_enforce_dns_checkpoints(false)
{
LOG_PRINT_L3("Blockchain::" << __func__);
}
@@ -226,43 +224,24 @@ uint64_t Blockchain::get_current_blockchain_height() const
//------------------------------------------------------------------
//FIXME: possibly move this into the constructor, to avoid accidentally
// dereferencing a null BlockchainDB pointer
-bool Blockchain::init(const std::string& config_folder, const bool testnet, const int db_flags)
+bool Blockchain::init(BlockchainDB* db, const bool testnet)
{
LOG_PRINT_L3("Blockchain::" << __func__);
CRITICAL_REGION_LOCAL(m_blockchain_lock);
- // TODO: make this configurable
- m_db = new BlockchainLMDB();
-
- m_config_folder = config_folder;
- m_testnet = testnet;
-
- boost::filesystem::path folder(m_config_folder);
-
- folder /= m_db->get_db_name();
-
- LOG_PRINT_L0("Loading blockchain from folder " << folder.c_str() << " ...");
-
- const std::string filename = folder.string();
- try
+ if (db == nullptr)
{
- m_db->open(filename, db_flags);
+ LOG_ERROR("Attempted to init Blockchain with null DB");
+ return false;
}
- catch (const DB_OPEN_FAILURE& e)
+ if (!db->is_open())
{
- LOG_PRINT_L0("No blockchain file found, attempting to create one.");
- try
- {
- m_db->create(filename);
- }
- catch (const DB_CREATE_FAILURE& db_create_error)
- {
- LOG_PRINT_L0("Unable to create BlockchainDB! This is not good...");
- //TODO: make sure whatever calls this handles the return value properly
- return false;
- }
+ LOG_ERROR("Attempted to init Blockchain with unopened DB");
+ return false;
}
+ m_db = db;
+
// if the blockchain is new, add the genesis block
// this feels kinda kludgy to do it this way, but can be looked at later.
// TODO: add function to create and store genesis block,
diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h
index dc98a56a4..bc13901d2 100644
--- a/src/cryptonote_core/blockchain.h
+++ b/src/cryptonote_core/blockchain.h
@@ -81,7 +81,7 @@ namespace cryptonote
Blockchain(tx_memory_pool& tx_pool);
- bool init(const std::string& config_folder, const bool testnet = false, const int db_flags = 0);
+ bool init(BlockchainDB* db, const bool testnet = false);
bool deinit();
void set_checkpoints(checkpoints&& chk_pts) { m_checkpoints = chk_pts; }
@@ -180,11 +180,9 @@ namespace cryptonote
outputs_container m_outputs;
- std::string m_config_folder;
checkpoints m_checkpoints;
std::atomic<bool> m_is_in_checkpoint_zone;
std::atomic<bool> m_is_blockchain_storing;
- bool m_testnet;
bool m_enforce_dns_checkpoints;
bool switch_to_alternative_blockchain(std::list<blocks_ext_by_hash::iterator>& alt_chain, bool discard_disconnected_chain);
diff --git a/src/cryptonote_core/cryptonote_core.cpp b/src/cryptonote_core/cryptonote_core.cpp
index f9b2b19ff..7864b55c8 100644
--- a/src/cryptonote_core/cryptonote_core.cpp
+++ b/src/cryptonote_core/cryptonote_core.cpp
@@ -44,6 +44,9 @@ using namespace epee;
#include <csignal>
#include "daemon/command_line_args.h"
#include "cryptonote_core/checkpoints_create.h"
+#include "blockchain_db/blockchain_db.h"
+#include "blockchain_db/lmdb/db_lmdb.h"
+#include "blockchain_db/berkeleydb/db_bdb.h"
DISABLE_VS_WARNINGS(4355)
@@ -194,7 +197,45 @@ namespace cryptonote
r = m_mempool.init(m_config_folder);
CHECK_AND_ASSERT_MES(r, false, "Failed to initialize memory pool");
+#if BLOCKCHAIN_DB == DB_LMDB
+ std::string db_type = command_line::get_arg(vm, daemon_args::arg_db_type);
+
+ BlockchainDB* db = nullptr;
+ if (db_type == "lmdb")
+ {
+ db = new BlockchainLMDB();
+ }
+ else if (db_type == "berkeley")
+ {
+ db = new BlockchainBDB();
+ }
+ else
+ {
+ LOG_ERROR("Attempted to use non-existant database type");
+ return false;
+ }
+
+ boost::filesystem::path folder(m_config_folder);
+
+ folder /= db->get_db_name();
+
+ LOG_PRINT_L0("Loading blockchain from folder " << folder.c_str() << " ...");
+
+ const std::string filename = folder.string();
+ try
+ {
+ db->open(filename);
+ }
+ catch (const DB_ERROR& e)
+ {
+ LOG_PRINT_L0("Error opening database: " << e.what());
+ return false;
+ }
+
+ r = m_blockchain_storage.init(db, m_testnet);
+#else
r = m_blockchain_storage.init(m_config_folder, m_testnet);
+#endif
CHECK_AND_ASSERT_MES(r, false, "Failed to initialize blockchain storage");
// load json & DNS checkpoints, and verify them