From 15e4c3a374f525e4e9b1351975d6822a731d8e18 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Wed, 2 Jul 2025 14:52:46 +0200 Subject: [PATCH] refactor(database): get rid of the sqlite tentative --- go.mod | 1 - go.sum | 2 - internal/database/database.go | 4 +- internal/database/migrations.go | 293 ++++++++++++++++---------------- internal/database/postgresql.go | 6 - internal/database/sqlite.go | 26 --- 6 files changed, 144 insertions(+), 188 deletions(-) delete mode 100644 internal/database/sqlite.go diff --git a/go.mod b/go.mod index 61979582..363094cd 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,6 @@ require ( github.com/go-webauthn/webauthn v0.13.0 github.com/gorilla/mux v1.8.1 github.com/lib/pq v1.10.9 - github.com/mattn/go-sqlite3 v1.14.28 github.com/prometheus/client_golang v1.22.0 github.com/tdewolff/minify/v2 v2.23.8 golang.org/x/crypto v0.39.0 diff --git a/go.sum b/go.sum index 706421e8..f315ccd8 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= -github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= diff --git a/internal/database/database.go b/internal/database/database.go index 16efb184..1b3c83df 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -14,11 +14,9 @@ func Migrate(db *sql.DB) error { var currentVersion int db.QueryRow(`SELECT version FROM schema_version`).Scan(¤tVersion) - driver := getDriverStr() slog.Info("Running database migrations", slog.Int("current_version", currentVersion), slog.Int("latest_version", schemaVersion), - slog.String("driver", driver), ) for version := currentVersion; version < schemaVersion; version++ { @@ -29,7 +27,7 @@ func Migrate(db *sql.DB) error { return fmt.Errorf("[Migration v%d] %v", newVersion, err) } - if err := migrations[version](tx, driver); err != nil { + if err := migrations[version](tx); err != nil { tx.Rollback() return fmt.Errorf("[Migration v%d] %v", newVersion, err) } diff --git a/internal/database/migrations.go b/internal/database/migrations.go index e5faec42..51e52d80 100644 --- a/internal/database/migrations.go +++ b/internal/database/migrations.go @@ -12,8 +12,8 @@ import ( var schemaVersion = len(migrations) // Order is important. Add new migrations at the end of the list. -var migrations = []func(tx *sql.Tx, driver string) error{ - func(tx *sql.Tx, _ string) (err error) { +var migrations = []func(tx *sql.Tx) error{ + func(tx *sql.Tx) (err error) { sql := ` CREATE TABLE schema_version ( version text not null @@ -122,19 +122,16 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, driver string) (err error) { - if driver == "postgresql" { - sql := ` + func(tx *sql.Tx) (err error) { + sql := ` CREATE EXTENSION IF NOT EXISTS hstore; ALTER TABLE users ADD COLUMN extra hstore; CREATE INDEX users_extra_idx ON users using gin(extra); ` - _, err = tx.Exec(sql) - return err - } - return nil + _, err = tx.Exec(sql) + return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` CREATE TABLE tokens ( id text not null, @@ -146,7 +143,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` CREATE TYPE entry_sorting_direction AS enum('asc', 'desc'); ALTER TABLE users ADD COLUMN entry_direction entry_sorting_direction default 'asc'; @@ -154,7 +151,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` CREATE TABLE integrations ( user_id int not null, @@ -175,27 +172,27 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE feeds ADD COLUMN scraper_rules text default ''` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE feeds ADD COLUMN rewrite_rules text default ''` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE feeds ADD COLUMN crawler boolean default 'f'` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE sessions rename to user_sessions` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` DROP TABLE tokens; @@ -209,7 +206,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN wallabag_enabled bool default 'f', @@ -222,12 +219,12 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE entries ADD COLUMN starred bool default 'f'` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` CREATE INDEX entries_user_status_idx ON entries(user_id, status); CREATE INDEX feeds_user_category_idx ON feeds(user_id, category_id); @@ -235,7 +232,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN nunux_keeper_enabled bool default 'f', @@ -245,17 +242,17 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE enclosures ALTER COLUMN size SET DATA TYPE bigint` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE entries ADD COLUMN comments_url text default ''` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN pocket_enabled bool default 'f', @@ -265,14 +262,14 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE user_sessions ALTER COLUMN ip SET DATA TYPE inet using ip::inet; ` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE feeds ADD COLUMN username text default '', @@ -281,7 +278,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE entries ADD COLUMN document_vectors tsvector; UPDATE entries SET document_vectors = to_tsvector(substring(title || ' ' || coalesce(content, '') for 1000000)); @@ -290,12 +287,12 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE feeds ADD COLUMN user_agent text default ''` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` UPDATE entries @@ -305,17 +302,17 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE users ADD COLUMN keyboard_shortcuts boolean default 't'` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE feeds ADD COLUMN disabled boolean default 'f';` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE users ALTER COLUMN theme SET DEFAULT 'light_serif'; UPDATE users SET theme='light_serif' WHERE theme='default'; @@ -325,7 +322,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE entries ADD COLUMN changed_at timestamp with time zone; UPDATE entries SET changed_at = published_at; @@ -334,7 +331,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` CREATE TABLE api_keys ( id serial not null, @@ -350,7 +347,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE entries ADD COLUMN share_code text not null default ''; CREATE UNIQUE INDEX entries_share_code_idx ON entries USING btree(share_code) WHERE share_code <> ''; @@ -358,12 +355,12 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `CREATE INDEX enclosures_user_entry_url_idx ON enclosures(user_id, entry_id, md5(url))` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE feeds ADD COLUMN next_check_at timestamp with time zone default now(); CREATE INDEX entries_user_feed_idx ON entries (user_id, feed_id); @@ -371,52 +368,52 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE feeds ADD COLUMN ignore_http_cache bool default false` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE users ADD COLUMN entries_per_page int default 100` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE users ADD COLUMN show_reading_time boolean default 't'` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `CREATE INDEX entries_id_user_status_idx ON entries USING btree (id, user_id, status)` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE feeds ADD COLUMN fetch_via_proxy bool default false` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `CREATE INDEX entries_feed_id_status_hash_idx ON entries USING btree (feed_id, status, hash)` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `CREATE INDEX entries_user_id_status_starred_idx ON entries (user_id, status, starred)` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE users ADD COLUMN entry_swipe boolean default 't'` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE integrations DROP COLUMN fever_password` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE feeds ADD COLUMN blocklist_rules text not null default '', @@ -425,12 +422,12 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE entries ADD COLUMN reading_time int not null default 0` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE entries ADD COLUMN created_at timestamp with time zone not null default now(); UPDATE entries SET created_at = published_at; @@ -438,7 +435,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, driver string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` ALTER TABLE users ADD column stylesheet text not null default '', @@ -449,8 +446,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ return err } - if driver == "postgresql" { - _, err = tx.Exec(` + _, err = tx.Exec(` DECLARE my_cursor CURSOR FOR SELECT id, @@ -460,28 +456,28 @@ var migrations = []func(tx *sql.Tx, driver string) error{ FROM users FOR UPDATE `) - if err != nil { + if err != nil { + return err + } + defer tx.Exec("CLOSE my_cursor") + + for { + var ( + userID int64 + customStylesheet string + googleID string + oidcID string + ) + + if err := tx.QueryRow(`FETCH NEXT FROM my_cursor`).Scan(&userID, &customStylesheet, &googleID, &oidcID); err != nil { + if err == sql.ErrNoRows { + break + } return err } - defer tx.Exec("CLOSE my_cursor") - for { - var ( - userID int64 - customStylesheet string - googleID string - oidcID string - ) - - if err := tx.QueryRow(`FETCH NEXT FROM my_cursor`).Scan(&userID, &customStylesheet, &googleID, &oidcID); err != nil { - if err == sql.ErrNoRows { - break - } - return err - } - - _, err := tx.Exec( - `UPDATE + _, err := tx.Exec( + `UPDATE users SET stylesheet=$2, @@ -490,20 +486,17 @@ var migrations = []func(tx *sql.Tx, driver string) error{ WHERE id=$1 `, - userID, customStylesheet, googleID, oidcID) - if err != nil { - return err - } + userID, customStylesheet, googleID, oidcID) + if err != nil { + return err } } return err }, - func(tx *sql.Tx, driver string) (err error) { - if driver == "postgresql" { - if _, err = tx.Exec(`ALTER TABLE users DROP COLUMN extra;`); err != nil { - return err - } + func(tx *sql.Tx) (err error) { + if _, err = tx.Exec(`ALTER TABLE users DROP COLUMN extra;`); err != nil { + return err } _, err = tx.Exec(` CREATE UNIQUE INDEX users_google_id_idx ON users(google_id) WHERE google_id <> ''; @@ -511,7 +504,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ `) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` CREATE INDEX entries_feed_url_idx ON entries(feed_id, url) WHERE length(url) < 2000; CREATE INDEX entries_user_status_feed_idx ON entries(user_id, status, feed_id); @@ -519,7 +512,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ `) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` CREATE TABLE acme_cache ( key varchar(400) not null primary key, @@ -529,13 +522,13 @@ var migrations = []func(tx *sql.Tx, driver string) error{ `) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` ALTER TABLE feeds ADD COLUMN allow_self_signed_certificates boolean not null default false `) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` CREATE TYPE webapp_display_mode AS enum('fullscreen', 'standalone', 'minimal-ui', 'browser'); ALTER TABLE users ADD COLUMN display_mode webapp_display_mode default 'standalone'; @@ -543,24 +536,24 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE feeds ADD COLUMN cookie text default ''` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` ALTER TABLE categories ADD COLUMN hide_globally boolean not null default false `) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` ALTER TABLE feeds ADD COLUMN hide_globally boolean not null default false `) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN telegram_bot_enabled bool default 'f', @@ -570,7 +563,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` CREATE TYPE entry_sorting_order AS enum('published_at', 'created_at'); ALTER TABLE users ADD COLUMN entry_order entry_sorting_order default 'published_at'; @@ -578,7 +571,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN googlereader_enabled bool default 'f', @@ -588,7 +581,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN espial_enabled bool default 'f', @@ -599,7 +592,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN linkding_enabled bool default 'f', @@ -609,13 +602,13 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` ALTER TABLE feeds ADD COLUMN url_rewrite_rules text not null default '' `) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` ALTER TABLE users ADD COLUMN default_reading_speed int default 265, @@ -623,25 +616,25 @@ var migrations = []func(tx *sql.Tx, driver string) error{ `) return }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` ALTER TABLE users ADD COLUMN default_home_page text default 'unread'; `) return }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` ALTER TABLE integrations ADD COLUMN wallabag_only_url bool default 'f'; `) return }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` ALTER TABLE users ADD COLUMN categories_sorting_order text not null default 'unread_count'; `) return }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN matrix_bot_enabled bool default 'f', @@ -653,18 +646,18 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE users ADD COLUMN double_tap boolean default 't'` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` ALTER TABLE entries ADD COLUMN tags text[] default '{}'; `) return }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE users RENAME double_tap TO gesture_nav; ALTER TABLE users @@ -674,14 +667,14 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN linkding_tags text default ''; ` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE feeds ADD COLUMN no_media_player boolean default 'f'; ALTER TABLE enclosures ADD COLUMN media_progression int default 0; @@ -689,14 +682,14 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN linkding_mark_as_unread bool default 'f'; ` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { // Delete duplicated rows sql := ` DELETE FROM enclosures a USING enclosures b @@ -724,12 +717,12 @@ var migrations = []func(tx *sql.Tx, driver string) error{ return nil }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE users ADD COLUMN mark_read_on_view boolean default 't'` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN notion_enabled bool default 'f', @@ -739,7 +732,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN readwise_enabled bool default 'f', @@ -748,7 +741,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN apprise_enabled bool default 'f', @@ -758,7 +751,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN shiori_enabled bool default 'f', @@ -769,7 +762,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN shaarli_enabled bool default 'f', @@ -779,13 +772,13 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` ALTER TABLE feeds ADD COLUMN apprise_service_urls text default ''; `) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN webhook_enabled bool default 'f', @@ -795,7 +788,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN telegram_bot_topic_id int, @@ -805,14 +798,14 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN telegram_bot_disable_buttons bool default 'f'; ` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` -- Speed up has_enclosure CREATE INDEX enclosures_entry_id_idx ON enclosures(entry_id); @@ -828,7 +821,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN rssbridge_enabled bool default 'f', @@ -837,7 +830,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` CREATE TABLE webauthn_credentials ( handle bytea primary key, @@ -855,7 +848,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ `) return }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN omnivore_enabled bool default 'f', @@ -865,7 +858,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN linkace_enabled bool default 'f', @@ -878,7 +871,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN linkwarden_enabled bool default 'f', @@ -888,7 +881,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN readeck_enabled bool default 'f', @@ -900,29 +893,29 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE feeds ADD COLUMN disable_http2 bool default 'f'` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE users ADD COLUMN media_playback_rate numeric default 1;` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { // the WHERE part speed-up the request a lot sql := `UPDATE entries SET tags = array_remove(tags, '') WHERE '' = ANY(tags);` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { // Entry URLs can exceeds btree maximum size // Checking entry existence is now using entries_feed_id_status_hash_idx index _, err = tx.Exec(`DROP INDEX entries_feed_url_idx`) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN raindrop_enabled bool default 'f', @@ -933,12 +926,12 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE feeds ADD COLUMN description text default ''` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE users ADD COLUMN block_filter_entry_rules text not null default '', @@ -947,7 +940,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN betula_url text default '', @@ -957,7 +950,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN ntfy_enabled bool default 'f', @@ -975,22 +968,22 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE users ADD COLUMN mark_read_on_media_player_completion bool default 'f';` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE users ADD COLUMN custom_js text not null default '';` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE users ADD COLUMN external_font_hosts text not null default '';` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN cubox_enabled bool default 'f', @@ -999,7 +992,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN discord_enabled bool default 'f', @@ -1008,12 +1001,12 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := `ALTER TABLE integrations ADD COLUMN ntfy_internal_links bool default 'f';` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN slack_enabled bool default 'f', @@ -1022,11 +1015,11 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(`ALTER TABLE feeds ADD COLUMN webhook_url text default '';`) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN pushover_enabled bool default 'f', @@ -1042,14 +1035,14 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE feeds ADD COLUMN ntfy_topic text default ''; ` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE icons ADD COLUMN external_id text default ''; CREATE UNIQUE INDEX icons_external_id_idx ON icons USING btree(external_id) WHERE external_id <> ''; @@ -1058,7 +1051,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(` DECLARE id_cursor CURSOR FOR SELECT @@ -1094,22 +1087,22 @@ var migrations = []func(tx *sql.Tx, driver string) error{ return nil }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(`ALTER TABLE feeds ADD COLUMN proxy_url text default ''`) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN rssbridge_token text default ''; ` _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(`ALTER TABLE users ADD COLUMN always_open_external_links bool default 'f'`) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations ADD COLUMN karakeep_enabled bool default 'f', @@ -1119,11 +1112,11 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { _, err = tx.Exec(`ALTER TABLE users ADD COLUMN open_external_links_in_new_tab bool default 't'`) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE integrations DROP COLUMN pocket_enabled, @@ -1133,7 +1126,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{ _, err = tx.Exec(sql) return err }, - func(tx *sql.Tx, _ string) (err error) { + func(tx *sql.Tx) (err error) { sql := ` ALTER TABLE feeds ADD COLUMN block_filter_entry_rules text not null default '', diff --git a/internal/database/postgresql.go b/internal/database/postgresql.go index 2e579d79..df2ace59 100644 --- a/internal/database/postgresql.go +++ b/internal/database/postgresql.go @@ -1,5 +1,3 @@ -//go:build !sqlite - // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved. // SPDX-License-Identifier: Apache-2.0 @@ -25,7 +23,3 @@ func NewConnectionPool(dsn string, minConnections, maxConnections int, connectio return db, nil } - -func getDriverStr() string { - return "postgresql" -} diff --git a/internal/database/sqlite.go b/internal/database/sqlite.go deleted file mode 100644 index 51d90ef9..00000000 --- a/internal/database/sqlite.go +++ /dev/null @@ -1,26 +0,0 @@ -//go:build sqlite - -// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved. -// SPDX-License-Identifier: Apache-2.0 - -package database // import "miniflux.app/v2/internal/database" - -import ( - "database/sql" - "time" - - _ "github.com/mattn/go-sqlite3" -) - -// NewConnectionPool configures the database connection pool. -func NewConnectionPool(dsn string, _, _ int, _ time.Duration) (*sql.DB, error) { - db, err := sql.Open("sqlite3", dsn) - if err != nil { - return nil, err - } - return db, nil -} - -func getDriverStr() string { - return "sqlite3" -}