fix: migrator: more accurate check for hectic.migrator isntalled

This commit is contained in:
2026-02-17 16:47:05 +00:00
parent ff87e8c411
commit 26bdecb8e0

View File

@@ -217,7 +217,7 @@ BEGIN;
DO \$\$ DO \$\$
DECLARE DECLARE
version TEXT; ver TEXT;
BEGIN BEGIN
CREATE SCHEMA IF NOT EXISTS hectic; CREATE SCHEMA IF NOT EXISTS hectic;
@@ -230,28 +230,43 @@ BEGIN
AND n.nspname = 'hectic' AND n.nspname = 'hectic'
AND c.relkind = 'r' AND c.relkind = 'r'
) THEN ) THEN
SELECT hectic.version.version FROM hectic.version WHERE name = 'migrator' INTO version; SELECT v.version INTO ver FROM hectic.version v WHERE v.name = 'migrator';
IF version != '$VERSION' THEN IF ver IS NOT NULL AND ver != '$VERSION' THEN
RAISE EXCEPTION 'Incompatible migrator versions: % and $VERSION', version; RAISE EXCEPTION 'Incompatible migrator versions: % and $VERSION', ver;
END IF; END IF;
ELSE ELSE
CREATE DOMAIN hectic.migration_name AS TEXT CHECK (VALUE ~ '^[0-9]{14}-.*');
CREATE DOMAIN hectic.sha256 AS CHAR(64) CHECK (VALUE ~ '^[0-9a-f]{64}\$');
CREATE FUNCTION hectic.sha256_lower() RETURNS trigger AS \$fn\$
BEGIN
NEW.hash = lower(NEW.hash);
RETURN NEW;
END;
\$fn\$ LANGUAGE plpgsql;
CREATE TABLE hectic.version ( CREATE TABLE hectic.version (
name TEXT PRIMARY KEY, name TEXT PRIMARY KEY,
version TEXT NOT NULL, version TEXT NOT NULL,
installed_at TIMESTAMPTZ NOT NULL DEFAULT NOW() installed_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
)$inherits; )$inherits;
END IF;
-- NOTE(yukkop): check migrator is registered in version table
IF NOT EXISTS (
SELECT 1 FROM hectic.version WHERE name = 'migrator'
) THEN
INSERT INTO hectic.version (name, version) VALUES ('migrator', '$VERSION'); INSERT INTO hectic.version (name, version) VALUES ('migrator', '$VERSION');
END IF;
-- NOTE(yukkop): create migrator-specific objects if not yet present
IF NOT EXISTS (
SELECT 1
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname = 'migration'
AND n.nspname = 'hectic'
AND c.relkind = 'r'
) THEN
CREATE DOMAIN hectic.migration_name AS TEXT CHECK (VALUE ~ '^[0-9]{14}-.*');
CREATE DOMAIN hectic.sha256 AS CHAR(64) CHECK (VALUE ~ '^[0-9a-f]{64}\$');
CREATE OR REPLACE FUNCTION hectic.sha256_lower() RETURNS trigger AS \$fn\$
BEGIN
NEW.hash = lower(NEW.hash);
RETURN NEW;
END;
\$fn\$ LANGUAGE plpgsql;
CREATE TABLE hectic.migration ( CREATE TABLE hectic.migration (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,