You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.2 KiB
166 lines
5.2 KiB
<?php
|
|
/*********************************************************************
|
|
class.migrater.php
|
|
|
|
Migration utils required by upgrader.
|
|
|
|
Jared Hancock <jared@osticket.com>
|
|
Copyright (c) 2006-2013 osTicket
|
|
http://www.osticket.com
|
|
|
|
Released under the GNU General Public License WITHOUT ANY WARRANTY.
|
|
See LICENSE.TXT for details.
|
|
|
|
vim: expandtab sw=4 ts=4 sts=4:
|
|
**********************************************************************/
|
|
|
|
|
|
/*
|
|
DatabaseMigrater.
|
|
|
|
SQL database migrater. This provides the engine capable of rolling the
|
|
database for an osTicket installation forward (and perhaps even
|
|
backward) in time using a set of included migration scripts. Each script
|
|
will roll the database between two database checkpoints. Where possible,
|
|
the migrater will roll several checkpoint scripts into one to be applied
|
|
together.
|
|
|
|
*/
|
|
|
|
class DatabaseMigrater {
|
|
|
|
var $start;
|
|
var $end;
|
|
var $sqldir;
|
|
|
|
function __construct($start, $end, $sqldir) {
|
|
$this->start = $start;
|
|
$this->end = $end;
|
|
$this->sqldir = $sqldir;
|
|
}
|
|
|
|
function getPatches($stop=null) {
|
|
|
|
$start= $this->start;
|
|
$stop = $stop?$stop:$this->end;
|
|
|
|
$patches = array();
|
|
while (true) {
|
|
$next = glob($this->sqldir . substr($start, 0, 8)
|
|
. '-*.patch.sql');
|
|
if(!$next || empty($next)) {
|
|
# No patches leaving the current signature.
|
|
# Assume that we've applied all the available patches
|
|
break;
|
|
} elseif (count($next) == 1) {
|
|
$patches[] = $next[0];
|
|
$start = substr(basename($next[0]), 9, 8);
|
|
} else {
|
|
# Problem -- more than one patch exists from this snapshot.
|
|
# We probably need a graph approach to solve this.
|
|
break;
|
|
}
|
|
|
|
# Break if we've reached our target stop.
|
|
if(!$start || !strncasecmp($start, $stop, 8))
|
|
break;
|
|
}
|
|
|
|
return array_filter($patches);
|
|
}
|
|
|
|
/**
|
|
* Reads update stream information from UPGRADE_DIR/<streams>/streams.cfg.
|
|
* Each declared stream folder should contain a file under the name of the
|
|
* stream with an 'sig' extension. The file will be the hash of the
|
|
* signature of the tip of the stream. A corresponding config variable
|
|
* 'schema_signature' should exist in the namespace of the stream itself.
|
|
* If the hash file doesn't match the schema_signature on record, then an
|
|
* update is triggered and the patches in the stream folder are used to
|
|
* upgrade the database.
|
|
*/
|
|
/* static */
|
|
function getUpgradeStreams($basedir) {
|
|
static $streams = array();
|
|
if ($streams) return $streams;
|
|
|
|
// TODO: Make the hash algo configurable in the streams
|
|
// configuration ( core : md5 )
|
|
$config = @file_get_contents($basedir.'/streams.cfg');
|
|
if (!$config) $config = 'core';
|
|
foreach (explode("\n", $config) as $line) {
|
|
$line = trim(preg_replace('/#.*$/', '', $line));
|
|
if (!$line)
|
|
continue;
|
|
else if (file_exists($basedir."$line.sig") && is_dir($basedir.$line))
|
|
$streams[$line] =
|
|
trim(file_get_contents($basedir."$line.sig"));
|
|
}
|
|
return $streams;
|
|
}
|
|
}
|
|
|
|
class MigrationTask {
|
|
var $description = "[Unnamed task]";
|
|
var $status = "finished";
|
|
|
|
/**
|
|
* Function: run
|
|
*
|
|
* (Abstract) method which will perform the migration task. The task
|
|
* does not have to be completed in one invocation; however, if the
|
|
* run() method is called again, the task should not be restarted from the
|
|
* beginning. The ::isFinished() method will be used to determine if the
|
|
* migration task has more work to be done.
|
|
*
|
|
* If ::isFinished() returns boolean false, then the run method will be
|
|
* called again. Note that the next invocation may be in a separate
|
|
* request. Ensure that you properly capture the state of the task before
|
|
* exiting the ::run() method. The entire MigrationTask instance is stored
|
|
* in the migration session, so all instance variables will be preserved
|
|
* between calls.
|
|
*
|
|
* Parameters:
|
|
* max_time - (int) number of seconds the task should be allowed to run
|
|
*/
|
|
/* abstract */
|
|
function run($max_time) { }
|
|
|
|
/**
|
|
* Function: isFinished
|
|
*
|
|
* Returns boolean TRUE if another call to ::run() is required, and
|
|
* false otherwise
|
|
*/
|
|
/* abstract */
|
|
function isFinished() { return true; }
|
|
|
|
/**
|
|
* Funciton: sleep
|
|
*
|
|
* Called if isFinished() returns false. The data returned is passed to
|
|
* the ::wakeup() method before the ::run() method is called again
|
|
*/
|
|
function sleep() { return null; }
|
|
|
|
/**
|
|
* Function: wakeup
|
|
*
|
|
* Called before the ::run() method if the migration task was saved in
|
|
* the session and run in multiple requests
|
|
*/
|
|
function wakeup($data) { }
|
|
|
|
function getDescription() {
|
|
return $this->description;
|
|
}
|
|
|
|
function getStatus() {
|
|
return $this->status;
|
|
}
|
|
function setStatus($message) {
|
|
$this->status = $message;
|
|
}
|
|
}
|
|
|
|
?>
|