diff --git a/.gitignore b/.gitignore index 4ce6910..d4f39e9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ /target **/*.rs.bk - -/db +db.dat +/db diff --git a/Cargo.lock b/Cargo.lock index 37689c6..dbdbab2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1279,7 +1279,6 @@ name = "qchgk_web" version = "0.1.1" dependencies = [ "chgk_ledb_lib", - "ledb", "rand", "rocket", "rocket_contrib", diff --git a/Cargo.toml b/Cargo.toml index 7160e6e..cf8a7a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,12 +13,9 @@ readme = "README.md" rand="0.8" serde="1.0" serde_json="1.0" -ledb = {git = "https://github.com/b4tman/ledb.git", rev="a646b90e", package="ledb"} rocket="0.4" chgk_ledb_lib = {git = "https://gitea.b4tman.ru/b4tman/chgk_ledb.git", rev="e521e39f5e", package="chgk_ledb_lib"} -# lmdb-zero="0.4" - [dependencies.rocket_contrib] version = "0.4" default-features = false diff --git a/src/main.rs b/src/main.rs index 9a05c88..06bfef0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,5 @@ #![feature(proc_macro_hygiene, decl_macro)] -extern crate ledb; extern crate serde; extern crate serde_json; @@ -16,10 +15,11 @@ use rocket_contrib::templates::Template; use rand::distributions::Uniform; use rand::Rng; -use ledb::{Options, Storage}; - +use chgk_ledb_lib::db; use chgk_ledb_lib::questions::Question; +const DB_FILENAME: &str = "db.dat"; + trait ErrorEmpty { type Output; fn err_empty(self) -> Result; @@ -32,36 +32,31 @@ impl ErrorEmpty for Result { } } -struct AppState { - storage: Storage, - database_distribution: Uniform, +struct AppState{ + database_distribution: Uniform, } -fn get_database_distribution(storage: &Storage) -> Uniform { - let collection = storage - .collection("questions") - .expect("collection \"questions\""); - let last_id = collection.last_id().expect("\"questions\" last_id"); - - rand::distributions::Uniform::new_inclusive(1u32, last_id) +fn open_db() -> db::Reader { + db::Reader::new(DB_FILENAME, 2048).expect("new db reader") } -fn random_question_id(database_distribution: &Uniform) -> u32 { +fn get_database_distribution() -> Uniform { + let last_id = open_db().len(); + + rand::distributions::Uniform::new_inclusive(1usize, last_id) +} + +fn random_question_id(database_distribution: &Uniform) -> usize { let mut rng = rand::thread_rng(); rng.sample(database_distribution) } -fn get_question(storage: &Storage, id: u32) -> Result { - storage - .collection("questions") - .err_empty()? - .get::(id) - .err_empty()? - .ok_or(()) +fn get_question(id: usize) -> Result { + open_db().get(id - 1).err_empty() } -fn show_question_details(template_name: &'static str, data: &AppState, id: u32) -> Template { - match get_question(&data.storage, id) { +fn show_question_details(template_name: &'static str, data: &AppState, id: usize) -> Template { + match get_question(id) { Ok(question) => { let mut context = serde_json::to_value(question).expect("question serialize"); if context.is_object() { @@ -79,12 +74,12 @@ fn show_question_details(template_name: &'static str, data: &AppState, id: u32) } #[get("/q/")] -fn show_question(data: State, id: u32) -> Template { +fn show_question(data: State, id: usize) -> Template { show_question_details("question", data.inner(), id) } #[get("/q//a")] -fn show_answer(data: State, id: u32) -> Template { +fn show_answer(data: State, id: usize) -> Template { show_question_details("answer", data.inner(), id) } @@ -112,19 +107,9 @@ fn not_found(_req: &rocket::Request) -> Template { } fn rocket() -> Rocket { - let options: Options = serde_json::from_value(serde_json::json!({ - "read_only": true, - "no_lock": true, - })) - .unwrap(); - - let mut state = AppState { - storage: Storage::new("db", options).expect("open db"), - database_distribution: Uniform::new(1, 3), + let state = AppState { + database_distribution: get_database_distribution(), }; - state.database_distribution = get_database_distribution(&state.storage); - - let state = state; rocket::ignite() .manage(state)