aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md3
-rw-r--r--app/Models/DatabaseDAO.php15
-rw-r--r--app/Models/EntryDAO.php2
-rw-r--r--app/SQL/install.sql.mysql.php21
-rw-r--r--app/SQL/install.sql.pgsql.php21
-rw-r--r--app/SQL/install.sql.sqlite.php10
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,