aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoris2025-02-07 11:45:22 +0100
committerJoris2025-02-07 11:45:22 +0100
commitb324803fe11b52b28ac2dc459504f904a48a79d4 (patch)
tree1d916303b3b262dc09c38a3c6f9abbb4a9a4e4be /src
parentf7afa9cf50a9459f41146ca5cb009eab69b76c5f (diff)
Use strict tables
Diffstat (limited to 'src')
-rw-r--r--src/db/migrations/01-init.sql (renamed from src/db/sql/1-init.sql)0
-rw-r--r--src/db/migrations/02-primary-key-question-responses.sql (renamed from src/db/sql/2-primary-key-question-responses.sql)0
-rw-r--r--src/db/migrations/03-drop-deck-read.sql (renamed from src/db/sql/3-drop-deck-read.sql)0
-rw-r--r--src/db/migrations/04-strict-tables.sql18
-rw-r--r--src/db/mod.rs22
5 files changed, 35 insertions, 5 deletions
diff --git a/src/db/sql/1-init.sql b/src/db/migrations/01-init.sql
index 29d70ed..29d70ed 100644
--- a/src/db/sql/1-init.sql
+++ b/src/db/migrations/01-init.sql
diff --git a/src/db/sql/2-primary-key-question-responses.sql b/src/db/migrations/02-primary-key-question-responses.sql
index cb7df21..cb7df21 100644
--- a/src/db/sql/2-primary-key-question-responses.sql
+++ b/src/db/migrations/02-primary-key-question-responses.sql
diff --git a/src/db/sql/3-drop-deck-read.sql b/src/db/migrations/03-drop-deck-read.sql
index 1ca23d1..1ca23d1 100644
--- a/src/db/sql/3-drop-deck-read.sql
+++ b/src/db/migrations/03-drop-deck-read.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..9ce4ce9
--- /dev/null
+++ b/src/db/migrations/04-strict-tables.sql
@@ -0,0 +1,18 @@
+ALTER TABLE "cards" RENAME TO "cards_non_strict";
+
+CREATE TABLE IF NOT EXISTS "cards" (
+ question TEXT NOT NULL,
+ responses TEXT NOT NULL,
+ state TEXT NOT NULL,
+ created INTEGER NOT NULL, /* TIMESTAMP */
+ updated INTEGER NULL, /* TIMESTAMP */
+ deleted INTEGER NULL, /* TIMESTAMP */
+ ready INTEGER NOT NULL, /* TIMESTAMP */
+ PRIMARY KEY (question, responses)
+) STRICT;
+
+INSERT INTO cards (question, responses, state, created, updated, deleted, ready)
+ SELECT question, responses, state, created, updated, deleted, ready
+ FROM cards_non_strict;
+
+DROP TABLE cards_non_strict;
diff --git a/src/db/mod.rs b/src/db/mod.rs
index 54bf90f..fb9f823 100644
--- a/src/db/mod.rs
+++ b/src/db/mod.rs
@@ -6,11 +6,23 @@ pub mod cards;
pub fn init(database: String) -> Result<Connection> {
let mut conn = Connection::open(database)?;
+ 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!("sql/1-init.sql")),
- M::up(include_str!("sql/2-primary-key-question-responses.sql")),
- M::up(include_str!("sql/3-drop-deck-read.sql")),
+ M::up(include_str!("migrations/01-init.sql")),
+ M::up(include_str!("migrations/02-primary-key-question-responses.sql")),
+ M::up(include_str!("migrations/03-drop-deck-read.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)?)
}