From b02778cd227d7d6faac8dfbd7e68f2a34ac24a7d Mon Sep 17 00:00:00 2001
From: Jared Hancock <jared@osticket.com>
Date: Thu, 4 Jul 2013 15:21:33 -0400
Subject: [PATCH] Support multiple update streams

This patch allows the upgrader to upgrade multiple database update
'streams'. The main stream is renamed to 'core' to reflect changes made
to the config class. This will significantly ease customizations
requiring database customizations, and will make plugins requiring
database changes possible.
---
 include/ajax.upgrader.php                     |   4 +-
 include/class.migrater.php                    |  22 +++
 include/class.osticket.php                    |  12 +-
 include/class.upgrader.php                    | 185 ++++++++++++++----
 include/upgrader/streams/core.md5             |   1 +
 .../core}/00ff231f-9f3b454c.patch.sql         |   0
 .../core}/02decaa2-60fcbee1.patch.sql         |   0
 .../core}/15719536-dd0022fb.patch.sql         |   0
 .../core}/15af7cd3-98ae1ed2.patch.sql         |   0
 .../core}/15b30765-dd0022fb.cleanup.sql       |   0
 .../core}/15b30765-dd0022fb.patch.sql         |   0
 .../core}/1da1bcba-15b30765.patch.sql         |   0
 .../core}/2e20a0eb-98ae1ed2.patch.sql         |   0
 .../core}/2e7531a2-d0e37dca.patch.sql         |   0
 .../core}/32de1766-852ca89e.patch.sql         |   0
 .../core}/435c62c3-2e7531a2.cleanup.sql       |   0
 .../core}/435c62c3-2e7531a2.patch.sql         |   0
 .../core}/49478749-c2d2fabf.patch.sql         |   0
 .../core}/522e5b78-02decaa2.patch.sql         |   0
 .../core}/60fcbee1-f8856d56.patch.sql         |   0
 .../core}/7be60a84-522e5b78.patch.sql         |   0
 .../core}/852ca89e-740428f9.patch.sql         |   0
 .../core}/98ae1ed2-e342f869.cleanup.sql       |   0
 .../core}/98ae1ed2-e342f869.patch.sql         |   0
 .../core}/9f3b454c-c0fd16f4.patch.sql         |   0
 .../core}/a67ba35e-98ae1ed2.patch.sql         |   0
 .../core}/aa4664af-b19dc97d.patch.sql         |   0
 .../core}/abe9c0cb-bbb021fb.patch.sql         |   0
 .../core}/aee589ab-98ae1ed2.patch.sql         |   0
 .../core}/b19dc97d-435c62c3.patch.sql         |   0
 .../core}/bbb021fb-49478749.patch.sql         |   0
 .../core}/c00511c7-7be60a84.cleanup.sql       |   0
 .../core}/c00511c7-7be60a84.patch.sql         |   0
 .../core}/c0fd16f4-d959a00e.patch.sql         |   0
 .../core}/c2d2fabf-aa4664af.patch.sql         |   0
 .../core}/d0e37dca-1da1bcba.patch.sql         |   0
 .../core}/d959a00e-32de1766.patch.sql         |   0
 .../core}/dd0022fb-f4da0c9b.patch.sql         |   0
 .../core}/e342f869-c00511c7.patch.sql         |   0
 .../core}/f4da0c9b-00ff231f.patch.sql         |   0
 .../core}/f8856d56-abe9c0cb.patch.sql         |   0
 main.inc.php                                  |   2 -
 scp/upgrade.php                               |   2 +-
 43 files changed, 185 insertions(+), 43 deletions(-)
 create mode 100644 include/upgrader/streams/core.md5
 rename include/upgrader/{sql => streams/core}/00ff231f-9f3b454c.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/02decaa2-60fcbee1.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/15719536-dd0022fb.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/15af7cd3-98ae1ed2.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/15b30765-dd0022fb.cleanup.sql (100%)
 rename include/upgrader/{sql => streams/core}/15b30765-dd0022fb.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/1da1bcba-15b30765.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/2e20a0eb-98ae1ed2.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/2e7531a2-d0e37dca.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/32de1766-852ca89e.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/435c62c3-2e7531a2.cleanup.sql (100%)
 rename include/upgrader/{sql => streams/core}/435c62c3-2e7531a2.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/49478749-c2d2fabf.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/522e5b78-02decaa2.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/60fcbee1-f8856d56.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/7be60a84-522e5b78.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/852ca89e-740428f9.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/98ae1ed2-e342f869.cleanup.sql (100%)
 rename include/upgrader/{sql => streams/core}/98ae1ed2-e342f869.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/9f3b454c-c0fd16f4.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/a67ba35e-98ae1ed2.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/aa4664af-b19dc97d.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/abe9c0cb-bbb021fb.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/aee589ab-98ae1ed2.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/b19dc97d-435c62c3.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/bbb021fb-49478749.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/c00511c7-7be60a84.cleanup.sql (100%)
 rename include/upgrader/{sql => streams/core}/c00511c7-7be60a84.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/c0fd16f4-d959a00e.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/c2d2fabf-aa4664af.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/d0e37dca-1da1bcba.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/d959a00e-32de1766.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/dd0022fb-f4da0c9b.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/e342f869-c00511c7.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/f4da0c9b-00ff231f.patch.sql (100%)
 rename include/upgrader/{sql => streams/core}/f8856d56-abe9c0cb.patch.sql (100%)

diff --git a/include/ajax.upgrader.php b/include/ajax.upgrader.php
index 8b263ba0c..00e284e42 100644
--- a/include/ajax.upgrader.php
+++ b/include/ajax.upgrader.php
@@ -25,7 +25,7 @@ class UpgraderAjaxAPI extends AjaxController {
         if(!$thisstaff or !$thisstaff->isAdmin() or !$ost)
             Http::response(403, 'Access Denied');
 
-        $upgrader = new Upgrader($ost->getDBSignature(), TABLE_PREFIX, SQL_DIR);
+        $upgrader = new Upgrader(TABLE_PREFIX, UPGRADE_DIR.'streams/');
 
         //Just report the next action on the first call.
         if(!$_SESSION['ost_upgrader'] || !$_SESSION['ost_upgrader'][$upgrader->getShash()]['progress']) {
@@ -51,7 +51,7 @@ class UpgraderAjaxAPI extends AjaxController {
                     Http::response(200, "Upgraded to $version ... post-upgrade checks!");
                     exit;
                 }
-            } else { 
+            } else {
                 //Abort: Upgrade pending but NOT upgradable - invalid or wrong hash.
                 $upgrader->abort(sprintf('Upgrade Failed: Invalid or wrong hash [%s]',$ost->getDBSignature()));
             }
diff --git a/include/class.migrater.php b/include/class.migrater.php
index ba26d091e..a9764a96f 100644
--- a/include/class.migrater.php
+++ b/include/class.migrater.php
@@ -70,6 +70,28 @@ class DatabaseMigrater {
 
         return array_filter($patches);
     }
+
+	/**
+     * Reads update stream information from UPGRADE_DIR/<stream>/<stream>.md5.
+     * Each declared stream folder should contain a file under the name of the
+     * stream with an 'md5' extension. The file will be the md5 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 md5 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;
+
+		$h = opendir($basedir);
+		while (($next = readdir($h)) !== false)
+			if (file_exists($basedir."$next.md5") && is_dir($basedir.$next))
+				$streams[$next] =
+                    trim(file_get_contents($basedir."$next.md5"));
+		return $streams;
+	}
 }
 
 
diff --git a/include/class.osticket.php b/include/class.osticket.php
index 1a1945218..671bdca4b 100644
--- a/include/class.osticket.php
+++ b/include/class.osticket.php
@@ -20,6 +20,7 @@
 
 require_once(INCLUDE_DIR.'class.config.php'); //Config helper
 require_once(INCLUDE_DIR.'class.csrf.php'); //CSRF token class.
+require_once(INCLUDE_DIR.'class.migrater.php');
 
 define('LOG_WARN',LOG_WARNING);
 
@@ -60,8 +61,11 @@ class osTicket {
     }
 
     function isUpgradePending() {
-        return strcasecmp(SCHEMA_SIGNATURE,
-                $this->getConfig()->getSchemaSignature());
+		foreach (DatabaseMigrater::getUpgradeStreams(UPGRADE_DIR.'streams/') as $stream=>$hash)
+			if (strcasecmp($hash,
+					$this->getConfig()->getSchemaSignature($stream)))
+				return true;
+		return false;
     }
 
     function getSession() {
@@ -72,8 +76,8 @@ class osTicket {
         return $this->config;
     }
 
-    function getDBSignature() {
-        return $this->getConfig()->getSchemaSignature();
+    function getDBSignature($namespace='core') {
+        return $this->getConfig()->getSchemaSignature($namespace);
     }
 
     function getVersion() {
diff --git a/include/class.upgrader.php b/include/class.upgrader.php
index 8f6fea223..528850020 100644
--- a/include/class.upgrader.php
+++ b/include/class.upgrader.php
@@ -17,7 +17,128 @@
 require_once INCLUDE_DIR.'class.setup.php';
 require_once INCLUDE_DIR.'class.migrater.php';
 
-class Upgrader extends SetupWizard {
+class Upgrader {
+    function Upgrader($prefix, $basedir) {
+        global $ost;
+
+        $this->streams = array();
+		foreach (DatabaseMigrater::getUpgradeStreams($basedir) as $stream=>$hash) {
+            $signature = $ost->getConfig()->getSchemaSignature($stream);
+            $this->streams[$stream] = new StreamUpgrader($signature, $hash, $stream,
+                $prefix, $basedir.$stream.'/', $this);
+        }
+
+        //Init persistent state of upgrade.
+        $this->state = &$_SESSION['ost_upgrader']['state'];
+
+        $this->mode = &$_SESSION['ost_upgrader']['mode'];
+
+        $this->current = &$_SESSION['ost_upgrader']['stream'];
+        if (!$this->current || $this->getCurrentStream()->isFinished()) {
+            $streams = array_keys($this->streams);
+            do {
+                $this->current = array_shift($streams);
+            } while ($this->current && $this->getCurrentStream()->isFinished());
+        }
+    }
+
+    function getCurrentStream() {
+        return $this->streams[$this->current];
+    }
+
+    function isUpgradable() {
+        if ($this->isAborted())
+            return false;
+
+        foreach ($this->streams as $s)
+            if (!$s->isUpgradable())
+                return false;
+
+        return true;
+    }
+
+    function isAborted() {
+        return !strcasecmp($this->getState(), 'aborted');
+    }
+
+    function getState() {
+        return $this->state;
+    }
+
+    function setState($state) {
+        $this->state = $state;
+    }
+
+    function getMode() {
+        return $this->mode;
+    }
+
+    function setMode($mode) {
+        $this->mode = $mode;
+    }
+
+    function upgrade() {
+        if (!$this->current)
+            return true;
+
+        return $this->getCurrentStream()->upgrade();
+    }
+
+    function check_prereq() {
+        if ($this->getCurrentStream())
+            return $this->getCurrentStream()->check_prereq();
+    }
+    function check_php() {
+        if ($this->getCurrentStream())
+            return $this->getCurrentStream()->check_php();
+    }
+    function check_mysql() {
+        if ($this->getCurrentStream())
+            return $this->getCurrentStream()->check_mysql();
+    }
+
+    function getNumPendingTasks() {
+        return $this->getCurrentStream()->getNumPendingTasks();
+    }
+
+    function doTasks() {
+        if ($this->getNumPendingTasks())
+            return $this->getCurrentStream()->doTasks();
+    }
+
+    function getErrors() {
+        return $this->getCurrentStream()->getError();
+    }
+
+    function getNextAction() {
+        if ($this->getCurrentStream())
+            return $this->getCurrentStream()->getNextAction();
+    }
+
+    function getNextVersion() {
+        return $this->getCurrentStream()->getNextVersion();
+    }
+
+    function getSchemaSignature() {
+        if ($this->getCurrentStream())
+            return $this->getCurrentStream()->getSchemaSignature();
+    }
+
+    function getSHash() {
+        return $this->getCurrentStream()->getSHash();
+    }
+}
+
+/**
+ * Updates a single database stream. In the classical sense, osTicket only
+ * maintained a single database update stream. In that model, this
+ * represents upgrading that single stream. In multi-stream mode,
+ * customizations and plugins are supported to have their own respective
+ * database update streams. The Upgrader class is used to coordinate updates
+ * for all the streams, whereas the work to upgrade each stream is done in
+ * this class
+ */
+class StreamUpgrader extends SetupWizard {
 
     var $prefix;
     var $sqldir;
@@ -26,22 +147,32 @@ class Upgrader extends SetupWizard {
     var $state;
     var $mode;
 
-    function Upgrader($signature, $prefix, $sqldir) {
-
-        $this->signature = $signature;
+    /**
+     * Parameters:
+     * schema_signature - (string<md5-hex>) Current database-reflected (via
+     *      config table) version of the stream
+     * target - (stream<md5-hex>) Current stream tip, as reflected by
+     *      streams/<stream>.md5
+     * stream - (string) Name of the stream (folder)
+     * prefix - (string) Database table prefix
+     * sqldir - (string<path>) Path of sql patches
+     * upgrader - (Upgrader) Parent coordinator of parallel stream updates
+     */
+    function StreamUpgrader($schema_signature, $target, $stream, $prefix, $sqldir, $upgrader) {
+
+        $this->signature = $schema_signature;
+        $this->target = $target;
         $this->prefix = $prefix;
         $this->sqldir = $sqldir;
         $this->errors = array();
         $this->mode = 'ajax'; //
+        $this->upgrader = $upgrader;
+        $this->name = $stream;
 
         //Disable time limit if - safe mode is set.
         if(!ini_get('safe_mode'))
             set_time_limit(0);
 
-        //Init persistent state of upgrade.
-        $this->state = &$_SESSION['ost_upgrader']['state'];
-
-        $this->mode = &$_SESSION['ost_upgrader']['mode'];
 
         //Init the task Manager.
         if(!isset($_SESSION['ost_upgrader'][$this->getShash()]))
@@ -57,9 +188,10 @@ class Upgrader extends SetupWizard {
     function onError($error) {
         global $ost, $thisstaff;
 
-        $ost->logError('Upgrader Error', $error);
+        $subject = '['.$this->name.']: Upgrader Error';
+        $ost->logError($subject, $error);
         $this->setError($error);
-        $this->setState('aborted');
+        $this->upgrader->setState('aborted');
 
         //Alert staff upgrading the system - if the email is not same as admin's
         // admin gets alerted on error log (above)
@@ -70,7 +202,6 @@ class Upgrader extends SetupWizard {
         if(!($email=$ost->getConfig()->getAlertEmail()))
             $email=$ost->getConfig()->getDefaultEmail(); //will take the default email.
 
-        $subject = 'Upgrader Error';
         if($email) {
             $email->sendAlert($thisstaff->getEmail(), $subject, $error);
         } else {//no luck - try the system mail.
@@ -80,11 +211,7 @@ class Upgrader extends SetupWizard {
     }
 
     function isUpgradable() {
-        return (!$this->isAborted() && $this->getNextPatch());
-    }
-
-    function isAborted() {
-        return !strcasecmp($this->getState(), 'aborted');
+        return $this->getNextPatch();
     }
 
     function getSchemaSignature() {
@@ -103,25 +230,9 @@ class Upgrader extends SetupWizard {
         return $this->sqldir;
     }
 
-    function getState() {
-        return $this->state;
-    }
-
-    function setState($state) {
-        $this->state = $state;
-    }
-
-    function getMode() {
-        return $this->mode;
-    }
-
-    function setMode($mode) {
-        $this->mode = $mode;
-    }
-
     function getMigrater() {
         if(!$this->migrater)
-            $this->migrater = new DatabaseMigrater($this->signature, SCHEMA_SIGNATURE, $this->sqldir);
+            $this->migrater = new DatabaseMigrater($this->signature, $this->target, $this->sqldir);
 
         return  $this->migrater;
     }
@@ -146,6 +257,12 @@ class Upgrader extends SetupWizard {
         return $info['version'];
     }
 
+    function isFinished() {
+        # TODO: 1. Check if current and target hashes match,
+        #       2. Any pending tasks
+        return !($this->getNextPatch() || $this->getPendingTasks());
+    }
+
     function readPatchInfo($patch) {
         $info = array();
         if (preg_match(':/\*\*(.*)\*/:s', file_get_contents($patch), $matches)) {
@@ -170,7 +287,7 @@ class Upgrader extends SetupWizard {
             $action = "Upgrade to $nextversion";
         }
 
-        return $action;
+        return '['.$this->name.'] '.$action;
     }
 
     function getNumPendingTasks() {
diff --git a/include/upgrader/streams/core.md5 b/include/upgrader/streams/core.md5
new file mode 100644
index 000000000..12c25dccc
--- /dev/null
+++ b/include/upgrader/streams/core.md5
@@ -0,0 +1 @@
+740428f9986da6ad85f88ec841b57bfe
diff --git a/include/upgrader/sql/00ff231f-9f3b454c.patch.sql b/include/upgrader/streams/core/00ff231f-9f3b454c.patch.sql
similarity index 100%
rename from include/upgrader/sql/00ff231f-9f3b454c.patch.sql
rename to include/upgrader/streams/core/00ff231f-9f3b454c.patch.sql
diff --git a/include/upgrader/sql/02decaa2-60fcbee1.patch.sql b/include/upgrader/streams/core/02decaa2-60fcbee1.patch.sql
similarity index 100%
rename from include/upgrader/sql/02decaa2-60fcbee1.patch.sql
rename to include/upgrader/streams/core/02decaa2-60fcbee1.patch.sql
diff --git a/include/upgrader/sql/15719536-dd0022fb.patch.sql b/include/upgrader/streams/core/15719536-dd0022fb.patch.sql
similarity index 100%
rename from include/upgrader/sql/15719536-dd0022fb.patch.sql
rename to include/upgrader/streams/core/15719536-dd0022fb.patch.sql
diff --git a/include/upgrader/sql/15af7cd3-98ae1ed2.patch.sql b/include/upgrader/streams/core/15af7cd3-98ae1ed2.patch.sql
similarity index 100%
rename from include/upgrader/sql/15af7cd3-98ae1ed2.patch.sql
rename to include/upgrader/streams/core/15af7cd3-98ae1ed2.patch.sql
diff --git a/include/upgrader/sql/15b30765-dd0022fb.cleanup.sql b/include/upgrader/streams/core/15b30765-dd0022fb.cleanup.sql
similarity index 100%
rename from include/upgrader/sql/15b30765-dd0022fb.cleanup.sql
rename to include/upgrader/streams/core/15b30765-dd0022fb.cleanup.sql
diff --git a/include/upgrader/sql/15b30765-dd0022fb.patch.sql b/include/upgrader/streams/core/15b30765-dd0022fb.patch.sql
similarity index 100%
rename from include/upgrader/sql/15b30765-dd0022fb.patch.sql
rename to include/upgrader/streams/core/15b30765-dd0022fb.patch.sql
diff --git a/include/upgrader/sql/1da1bcba-15b30765.patch.sql b/include/upgrader/streams/core/1da1bcba-15b30765.patch.sql
similarity index 100%
rename from include/upgrader/sql/1da1bcba-15b30765.patch.sql
rename to include/upgrader/streams/core/1da1bcba-15b30765.patch.sql
diff --git a/include/upgrader/sql/2e20a0eb-98ae1ed2.patch.sql b/include/upgrader/streams/core/2e20a0eb-98ae1ed2.patch.sql
similarity index 100%
rename from include/upgrader/sql/2e20a0eb-98ae1ed2.patch.sql
rename to include/upgrader/streams/core/2e20a0eb-98ae1ed2.patch.sql
diff --git a/include/upgrader/sql/2e7531a2-d0e37dca.patch.sql b/include/upgrader/streams/core/2e7531a2-d0e37dca.patch.sql
similarity index 100%
rename from include/upgrader/sql/2e7531a2-d0e37dca.patch.sql
rename to include/upgrader/streams/core/2e7531a2-d0e37dca.patch.sql
diff --git a/include/upgrader/sql/32de1766-852ca89e.patch.sql b/include/upgrader/streams/core/32de1766-852ca89e.patch.sql
similarity index 100%
rename from include/upgrader/sql/32de1766-852ca89e.patch.sql
rename to include/upgrader/streams/core/32de1766-852ca89e.patch.sql
diff --git a/include/upgrader/sql/435c62c3-2e7531a2.cleanup.sql b/include/upgrader/streams/core/435c62c3-2e7531a2.cleanup.sql
similarity index 100%
rename from include/upgrader/sql/435c62c3-2e7531a2.cleanup.sql
rename to include/upgrader/streams/core/435c62c3-2e7531a2.cleanup.sql
diff --git a/include/upgrader/sql/435c62c3-2e7531a2.patch.sql b/include/upgrader/streams/core/435c62c3-2e7531a2.patch.sql
similarity index 100%
rename from include/upgrader/sql/435c62c3-2e7531a2.patch.sql
rename to include/upgrader/streams/core/435c62c3-2e7531a2.patch.sql
diff --git a/include/upgrader/sql/49478749-c2d2fabf.patch.sql b/include/upgrader/streams/core/49478749-c2d2fabf.patch.sql
similarity index 100%
rename from include/upgrader/sql/49478749-c2d2fabf.patch.sql
rename to include/upgrader/streams/core/49478749-c2d2fabf.patch.sql
diff --git a/include/upgrader/sql/522e5b78-02decaa2.patch.sql b/include/upgrader/streams/core/522e5b78-02decaa2.patch.sql
similarity index 100%
rename from include/upgrader/sql/522e5b78-02decaa2.patch.sql
rename to include/upgrader/streams/core/522e5b78-02decaa2.patch.sql
diff --git a/include/upgrader/sql/60fcbee1-f8856d56.patch.sql b/include/upgrader/streams/core/60fcbee1-f8856d56.patch.sql
similarity index 100%
rename from include/upgrader/sql/60fcbee1-f8856d56.patch.sql
rename to include/upgrader/streams/core/60fcbee1-f8856d56.patch.sql
diff --git a/include/upgrader/sql/7be60a84-522e5b78.patch.sql b/include/upgrader/streams/core/7be60a84-522e5b78.patch.sql
similarity index 100%
rename from include/upgrader/sql/7be60a84-522e5b78.patch.sql
rename to include/upgrader/streams/core/7be60a84-522e5b78.patch.sql
diff --git a/include/upgrader/sql/852ca89e-740428f9.patch.sql b/include/upgrader/streams/core/852ca89e-740428f9.patch.sql
similarity index 100%
rename from include/upgrader/sql/852ca89e-740428f9.patch.sql
rename to include/upgrader/streams/core/852ca89e-740428f9.patch.sql
diff --git a/include/upgrader/sql/98ae1ed2-e342f869.cleanup.sql b/include/upgrader/streams/core/98ae1ed2-e342f869.cleanup.sql
similarity index 100%
rename from include/upgrader/sql/98ae1ed2-e342f869.cleanup.sql
rename to include/upgrader/streams/core/98ae1ed2-e342f869.cleanup.sql
diff --git a/include/upgrader/sql/98ae1ed2-e342f869.patch.sql b/include/upgrader/streams/core/98ae1ed2-e342f869.patch.sql
similarity index 100%
rename from include/upgrader/sql/98ae1ed2-e342f869.patch.sql
rename to include/upgrader/streams/core/98ae1ed2-e342f869.patch.sql
diff --git a/include/upgrader/sql/9f3b454c-c0fd16f4.patch.sql b/include/upgrader/streams/core/9f3b454c-c0fd16f4.patch.sql
similarity index 100%
rename from include/upgrader/sql/9f3b454c-c0fd16f4.patch.sql
rename to include/upgrader/streams/core/9f3b454c-c0fd16f4.patch.sql
diff --git a/include/upgrader/sql/a67ba35e-98ae1ed2.patch.sql b/include/upgrader/streams/core/a67ba35e-98ae1ed2.patch.sql
similarity index 100%
rename from include/upgrader/sql/a67ba35e-98ae1ed2.patch.sql
rename to include/upgrader/streams/core/a67ba35e-98ae1ed2.patch.sql
diff --git a/include/upgrader/sql/aa4664af-b19dc97d.patch.sql b/include/upgrader/streams/core/aa4664af-b19dc97d.patch.sql
similarity index 100%
rename from include/upgrader/sql/aa4664af-b19dc97d.patch.sql
rename to include/upgrader/streams/core/aa4664af-b19dc97d.patch.sql
diff --git a/include/upgrader/sql/abe9c0cb-bbb021fb.patch.sql b/include/upgrader/streams/core/abe9c0cb-bbb021fb.patch.sql
similarity index 100%
rename from include/upgrader/sql/abe9c0cb-bbb021fb.patch.sql
rename to include/upgrader/streams/core/abe9c0cb-bbb021fb.patch.sql
diff --git a/include/upgrader/sql/aee589ab-98ae1ed2.patch.sql b/include/upgrader/streams/core/aee589ab-98ae1ed2.patch.sql
similarity index 100%
rename from include/upgrader/sql/aee589ab-98ae1ed2.patch.sql
rename to include/upgrader/streams/core/aee589ab-98ae1ed2.patch.sql
diff --git a/include/upgrader/sql/b19dc97d-435c62c3.patch.sql b/include/upgrader/streams/core/b19dc97d-435c62c3.patch.sql
similarity index 100%
rename from include/upgrader/sql/b19dc97d-435c62c3.patch.sql
rename to include/upgrader/streams/core/b19dc97d-435c62c3.patch.sql
diff --git a/include/upgrader/sql/bbb021fb-49478749.patch.sql b/include/upgrader/streams/core/bbb021fb-49478749.patch.sql
similarity index 100%
rename from include/upgrader/sql/bbb021fb-49478749.patch.sql
rename to include/upgrader/streams/core/bbb021fb-49478749.patch.sql
diff --git a/include/upgrader/sql/c00511c7-7be60a84.cleanup.sql b/include/upgrader/streams/core/c00511c7-7be60a84.cleanup.sql
similarity index 100%
rename from include/upgrader/sql/c00511c7-7be60a84.cleanup.sql
rename to include/upgrader/streams/core/c00511c7-7be60a84.cleanup.sql
diff --git a/include/upgrader/sql/c00511c7-7be60a84.patch.sql b/include/upgrader/streams/core/c00511c7-7be60a84.patch.sql
similarity index 100%
rename from include/upgrader/sql/c00511c7-7be60a84.patch.sql
rename to include/upgrader/streams/core/c00511c7-7be60a84.patch.sql
diff --git a/include/upgrader/sql/c0fd16f4-d959a00e.patch.sql b/include/upgrader/streams/core/c0fd16f4-d959a00e.patch.sql
similarity index 100%
rename from include/upgrader/sql/c0fd16f4-d959a00e.patch.sql
rename to include/upgrader/streams/core/c0fd16f4-d959a00e.patch.sql
diff --git a/include/upgrader/sql/c2d2fabf-aa4664af.patch.sql b/include/upgrader/streams/core/c2d2fabf-aa4664af.patch.sql
similarity index 100%
rename from include/upgrader/sql/c2d2fabf-aa4664af.patch.sql
rename to include/upgrader/streams/core/c2d2fabf-aa4664af.patch.sql
diff --git a/include/upgrader/sql/d0e37dca-1da1bcba.patch.sql b/include/upgrader/streams/core/d0e37dca-1da1bcba.patch.sql
similarity index 100%
rename from include/upgrader/sql/d0e37dca-1da1bcba.patch.sql
rename to include/upgrader/streams/core/d0e37dca-1da1bcba.patch.sql
diff --git a/include/upgrader/sql/d959a00e-32de1766.patch.sql b/include/upgrader/streams/core/d959a00e-32de1766.patch.sql
similarity index 100%
rename from include/upgrader/sql/d959a00e-32de1766.patch.sql
rename to include/upgrader/streams/core/d959a00e-32de1766.patch.sql
diff --git a/include/upgrader/sql/dd0022fb-f4da0c9b.patch.sql b/include/upgrader/streams/core/dd0022fb-f4da0c9b.patch.sql
similarity index 100%
rename from include/upgrader/sql/dd0022fb-f4da0c9b.patch.sql
rename to include/upgrader/streams/core/dd0022fb-f4da0c9b.patch.sql
diff --git a/include/upgrader/sql/e342f869-c00511c7.patch.sql b/include/upgrader/streams/core/e342f869-c00511c7.patch.sql
similarity index 100%
rename from include/upgrader/sql/e342f869-c00511c7.patch.sql
rename to include/upgrader/streams/core/e342f869-c00511c7.patch.sql
diff --git a/include/upgrader/sql/f4da0c9b-00ff231f.patch.sql b/include/upgrader/streams/core/f4da0c9b-00ff231f.patch.sql
similarity index 100%
rename from include/upgrader/sql/f4da0c9b-00ff231f.patch.sql
rename to include/upgrader/streams/core/f4da0c9b-00ff231f.patch.sql
diff --git a/include/upgrader/sql/f8856d56-abe9c0cb.patch.sql b/include/upgrader/streams/core/f8856d56-abe9c0cb.patch.sql
similarity index 100%
rename from include/upgrader/sql/f8856d56-abe9c0cb.patch.sql
rename to include/upgrader/streams/core/f8856d56-abe9c0cb.patch.sql
diff --git a/main.inc.php b/main.inc.php
index 6f7c93204..e5d19c0a4 100644
--- a/main.inc.php
+++ b/main.inc.php
@@ -70,13 +70,11 @@
     define('SETUP_DIR',INCLUDE_DIR.'setup/');
 
     define('UPGRADE_DIR', INCLUDE_DIR.'upgrader/');
-    define('SQL_DIR', UPGRADE_DIR.'sql/');
 
     /*############## Do NOT monkey with anything else beyond this point UNLESS you really know what you are doing ##############*/
 
     #Current version && schema signature (Changes from version to version)
     define('THIS_VERSION','1.7.0+'); //Shown on admin panel
-    define('SCHEMA_SIGNATURE', '740428f9986da6ad85f88ec841b57bfe'); //MD5 signature of the db schema. (used to trigger upgrades)
     #load config info
     $configfile='';
     if(file_exists(ROOT_DIR.'ostconfig.php')) //Old installs prior to v 1.6 RC5
diff --git a/scp/upgrade.php b/scp/upgrade.php
index c66230a22..4be64dc3b 100644
--- a/scp/upgrade.php
+++ b/scp/upgrade.php
@@ -17,7 +17,7 @@ require_once 'admin.inc.php';
 require_once INCLUDE_DIR.'class.upgrader.php';
 
 //$_SESSION['ost_upgrader']=null;
-$upgrader = new Upgrader($cfg->getSchemaSignature(), TABLE_PREFIX, SQL_DIR);
+$upgrader = new Upgrader(TABLE_PREFIX, UPGRADE_DIR.'streams/');
 $errors=array();
 if($_POST && $_POST['s'] && !$upgrader->isAborted()) {
     switch(strtolower($_POST['s'])) {
-- 
GitLab