* @copyright Copyright © 2008 Peter Adams * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0 * @category owa * @package owa * @version $Revision$ * @since owa 1.0.0 */ class owa_update extends owa_base { /** * Module Name * * Name of the module that his update is invoked under. This is set by the * factory. * * @var string */ var $module_name; /** * Schema Version Number * * Version number of the schema that will be in place after update is applied. * * This is set by the module's update method from the concrete class filename * when it creates the concrete version of this update class. This ensures * that the schema version number is only set in one place (the file name) and * that only one concrete update class can ever be applied for a particular * schema version. * * @var integer */ var $schema_version; var $is_cli_mode_required; function __construct() { return parent::__construct(); } function isCliModeRequired() { return $this->is_cli_mode_required; } /** * Applies an update * * @return boolean */ function apply() { // check for schema version. abort if not present or else updates will get out of sync. if (empty($this->schema_version)) { $this->e->notice(sprintf("Aborting %s Update (%s): Schema Version Number is not set.", get_class(), $this->module_name)); return false; } $current_version = $this->c->get($this->module_name, 'schema_version'); // check to see that you are applying an update that was successfully applied if ($current_version === $this->schema_version) { $this->e->notice(sprintf("Aborting %s Update (%s): Update has already ben applied.", get_class(), $this->module_name)); return false; } // execute pre update proceadure $ret = $this->pre(); if ($ret == true): $this->e->notice("Pre Update Proceadure Suceeded"); // execute actual update proceadure $ret = $this->up(); if ($ret == true): // execute post update proceadure $ret = $this->post(); if ($ret == true): $this->e->notice("Post Update Proceadure Suceeded"); $this->c->persistSetting($this->module_name, 'schema_version', $this->schema_version); $this->c->save(); return true; else: $this->e->notice("Post Update Proceadure Failed"); return false; endif; else: $this->e->notice("Update Proceadure Failed"); return false; endif; else: $this->e->notice("Pre Update Proceadure Failed"); return false; endif; } /** * Rollsback an update * * @return boolean */ function rollback() { $current_version = $this->c->get($this->module_name, 'schema_version'); // check to see that you are rolling back either an update that was successfully applied or one that might have failed. // we dont want people applying rollbacks out of sequence. if ($current_version === $this->schema_version || $current_version === $this->schema_version - 1) { $ret = $this->down(); if ($ret) { // only touch the current schema number if needed $prior_version = $current_version - 1; if ($current_version === $this->schema_version) { $this->c->persistSetting($this->module_name, 'schema_version', $prior_version); $this->c->save(); $this->e->notice("Rollback succeeded to version: $prior_version."); } else { $this->e->notice("Rollback succeeded to version: $current_version."); } } else { $this->e->notice("Rollback failed."); } } else { $this->e->notice(sprintf('Rollback of update %s cannot be applied because it does not appear that it update %s has been applied to your instance. Your current schema version is only %s', $this->schema_version, $this->schema_version, $current_version)); } return true; } /** * Abstract Pre-update hook * * @return boolean */ function pre() { return true; } /** * Abstract Post-update hook * * @return boolean */ function post() { return true; } /** * Abstract Method for update * * @return boolean */ function up() { return false; } /** * Abstract Method for reversing an update * * @return boolean */ function down() { return false; } } ?>