2016-11-03 09:19:35 -07:00
|
|
|
use std::sync::Arc;
|
2016-11-04 04:08:58 -07:00
|
|
|
use std::path::PathBuf;
|
2016-11-24 22:58:04 -08:00
|
|
|
use std::fs::create_dir_all;
|
2016-11-03 09:19:35 -07:00
|
|
|
use app_dirs::{app_dir, AppDataType};
|
2018-03-09 03:08:39 -08:00
|
|
|
use {storage, APP_INFO};
|
|
|
|
use db;
|
2016-11-07 01:15:15 -08:00
|
|
|
use config::Config;
|
2017-04-05 02:37:58 -07:00
|
|
|
use chain::IndexedBlock;
|
2016-11-03 09:19:35 -07:00
|
|
|
|
2018-03-09 03:08:39 -08:00
|
|
|
pub fn open_db(data_dir: &Option<String>, db_cache: usize) -> storage::SharedStore {
|
2017-09-01 06:57:12 -07:00
|
|
|
let db_path = match *data_dir {
|
2016-11-24 22:58:04 -08:00
|
|
|
Some(ref data_dir) => custom_path(&data_dir, "db"),
|
|
|
|
None => app_dir(AppDataType::UserData, &APP_INFO, "db").expect("Failed to get app dir"),
|
|
|
|
};
|
2017-09-01 06:57:12 -07:00
|
|
|
Arc::new(db::BlockChainDatabase::open_at_path(db_path, db_cache).expect("Failed to open database"))
|
2016-11-03 09:19:35 -07:00
|
|
|
}
|
|
|
|
|
2016-11-24 22:58:04 -08:00
|
|
|
pub fn node_table_path(cfg: &Config) -> PathBuf {
|
|
|
|
let mut node_table = match cfg.data_dir {
|
|
|
|
Some(ref data_dir) => custom_path(&data_dir, "p2p"),
|
|
|
|
None => app_dir(AppDataType::UserData, &APP_INFO, "p2p").expect("Failed to get app dir"),
|
|
|
|
};
|
2016-11-04 04:08:58 -07:00
|
|
|
node_table.push("nodes.csv");
|
|
|
|
node_table
|
|
|
|
}
|
|
|
|
|
2017-09-01 06:57:12 -07:00
|
|
|
pub fn init_db(cfg: &Config) -> Result<(), String> {
|
2016-11-03 09:19:35 -07:00
|
|
|
// insert genesis block if db is empty
|
2017-11-01 02:30:15 -07:00
|
|
|
let genesis_block: IndexedBlock = cfg.network.genesis_block().into();
|
2017-09-01 06:57:12 -07:00
|
|
|
match cfg.db.block_hash(0) {
|
2017-04-05 02:37:58 -07:00
|
|
|
Some(ref db_genesis_block_hash) if db_genesis_block_hash != genesis_block.hash() => Err("Trying to open database with incompatible genesis block".into()),
|
2016-11-07 02:20:27 -08:00
|
|
|
Some(_) => Ok(()),
|
|
|
|
None => {
|
2017-04-21 06:26:19 -07:00
|
|
|
let hash = genesis_block.hash().clone();
|
2017-09-01 06:57:12 -07:00
|
|
|
cfg.db.insert(genesis_block).expect("Failed to insert genesis block to the database");
|
|
|
|
cfg.db.canonize(&hash).expect("Failed to canonize genesis block");
|
2016-11-07 02:20:27 -08:00
|
|
|
Ok(())
|
|
|
|
}
|
2016-11-03 09:19:35 -07:00
|
|
|
}
|
|
|
|
}
|
2016-11-24 22:58:04 -08:00
|
|
|
|
|
|
|
fn custom_path(data_dir: &str, sub_dir: &str) -> PathBuf {
|
|
|
|
let mut path = PathBuf::from(data_dir);
|
|
|
|
path.push(sub_dir);
|
2016-11-25 01:39:14 -08:00
|
|
|
create_dir_all(&path).expect("Failed to get app dir");
|
2016-11-24 22:58:04 -08:00
|
|
|
path
|
|
|
|
}
|