2016-12-11 19:30:54 +01:00
|
|
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
2016-05-19 14:36:15 +02:00
|
|
|
// This file is part of Parity.
|
|
|
|
|
|
|
|
// Parity is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// Parity is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
extern crate ethcore_ipc as ipc;
|
|
|
|
extern crate rocksdb;
|
|
|
|
extern crate ethcore_devtools as devtools;
|
|
|
|
extern crate semver;
|
|
|
|
extern crate ethcore_ipc_nano as nanoipc;
|
2016-05-31 13:05:43 +02:00
|
|
|
extern crate nanomsg;
|
|
|
|
extern crate crossbeam;
|
2016-05-19 14:36:15 +02:00
|
|
|
extern crate ethcore_util as util;
|
|
|
|
|
|
|
|
pub mod database;
|
|
|
|
pub mod traits;
|
2016-05-31 13:05:43 +02:00
|
|
|
|
|
|
|
pub use traits::{DatabaseService, DBTransaction, Error};
|
|
|
|
pub use database::{Database, DatabaseClient, DatabaseIterator};
|
|
|
|
|
|
|
|
use std::sync::Arc;
|
|
|
|
use std::sync::atomic::*;
|
|
|
|
use std::path::PathBuf;
|
|
|
|
|
|
|
|
pub type DatabaseNanoClient = DatabaseClient<::nanomsg::Socket>;
|
|
|
|
pub type DatabaseConnection = nanoipc::GuardedSocket<DatabaseNanoClient>;
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub enum ServiceError {
|
|
|
|
Io(std::io::Error),
|
|
|
|
Socket(nanoipc::SocketError),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl std::convert::From<std::io::Error> for ServiceError {
|
|
|
|
fn from(io_error: std::io::Error) -> ServiceError { ServiceError::Io(io_error) }
|
|
|
|
}
|
|
|
|
|
|
|
|
impl std::convert::From<nanoipc::SocketError> for ServiceError {
|
|
|
|
fn from(socket_error: nanoipc::SocketError) -> ServiceError { ServiceError::Socket(socket_error) }
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn blocks_service_url(db_path: &str) -> Result<String, std::io::Error> {
|
|
|
|
let mut path = PathBuf::from(db_path);
|
2016-12-27 12:53:56 +01:00
|
|
|
::std::fs::create_dir_all(db_path)?;
|
2016-05-31 13:05:43 +02:00
|
|
|
path.push("blocks.ipc");
|
|
|
|
Ok(format!("ipc://{}", path.to_str().unwrap()))
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn extras_service_url(db_path: &str) -> Result<String, ::std::io::Error> {
|
|
|
|
let mut path = PathBuf::from(db_path);
|
2016-12-27 12:53:56 +01:00
|
|
|
::std::fs::create_dir_all(db_path)?;
|
2016-05-31 13:05:43 +02:00
|
|
|
path.push("extras.ipc");
|
|
|
|
Ok(format!("ipc://{}", path.to_str().unwrap()))
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn blocks_client(db_path: &str) -> Result<DatabaseConnection, ServiceError> {
|
2016-12-27 12:53:56 +01:00
|
|
|
let url = blocks_service_url(db_path)?;
|
|
|
|
let client = nanoipc::generic_client::<DatabaseClient<_>>(&url)?;
|
2016-05-31 13:05:43 +02:00
|
|
|
Ok(client)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn extras_client(db_path: &str) -> Result<DatabaseConnection, ServiceError> {
|
2016-12-27 12:53:56 +01:00
|
|
|
let url = extras_service_url(db_path)?;
|
|
|
|
let client = nanoipc::generic_client::<DatabaseClient<_>>(&url)?;
|
2016-05-31 13:05:43 +02:00
|
|
|
Ok(client)
|
|
|
|
}
|
|
|
|
|
|
|
|
// for tests
|
|
|
|
pub fn run_worker(scope: &crossbeam::Scope, stop: Arc<AtomicBool>, socket_path: &str) {
|
|
|
|
let socket_path = socket_path.to_owned();
|
|
|
|
scope.spawn(move || {
|
|
|
|
let mut worker = nanoipc::Worker::new(&Arc::new(Database::new()));
|
|
|
|
worker.add_reqrep(&socket_path).unwrap();
|
|
|
|
while !stop.load(Ordering::Relaxed) {
|
|
|
|
worker.poll();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|