aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/phpbb/db/migrator.php84
1 files changed, 34 insertions, 50 deletions
diff --git a/phpBB/phpbb/db/migrator.php b/phpBB/phpbb/db/migrator.php
index 2b7353d2b9..edc132e546 100644
--- a/phpBB/phpbb/db/migrator.php
+++ b/phpBB/phpbb/db/migrator.php
@@ -506,6 +506,11 @@ class migrator
*/
protected function process_data_step($steps, $state, $revert = false)
{
+ if (sizeof($steps) === 0)
+ {
+ return true;
+ }
+
$state = is_array($state) ? $state : false;
// reverse order of steps if reverting
@@ -514,66 +519,45 @@ class migrator
$steps = array_reverse($steps);
}
- end($steps);
- $last_step_identifier = key($steps);
-
- foreach ($steps as $step_identifier => $step)
+ $step = $last_result = 0;
+ if ($state)
{
- $last_result = 0;
- if ($state)
- {
- // Continue until we reach the step that matches the last step called
- if ($state['step'] != $step_identifier)
- {
- continue;
- }
-
- // We send the result from last time to the callable function
- $last_result = $state['result'];
+ $step = $state['step'];
- // Set state to false since we reached the point we were at
- $state = false;
-
- // If the last result is null or true, this means
- // the last method call was finished and we can move on
- if ($last_result === null || $last_result === true)
- {
- continue;
- }
- }
+ // We send the result from last time to the callable function
+ $last_result = $state['result'];
+ }
- try
+ try
+ {
+ // Result will be null or true if everything completed correctly
+ // Stop after each update step, to let the updater control the script runtime
+ $result = $this->run_step($steps[$step], $last_result, $revert);
+ if (($result !== null && $result !== true) || $step + 1 < sizeof($steps))
{
- // Result will be null or true if everything completed correctly
- // After any schema update step we allow to pause, since
- // database changes can take quite some time
- $result = $this->run_step($step, $last_result, $revert);
- if (($result !== null && $result !== true) ||
- (strpos($step[0], 'dbtools') === 0 && $step_identifier !== $last_step_identifier))
- {
- return array(
- 'result' => $result,
- 'step' => $step_identifier,
- );
- }
+ return array(
+ 'result' => $result,
+ // Move on if the last call finished
+ 'step' => ($result !== null && $result !== true) ? $step : $step + 1,
+ );
}
- catch (\phpbb\db\migration\exception $e)
+ }
+ catch (\phpbb\db\migration\exception $e)
+ {
+ // We should try rolling back here
+ foreach ($steps as $reverse_step_identifier => $reverse_step)
{
- // We should try rolling back here
- foreach ($steps as $reverse_step_identifier => $reverse_step)
+ // If we've reached the current step we can break because we reversed everything that was run
+ if ($reverse_step_identifier == $step)
{
- // If we've reached the current step we can break because we reversed everything that was run
- if ($reverse_step_identifier == $step_identifier)
- {
- break;
- }
-
- // Reverse the step that was run
- $result = $this->run_step($reverse_step, false, !$revert);
+ break;
}
- throw $e;
+ // Reverse the step that was run
+ $result = $this->run_step($reverse_step, false, !$revert);
}
+
+ throw $e;
}
return true;