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");
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());
getUpgradeFiles($upgrade_path=null)
Returns a list of upgrade files relative to the $upgrade_path dir.
__construct()
Constructor.
isUpgradeLocked()
Checks if upgrade is locked.
sanitise_filepath($path, $append_slash=true)
Sanitise file paths ensuring that they begin and end with slashes etc.
setProcessedUpgrade($upgrade)
Saves a processed upgrade to a dataset.
run()
Run the upgrade process.
getUpgradeFileVersion($filename)
Returns the version of the upgrade filename.
$upgrades
Lists pending upgrades.
dbUpgrade($version, $fromdir="", $quiet=false)
NOTE: If this is ever removed from Elgg, sites lose the ability to upgrade from 1.7.x and earlier to the latest version of Elgg without upgrading to 1.8 first.
releaseUpgradeMutex()
Unlocks upgrade.
getUnprocessedUpgrades($upgrade_files=null, $processed_upgrades=null)
Checks if any upgrades need to be run.
elgg global
Pointer to the global context.
static includeCode($file)
PHP include a file with a very limited scope.
getUpgradeMutex()
Creates a table {prefix}upgrade_lock that is used as a mutex for upgrades.
elgg system_message
Wrapper function for system_messages.
elgg_get_version($human_readable=false)
Get the current Elgg version information.
bootstrap17to18()
Boot straps into 1.8 upgrade system from 1.7.
processUpgrades()
Upgrades Elgg Database and code.
elgg_flush_caches()
Flush all the registered caches.
getProcessedUpgrades()
Gets a list of processes upgrades.
upgradeCode($version, $quiet=false)
Run any php upgrade scripts which are required.