tally_cli/
models.rs

1use sqlite::{ConnectionThreadSafe, State};
2
3#[derive(Debug)]
4pub struct Counter {
5    pub name: String,
6    pub count: i64,
7    pub step: i64,
8    pub template: String,
9}
10
11impl Counter {
12    pub fn new(name: &str) -> Counter {
13        Counter {
14            name: name.to_string(),
15            count: 0,
16            step: 1,
17            template: String::from("{}"),
18        }
19    }
20
21    pub fn set_default(&self, conn: &ConnectionThreadSafe) -> sqlite::Result<()> {
22        let mut stmt = conn.prepare(
23            "INSERT INTO default_counter (name, timestamp) VALUES (?, CURRENT_TIMESTAMP);",
24        )?;
25        stmt.bind((1, self.name.as_str()))?;
26        stmt.next()?;
27        Ok(())
28    }
29
30    pub fn get_default(conn: &ConnectionThreadSafe) -> sqlite::Result<Option<String>> {
31        let mut stmt =
32            conn.prepare("SELECT name FROM default_counter ORDER BY timestamp DESC LIMIT 1;")?;
33        if let State::Row = stmt.next()? {
34            Ok(Some(stmt.read::<String, usize>(0)?))
35        } else {
36            Ok(None)
37        }
38    }
39
40    pub fn insert(&self, conn: &ConnectionThreadSafe) -> sqlite::Result<()> {
41        let mut stmt =
42            conn.prepare("INSERT INTO counters (name, count, step, template) VALUES (?, ?, ?, ?)")?;
43        stmt.bind((1, self.name.as_str()))?;
44        stmt.bind((2, self.count))?;
45        stmt.bind((3, self.step))?;
46        stmt.bind((4, self.template.as_str()))?;
47        stmt.next()?;
48
49        Ok(())
50    }
51
52    pub fn delete(conn: &ConnectionThreadSafe, name: &str) -> sqlite::Result<()> {
53        let mut stmt = conn.prepare("DELETE FROM counters WHERE name = ?")?;
54        stmt.bind((1, name))?;
55        stmt.next()?;
56        Ok(())
57    }
58
59    pub fn get(conn: &ConnectionThreadSafe, name: &str) -> sqlite::Result<Option<Counter>> {
60        let mut stmt =
61            conn.prepare("SELECT name, count, step, template FROM counters WHERE name = ?")?;
62        stmt.bind((1, name))?;
63
64        if let State::Row = stmt.next()? {
65            Ok(Some(Counter {
66                name: stmt.read::<String, _>(0)?.to_string(),
67                count: stmt.read::<i64, _>(1)?,
68                step: stmt.read::<i64, _>(2)?,
69                template: stmt.read::<String, _>(3)?.to_string(),
70            }))
71        } else {
72            Ok(None)
73        }
74    }
75
76    pub fn get_all(conn: &ConnectionThreadSafe) -> sqlite::Result<Vec<Counter>> {
77        let mut stmt = conn.prepare("SELECT name, count, step, template FROM counters")?;
78        let mut counters = Vec::new();
79
80        while let State::Row = stmt.next()? {
81            counters.push(Counter {
82                name: stmt.read::<String, usize>(0)?,
83                count: stmt.read::<i64, usize>(1)?,
84                step: stmt.read::<i64, usize>(2)?,
85                template: stmt.read::<String, usize>(3)?,
86            });
87        }
88
89        Ok(counters)
90    }
91
92    pub fn update(&self, conn: &ConnectionThreadSafe) -> sqlite::Result<()> {
93        let mut stmt =
94            conn.prepare("UPDATE counters SET count = ?, step = ?, template = ? WHERE name = ?")?;
95        stmt.bind((1, self.count))?;
96        stmt.bind((2, self.step))?;
97        stmt.bind((3, self.template.as_str()))?;
98        stmt.bind((4, self.name.as_str()))?;
99        stmt.next()?;
100        Ok(())
101    }
102}