From b281f85a70a9a741d1a0851deefcb80e6aa22061 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Tue, 28 Mar 2023 16:36:04 +0300 Subject: [PATCH] share database reader instance --- src/main.rs | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/main.rs b/src/main.rs index 06bfef0..bedb496 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,8 @@ use rocket_contrib::templates::Template; use rand::distributions::Uniform; use rand::Rng; +use std::sync::Arc; + use chgk_ledb_lib::db; use chgk_ledb_lib::questions::Question; @@ -32,18 +34,24 @@ impl ErrorEmpty for Result { } } +type DataBaseInner = db::Reader; +type DataBase = Arc; struct AppState{ + db: DataBase, database_distribution: Uniform, } -fn open_db() -> db::Reader { - db::Reader::new(DB_FILENAME, 2048).expect("new db reader") -} +impl From for AppState { + fn from(db: DataBaseInner) -> Self { + let last_id = db.len(); + let database_distribution = rand::distributions::Uniform::new_inclusive(1usize, last_id); + let db = Arc::new(db); -fn get_database_distribution() -> Uniform { - let last_id = open_db().len(); - - rand::distributions::Uniform::new_inclusive(1usize, last_id) + Self { + db, + database_distribution + } + } } fn random_question_id(database_distribution: &Uniform) -> usize { @@ -51,12 +59,12 @@ fn random_question_id(database_distribution: &Uniform) -> usize { rng.sample(database_distribution) } -fn get_question(id: usize) -> Result { - open_db().get(id - 1).err_empty() +fn get_question(db: &DataBase, id: usize) -> Result { + db.get(id - 1).err_empty() } fn show_question_details(template_name: &'static str, data: &AppState, id: usize) -> Template { - match get_question(id) { + match get_question(&data.db, id) { Ok(question) => { let mut context = serde_json::to_value(question).expect("question serialize"); if context.is_object() { @@ -68,7 +76,7 @@ fn show_question_details(template_name: &'static str, data: &AppState, id: usize Err(_) => { use std::collections::HashMap; let context: HashMap = HashMap::new(); - Template::render("404", &context) + Template::render("404", context) } } } @@ -103,13 +111,11 @@ fn index(data: State) -> Redirect { fn not_found(_req: &rocket::Request) -> Template { use std::collections::HashMap; let context: HashMap = HashMap::new(); - Template::render("404", &context) + Template::render("404", context) } fn rocket() -> Rocket { - let state = AppState { - database_distribution: get_database_distribution(), - }; + let state: AppState = db::Reader::new(DB_FILENAME, 2048).expect("open db").into(); rocket::ignite() .manage(state)