From f5db9eda4da759474b611391de1099d1109d38c1 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sun, 18 Sep 2022 02:39:35 +0300 Subject: [PATCH] From refactor --- src/main.rs | 101 +++++++++++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 53 deletions(-) diff --git a/src/main.rs b/src/main.rs index 38495fa..d8c534e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,12 +13,21 @@ extern crate zip; use clap::{Parser, Subcommand}; use rand::seq::IteratorRandom; +use std::path::PathBuf; use std::time::Instant; - use std::{fs, io}; use ledb::{Options, Storage}; +macro_rules! make { + ($Target:ident; by {$($field:ident),+}; from $src:expr) => {$Target {$( + $field: $src.$field + ),+}}; + ($Target:ident; with defaults and by {$($field:ident),+}; from $src:expr) => {$Target {$( + $field: $src.$field + ),+ ,..$Target::default()}} +} + #[derive(Subcommand, Debug)] enum Command { Write, @@ -45,7 +54,7 @@ struct Cli { measure: bool, } -#[derive(Debug, Default, Clone, Deserialize)] +#[derive(Debug, Default, Clone, Serialize, Deserialize)] struct SourceQuestion { #[serde(default)] num: u32, @@ -100,7 +109,7 @@ struct SourceQuestion { rating: String, } -#[derive(Debug, Default, Clone, Deserialize)] +#[derive(Debug, Default, Clone, Serialize, Deserialize)] struct SourceQuestionsBatch { #[serde(default)] filename: String, @@ -223,56 +232,32 @@ struct Question { impl From for Question { fn from(src: SourceQuestion) -> Self { - Self { - num: src.num, - id: src.id, - description: src.description, - answer: src.answer, - author: src.author, - comment: src.comment, - comment1: src.comment1, - tour: src.tour, - url: src.url, - date: src.date, - processed_by: src.processed_by, - redacted_by: src.redacted_by, - copyright: src.copyright, - theme: src.theme, - kind: src.kind, - source: src.source, - rating: src.rating, - batch_info: BatchInfo::default(), - } + make! {Self; with defaults and by { + num, id, description, answer, author, comment, comment1, tour, url, + date, processed_by, redacted_by, copyright, theme, kind, source, rating + }; from src} } } -impl From<&SourceQuestionsBatch> for BatchInfo { - fn from(src: &SourceQuestionsBatch) -> Self { - Self { - filename: src.filename.clone(), - description: src.description.clone(), - author: src.author.clone(), - comment: src.comment.clone(), - url: src.url.clone(), - date: src.date.clone(), - processed_by: src.processed_by.clone(), - redacted_by: src.redacted_by.clone(), - copyright: src.copyright.clone(), - theme: src.theme.clone(), - kind: src.kind.clone(), - source: src.source.clone(), - rating: src.rating.clone(), - } +impl From for BatchInfo { + fn from(src: SourceQuestionsBatch) -> Self { + make! {Self; by { + filename, description, author, comment, url, date, + processed_by, redacted_by, copyright, theme, kind, source, rating + }; from src} } } impl From for Vec { fn from(src: SourceQuestionsBatch) -> Self { - let mut result = Vec::::with_capacity(src.questions.len()); - src.questions.iter().for_each(|item| { - let mut question: Question = item.clone().into(); - question.batch_info = BatchInfo::from(&src); - result.push(question); + let mut result: Vec = src + .questions + .iter() + .map(|item| item.clone().into()) + .collect(); + let batch_info = BatchInfo::from(src); + result.iter_mut().for_each(|mut question| { + question.batch_info = batch_info.clone(); }); result @@ -293,7 +278,19 @@ pub fn measure_and_print(func: F) { } fn writer_v4() { - let zip_file = fs::File::open("test1.zip").unwrap(); + const IN_FILENAME: &str = "test1.zip"; + const OUT_DIR: &str = "db"; + + let out_file: PathBuf = [OUT_DIR, "data.mdb"].into_iter().collect(); + match fs::metadata(&out_file) { + Ok(x) if x.is_file() => { + fs::remove_file(&out_file).unwrap(); + println!(r#""{}" removed"#, out_file.to_str().unwrap()); + } + _ => {} + }; + + let zip_file = fs::File::open(IN_FILENAME).unwrap(); let zip_reader = io::BufReader::new(zip_file); let mut archive = zip::ZipArchive::new(zip_reader).unwrap(); @@ -309,7 +306,8 @@ fn writer_v4() { let storage = Storage::new("db", options).unwrap(); let collection = storage.collection("questions").unwrap(); - collection.purge().unwrap(); + + println!("converting..."); let mut count: usize = 0; let count = &mut count; @@ -333,17 +331,14 @@ fn writer_v4() { .for_each(|question| { let result = collection.insert(&question); if result.is_err() { - println!( - "Error: {:?} \n\ - On: {:?}", - result, question - ); + println!("-- {:#?}", question); + panic!("-- {:#?}", result); } else { *count += 1; } }); - println!("inserted {}", count); + println!("inserted {}\nwriting...", count); storage.sync(true).unwrap(); print!("stats: "); let stats = storage.stat().unwrap();