/** * Checks if the migration is necessary * * @access public * @throws FatalMisconfigurationException * @throws FatalNotImplementedException * @return boolean */ public function MigrationNecessary() { try { $this->sm = ZPush::GetStateMachine(); } catch (HTTPReturnCodeException $e) { echo "Check states: states versions do not match and need to be migrated\n\n"; // we just try to get the statemachine again // the exception is only thrown the first time $this->sm = ZPush::GetStateMachine(); } if (!$this->sm) { throw new FatalMisconfigurationException("Could not get StateMachine from ZPush::GetStateMachine()"); } if (!$this->sm instanceof FileStateMachine) { throw new FatalNotImplementedException("This conversion script is only able to convert states of the FileStateMachine"); } if ($this->sm->GetStateVersion() == ZPush::GetLatestStateVersion()) { return false; } if ($this->sm->GetStateVersion() !== self::FROMVERSION || ZPush::GetLatestStateVersion() !== self::TOVERSION) { throw new FatalNotImplementedException(sprintf("This script only converts from state version %d to %d. Currently the system is on %d and should go to %d. Please contact support.", self::FROMVERSION, self::TOVERSION, $this->sm->GetStateVersion(), ZPush::GetLatestStateVersion())); } // do migration return true; }
/** * Returns the StateMachine object * which has to be an IStateMachine implementation * * @access public * @throws FatalNotImplementedException * @throws HTTPReturnCodeException * @return object implementation of IStateMachine */ public static function GetStateMachine() { if (!isset(ZPush::$stateMachine)) { // the backend could also return an own IStateMachine implementation $backendStateMachine = self::GetBackend()->GetStateMachine(); // if false is returned, use the default StateMachine if ($backendStateMachine !== false) { ZLog::Write(LOGLEVEL_DEBUG, "Backend implementation of IStateMachine: " . get_class($backendStateMachine)); if (in_array('IStateMachine', class_implements($backendStateMachine))) { ZPush::$stateMachine = $backendStateMachine; } else { throw new FatalNotImplementedException("State machine returned by the backend does not implement the IStateMachine interface!"); } } else { // Initialize the default StateMachine if (defined('STATE_MACHINE') && STATE_MACHINE == 'SQL') { ZPush::$stateMachine = new SqlStateMachine(); } else { ZPush::$stateMachine = new FileStateMachine(); } } if (ZPush::$stateMachine->GetStateVersion() !== ZPush::GetLatestStateVersion()) { if (class_exists("TopCollector")) { self::GetTopCollector()->AnnounceInformation("Run migration script!", true); } throw new HTTPReturnCodeException(sprintf("The state version available to the %s is not the latest version - please run the state upgrade script. See release notes for more information.", get_class(ZPush::$stateMachine)), HTTP_CODE_500); } } return ZPush::$stateMachine; }