aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2025-10-24 12:49:29 +0200
committerGravatar GitHub <noreply@github.com> 2025-10-24 12:49:29 +0200
commit9833d8197686d9614fc5cbd300e0761a520e2e6d (patch)
treebc03ed08a242bb55146232b3babf827aa6348b16
parent90c69e04bb25ff237b4ca1add7bd87feac646b33 (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.php6
-rw-r--r--app/Models/CategoryDAOSQLite.php9
-rw-r--r--app/Models/FeedDAO.php2
-rw-r--r--app/Models/FeedDAOSQLite.php4
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);
}