1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
extern crate rusqlite;
extern crate serde;
extern crate serde_json;
extern crate time;
use self::rusqlite::Connection;
use super::Note;
pub fn count(conn: &Connection, tbl: &str) -> i64 {
let mut stmt = conn
.prepare(&format!("select count(1) as cnt from {}", tbl))
.unwrap();
let rs = stmt.query_row(&[], |row| row.get(0)).unwrap();
rs
}
pub fn select(conn: &Connection, sql: &str) -> String {
let mut stmt = conn.prepare(sql).unwrap();
let note_iter =
stmt.query_map(&[], |row| Note {
rowid: row.get(0),
title: row.get(1),
url: row.get(2),
tags: row.get(3),
description: row.get(4),
comments: row.get(5),
annotations: "".to_string(),
created_at: row.get(7),
}).unwrap();
let mut j = "[ ".to_owned();
for note in note_iter {
let note = note.unwrap();
j.push_str(&serde_json::to_string(¬e).unwrap());
j.push_str(",");
}
j.pop();
j.push_str("]");
j
}
pub fn delete(conn: &Connection, rowid: i64) {
conn.execute("delete from note where rowid = ?1", &[&rowid])
.unwrap();
}
pub fn insert(conn: &Connection, note: Note) {
conn.execute(
"
INSERT INTO note (title, url, tags, description, comments, annotations, created_at)
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7);
",
&[
¬e.title,
¬e.url,
¬e.tags,
¬e.description,
¬e.comments,
¬e.annotations,
¬e.created_at,
],
).unwrap();
conn.execute_batch(
"BEGIN;
UPDATE ssb SET is_last_note = 0
WHERE is_active_author = 1;
COMMIT;
",
).unwrap();
}
pub fn create(conn: &Connection) {
conn.execute_batch(
"BEGIN;
CREATE TABLE IF NOT EXISTS note (
rowid INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
url TEXT NOT NULL,
tags TEXT NOT NULL,
description TEXT NOT NULL,
comments TEXT NOT NULL,
annotations TEXT NOT NULL,
created_at TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS ssb (
note_rowid INTEGER NOT NULL UNIQUE,
author TEXT PRIMARY KEY,
is_active_author BOOLEAN NOT NULL,
is_last_note BOOLEAN NOT NULL,
ts INTEGER NOT NULL,
seq INTEGER NOT NULL,
key TEXT NOT NULL,
prev TEXT NOT NULL
) WITHOUT ROWID;
COMMIT;",
).unwrap();
}
pub fn clear(conn: &Connection) {
conn.execute_batch(
"BEGIN;
drop TABLE IF EXISTS note;
drop TABLE IF EXISTS ssb;
COMMIT;
",
).unwrap();
}