aboutsummaryrefslogtreecommitdiff
path: root/src/db/mod.rs
blob: 03692e9eb0f8d0275919c042a98c1ff972324e36 (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
38
39
40
41
42
43
44
45
46
47
48
49
use anyhow::Result;
use rusqlite::{params, Connection};
use rusqlite_migration::{Migrations, M};
use uuid::Uuid;

use crate::model::event::Event;

pub fn init() -> Result<Connection> {
    let mut conn = Connection::open("database.db")?;
    let migrations = Migrations::new(vec![M::up(include_str!("migrations/1-init.sql"))]);
    migrations.to_latest(&mut conn)?;
    Ok(conn)
}

pub fn insert(conn: &Connection, event: &Event) -> Result<()> {
    conn.execute(
        "INSERT INTO events (id, date, start, end, name, created, updated) VALUES (?, ?, ?, ?, ?, datetime(), datetime())",
        params![event.id.to_hyphenated().to_string(), event.date, event.start, event.end, event.name]
    )?;

    Ok(())
}

pub fn update(conn: &Connection, event: &Event) -> Result<()> {
    conn.execute(
        "UPDATE events SET date = ?, start = ?, end = ?, name = ?, updated = datetime() where id = ?",
        params![event.date, event.start, event.end, event.name, event.id.to_hyphenated().to_string()]
    )?;

    Ok(())
}

// TODO: Don’t use unwrap
pub fn list(conn: &Connection) -> Result<Vec<Event>> {
    let mut stmt = conn.prepare("SELECT id, date, start, end, name FROM events")?;

    let iter = stmt.query_map([], |row| {
        let uuid: String = row.get(0)?;
        Ok(Event {
            id: Uuid::parse_str(&uuid).unwrap(),
            date: row.get(1)?,
            start: row.get(2)?,
            end: row.get(3)?,
            name: row.get(4)?,
        })
    })?;

    Ok(iter.map(|r| r.unwrap()).collect())
}