iens

Manager of links to read
git clone https://git.instinctive.eu/iens.git
Log | Files | Refs | README | LICENSE

commit 73f292296bb8132dc3dc12aa394111b55112a8b7
parent 51e3c160f8a188b9a4b494bb683d4870567b3db2
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date:   Thu,  2 Apr 2026 17:59:11 +0000

Database schema is extracted into a common source file
Diffstat:
Asrc/common.scm | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/iens.scm | 57+--------------------------------------------------------
2 files changed, 71 insertions(+), 56 deletions(-)

diff --git a/src/common.scm b/src/common.scm @@ -0,0 +1,70 @@ +; Copyright (c) 2023-2026, Natacha Porté +; +; Permission to use, copy, modify, and distribute this software for any +; purpose with or without fee is hereby granted, provided that the above +; copyright notice and this permission notice appear in all copies. +; +; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Database Creation/Migration + +(define (db-version) + (query fetch-value (sql db "PRAGMA user_version;"))) + +(when (null? (schema db)) + (write-line "Initializing database with schema v2") + (for-each + (lambda (s) (exec (sql/transient db s))) + (list "CREATE TABLE config (key TEXT PRIMARY KEY, val);" + "CREATE TABLE tag (id INTEGER PRIMARY KEY, + name TEXT NOT NULL, + auto INTEGER DEFAULT 0);" + "CREATE TABLE entry (id INTEGER PRIMARY KEY, + url TEXT NOT NULL, type TEXT, description TEXT, notes TEXT, + protected INTEGER DEFAULT 0, ptime INTEGER, + ctime INTEGER NOT NULL DEFAULT CURRENT_TIMESTAMP, + mtime INTEGER NOT NULL DEFAULT CURRENT_TIMESTAMP);" + "CREATE TABLE tagrel (url_id REFERENCES entry(id) + ON UPDATE CASCADE ON DELETE CASCADE, + tag_id REFERENCES tag(id) + ON UPDATE CASCADE ON DELETE CASCADE);" + "CREATE TABLE feed (id INTEGER PRIMARY KEY, filename TEXT NOT NULL, + url TEXT NOT NULL, selector TEXT NOT NULL, + title TEXT NOT NULL, + active INTEGER NOT NULL DEFAULT 1, + mtime INTEGER);" + "CREATE TABLE selector (id INTEGER PRIMARY KEY, text TEXT);" + "CREATE INDEX i_mtime ON entry(mtime);" + "CREATE INDEX i_pmtime ON entry(protected,mtime);" + "CREATE UNIQUE INDEX i_url ON entry(url);" + "CREATE UNIQUE INDEX i_tag ON tag(name);" + "CREATE UNIQUE INDEX i_rel0 ON tagrel(url_id,tag_id);" + "CREATE INDEX i_rel1 ON tagrel(url_id);" + "CREATE INDEX i_rel2 ON tagrel(tag_id);" + "PRAGMA user_version = 2;"))) + +(when (= 0 (db-version)) + (write-line "Updating database schema from v0 to v1") + (assert (= 1 (query fetch-value + (sql db "SELECT val FROM config WHERE key = ?;") + "schema-version"))) + (for-each + (lambda (s) (exec (sql/transient db s))) + (list "CREATE TABLE IF NOT EXISTS + selector (id INTEGER PRIMARY KEY, text TEXT);" + "DELETE FROM config WHERE key='schema-version';" + "PRAGMA user_version = 1;"))) + +(when (= 1 (db-version)) + (write-line "Updating database schema from v1 to v2") + (for-each + (lambda (s) (exec (sql/transient db s))) + (list "ALTER TABLE feed ADD COLUMN mtime INTEGER;" + "PRAGMA user_version = 2;"))) diff --git a/src/iens.scm b/src/iens.scm @@ -109,62 +109,7 @@ (write-line (conc "Using database " db-name " with SQLite " library-version)) (exec (sql db "PRAGMA foreign_keys = ON;")) -(define (db-version) - (query fetch-value (sql db "PRAGMA user_version;"))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Database Creation/Migration - -(when (null? (schema db)) - (write-line "Initializing database with schema v2") - (for-each - (lambda (s) (exec (sql/transient db s))) - (list "CREATE TABLE config (key TEXT PRIMARY KEY, val);" - "CREATE TABLE tag (id INTEGER PRIMARY KEY, - name TEXT NOT NULL, - auto INTEGER DEFAULT 0);" - "CREATE TABLE entry (id INTEGER PRIMARY KEY, - url TEXT NOT NULL, type TEXT, description TEXT, notes TEXT, - protected INTEGER DEFAULT 0, ptime INTEGER, - ctime INTEGER NOT NULL DEFAULT CURRENT_TIMESTAMP, - mtime INTEGER NOT NULL DEFAULT CURRENT_TIMESTAMP);" - "CREATE TABLE tagrel (url_id REFERENCES entry(id) - ON UPDATE CASCADE ON DELETE CASCADE, - tag_id REFERENCES tag(id) - ON UPDATE CASCADE ON DELETE CASCADE);" - "CREATE TABLE feed (id INTEGER PRIMARY KEY, filename TEXT NOT NULL, - url TEXT NOT NULL, selector TEXT NOT NULL, - title TEXT NOT NULL, - active INTEGER NOT NULL DEFAULT 1, - mtime INTEGER);" - "CREATE TABLE selector (id INTEGER PRIMARY KEY, text TEXT);" - "CREATE INDEX i_mtime ON entry(mtime);" - "CREATE INDEX i_pmtime ON entry(protected,mtime);" - "CREATE UNIQUE INDEX i_url ON entry(url);" - "CREATE UNIQUE INDEX i_tag ON tag(name);" - "CREATE UNIQUE INDEX i_rel0 ON tagrel(url_id,tag_id);" - "CREATE INDEX i_rel1 ON tagrel(url_id);" - "CREATE INDEX i_rel2 ON tagrel(tag_id);" - "PRAGMA user_version = 2;"))) - -(when (= 0 (db-version)) - (write-line "Updating database schema from v0 to v1") - (assert (= 1 (query fetch-value - (sql db "SELECT val FROM config WHERE key = ?;") - "schema-version"))) - (for-each - (lambda (s) (exec (sql/transient db s))) - (list "CREATE TABLE IF NOT EXISTS - selector (id INTEGER PRIMARY KEY, text TEXT);" - "DELETE FROM config WHERE key='schema-version';" - "PRAGMA user_version = 1;"))) - -(when (= 1 (db-version)) - (write-line "Updating database schema from v1 to v2") - (for-each - (lambda (s) (exec (sql/transient db s))) - (list "ALTER TABLE feed ADD COLUMN mtime INTEGER;" - "PRAGMA user_version = 2;"))) +(include "common.scm") (assert (= 2 (db-version)))