diff options
| author | 2025-10-24 12:49:29 +0200 | |
|---|---|---|
| committer | 2025-10-24 12:49:29 +0200 | |
| commit | 9833d8197686d9614fc5cbd300e0761a520e2e6d (patch) | |
| tree | bc03ed08a242bb55146232b3babf827aa6348b16 | |
| parent | 90c69e04bb25ff237b4ca1add7bd87feac646b33 (diff) | |
Better SQL auto-update f.kind (#8148)
Add a little help to make sure that feed.kind gets added during the first call.
Tested that replacing the DB with a backup from Febuary 2020 just works, automatically adding new columns since FreshRSS 1.20.0.
| -rw-r--r-- | app/Models/CategoryDAO.php | 6 | ||||
| -rw-r--r-- | app/Models/CategoryDAOSQLite.php | 9 | ||||
| -rw-r--r-- | app/Models/FeedDAO.php | 2 | ||||
| -rw-r--r-- | app/Models/FeedDAOSQLite.php | 4 |
4 files changed, 18 insertions, 3 deletions
diff --git a/app/Models/CategoryDAO.php b/app/Models/CategoryDAO.php index 5520c39d6..e2fc825ac 100644 --- a/app/Models/CategoryDAO.php +++ b/app/Models/CategoryDAO.php @@ -94,6 +94,12 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo { if (isset($errorInfo[0])) { if ($errorInfo[0] === FreshRSS_DatabaseDAO::ER_BAD_FIELD_ERROR || $errorInfo[0] === FreshRSS_DatabaseDAOPGSQL::UNDEFINED_COLUMN) { $errorLines = explode("\n", $errorInfo[2], 2); // The relevant column name is on the first line, other lines are noise + if (str_contains($errorLines[0], 'f.')) { // Coming from a feed sub-query + $feedDao = FreshRSS_Factory::createFeedDao(); + if ($feedDao->autoUpdateDb($errorInfo)) { + return true; + } + } foreach (['kind', 'lastUpdate', 'error', 'attributes'] as $column) { if (str_contains($errorLines[0], $column)) { return $this->addColumn($column); diff --git a/app/Models/CategoryDAOSQLite.php b/app/Models/CategoryDAOSQLite.php index ee59d0754..575656e67 100644 --- a/app/Models/CategoryDAOSQLite.php +++ b/app/Models/CategoryDAOSQLite.php @@ -11,6 +11,15 @@ class FreshRSS_CategoryDAOSQLite extends FreshRSS_CategoryDAO { /** @param array{0:string,1:int,2:string} $errorInfo */ #[\Override] protected function autoUpdateDb(array $errorInfo): bool { + if (isset($errorInfo[0])) { + $errorLines = explode("\n", $errorInfo[2], 2); // The relevant column name is on the first line, other lines are noise + if (str_contains($errorLines[0], 'f.')) { // Coming from a feed sub-query + $feedDao = FreshRSS_Factory::createFeedDao(); + if ($feedDao->autoUpdateDb($errorInfo)) { + return true; + } + } + } if (($tableInfo = $this->pdo->query("PRAGMA table_info('category')")) !== false) { $columns = $tableInfo->fetchAll(PDO::FETCH_COLUMN, 1); foreach (['kind', 'lastUpdate', 'error', 'attributes'] as $column) { diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php index 65d834936..346aa1924 100644 --- a/app/Models/FeedDAO.php +++ b/app/Models/FeedDAO.php @@ -23,7 +23,7 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo { } /** @param array{0:string,1:int,2:string} $errorInfo */ - protected function autoUpdateDb(array $errorInfo): bool { + public function autoUpdateDb(array $errorInfo): bool { if (isset($errorInfo[0])) { if ($errorInfo[0] === FreshRSS_DatabaseDAO::ER_BAD_FIELD_ERROR || $errorInfo[0] === FreshRSS_DatabaseDAOPGSQL::UNDEFINED_COLUMN) { $errorLines = explode("\n", $errorInfo[2], 2); // The relevant column name is on the first line, other lines are noise diff --git a/app/Models/FeedDAOSQLite.php b/app/Models/FeedDAOSQLite.php index a12fb2adb..18befed54 100644 --- a/app/Models/FeedDAOSQLite.php +++ b/app/Models/FeedDAOSQLite.php @@ -10,10 +10,10 @@ class FreshRSS_FeedDAOSQLite extends FreshRSS_FeedDAO { /** @param array{0:string,1:int,2:string} $errorInfo */ #[\Override] - protected function autoUpdateDb(array $errorInfo): bool { + public function autoUpdateDb(array $errorInfo): bool { if (($tableInfo = $this->pdo->query("PRAGMA table_info('feed')")) !== false) { $columns = $tableInfo->fetchAll(PDO::FETCH_COLUMN, 1); - foreach (['attributes', 'kind'] as $column) { + foreach (['kind'] as $column) { if (!in_array($column, $columns, true)) { return $this->addColumn($column); } |
