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
use log::LevelFilter;
pub fn ensure_dicts_table_exists(db: &rusqlite::Connection) -> rusqlite::Result<()> {
db.execute(
"
create table if not exists _zstd_dicts (
id integer primary key autoincrement,
chooser_key text unique,
dict blob not null
);",
rusqlite::params![],
)?;
Ok(())
}
#[macro_export]
macro_rules! format_sqlite {
($x:expr) => {
format!($x)
};
($x:expr, $y:expr) => {
format!($x, escape_sqlite_identifier($y))
};
($x:expr, $y:expr, $z:expr) => {
format!(
$x,
escape_sqlite_identifier($y),
escape_sqlite_identifier($z)
)
};
($x:expr, $y:expr, $z:expr, $w:expr) => {
format!(
$x,
escape_sqlite_identifier($y),
escape_sqlite_identifier($z),
escape_sqlite_identifier($w)
)
};
}
pub fn ah(e: anyhow::Error) -> rusqlite::Error {
rusqlite::Error::UserFunctionError(format!("{:?}", e).into())
}
pub fn escape_sqlite_identifier(identifier: &str) -> String {
format!("`{}`", identifier.replace("`", "``"))
}
pub fn init_logging(default_level: LevelFilter) {
if std::env::var("SQLITE_ZSTD_LOG").is_err() {
std::env::set_var("SQLITE_ZSTD_LOG", format!("{}", default_level));
}
env_logger::try_init_from_env(env_logger::Env::new().filter("SQLITE_ZSTD_LOG")).ok();
}