aboutsummaryrefslogtreecommitdiff
path: root/src/db/utils.rs
blob: 30f25c9e6e9575e068c1a82b53485673ce9a2195 (plain)
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
use crate::model::report::Report;
use tokio_rusqlite::{Connection, Row};

pub async fn support_foreign_keys(conn: &Connection) {
    let res = conn.call(move |conn| Ok(conn.pragma_update(None, "foreign_keys", "ON"))).await;

    if let Err(err) = res {
        log::error!("Error supporting foreign keys: {err:?}");
    }
}

pub fn format_key_for_search(value: &str) -> String {
    // Lower doesn’t work on accentuated letters, hence the need to remove manually accents for
    // uppercase letters as well.
    format!("replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower({}), 'à', 'a'), 'â', 'a'), 'ç', 'c'), 'è', 'e'), 'é', 'e'), 'ê', 'e'), 'ë', 'e'), 'î', 'i'), 'ï', 'i'), 'ô', 'o'), 'ù', 'u'), 'û', 'u'), 'ü', 'u'), 'À', 'A'), 'Â', 'A'), 'Ç', 'C'), 'È', 'E'), 'É', 'E'), 'Ê', 'E'), 'Ë', 'E'), 'Î', 'I'), 'Ï', 'I'), 'Ô', 'O'), 'Ù', 'U'), 'Û', 'U'), 'Ü', 'U')", value)
}

pub fn one<A, I: Iterator<Item = Result<A, rusqlite::Error>>>(
    mut iter: I,
) -> Result<A, tokio_rusqlite::Error> {
    match iter.next() {
        Some(Ok(user)) => Ok(user),
        Some(Err(err)) => Err(tokio_rusqlite::Error::Rusqlite(err)),
        None => Err(tokio_rusqlite::Error::Rusqlite(
            rusqlite::Error::QueryReturnedNoRows,
        )),
    }
}

pub fn row_to_report(row: &Row) -> Result<Report, rusqlite::Error> {
    Ok(Report {
        date: row.get(0)?,
        name: row.get(1)?,
        amount: row.get(2)?,
        action: row.get(3)?,
    })
}