aboutsummaryrefslogtreecommitdiff
path: root/src/db/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/db/mod.rs')
-rw-r--r--src/db/mod.rs137
1 files changed, 6 insertions, 131 deletions
diff --git a/src/db/mod.rs b/src/db/mod.rs
index 101c874..20e7f81 100644
--- a/src/db/mod.rs
+++ b/src/db/mod.rs
@@ -1,143 +1,18 @@
+pub mod categories;
+pub mod event_color;
+pub mod events;
+
use anyhow::Result;
-use chrono::{NaiveDate, NaiveTime};
-use rusqlite::{params, Connection};
+use rusqlite::Connection;
use rusqlite_migration::{Migrations, M};
-use uuid::Uuid;
-
-use crate::model::event::Event;
pub fn init(db_path: &str) -> Result<Connection> {
let mut conn = Connection::open(db_path)?;
let migrations = Migrations::new(vec![
M::up(include_str!("migrations/1-init.sql")),
M::up(include_str!("migrations/2-categories.sql")),
+ M::up(include_str!("migrations/3-event-color.sql")),
]);
migrations.to_latest(&mut conn)?;
Ok(conn)
}
-
-pub fn insert(conn: &Connection, event: &Event) -> Result<()> {
- let repetition = match &event.repetition {
- Some(r) => Some(serde_json::to_string(&r)?),
- None => None,
- };
-
- conn.execute(
- "INSERT INTO events (id, date, start, end, name, repetition, created, updated) VALUES (?, ?, ?, ?, ?, ?, datetime(), datetime())",
- params![event.id.to_hyphenated().to_string(), event.date, event.start, event.end, event.name, repetition]
- )?;
-
- Ok(())
-}
-
-pub fn update(conn: &Connection, event: &Event) -> Result<()> {
- let repetition = match &event.repetition {
- Some(r) => Some(serde_json::to_string(&r)?),
- None => None,
- };
-
- conn.execute(
- "UPDATE events SET date = ?, start = ?, end = ?, name = ?, repetition = ?, updated = datetime() WHERE id = ?",
- params![event.date, event.start, event.end, event.name, repetition, event.id.to_hyphenated().to_string()]
- )?;
-
- Ok(())
-}
-
-pub fn delete(conn: &Connection, id: &Uuid) -> Result<()> {
- conn.execute(
- "DELETE FROM events WHERE id = ?",
- params![id.to_hyphenated().to_string()],
- )?;
-
- Ok(())
-}
-
-pub fn list_recurring(conn: &Connection) -> Result<Vec<Event>> {
- let mut stmt = conn.prepare(
- "
- SELECT id, date, start, end, name, repetition
- FROM events
- WHERE repetition IS NOT NULL",
- )?;
-
- let iter = stmt.query_map([], |row| {
- Ok(read_recurring_event(
- row.get(0)?,
- row.get(1)?,
- row.get(2)?,
- row.get(3)?,
- row.get(4)?,
- row.get(5)?,
- ))
- })?;
-
- let mut res = vec![];
- for event in iter {
- res.push(event??)
- }
- Ok(res)
-}
-
-fn read_recurring_event(
- uuid: String,
- date: NaiveDate,
- start: Option<NaiveTime>,
- end: Option<NaiveTime>,
- name: String,
- repetition: Option<String>,
-) -> Result<Event> {
- let id = Uuid::parse_str(&uuid)?;
- let repetition = match repetition {
- Some(r) => Some(serde_json::from_str(&r)?),
- None => None,
- };
-
- Ok(Event {
- id,
- date,
- start,
- end,
- name,
- repetition,
- })
-}
-
-pub fn list_non_recurring_between(
- conn: &Connection,
- start: NaiveDate,
- end: NaiveDate,
-) -> Result<Vec<Event>> {
- let mut stmt = conn.prepare(
- "
- SELECT id, date, start, end, name
- FROM events
- WHERE
- repetition IS NULL
- AND date >= ?
- AND date <= ?
- ",
- )?;
-
- let iter = stmt.query_map([start, end], |row| {
- let uuid: String = row.get(0)?;
- let date = row.get(1)?;
- let start = row.get(2)?;
- let end = row.get(3)?;
- let name = row.get(4)?;
- Ok(Uuid::parse_str(&uuid).map(|id| Event {
- id,
- date,
- start,
- end,
- name,
- repetition: None,
- }))
- })?;
-
- let mut res = vec![];
- for event in iter {
- res.push(event??)
- }
- Ok(res)
-}