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}