config_name = 'db_version'; $this->func_prefix = '_'; $build = get_config('system', 'db_version', 0); if (!intval($build)) { $build = set_config('system', 'db_version', $db_revision); } if ($build == $db_revision) { // Nothing to be done. return; } else { $stored = intval($build); if (!$stored) { logger('Critical: check_config unable to determine database schema version'); return; } $current = intval($db_revision); if ($stored < $current) { // The last update we performed was $stored. // Start at $stored + 1 and continue until we have completed $current for ($x = $stored + 1; $x <= $current; $x++) { $s = '_' . $x; $cls = '\\Code\Update\\' . $s; if (!class_exists($cls)) { return; } // There could be a lot of processes running or about to run. // We want exactly one process to run the update command. // So store the fact that we're taking responsibility // after first checking to see if somebody else already has. // If the update fails or times-out completely you may need to // delete the config entry to try again. Config::Load('database'); if (get_config('database', $s)) { break; } set_config('database', $s, '1'); $c = new $cls(); $retval = $c->run(); if ($retval != UPDATE_SUCCESS) { $source = t('Source code of failed update: ') . "\n\n" . @file_get_contents('Code/Update/' . $s . '.php'); // Prevent sending hundreds of thousands of emails by creating // a lockfile. $lockfile = 'cache/mailsent'; if ((file_exists($lockfile)) && (filemtime($lockfile) > (time() - 86400))) { return; } @unlink($lockfile); //send the administrator an e-mail file_put_contents($lockfile, $x); $r = q( "select account_language from account where account_email = '%s' limit 1", dbesc(App::$config['system']['admin_email']) ); push_lang(($r) ? $r[0]['account_language'] : 'en'); z_mail( [ 'toEmail' => App::$config['system']['admin_email'], 'messageSubject' => sprintf(t('Update Error at %s'), z_root()), 'textVersion' => replace_macros( Theme::get_email_template('update_fail_eml.tpl'), [ '$sitename' => App::$config['system']['sitename'], '$siteurl' => z_root(), '$update' => $x, '$error' => sprintf(t('Update %s failed. See error logs.'), $x), '$baseurl' => z_root(), '$source' => $source ] ) ] ); //try the logger logger('CRITICAL: Update Failed: ' . $x); pop_lang(); } else { set_config('database', $s, 'success'); } } } set_config('system', 'db_version', $db_revision); } } }