BerkeleyDB Blockchain building, not working yet

Everything except actually *using* BlockchainBDB is wired up, but the db
itself is not yet working.  Some error about user mem not large enough.
I think I know what this error means, but I can't determine the cause.

Notes: BerkeleyDB does not allow 0-indexing in its recno type databases,
  so block numbers *in the database* will be 1-indexed.  Modifications
  to indexing have been made as needed.
This commit is contained in:
Thomas Winget 2015-03-16 09:14:51 -04:00
parent cade0da8f1
commit 43477b7dac
No known key found for this signature in database
GPG key ID: 58131A160789E630
6 changed files with 247 additions and 193 deletions

View file

@ -30,6 +30,8 @@
#include <boost/algorithm/string/predicate.hpp>
#include <cstdio>
#include <iostream>
#include <chrono>
#include <thread>
#include "gtest/gtest.h"
@ -88,6 +90,7 @@ bool compare_blocks(const block& a, const block& b)
return hash_a == hash_b;
}
/*
void print_block(const block& blk, const std::string& prefix = "")
{
std::cerr << prefix << ": " << std::endl
@ -106,6 +109,7 @@ bool compare_txs(const transaction& a, const transaction& b)
return ab == bb;
}
*/
// convert hex string to string that has values based on that hex
// thankfully should automatically ignore null-terminator.
@ -173,20 +177,29 @@ protected:
}
~BlockchainDBTest() {
auto files = m_db->get_filenames();
delete m_db;
remove_files(files);
remove_files();
}
BlockchainDB* m_db;
std::string m_prefix;
std::vector<block> m_blocks;
std::vector<std::vector<transaction> > m_txs;
std::vector<std::string> m_filenames;
void remove_files(const std::vector<std::string>& files)
void get_filenames()
{
m_filenames = m_db->get_filenames();
for (auto& f : m_filenames)
{
std::cerr << "File created by test: " << f << std::endl;
}
}
void remove_files()
{
// remove each file the db created, making sure it starts with fname.
for (auto& f : files)
for (auto& f : m_filenames)
{
if (boost::starts_with(f, m_prefix))
{
@ -199,7 +212,7 @@ protected:
}
// remove directory if it still exists
boost::filesystem::remove(m_prefix);
boost::filesystem::remove_all(m_prefix);
}
void set_prefix(const std::string& prefix)
@ -222,6 +235,7 @@ TYPED_TEST(BlockchainDBTest, OpenAndClose)
// make sure open does not throw
ASSERT_NO_THROW(this->m_db->open(fname));
this->get_filenames();
// make sure open when already open DOES throw
ASSERT_THROW(this->m_db->open(fname), DB_OPEN_FAILURE);
@ -232,9 +246,11 @@ TYPED_TEST(BlockchainDBTest, OpenAndClose)
TYPED_TEST(BlockchainDBTest, AddBlock)
{
std::string fname(tmpnam(NULL));
this->set_prefix(fname);
// make sure open does not throw
ASSERT_NO_THROW(this->m_db->open(fname));
this->get_filenames();
// adding a block with no parent in the blockchain should throw.
// note: this shouldn't be possible, but is a good (and cheap) failsafe.
@ -273,9 +289,11 @@ TYPED_TEST(BlockchainDBTest, AddBlock)
TYPED_TEST(BlockchainDBTest, RetrieveBlockData)
{
std::string fname(tmpnam(NULL));
this->set_prefix(fname);
// make sure open does not throw
ASSERT_NO_THROW(this->m_db->open(fname));
this->get_filenames();
ASSERT_NO_THROW(this->m_db->add_block(this->m_blocks[0], t_sizes[0], t_diffs[0], t_coins[0], this->m_txs[0]));