From 6e803b9fe46ecaf4921deb64dd615ef8d30c7d2f Mon Sep 17 00:00:00 2001 From: "Eloy Lafuente (stronk7)" Date: Sun, 22 Apr 2012 23:30:44 +0200 Subject: [PATCH] MDL-29262 backup: Clean controller obj form DB once finished ok --- backup/controller/backup_controller.class.php | 29 ++++++++++++++----- .../dbops/backup_controller_dbops.class.php | 26 ++++++++++++++--- 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/backup/controller/backup_controller.class.php b/backup/controller/backup_controller.class.php index d6d7bd1d6a1..5d27ab0daaf 100644 --- a/backup/controller/backup_controller.class.php +++ b/backup/controller/backup_controller.class.php @@ -170,17 +170,22 @@ class backup_controller extends backup implements loggable { } public function set_status($status) { - $this->log('setting controller status to', backup::LOG_DEBUG, $status); - // TODO: Check it's a correct status - $this->status = $status; - // Ensure that, once set to backup::STATUS_AWAITING, controller is stored in DB - // Note: never save_controller() after STATUS_EXECUTING or the whole controller, + // Note: never save_controller() with the object info after STATUS_EXECUTING or the whole controller, // containing all the steps will be sent to DB. 100% (monster) useless. + $this->log('setting controller status to', backup::LOG_DEBUG, $status); + // TODO: Check it's a correct status. + $this->status = $status; + // Ensure that, once set to backup::STATUS_AWAITING, controller is stored in DB. if ($status == backup::STATUS_AWAITING) { $this->save_controller(); $tbc = self::load_controller($this->backupid); $this->logger = $tbc->logger; // wakeup loggers $tbc->destroy(); // Clean temp controller structures + + } else if ($status == backup::STATUS_FINISHED_OK) { + // If the operation has ended without error (backup::STATUS_FINISHED_OK) + // proceed by cleaning the object from database. MDL-29262. + $this->save_controller(false, true); } } @@ -312,12 +317,20 @@ class backup_controller extends backup implements loggable { backup_helper::log($message, $level, $a, $depth, $display, $this->logger); } - public function save_controller() { + /** + * Save controller information + * + * @param bool $includeobj to decide if the object itself must be updated (true) or no (false) + * @param bool $cleanobj to decide if the object itself must be cleaned (true) or no (false) + */ + public function save_controller($includeobj = true, $cleanobj = false) { // Going to save controller to persistent storage, calculate checksum for later checks and save it // TODO: flag the controller as NA. Any operation on it should be forbidden util loaded back $this->log('saving controller to db', backup::LOG_DEBUG); - $this->checksum = $this->calculate_checksum(); - backup_controller_dbops::save_controller($this, $this->checksum); + if ($includeobj ) { // Only calculate checksum if we are going to include the object. + $this->checksum = $this->calculate_checksum(); + } + backup_controller_dbops::save_controller($this, $this->checksum, $includeobj, $cleanobj); } public static function load_controller($backupid) { diff --git a/backup/util/dbops/backup_controller_dbops.class.php b/backup/util/dbops/backup_controller_dbops.class.php index ac4725de668..c77aeb6e4c4 100644 --- a/backup/util/dbops/backup_controller_dbops.class.php +++ b/backup/util/dbops/backup_controller_dbops.class.php @@ -32,16 +32,30 @@ */ abstract class backup_controller_dbops extends backup_dbops { - public static function save_controller($controller, $checksum) { + /** + * Send one backup controller to DB + * + * @param backup_controller $controller controller to send to DB + * @param string $checksum hash of the controller to be checked + * @param bool $includeobj to decide if the object itself must be updated (true) or no (false) + * @param bool $cleanobj to decide if the object itself must be cleaned (true) or no (false) + * @return int id of the controller record in the DB + * @throws backup_controller_exception|backup_dbops_exception + */ + public static function save_controller($controller, $checksum, $includeobj = true, $cleanobj = false) { global $DB; // Check we are going to save one backup_controller if (! $controller instanceof backup_controller) { throw new backup_controller_exception('backup_controller_expected'); } - // Check checksum is ok. Sounds silly but it isn't ;-) - if (!$controller->is_checksum_correct($checksum)) { + // Check checksum is ok. Only if we are including object info. Sounds silly but it isn't ;-). + if ($includeobj and !$controller->is_checksum_correct($checksum)) { throw new backup_dbops_exception('backup_controller_dbops_saving_checksum_mismatch'); } + // Cannot request to $includeobj and $cleanobj at the same time. + if ($includeobj and $cleanobj) { + throw new backup_dbops_exception('backup_controller_dbops_saving_cannot_include_and_delete'); + } // Get all the columns $rec = new stdclass(); $rec->backupid = $controller->get_backupid(); @@ -57,7 +71,11 @@ abstract class backup_controller_dbops extends backup_dbops { $rec->executiontime= $controller->get_executiontime(); $rec->checksum = $checksum; // Serialize information - $rec->controller = base64_encode(serialize($controller)); + if ($includeobj) { + $rec->controller = base64_encode(serialize($controller)); + } else if ($cleanobj) { + $rec->controller = ''; + } // Send it to DB if ($recexists = $DB->get_record('backup_controllers', array('backupid' => $rec->backupid))) { $rec->id = $recexists->id;