X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FUpdate.php;h=2718d03d0c3318d69e33e0fd84b28e2ac325cf09;hb=5ae03319936f70d12eaf4a09dfcda020de429380;hp=5f425172099a55cf132e8648f899ef4e349592c6;hpb=9bac8153aef970c76d1720e4fda629ef95e02b68;p=friendica.git diff --git a/src/Core/Update.php b/src/Core/Update.php index 5f42517209..2718d03d0c 100644 --- a/src/Core/Update.php +++ b/src/Core/Update.php @@ -1,6 +1,6 @@ get('system', 'update', Update::SUCCESS, true) == Update::FAILED) { + if (DI::config()->get('system', 'update', Update::SUCCESS) == Update::FAILED) { return; } $build = DI::config()->get('system', 'build'); if (empty($build)) { - DI::config()->set('system', 'build', DB_UPDATE_VERSION - 1); - $build = DB_UPDATE_VERSION - 1; + // legacy option - check if there's something in the Config table + if (DBStructure::existsTable('config')) { + $dbConfig = DBA::selectFirst('config', ['v'], ['cat' => 'system', 'k' => 'build']); + if (!empty($dbConfig)) { + $build = $dbConfig['v']; + } + } + + if (empty($build)) { + DI::config()->set('system', 'build', DB_UPDATE_VERSION - 1); + $build = DB_UPDATE_VERSION - 1; + } } // We don't support upgrading from very old versions anymore @@ -75,7 +86,7 @@ class Update } // The postupdate has to completed version 1288 for the new post views to take over - $postupdate = DI::config()->get('system', 'post_update_version', self::NEW_TABLE_STRUCTURE_VERSION); + $postupdate = DI::keyValue()->get('post_update_version') ?? self::NEW_TABLE_STRUCTURE_VERSION; if ($postupdate < self::NEW_TABLE_STRUCTURE_VERSION) { $error = DI::l10n()->t('Updates from postupdate version %s are not supported. Please update at least to version 2021.01 and wait until the postupdate finished version 1383.', $postupdate); if (DI::mode()->getExecutor() == Mode::INDEX) { @@ -118,11 +129,18 @@ class Update DI::lock()->release('dbupdate', true); } - $build = DI::config()->get('system', 'build', null, true); + $build = DI::config()->get('system', 'build'); + + if (empty($build)) { + $dbConfig = DBA::selectFirst('config', ['v'], ['cat' => 'system', 'k' => 'build']); + if (!empty($dbConfig)) { + $build = $dbConfig['v']; + } - if (empty($build) || ($build > DB_UPDATE_VERSION)) { - $build = DB_UPDATE_VERSION - 1; - DI::config()->set('system', 'build', $build); + if (empty($build) || ($build > DB_UPDATE_VERSION)) { + DI::config()->set('system', 'build', DB_UPDATE_VERSION - 1); + $build = DB_UPDATE_VERSION - 1; + } } if ($build != DB_UPDATE_VERSION || $force) { @@ -131,7 +149,7 @@ class Update $stored = intval($build); $current = intval(DB_UPDATE_VERSION); if ($stored < $current || $force) { - DI::config()->load('database'); + DI::config()->reload(); // Compare the current structure with the defined structure // If the Lock is acquired, never release it automatically to avoid double updates @@ -140,15 +158,25 @@ class Update Logger::notice('Update starting.', ['from' => $stored, 'to' => $current]); // Checks if the build changed during Lock acquiring (so no double update occurs) - $retryBuild = DI::config()->get('system', 'build', null, true); - if ($retryBuild !== $build) { - Logger::notice('Update already done.', ['from' => $stored, 'to' => $current]); - DI::lock()->release('dbupdate'); - return ''; + $retryBuild = DI::config()->get('system', 'build'); + if ($retryBuild != $build) { + // legacy option - check if there's something in the Config table + if (DBStructure::existsTable('config')) { + $dbConfig = DBA::selectFirst('config', ['v'], ['cat' => 'system', 'k' => 'build']); + if (!empty($dbConfig)) { + $retryBuild = intval($dbConfig['v']); + } + } + + if ($retryBuild != $build) { + Logger::notice('Update already done.', ['from' => $build, 'retry' => $retryBuild, 'to' => $current]); + DI::lock()->release('dbupdate'); + return ''; + } } DI::config()->set('system', 'maintenance', 1); - + // run the pre_update_nnnn functions in update.php for ($version = $stored + 1; $version <= $current; $version++) { Logger::notice('Execute pre update.', ['version' => $version]); @@ -159,8 +187,10 @@ class Update Logger::warning('Pre update failed', ['version' => $version]); DI::config()->set('system', 'update', Update::FAILED); DI::lock()->release('dbupdate'); - DI::config()->set('system', 'maintenance', 0); - DI::config()->set('system', 'maintenance_reason', ''); + DI::config()->beginTransaction() + ->set('system', 'maintenance', false) + ->delete('system', 'maintenance_reason') + ->commit(); return $r; } else { Logger::notice('Pre update executed.', ['version' => $version]); @@ -180,8 +210,10 @@ class Update Logger::error('Update ERROR.', ['from' => $stored, 'to' => $current, 'retval' => $retval]); DI::config()->set('system', 'update', Update::FAILED); DI::lock()->release('dbupdate'); - DI::config()->set('system', 'maintenance', 0); - DI::config()->set('system', 'maintenance_reason', ''); + DI::config()->beginTransaction() + ->set('system', 'maintenance', false) + ->delete('system', 'maintenance_reason') + ->commit(); return $retval; } else { Logger::notice('Database structure update finished.', ['from' => $stored, 'to' => $current]); @@ -197,8 +229,10 @@ class Update Logger::warning('Post update failed', ['version' => $version]); DI::config()->set('system', 'update', Update::FAILED); DI::lock()->release('dbupdate'); - DI::config()->set('system', 'maintenance', 0); - DI::config()->set('system', 'maintenance_reason', ''); + DI::config()->beginTransaction() + ->set('system', 'maintenance', false) + ->delete('system', 'maintenance_reason') + ->commit(); return $r; } else { DI::config()->set('system', 'build', $version); @@ -209,8 +243,10 @@ class Update DI::config()->set('system', 'build', $current); DI::config()->set('system', 'update', Update::SUCCESS); DI::lock()->release('dbupdate'); - DI::config()->set('system', 'maintenance', 0); - DI::config()->set('system', 'maintenance_reason', ''); + DI::config()->beginTransaction() + ->set('system', 'maintenance', false) + ->delete('system', 'maintenance_reason') + ->commit(); Logger::notice('Update success.', ['from' => $stored, 'to' => $current]); if ($sendMail) { @@ -289,30 +325,16 @@ class Update * @return void * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - private static function updateFailed(int $update_id, string $error_message) { - //send the administrators an e-mail - $condition = ['email' => explode(',', str_replace(' ', '', DI::config()->get('config', 'admin_email'))), 'parent-uid' => 0]; - $adminlist = DBA::select('user', ['uid', 'language', 'email'], $condition, ['order' => ['uid']]); - - // No valid result? - if (!DBA::isResult($adminlist)) { + private static function updateFailed(int $update_id, string $error_message) + { + $adminEmails = User::getAdminListForEmailing(['uid', 'language', 'email']); + if (!$adminEmails) { Logger::warning('Cannot notify administrators .', ['update' => $update_id, 'message' => $error_message]); - - // Don't continue return; } - $sent = []; - - // every admin could had different language - while ($admin = DBA::fetch($adminlist)) { - if (in_array($admin['email'], $sent)) { - continue; - } - $sent[] = $admin['email']; - - $lang = $admin['language'] ?? 'en'; - $l10n = DI::l10n()->withLang($lang); + foreach($adminEmails as $admin) { + $l10n = DI::l10n()->withLang($admin['language'] ?: 'en'); $preamble = Strings::deindent($l10n->t(" The friendica developers released update %s recently, @@ -343,35 +365,20 @@ class Update */ private static function updateSuccessful(int $from_build, int $to_build) { - //send the administrators an e-mail - $condition = ['email' => explode(',', str_replace(' ', '', DI::config()->get('config', 'admin_email'))), 'parent-uid' => 0]; - $adminlist = DBA::select('user', ['uid', 'language', 'email'], $condition, ['order' => ['uid']]); + foreach(User::getAdminListForEmailing(['uid', 'language', 'email']) as $admin) { + $l10n = DI::l10n()->withLang($admin['language'] ?: 'en'); - if (DBA::isResult($adminlist)) { - $sent = []; + $preamble = Strings::deindent($l10n->t(' + The friendica database was successfully updated from %s to %s.', + $from_build, $to_build)); - // every admin could had different language - while ($admin = DBA::fetch($adminlist)) { - if (in_array($admin['email'], $sent)) { - continue; - } - $sent[] = $admin['email']; - - $lang = (($admin['language']) ? $admin['language'] : 'en'); - $l10n = DI::l10n()->withLang($lang); - - $preamble = Strings::deindent($l10n->t(' - The friendica database was successfully updated from %s to %s.', - $from_build, $to_build)); - - $email = DI::emailer() - ->newSystemMail() - ->withMessage($l10n->t('[Friendica Notify] Database update'), $preamble) - ->forUser($admin) - ->withRecipient($admin['email']) - ->build(); - DI::emailer()->send($email); - } + $email = DI::emailer() + ->newSystemMail() + ->withMessage($l10n->t('[Friendica Notify] Database update'), $preamble) + ->forUser($admin) + ->withRecipient($admin['email']) + ->build(); + DI::emailer()->send($email); } Logger::debug('Database structure update successful.');