diff --git a/boot.php b/boot.php index 292e5a9411..4c3a8c5ca8 100644 --- a/boot.php +++ b/boot.php @@ -703,10 +703,17 @@ function update_db() return; } + // run the pre_update_nnnn functions in update.php + for ($x = $stored + 1; $x <= $current; $x++) { + $r = run_update_function($x, 'pre_update'); + if (!$r) { + break; + } + } + Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time()); - // run update routine - // it update the structure in one call + // update the structure in one call $retval = DBStructure::update(false, true); if ($retval) { DBStructure::updateFail( @@ -718,9 +725,9 @@ function update_db() Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, 'success'); } - // run any left update_nnnn functions in update.php + // run the update_nnnn functions in update.php for ($x = $stored + 1; $x <= $current; $x++) { - $r = run_update_function($x); + $r = run_update_function($x, 'update'); if (!$r) { break; } @@ -731,9 +738,11 @@ function update_db() return; } -function run_update_function($x) +function run_update_function($x, $prefix) { - if (function_exists('update_' . $x)) { + $funcname = $prefix . '_' . $x; + + if (function_exists($funcname)) { // 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 @@ -741,16 +750,14 @@ function run_update_function($x) // If the update fails or times-out completely you may need to // delete the config entry to try again. - $t = Config::get('database', 'update_' . $x); + $t = Config::get('database', $funcname); if (!is_null($t)) { return false; } - Config::set('database', 'update_' . $x, time()); + Config::set('database', $funcname, time()); // call the specific update - - $func = 'update_' . $x; - $retval = $func(); + $retval = $funcname(); if ($retval) { //send the administrator an e-mail @@ -760,13 +767,17 @@ function run_update_function($x) ); return false; } else { - Config::set('database', 'update_' . $x, 'success'); - Config::set('system', 'build', $x); + Config::set('database', $funcname, 'success'); + if ($post_update) { + Config::set('system', 'build', $x); + } return true; } } else { - Config::set('database', 'update_' . $x, 'success'); - Config::set('system', 'build', $x); + Config::set('database', $funcname, 'success'); + if ($post_update) { + Config::set('system', 'build', $x); + } return true; } } diff --git a/src/Core/Console/DatabaseStructure.php b/src/Core/Console/DatabaseStructure.php index ee8370dfa1..1b64622dbf 100644 --- a/src/Core/Console/DatabaseStructure.php +++ b/src/Core/Console/DatabaseStructure.php @@ -69,8 +69,6 @@ HELP; $output = DBStructure::update(true, false); break; case "update": - $output = DBStructure::update(true, true); - $build = Core\Config::get('system', 'build'); if (empty($build)) { Core\Config::set('system', 'build', DB_UPDATE_VERSION); @@ -80,9 +78,19 @@ HELP; $stored = intval($build); $current = intval(DB_UPDATE_VERSION); - // run any left update_nnnn functions in update.php + // run the pre_update_nnnn functions in update.php for ($x = $stored; $x < $current; $x ++) { - $r = run_update_function($x); + $r = run_update_function($x, 'pre_update'); + if (!$r) { + break; + } + } + + $output = DBStructure::update(true, true); + + // run the update_nnnn functions in update.php + for ($x = $stored; $x < $current; $x ++) { + $r = run_update_function($x, 'update'); if (!$r) { break; } diff --git a/update.php b/update.php index 4fcb9d94e4..ee70a7a262 100644 --- a/update.php +++ b/update.php @@ -33,6 +33,8 @@ require_once 'include/dba.php'; * 1. Create a function "update_4712()" here in the update.php * 2. Apply the needed structural changes in src/Database/DBStructure.php * 3. Set DB_UPDATE_VERSION in boot.php to 4712. + * + * If you need to run a script before the database update, name the function "pre_update_4712()" */ function update_1178() {