Merge pull request #9884 from annando/update-in-maintenance
Setting "maintenance" for pre and post updates
This commit is contained in:
commit
acaf2f768e
|
@ -106,7 +106,7 @@ HELP;
|
|||
|
||||
switch ($this->getArgument(0)) {
|
||||
case "dryrun":
|
||||
$output = DBStructure::update($basePath, true, false);
|
||||
$output = DBStructure::dryRun();
|
||||
break;
|
||||
case "update":
|
||||
$force = $this->getOption(['f', 'force'], false);
|
||||
|
|
|
@ -192,7 +192,7 @@ class Installer
|
|||
*/
|
||||
public function installDatabase($basePath)
|
||||
{
|
||||
$result = DBStructure::update($basePath, false, true, true);
|
||||
$result = DBStructure::install($basePath);
|
||||
|
||||
if ($result) {
|
||||
$txt = DI::l10n()->t('You may need to import the file "database.sql" manually using phpmyadmin or mysql.') . EOL;
|
||||
|
|
|
@ -27,6 +27,7 @@ use Friendica\Database\DBA;
|
|||
use Friendica\Database\DBStructure;
|
||||
use Friendica\DI;
|
||||
use Friendica\Network\HTTPException\InternalServerErrorException;
|
||||
use Friendica\Util\DateTimeFormat;
|
||||
use Friendica\Util\Strings;
|
||||
|
||||
class Update
|
||||
|
@ -143,14 +144,20 @@ class Update
|
|||
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]);
|
||||
DI::config()->set('system', 'maintenance_reason', DI::l10n()->t('%s: executing pre update %d',
|
||||
DateTimeFormat::utcNow() . ' ' . date('e'), $version));
|
||||
$r = self::runUpdateFunction($version, 'pre_update', $sendMail);
|
||||
if (!$r) {
|
||||
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', '');
|
||||
return $r;
|
||||
} else {
|
||||
Logger::notice('Pre update executed.', ['version' => $version]);
|
||||
|
@ -159,7 +166,7 @@ class Update
|
|||
|
||||
// update the structure in one call
|
||||
Logger::notice('Execute structure update');
|
||||
$retval = DBStructure::update($basePath, $verbose, true);
|
||||
$retval = DBStructure::performUpdate(false, $verbose);
|
||||
if (!empty($retval)) {
|
||||
if ($sendMail) {
|
||||
self::updateFailed(
|
||||
|
@ -170,6 +177,8 @@ 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', '');
|
||||
return $retval;
|
||||
} else {
|
||||
Logger::notice('Database structure update finished.', ['from' => $stored, 'to' => $current]);
|
||||
|
@ -178,11 +187,15 @@ class Update
|
|||
// run the update_nnnn functions in update.php
|
||||
for ($version = $stored + 1; $version <= $current; $version++) {
|
||||
Logger::notice('Execute post update.', ['version' => $version]);
|
||||
DI::config()->set('system', 'maintenance_reason', DI::l10n()->t('%s: executing post update %d',
|
||||
DateTimeFormat::utcNow() . ' ' . date('e'), $version));
|
||||
$r = self::runUpdateFunction($version, 'update', $sendMail);
|
||||
if (!$r) {
|
||||
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', '');
|
||||
return $r;
|
||||
} else {
|
||||
DI::config()->set('system', 'build', $version);
|
||||
|
@ -193,6 +206,8 @@ 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', '');
|
||||
|
||||
Logger::notice('Update success.', ['from' => $stored, 'to' => $current]);
|
||||
if ($sendMail) {
|
||||
|
|
|
@ -361,6 +361,54 @@ class DBStructure
|
|||
return ($sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform a database structure dryrun (means: just simulating)
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function dryRun()
|
||||
{
|
||||
self::update(DI::app()->getBasePath(), true, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates DB structure and returns eventual errors messages
|
||||
*
|
||||
* @param bool $enable_maintenance_mode Set the maintenance mode
|
||||
* @param bool $verbose Display the SQL commands
|
||||
*
|
||||
* @return string Empty string if the update is successful, error messages otherwise
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function performUpdate(bool $enable_maintenance_mode = true, bool $verbose = false)
|
||||
{
|
||||
if ($enable_maintenance_mode) {
|
||||
DI::config()->set('system', 'maintenance', 1);
|
||||
}
|
||||
|
||||
$status = self::update(DI::app()->getBasePath(), $verbose, true);
|
||||
|
||||
if ($enable_maintenance_mode) {
|
||||
DI::config()->set('system', 'maintenance', 0);
|
||||
DI::config()->set('system', 'maintenance_reason', '');
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates DB structure from the installation and returns eventual errors messages
|
||||
*
|
||||
* @param string $basePath The base path of this application
|
||||
*
|
||||
* @return string Empty string if the update is successful, error messages otherwise
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function install(string $basePath)
|
||||
{
|
||||
return self::update($basePath, false, true, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates DB structure and returns eventual errors messages
|
||||
*
|
||||
|
@ -373,14 +421,15 @@ class DBStructure
|
|||
* @return string Empty string if the update is successful, error messages otherwise
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function update($basePath, $verbose, $action, $install = false, array $tables = null, array $definition = null)
|
||||
private static function update($basePath, $verbose, $action, $install = false, array $tables = null, array $definition = null)
|
||||
{
|
||||
if ($action && !$install) {
|
||||
if (self::isUpdating()) {
|
||||
$in_maintenance_mode = DI::config()->get('system', 'maintenance');
|
||||
|
||||
if ($action && !$install && self::isUpdating()) {
|
||||
return DI::l10n()->t('Another database update is currently running.');
|
||||
}
|
||||
|
||||
DI::config()->set('system', 'maintenance', 1);
|
||||
if ($in_maintenance_mode) {
|
||||
DI::config()->set('system', 'maintenance_reason', DI::l10n()->t('%s: Database update', DateTimeFormat::utcNow() . ' ' . date('e')));
|
||||
}
|
||||
|
||||
|
@ -680,7 +729,7 @@ class DBStructure
|
|||
}
|
||||
|
||||
if ($action) {
|
||||
if (!$install) {
|
||||
if ($in_maintenance_mode) {
|
||||
DI::config()->set('system', 'maintenance_reason', DI::l10n()->t('%s: updating %s table.', DateTimeFormat::utcNow() . ' ' . date('e'), $name));
|
||||
}
|
||||
|
||||
|
@ -737,9 +786,6 @@ class DBStructure
|
|||
self::checkInitialValues();
|
||||
|
||||
if ($action && !$install) {
|
||||
DI::config()->set('system', 'maintenance', 0);
|
||||
DI::config()->set('system', 'maintenance_reason', '');
|
||||
|
||||
if ($errors) {
|
||||
DI::config()->set('system', 'dbupdate', self::UPDATE_FAILED);
|
||||
} else {
|
||||
|
|
|
@ -54,7 +54,7 @@ class DBSync extends BaseAdmin
|
|||
break;
|
||||
case 'check':
|
||||
// @TODO Seems like a similar logic like Update::check()
|
||||
$retval = DBStructure::update($a->getBasePath(), false, true);
|
||||
$retval = DBStructure::performUpdate();
|
||||
if ($retval === '') {
|
||||
$o = DI::l10n()->t("Database structure update %s was successfully applied.", DB_UPDATE_VERSION) . "<br />";
|
||||
} else {
|
||||
|
|
|
@ -82,7 +82,7 @@ class Summary extends BaseAdmin
|
|||
}
|
||||
|
||||
if (DI::config()->get('system', 'dbupdate', DBStructure::UPDATE_NOT_CHECKED) == DBStructure::UPDATE_NOT_CHECKED) {
|
||||
DBStructure::update($a->getBasePath(), false, true);
|
||||
DBStructure::performUpdate();
|
||||
}
|
||||
|
||||
if (DI::config()->get('system', 'dbupdate') == DBStructure::UPDATE_FAILED) {
|
||||
|
|
Loading…
Reference in a new issue