1use kobo_db_tools::{AppEventKind, ParseOption, Parser, Statistics};
2use rusqlite::{Connection, OpenFlags};
3use std::env;
4use std::error::Error;
5
6fn main() -> Result<(), Box<dyn Error>> {
7 let db_path = env::args().nth(1).or_else(|| env::var("KOBO_DB_PATH").ok());
8 let db_path = db_path.ok_or_else(|| {
9 "Usage: cargo run --example inspect -- /path/to/KoboReader.sqlite (or set KOBO_DB_PATH)"
10 .to_string()
11 })?;
12
13 let uri = format!("file:{}?immutable=1", db_path);
14 let conn = Connection::open_with_flags(
15 uri,
16 OpenFlags::SQLITE_OPEN_READ_ONLY | OpenFlags::SQLITE_OPEN_URI,
17 )?;
18 let analysis = Parser::parse_events(&conn, ParseOption::All)?;
19
20 if let Some(sessions) = &analysis.sessions {
21 println!("sessions: {}", sessions.sessions_count());
22 println!("sessions avg seconds: {:.2}", sessions.avg());
23 } else {
24 println!("sessions: none");
25 }
26
27 if let Some(terms) = &analysis.terms {
28 println!("dictionary terms: {}", terms.len());
29 } else {
30 println!("dictionary terms: none");
31 }
32
33 if let Some(history) = &analysis.brightness_history {
34 println!("brightness events: {}", history.events.len());
35 println!("brightness avg: {:.2}", history.avg());
36 } else {
37 println!("brightness events: none");
38 }
39
40 if let Some(history) = &analysis.natural_light_history {
41 println!("natural light events: {}", history.events.len());
42 println!("natural light avg: {:.2}", history.avg());
43 } else {
44 println!("natural light events: none");
45 }
46
47 if let Some(bookmarks) = &analysis.bookmarks {
48 println!("bookmarks: {}", bookmarks.len());
49 } else {
50 println!("bookmarks: none");
51 }
52
53 if let Some(books) = &analysis.books {
54 println!("books: {}", books.len());
55 } else {
56 println!("books: none");
57 }
58
59 if let Some(app_events) = &analysis.app_events {
60 let app_starts = app_events
61 .iter()
62 .filter(|event| event.kind == AppEventKind::AppStart)
63 .count();
64 let plugged_in = app_events
65 .iter()
66 .filter(|event| event.kind == AppEventKind::PluggedIn)
67 .count();
68 println!("app starts: {}", app_starts);
69 println!("plugged in: {}", plugged_in);
70 } else {
71 println!("app events: none");
72 }
73
74 Ok(())
75}