aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoris2025-02-07 10:35:20 +0100
committerJoris2025-02-07 10:35:20 +0100
commit582c03eacbc73b851aa232c404be71b2cf77295a (patch)
tree59c48474f03135a7cdb8c104f372a84f1777cac8 /src
parent8a78d6fcb970d256f7645d6c0a6f02da987a2896 (diff)
Use strict mode for tables
Diffstat (limited to 'src')
-rw-r--r--src/db/event_colors.rs (renamed from src/db/event_color.rs)2
-rw-r--r--src/db/migrations/01-init.sql (renamed from src/db/migrations/1-init.sql)0
-rw-r--r--src/db/migrations/02-categories.sql (renamed from src/db/migrations/2-categories.sql)0
-rw-r--r--src/db/migrations/03-event-color.sql (renamed from src/db/migrations/3-event-color.sql)0
-rw-r--r--src/db/migrations/04-strict-tables.sql57
-rw-r--r--src/db/mod.rs24
-rw-r--r--src/gui/app.rs2
7 files changed, 77 insertions, 8 deletions
diff --git a/src/db/event_color.rs b/src/db/event_colors.rs
index 33d350b..62b6146 100644
--- a/src/db/event_color.rs
+++ b/src/db/event_colors.rs
@@ -2,7 +2,7 @@ use anyhow::Result;
use rusqlite::Connection;
pub fn get_default_color(conn: &Connection) -> Result<String> {
- let mut stmt = conn.prepare("SELECT * FROM event_color LIMIT 1")?;
+ let mut stmt = conn.prepare("SELECT * FROM event_colors LIMIT 1")?;
let iter = stmt.query_map([], |row| row.get(0))?;
diff --git a/src/db/migrations/1-init.sql b/src/db/migrations/01-init.sql
index 467e481..467e481 100644
--- a/src/db/migrations/1-init.sql
+++ b/src/db/migrations/01-init.sql
diff --git a/src/db/migrations/2-categories.sql b/src/db/migrations/02-categories.sql
index 0b373d0..0b373d0 100644
--- a/src/db/migrations/2-categories.sql
+++ b/src/db/migrations/02-categories.sql
diff --git a/src/db/migrations/3-event-color.sql b/src/db/migrations/03-event-color.sql
index ec589ea..ec589ea 100644
--- a/src/db/migrations/3-event-color.sql
+++ b/src/db/migrations/03-event-color.sql
diff --git a/src/db/migrations/04-strict-tables.sql b/src/db/migrations/04-strict-tables.sql
new file mode 100644
index 0000000..7a10b31
--- /dev/null
+++ b/src/db/migrations/04-strict-tables.sql
@@ -0,0 +1,57 @@
+-- Categories
+
+ALTER TABLE "categories" RENAME TO "categories_non_strict";
+
+CREATE TABLE IF NOT EXISTS "categories" (
+ "id" TEXT PRIMARY KEY, /* UUID */
+ "name" TEXT NOT NULL UNIQUE,
+ "color" TEXT NOT NULL, /* COLOR */
+ "created" TEXT NOT NULL, /* DATETIME */
+ "updated" TEXT NOT NULL /* DATETIME */
+) STRICT;
+
+INSERT INTO categories (id, name, color, created, updated)
+ SELECT id, name, color, created, updated
+ FROM categories_non_strict;
+
+DROP TABLE categories_non_strict;
+
+-- Event color
+
+CREATE TABLE IF NOT EXISTS "event_colors" (
+ "color" TEXT NOT NULL /* COLOR */
+) STRICT;
+
+INSERT INTO event_colors (color)
+ SELECT color
+ FROM event_color;
+
+DROP TABLE event_color;
+
+-- Events
+
+ALTER TABLE "events" RENAME TO "events_non_strict";
+
+CREATE TABLE IF NOT EXISTS "events" (
+ "id" TEXT PRIMARY KEY, /* UUID */
+ "date" TEXT NOT NULL, /* DATE */
+ "start" TEXT NULL, /* TIME */
+ "end" TEXT NULL, /* TIME */
+ "name" TEXT NOT NULL,
+ "repetition" TEXT NULL, /* JSON */
+ "created" TEXT NOT NULL, /* DATETIME */
+ "updated" TEXT NOT NULL, /* DATETIME */
+ "category" TEXT REFERENCES "categories" ("id")
+) STRICT;
+
+INSERT INTO events (id, date, start, end, name, repetition, created, updated, category)
+ SELECT id, date, start, end, name, repetition, created, updated, category
+ FROM events_non_strict;
+
+DROP TABLE events_non_strict;
+
+DROP INDEX IF EXISTS events_date_index;
+CREATE INDEX events_date_index on events (date);
+
+DROP INDEX IF EXISTS events_repetition_index;
+CREATE INDEX events_repetition_index on events (repetition);
diff --git a/src/db/mod.rs b/src/db/mod.rs
index 20e7f81..0e73f30 100644
--- a/src/db/mod.rs
+++ b/src/db/mod.rs
@@ -1,5 +1,5 @@
pub mod categories;
-pub mod event_color;
+pub mod event_colors;
pub mod events;
use anyhow::Result;
@@ -8,11 +8,23 @@ use rusqlite_migration::{Migrations, M};
pub fn init(db_path: &str) -> Result<Connection> {
let mut conn = Connection::open(db_path)?;
+ apply_migrations(&mut conn)?;
+ set_pragma(&conn, "foreign_keys", "ON")?;
+ set_pragma(&conn, "journal_mode", "wal")?;
+ Ok(conn)
+}
+
+fn apply_migrations(conn: &mut Connection) -> Result<()> {
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")),
+ M::up(include_str!("migrations/01-init.sql")),
+ M::up(include_str!("migrations/02-categories.sql")),
+ M::up(include_str!("migrations/03-event-color.sql")),
+ M::up(include_str!("migrations/04-strict-tables.sql")),
]);
- migrations.to_latest(&mut conn)?;
- Ok(conn)
+ migrations.to_latest(conn)?;
+ Ok(())
+}
+
+fn set_pragma(conn: &Connection, key: &str, value: &str) -> Result<()> {
+ Ok(conn.pragma_update(None, key, value)?)
}
diff --git a/src/gui/app.rs b/src/gui/app.rs
index 76dff71..826f051 100644
--- a/src/gui/app.rs
+++ b/src/gui/app.rs
@@ -36,7 +36,7 @@ impl App {
let events = db::events::list_non_recurring_between(&conn, start_date, end_date)?;
let recurring_events = db::events::list_recurring(&conn)?;
let categories = db::categories::list(&conn)?;
- let default_color = db::event_color::get_default_color(&conn)?;
+ let default_color = db::event_colors::get_default_color(&conn)?;
let calendar = calendar::create(
tx.clone(),