diff --git a/Cargo.lock b/Cargo.lock index fe052f4c56c1b0a0571e833aafb10688e69e43c8..edbb07ac06e76fe50898f01dba415dc50ef5fcd6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1009,6 +1009,7 @@ version = "0.1.0" dependencies = [ "actix-web 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "dubp-currency-params 0.2.0", + "durs-bc-db-reader 0.3.0-dev", "durs-common-tools 0.2.0", "durs-conf 0.3.0-dev", "durs-message 0.3.0-dev", diff --git a/lib/modules/gva/Cargo.toml b/lib/modules/gva/Cargo.toml index 7f21a81da43faa0bb64eb973f32de83a033e7162..b476228695a741d75dd84293869fc59bf51d3c5e 100644 --- a/lib/modules/gva/Cargo.toml +++ b/lib/modules/gva/Cargo.toml @@ -10,6 +10,7 @@ edition = "2018" path = "src/lib.rs" [dependencies] +durs-bc-db-reader = { path = "../../modules-lib/bc-db-reader" } durs-conf = { path = "../../core/conf" } durs-message = { path = "../../core/message" } durs-module = { path = "../../core/module" } diff --git a/lib/modules/gva/src/context.rs b/lib/modules/gva/src/context.rs new file mode 100644 index 0000000000000000000000000000000000000000..8e0ceb7d63bcbcbb8228344ac2ca2f76af6637e6 --- /dev/null +++ b/lib/modules/gva/src/context.rs @@ -0,0 +1,30 @@ +use durs_bc_db_reader::BcDbRo; +use durs_common_tools::fatal_error; + +/// GVA context (access to database) +static mut CONTEXT: Option<Context> = None; + +#[derive(Debug)] +pub struct Context { + db: BcDbRo, +} + +impl juniper::Context for Context {} + +impl Context { + pub fn new(db: BcDbRo) -> Self { + Context { db } + } +} + +pub unsafe fn init(db: BcDbRo) { + CONTEXT.replace(Context::new(db)); +} + +pub unsafe fn get_context() -> &'static Context { + if let Some(ref context) = CONTEXT { + context + } else { + fatal_error!("GVA: no context"); + } +} diff --git a/lib/modules/gva/src/lib.rs b/lib/modules/gva/src/lib.rs index 653dc19e91df30d6827c145efbf873661b895da1..195c407f8fe323186af8a1b70b38ee25563dc908 100644 --- a/lib/modules/gva/src/lib.rs +++ b/lib/modules/gva/src/lib.rs @@ -21,7 +21,6 @@ missing_copy_implementations, trivial_casts, trivial_numeric_casts, - unsafe_code, unstable_features, unused_import_braces, unused_qualifications @@ -36,6 +35,7 @@ extern crate structopt; extern crate juniper; +mod context; mod schema; use dubp_currency_params::CurrencyName; @@ -62,7 +62,7 @@ use juniper::http::graphiql::graphiql_source; use juniper::http::GraphQLRequest; /// Name of your module -pub static MODULE_NAME: &'static str = "gva"; +pub static MODULE_NAME: &str = "gva"; fn graphiql() -> HttpResponse { let html = graphiql_source("http://127.0.0.1:3000/graphql"); @@ -76,9 +76,9 @@ fn graphql( st: web::Data<Arc<Schema>>, data: web::Json<GraphQLRequest>, ) -> impl Future<Item = HttpResponse, Error = Error> { - let context = Context::new(); + let context = unsafe { crate::context::get_context() }; web::block(move || { - let res = data.execute(&st, &context); + let res = data.execute(&st, context); Ok::<_, serde_json::error::Error>(serde_json::to_string(&res)?) }) .map_err(Error::from) @@ -96,6 +96,15 @@ fn start_web_server() -> std::io::Result<()> { // Create Juniper schema let schema = std::sync::Arc::new(create_schema()); + // Instanciate the context + if let Ok(db) = durs_bc_db_reader::open_db_ro(&std::path::Path::new("db_path")) { + unsafe { + context::init(db); + } + } else { + fatal_error!("GVA: fail to open DB."); + }; + // Start http server HttpServer::new(move || { App::new() @@ -299,7 +308,6 @@ impl DursModule<DuRsConf, DursMsg> for GvaModule { } }); - thread::spawn(move || { let _ = start_web_server(); }); diff --git a/lib/modules/gva/src/schema.rs b/lib/modules/gva/src/schema.rs index 3d0d88c528be62eaf66a1fed929af342cc053988..516a09a43dff03dfbe75e75f6f8f3409515364b2 100644 --- a/lib/modules/gva/src/schema.rs +++ b/lib/modules/gva/src/schema.rs @@ -1,14 +1,12 @@ +use crate::context::Context; use juniper::Executor; use juniper::FieldResult; use juniper_from_schema::graphql_schema_from_file; graphql_schema_from_file!("lib/modules/gva/resources/schema.gql"); - - pub struct Query; - impl QueryFields for Query { fn field_hello_world( &self, @@ -27,22 +25,6 @@ impl MutationFields for Mutation { } } -pub struct Context{ - - -} - - -impl juniper::Context for Context {} - -impl Context { - - - pub fn new() -> Self { - Context {} - } -} - pub fn create_schema() -> Schema { Schema::new(Query {}, Mutation {}) } diff --git a/lib/tools/dbs-tools/src/kv_db/file.rs b/lib/tools/dbs-tools/src/kv_db/file.rs index 9b8020715e166e076088fee3c01c464f2a61e22a..b76ebc325cfa12334041376b5507f9106fa7235d 100644 --- a/lib/tools/dbs-tools/src/kv_db/file.rs +++ b/lib/tools/dbs-tools/src/kv_db/file.rs @@ -57,6 +57,7 @@ pub struct KvFileDbHandler { } /// Key-value file Database read-only handler +#[derive(Debug)] pub struct KvFileDbRoHandler(KvFileDbHandler); impl KvFileDbRoHandler {