/** * Processes AJAX requests for upgrades. * The updater starts with the passed $version and goes on until the * last one. * * The response is in the following format: * <percent-complete>|<next-action>|<status-message> * * @static * @param string $version * @return string */ public static function update($action) { // Get the update versions and current scope $versions = Config::get('schema.update'); $versionNames = array_keys($versions); // Initialize everything if (!Session::has('setup.updating')) { Session::put('setup.updating', TRUE); Session::forget('setup.messages'); return "5|{$action}|" . sprintf(Lang::get('setup.process_version'), $action); } else { if ($action == '~complete') { // Set the final stage Session::put('setup.stage', 3); // Update the version number in the database Site::config('general', array('version' => Config::get('app.version'))); // Flush the cache Cache::flush(); // All done! return "100||" . Lang::get('setup.update_complete'); } else { if (array_key_exists($action, $versions)) { try { // In case the exception is not caught static::setHandler('mainProcess'); // Scope is the current version being processed $scope = $versions[$action]; // Create new tables if (isset($scope['newTables'])) { foreach ($scope['newTables'] as $tableName => $schema) { // Drop the table Schema::dropIfExists($tableName); // Generate schema and create the table Schema::create($tableName, function ($table) use($schema) { Setup::schema($table, $schema); }); } } // Update existing tables if (isset($scope['modifyTables'])) { foreach ($scope['modifyTables'] as $tableName => $schema) { // Generate schema and modify the table Schema::table($tableName, function ($table) use($schema) { Setup::schema($table, $schema); }); } } // Run the closure for this version if (isset($scope['closure'])) { call_user_func($scope['closure']); } // Output the next action in queue return Setup::nextAction($action, $versionNames, 'setup.process_version'); } catch (Exception $e) { Session::put('setup.error', $e->getMessage()); return '-1||' . Lang::get('setup.error_occurred'); } } } } }