From 21bde13274bf49a96b58b1c780b6dc94ca8baa60 Mon Sep 17 00:00:00 2001 From: Yonas Habteab Date: Wed, 21 Jun 2023 17:24:32 +0200 Subject: [PATCH] Introduce database models required by migration hooks --- library/Icinga/Model/Schema.php | 49 ++++++++++++++++++++++++++++++++ phpstan.neon | 3 ++ schema/mysql-upgrades/2.12.0.sql | 11 +++++++ schema/mysql.schema.sql | 15 ++++++---- schema/pgsql-upgrades/2.12.0.sql | 13 +++++++++ schema/pgsql.schema.sql | 15 ++++++---- 6 files changed, 95 insertions(+), 11 deletions(-) create mode 100644 library/Icinga/Model/Schema.php create mode 100644 schema/mysql-upgrades/2.12.0.sql create mode 100644 schema/pgsql-upgrades/2.12.0.sql diff --git a/library/Icinga/Model/Schema.php b/library/Icinga/Model/Schema.php new file mode 100644 index 000000000..465cce084 --- /dev/null +++ b/library/Icinga/Model/Schema.php @@ -0,0 +1,49 @@ +add(new BoolCast(['success'])); + $behaviors->add(new MillisecondTimestamp(['timestamp'])); + } +} diff --git a/phpstan.neon b/phpstan.neon index 43cecf9c4..9da27bcff 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -49,6 +49,8 @@ parameters: count: 2 path: library/Icinga/Protocol/Ldap/LdapConnection.php + - '#Call to an undefined method ipl\\Sql\\Connection::exec\(\)#' + scanDirectories: - vendor @@ -56,6 +58,7 @@ parameters: - library/Icinga/Test universalObjectCratesClasses: + - ipl\Orm\Model - Icinga\Data\ConfigObject - Icinga\Web\View - Icinga\Module\Monitoring\Object\MonitoredObject diff --git a/schema/mysql-upgrades/2.12.0.sql b/schema/mysql-upgrades/2.12.0.sql new file mode 100644 index 000000000..9aace2856 --- /dev/null +++ b/schema/mysql-upgrades/2.12.0.sql @@ -0,0 +1,11 @@ +ALTER TABLE icingaweb_schema + MODIFY COLUMN timestamp bigint unsigned NOT NULL, + MODIFY COLUMN version varchar(64) NOT NULL, + ADD COLUMN IF NOT EXISTS success enum ('n', 'y') DEFAULT NULL, + ADD COLUMN IF NOT EXISTS reason text DEFAULT NULL, + DROP CONSTRAINT IF EXISTS idx_icingaweb_schema_version, + ADD CONSTRAINT idx_icingaweb_schema_version UNIQUE (version); + +INSERT INTO icingaweb_schema (version, timestamp, success, reason) + VALUES('2.12.0', UNIX_TIMESTAMP() * 1000, 'y', NULL) + ON DUPLICATE KEY UPDATE timestamp = VALUES(timestamp), success = VALUES(success), reason = VALUES(reason); diff --git a/schema/mysql.schema.sql b/schema/mysql.schema.sql index 160061887..bb37f9b28 100644 --- a/schema/mysql.schema.sql +++ b/schema/mysql.schema.sql @@ -54,12 +54,15 @@ CREATE TABLE `icingaweb_rememberme`( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC; CREATE TABLE icingaweb_schema ( - id int unsigned NOT NULL AUTO_INCREMENT, - version smallint unsigned NOT NULL, - timestamp int unsigned NOT NULL, + id int unsigned NOT NULL AUTO_INCREMENT, + version varchar(64) NOT NULL, + timestamp bigint NOT NULL, + success enum ('n', 'y') DEFAULT NULL, + reason text DEFAULT NULL, - PRIMARY KEY (id) + PRIMARY KEY (id), + CONSTRAINT idx_icingaweb_schema_version UNIQUE (version) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC; -INSERT INTO icingaweb_schema (version, timestamp) - VALUES (6, UNIX_TIMESTAMP()); +INSERT INTO icingaweb_schema (version, timestamp, success) + VALUES ('2.12.0', UNIX_TIMESTAMP() * 1000, 'y'); diff --git a/schema/pgsql-upgrades/2.12.0.sql b/schema/pgsql-upgrades/2.12.0.sql new file mode 100644 index 000000000..733d8f547 --- /dev/null +++ b/schema/pgsql-upgrades/2.12.0.sql @@ -0,0 +1,13 @@ +CREATE TYPE boolenum AS ENUM ('n', 'y'); + +ALTER TABLE icingaweb_schema + ALTER COLUMN timestamp TYPE bigint, + ALTER COLUMN version TYPE varchar(64), + ADD COLUMN success boolenum DEFAULT NULL, + ADD COLUMN reason text DEFAULT NULL, + DROP CONSTRAINT IF EXISTS idx_icingaweb_schema_version, + ADD CONSTRAINT idx_icingaweb_schema_version UNIQUE (version); + +INSERT INTO icingaweb_schema (version, timestamp, success, reason) + VALUES('2.12.0', EXTRACT(EPOCH FROM now()) * 1000, 'y', NULL) + ON CONFLICT ON CONSTRAINT idx_icingaweb_schema_version DO UPDATE SET timestamp = EXCLUDED.timestamp, success = EXCLUDED.success, reason = EXCLUDED.reason; diff --git a/schema/pgsql.schema.sql b/schema/pgsql.schema.sql index 8bf4ca07f..3a5413bbb 100644 --- a/schema/pgsql.schema.sql +++ b/schema/pgsql.schema.sql @@ -118,13 +118,18 @@ ALTER TABLE ONLY "icingaweb_rememberme" "id" ); +CREATE TYPE boolenum AS ENUM ('n', 'y'); + CREATE TABLE "icingaweb_schema" ( "id" serial, - "version" smallint NOT NULL, - "timestamp" int NOT NULL, + "version" varchar(64) NOT NULL, + "timestamp" bigint NOT NULL, + "success" boolenum DEFAULT NULL, + "reason" text DEFAULT NULL, - CONSTRAINT pk_icingaweb_schema PRIMARY KEY ("id") + CONSTRAINT pk_icingaweb_schema PRIMARY KEY ("id"), + CONSTRAINT idx_icingaweb_schema_version UNIQUE (version) ); -INSERT INTO icingaweb_schema (version, timestamp) - VALUES (6, extract(epoch from now())); +INSERT INTO icingaweb_schema (version, timestamp, success) + VALUES ('2.12.0', extract(epoch from now()) * 1000, 'y');