37 public function run() {
44 if (!$this->getUpgradeMutex()) {
51 _elgg_services()->events->unregisterHandler(
'log',
'systemlog',
'system_log_default_logger');
52 _elgg_services()->events->unregisterHandler(
'all',
'all',
'system_log_listener');
57 if ($this->getUnprocessedUpgrades()) {
58 $this->processUpgrades();
64 $this->releaseUpgradeMutex();
79 $upgrade_path =
_elgg_services()->config->get(
'path') .
'engine/lib/upgrades/';
80 $processed_upgrades = $this->getProcessedUpgrades();
83 if (!$processed_upgrades) {
84 $this->bootstrap17to18();
87 $processed_upgrades = $this->getProcessedUpgrades();
90 $upgrade_files = $this->getUpgradeFiles($upgrade_path);
92 if ($upgrade_files ===
false) {
96 $upgrades = $this->getUnprocessedUpgrades($upgrade_files, $processed_upgrades);
102 $upgrade_version = $this->getUpgradeFileVersion($upgrade);
116 if (!@self::includeCode(
"$upgrade_path/$upgrade")) {
118 error_log(
"Could not include $upgrade_path/$upgrade");
120 }
catch (\Exception
$e) {
122 error_log(
$e->getMessage());
125 if (!self::includeCode(
"$upgrade_path/$upgrade")) {
127 error_log(
"Could not include $upgrade_path/$upgrade");
139 $this->setProcessedUpgrade($upgrade);
158 return include $file;
169 $processed_upgrades = $this->getProcessedUpgrades();
170 $processed_upgrades[] = $upgrade;
171 $processed_upgrades = array_unique($processed_upgrades);
172 return _elgg_services()->datalist->set(
'processed_upgrades', serialize($processed_upgrades));
183 return $unserialized;
194 preg_match(
'/^([0-9]{10})([\.a-z0-9-_]+)?\.(php)$/i',
$filename, $matches);
196 if (isset($matches[1])) {
197 return (
int) $matches[1];
210 if (!$upgrade_path) {
211 $upgrade_path =
_elgg_services()->config->get(
'path') .
'engine/lib/upgrades/';
214 $handle = opendir($upgrade_path);
220 $upgrade_files = array();
222 while ($upgrade_file = readdir($handle)) {
224 if (is_dir($upgrade_path .
'$upgrade_file')) {
227 $upgrade_version = $this->getUpgradeFileVersion($upgrade_file);
228 if (!$upgrade_version) {
231 $upgrade_files[] = $upgrade_file;
234 sort($upgrade_files);
236 return $upgrade_files;
248 if ($upgrade_files ===
null) {
249 $upgrade_files = $this->getUpgradeFiles();
252 if ($processed_upgrades ===
null) {
253 $processed_upgrades = unserialize(
_elgg_services()->datalist->get(
'processed_upgrades'));
254 if (!is_array($processed_upgrades)) {
255 $processed_upgrades = array();
259 $unprocessed = array_diff($upgrade_files, $processed_upgrades);
275 $quiet = !$dbversion;
278 if ($this->dbUpgrade($dbversion,
'', $quiet)) {
282 if ($this->upgradeCode($dbversion, $quiet)) {
286 $upgrade_details = new \stdClass;
287 $upgrade_details->from = $dbversion;
290 _elgg_services()->events->trigger(
'upgrade',
'upgrade', $upgrade_details);
311 $upgrades_18 = array(
320 $upgrade_files = $this->getUpgradeFiles();
321 $processed_upgrades = array();
323 foreach ($upgrade_files as $upgrade_file) {
325 if (in_array($upgrade_file, $upgrades_18) || !preg_match(
"/[0-9]{10}\.php/", $upgrade_file)) {
329 $upgrade_version = $this->getUpgradeFileVersion($upgrade_file);
332 if ($upgrade_version < $db_version) {
333 $this->setProcessedUpgrade($upgrade_file);
346 if (!$this->isUpgradeLocked()) {
348 _elgg_services()->db->insertData(
"create table {$this->CONFIG->dbprefix}upgrade_lock (id INT)");
353 _elgg_services()->logger->warn(
'Cannot lock for upgrade: already locked');
364 _elgg_services()->db->deleteData(
"drop table {$this->CONFIG->dbprefix}upgrade_lock");
409 $fromdir = $this->CONFIG->path .
'engine/schema/upgrades/';
414 if ($handle = opendir($fromdir)) {
415 $sqlupgrades = array();
417 while ($sqlfile = readdir($handle)) {
418 if (!is_dir($fromdir . $sqlfile)) {
419 if (preg_match(
'/^([0-9]{10})\.(sql)$/', $sqlfile, $matches)) {
420 $sql_version = (int) $matches[1];
422 $sqlupgrades[] = $sqlfile;
430 if (
sizeof($sqlupgrades) > 0) {
431 foreach ($sqlupgrades as $sqlfile) {
438 error_log(
$e->getmessage());
elgg_flush_caches()
Flush all the registered caches.
run()
Run the upgrade process.
__construct()
Constructor.
getUpgradeMutex()
Creates a table {prefix}upgrade_lock that is used as a mutex for upgrades.
processUpgrades()
Upgrades Elgg Database and code.
static includeCode($file)
PHP include a file with a very limited scope.
getProcessedUpgrades()
Gets a list of processes upgrades.
isUpgradeLocked()
Checks if upgrade is locked.
getUpgradeFiles($upgrade_path=null)
Returns a list of upgrade files relative to the $upgrade_path dir.
dbUpgrade($version, $fromdir="", $quiet=false)
upgradeCode($version, $quiet=false)
Run any php upgrade scripts which are required.
releaseUpgradeMutex()
Unlocks upgrade.
bootstrap17to18()
Boot straps into 1.8 upgrade system from 1.7.
getUnprocessedUpgrades($upgrade_files=null, $processed_upgrades=null)
Checks if any upgrades need to be run.
getUpgradeFileVersion($filename)
Returns the version of the upgrade filename.
setProcessedUpgrade($upgrade)
Saves a processed upgrade to a dataset.
sanitise_filepath($path, $append_slash=true)
Sanitise file paths ensuring that they begin and end with slashes etc.
system_message($message)
Display a system message on next page load.
elgg_get_version($human_readable=false)
Get the current Elgg version information.
$upgrades
Lists pending upgrades.