diff options
| -rw-r--r-- | CHANGELOG.md | 3 | ||||
| -rw-r--r-- | app/Models/DatabaseDAO.php | 15 | ||||
| -rw-r--r-- | app/Models/EntryDAO.php | 2 | ||||
| -rw-r--r-- | app/SQL/install.sql.mysql.php | 21 | ||||
| -rw-r--r-- | app/SQL/install.sql.pgsql.php | 21 | ||||
| -rw-r--r-- | app/SQL/install.sql.sqlite.php | 10 |
6 files changed, 53 insertions, 19 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 94663ef1d..7c30f6f16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,8 @@ * Compatibility * Require PHP 7.4+, and implement *typed properties* [#5720](https://github.com/FreshRSS/FreshRSS/pull/5720) * Features - * Increase SQL (`VARCHAR`) text fields to maximum possible [#5756](https://github.com/FreshRSS/FreshRSS/pull/5756) + * Increase SQL (`VARCHAR`) text fields length to maximum possible [#5756](https://github.com/FreshRSS/FreshRSS/pull/5756) + * Increase SQL date fields to 64-bit to be ready for year 2038+ [#5570](https://github.com/FreshRSS/FreshRSS/pull/5570) * Misc. * Code improvements [#5511](https://github.com/FreshRSS/FreshRSS/pull/5511) diff --git a/app/Models/DatabaseDAO.php b/app/Models/DatabaseDAO.php index f9d2859e8..45fc1967c 100644 --- a/app/Models/DatabaseDAO.php +++ b/app/Models/DatabaseDAO.php @@ -20,7 +20,7 @@ class FreshRSS_DatabaseDAO extends Minz_ModelPdo { public const LENGTH_INDEX_UNICODE = 191; public function create(): string { - require(APP_PATH . '/SQL/install.sql.' . $this->pdo->dbType() . '.php'); + require_once(APP_PATH . '/SQL/install.sql.' . $this->pdo->dbType() . '.php'); $db = FreshRSS_Context::$system_conf->db; try { @@ -214,9 +214,22 @@ SQL; return $ok; } + private function ensureYear2038Compatible(): bool { + if ($this->pdo->dbType() !== 'sqlite') { + include_once(APP_PATH . '/SQL/install.sql.' . $this->pdo->dbType() . '.php'); + if ($this->pdo->exec($GLOBALS['SQL_UPDATE_YEAR_2038']) === false) { //FreshRSS 1.23 + Minz_Log::error('SQL error ' . __METHOD__ . json_encode($this->pdo->errorInfo())); + return false; + } + } + return true; + } + public function minorDbMaintenance(): void { $catDAO = FreshRSS_Factory::createCategoryDao(); $catDAO->resetDefaultCategoryName(); + + $this->ensureYear2038Compatible(); } private static function stdError(string $error): bool { diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php index f7e9ffddc..741886520 100644 --- a/app/Models/EntryDAO.php +++ b/app/Models/EntryDAO.php @@ -123,7 +123,6 @@ SQL; $valuesTmp['link'] = substr($valuesTmp['link'], 0, 32768); $valuesTmp['link'] = safe_ascii($valuesTmp['link']); $this->addEntryPrepared->bindParam(':link', $valuesTmp['link']); - $valuesTmp['date'] = min($valuesTmp['date'], 2147483647); $this->addEntryPrepared->bindParam(':date', $valuesTmp['date'], PDO::PARAM_INT); if (empty($valuesTmp['lastSeen'])) { $valuesTmp['lastSeen'] = time(); @@ -229,7 +228,6 @@ SQL; $valuesTmp['link'] = substr($valuesTmp['link'], 0, 32768); $valuesTmp['link'] = safe_ascii($valuesTmp['link']); $this->updateEntryPrepared->bindParam(':link', $valuesTmp['link']); - $valuesTmp['date'] = min($valuesTmp['date'], 2147483647); $this->updateEntryPrepared->bindParam(':date', $valuesTmp['date'], PDO::PARAM_INT); $this->updateEntryPrepared->bindParam(':last_seen', $valuesTmp['lastSeen'], PDO::PARAM_INT); if ($valuesTmp['is_read'] === null) { diff --git a/app/SQL/install.sql.mysql.php b/app/SQL/install.sql.mysql.php index cb12fa179..b79450943 100644 --- a/app/SQL/install.sql.mysql.php +++ b/app/SQL/install.sql.mysql.php @@ -24,7 +24,7 @@ CREATE TABLE IF NOT EXISTS `_feed` ( `name` VARCHAR(191) NOT NULL, `website` TEXT CHARACTER SET latin1 COLLATE latin1_bin, `description` TEXT, - `lastUpdate` INT(11) DEFAULT 0, -- Until year 2038 + `lastUpdate` BIGINT DEFAULT 0, `priority` TINYINT(2) NOT NULL DEFAULT 10, `pathEntries` VARCHAR(65535) DEFAULT NULL, `httpAuth` VARCHAR(1024) DEFAULT NULL, @@ -47,8 +47,8 @@ CREATE TABLE IF NOT EXISTS `_entry` ( `author` VARCHAR(65535), `content_bin` MEDIUMBLOB, -- v0.7 `link` VARCHAR(32768) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, - `date` INT(11), -- Until year 2038 - `lastSeen` INT(11) DEFAULT 0, -- v1.1.1, Until year 2038 + `date` BIGINT, + `lastSeen` BIGINT DEFAULT 0, `hash` BINARY(16), -- v1.1.1 `is_read` BOOLEAN NOT NULL DEFAULT 0, `is_favorite` BOOLEAN NOT NULL DEFAULT 0, @@ -74,8 +74,8 @@ CREATE TABLE IF NOT EXISTS `_entrytmp` ( -- v1.7 `author` VARCHAR(65535), `content_bin` MEDIUMBLOB, `link` VARCHAR(32768) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, - `date` INT(11), - `lastSeen` INT(11) DEFAULT 0, + `date` BIGINT, + `lastSeen` BIGINT DEFAULT 0, `hash` BINARY(16), `is_read` BOOLEAN NOT NULL DEFAULT 0, `is_favorite` BOOLEAN NOT NULL DEFAULT 0, @@ -112,3 +112,14 @@ SQL; $GLOBALS['SQL_DROP_TABLES'] = <<<'SQL' DROP TABLE IF EXISTS `_entrytag`, `_tag`, `_entrytmp`, `_entry`, `_feed`, `_category`; SQL; + +$GLOBALS['SQL_UPDATE_YEAR_2038'] = <<<'SQL' +ALTER TABLE `_entry` -- v1.23 + MODIFY COLUMN `date` BIGINT, + MODIFY COLUMN `lastSeen` BIGINT DEFAULT 0; +ALTER TABLE `_entrytmp` + MODIFY COLUMN `date` BIGINT, + MODIFY COLUMN `lastSeen` BIGINT DEFAULT 0; +ALTER TABLE `_feed` + MODIFY COLUMN `lastUpdate` BIGINT DEFAULT 0; +SQL; diff --git a/app/SQL/install.sql.pgsql.php b/app/SQL/install.sql.pgsql.php index 4f7f1cf89..e08d0e1ef 100644 --- a/app/SQL/install.sql.pgsql.php +++ b/app/SQL/install.sql.pgsql.php @@ -21,7 +21,7 @@ CREATE TABLE IF NOT EXISTS `_feed` ( "name" VARCHAR(191) NOT NULL, "website" VARCHAR(32768), "description" TEXT, - "lastUpdate" INT DEFAULT 0, + "lastUpdate" BIGINT DEFAULT 0, "priority" SMALLINT NOT NULL DEFAULT 10, "pathEntries" VARCHAR(65535) DEFAULT NULL, "httpAuth" VARCHAR(1024) DEFAULT NULL, @@ -42,8 +42,8 @@ CREATE TABLE IF NOT EXISTS `_entry` ( "author" VARCHAR(65535), "content" TEXT, "link" VARCHAR(32768) NOT NULL, - "date" INT, - "lastSeen" INT DEFAULT 0, + "date" BIGINT, + "lastSeen" BIGINT DEFAULT 0, "hash" BYTEA, "is_read" SMALLINT NOT NULL DEFAULT 0, "is_favorite" SMALLINT NOT NULL DEFAULT 0, @@ -70,8 +70,8 @@ CREATE TABLE IF NOT EXISTS `_entrytmp` ( -- v1.7 "author" VARCHAR(65535), "content" TEXT, "link" VARCHAR(32768) NOT NULL, - "date" INT, - "lastSeen" INT DEFAULT 0, + "date" BIGINT, + "lastSeen" BIGINT DEFAULT 0, "hash" BYTEA, "is_read" SMALLINT NOT NULL DEFAULT 0, "is_favorite" SMALLINT NOT NULL DEFAULT 0, @@ -101,3 +101,14 @@ SQL; $GLOBALS['SQL_DROP_TABLES'] = <<<'SQL' DROP TABLE IF EXISTS `_entrytag`, `_tag`, `_entrytmp`, `_entry`, `_feed`, `_category`; SQL; + +$GLOBALS['SQL_UPDATE_YEAR_2038'] = <<<'SQL' +ALTER TABLE `_entry` -- v1.23 + ALTER COLUMN "date" SET DATA TYPE BIGINT, + ALTER COLUMN "lastSeen" SET DATA TYPE BIGINT; +ALTER TABLE `_entrytmp` + ALTER COLUMN "date" SET DATA TYPE BIGINT, + ALTER COLUMN "lastSeen" SET DATA TYPE BIGINT; +ALTER TABLE `_feed` + ALTER COLUMN "lastUpdate" SET DATA TYPE BIGINT; +SQL; diff --git a/app/SQL/install.sql.sqlite.php b/app/SQL/install.sql.sqlite.php index 1369bad25..2796b63e9 100644 --- a/app/SQL/install.sql.sqlite.php +++ b/app/SQL/install.sql.sqlite.php @@ -22,7 +22,7 @@ CREATE TABLE IF NOT EXISTS `feed` ( `name` VARCHAR(191) NOT NULL, `website` VARCHAR(32768), `description` TEXT, - `lastUpdate` INT(11) DEFAULT 0, -- Until year 2038 + `lastUpdate` BIGINT DEFAULT 0, `priority` TINYINT(2) NOT NULL DEFAULT 10, `pathEntries` VARCHAR(65535) DEFAULT NULL, `httpAuth` VARCHAR(1024) DEFAULT NULL, @@ -43,8 +43,8 @@ CREATE TABLE IF NOT EXISTS `entry` ( `author` VARCHAR(65535), `content` TEXT, `link` VARCHAR(32768) NOT NULL, - `date` INT(11), -- Until year 2038 - `lastSeen` INT(11) DEFAULT 0, -- v1.1.1, Until year 2038 + `date` BIGINT, + `lastSeen` BIGINT DEFAULT 0, `hash` BINARY(16), -- v1.1.1 `is_read` BOOLEAN NOT NULL DEFAULT 0, `is_favorite` BOOLEAN NOT NULL DEFAULT 0, @@ -69,8 +69,8 @@ CREATE TABLE IF NOT EXISTS `entrytmp` ( -- v1.7 `author` VARCHAR(65535), `content` TEXT, `link` VARCHAR(32768) NOT NULL, - `date` INT(11), - `lastSeen` INT(11) DEFAULT 0, + `date` BIGINT, + `lastSeen` BIGINT DEFAULT 0, `hash` BINARY(16), `is_read` BOOLEAN NOT NULL DEFAULT 0, `is_favorite` BOOLEAN NOT NULL DEFAULT 0, |
