MDL-29262 backup: Clean controller obj form DB once finished ok
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Sun, 22 Apr 2012 21:30:44 +0000 (23:30 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Sun, 22 Apr 2012 22:03:37 +0000 (00:03 +0200)
backup/controller/backup_controller.class.php
backup/util/dbops/backup_controller_dbops.class.php

index d6d7bd1..5d27ab0 100644 (file)
@@ -170,17 +170,22 @@ class backup_controller extends backup implements loggable {
     }
 
     public function set_status($status) {
+        // 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
+        // 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,
-        // containing all the steps will be sent to DB. 100% (monster) useless.
+        // 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) {
index ac4725d..c77aeb6 100644 (file)
  */
 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;