From 7334d4dcbe65e40236e179716a4dbed75c96816c Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Fri, 23 Aug 2013 10:51:10 +0000
Subject: [PATCH] Merged revision 4125 from stable branch.

---
 install/install.php          |  2 ++
 install/lib/update.lib.php   | 44 ++++++++++++++++++++++++++++++++----
 install/patches/upd_0001.php | 21 +++++++++++++++++
 install/update.php           |  2 ++
 4 files changed, 64 insertions(+), 5 deletions(-)
 create mode 100644 install/patches/upd_0001.php

diff --git a/install/install.php b/install/install.php
index c6b85a3beb..00391d5a03 100644
--- a/install/install.php
+++ b/install/install.php
@@ -34,6 +34,8 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 error_reporting(E_ALL|E_STRICT);
 
+define('INSTALLER_RUN', true);
+
 //** The banner on the command line
 echo "\n\n".str_repeat('-',80)."\n";
 echo " _____ ___________   _____              __ _         ____
diff --git a/install/lib/update.lib.php b/install/lib/update.lib.php
index 5beca81020..8362b8aaf8 100644
--- a/install/lib/update.lib.php
+++ b/install/lib/update.lib.php
@@ -27,6 +27,15 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+//* Installer patch stub class
+class installer_patch_update {
+   protected function onBeforeSQL() {
+   }
+   protected function onAfterSQL() {
+   }
+}
+
+//* DB dump function
 function prepareDBDump() {
 	global $conf;
 
@@ -151,16 +160,39 @@ function updateDbAndIni() {
 		$found = true;
 		while($found == true) {
 			$next_db_version = intval($current_db_version + 1);
-			$patch_filename = realpath(dirname(__FILE__).'/../').'/sql/incremental/upd_'.str_pad($next_db_version, 4, '0', STR_PAD_LEFT).'.sql';
-			if(is_file($patch_filename)) {
+			$sql_patch_filename = realpath(dirname(__FILE__).'/../').'/sql/incremental/upd_'.str_pad($next_db_version, 4, '0', STR_PAD_LEFT).'.sql';
+			$php_patch_filename = realpath(dirname(__FILE__).'/../').'/patches/upd_'.str_pad($next_db_version, 4, '0', STR_PAD_LEFT).'.php';
+			
+			if(is_file($sql_patch_filename)) {
+				
+				//* Load php patch file and instantiate object
+				if(is_file($php_patch_filename)) {
+					$php_patch_class_name = 'upd_'.str_pad($next_db_version, 4, '0', STR_PAD_LEFT);
+					include_once($php_patch_filename);
+					$php_patch = new $php_patch_class_name;
+				}
+				
+				//* Exec onBeforeSQL function
+				if(isset($php_patch) && is_object($php_patch)) {
+					$php_patch->onBeforeSQL();
+					swriteln($inst->lng('Executing PHP patch file').': '.$php_patch_filename);
+				}
+				
 				//* Load patch file into database
 				if( !empty($conf["mysql"]["admin_password"]) ) {
-					system("mysql --default-character-set=".escapeshellarg($conf['mysql']['charset'])." --force -h ".escapeshellarg($conf['mysql']['host'])." -u ".escapeshellarg($conf['mysql']['admin_user'])." -p".escapeshellarg($conf['mysql']['admin_password'])." ".escapeshellarg($conf['mysql']['database'])." < ".$patch_filename);
+					system("mysql --default-character-set=".escapeshellarg($conf['mysql']['charset'])." --force -h ".escapeshellarg($conf['mysql']['host'])." -u ".escapeshellarg($conf['mysql']['admin_user'])." -p".escapeshellarg($conf['mysql']['admin_password'])." ".escapeshellarg($conf['mysql']['database'])." < ".$sql_patch_filename);
 				} else {
-					system("mysql --default-character-set=".escapeshellarg($conf['mysql']['charset'])." --force -h ".escapeshellarg($conf['mysql']['host'])." -u ".escapeshellarg($conf['mysql']['admin_user'])." ".escapeshellarg($conf['mysql']['database'])." < ".$patch_filename);
+					system("mysql --default-character-set=".escapeshellarg($conf['mysql']['charset'])." --force -h ".escapeshellarg($conf['mysql']['host'])." -u ".escapeshellarg($conf['mysql']['admin_user'])." ".escapeshellarg($conf['mysql']['database'])." < ".$sql_patch_filename);
+				}
+				swriteln($inst->lng('Loading SQL patch file').': '.$sql_patch_filename);
+				
+				//* Exec onAfterSQL function
+				if(isset($php_patch) && is_object($php_patch)) {
+					$php_patch->onAfterSQL();
 				}
-				swriteln($inst->lng('Loading SQL patch file').': '.$patch_filename);
+				
 				$current_db_version = $next_db_version;
+				if(isset($php_patch)) unset($php_patch);
 			} else {
 				$found = false;
 			}
@@ -332,4 +364,6 @@ function updateDbAndIni() {
 	unset($new_ini);
 }
 
+
+
 ?>
diff --git a/install/patches/upd_0001.php b/install/patches/upd_0001.php
new file mode 100644
index 0000000000..93d6967b9d
--- /dev/null
+++ b/install/patches/upd_0001.php
@@ -0,0 +1,21 @@
+<?php
+
+if(!defined('INSTALLER_RUN')) die('Patch update file access violation.'); 
+
+/*
+	Example installer patch update class. the classname must match
+	the php and the sql patch update filename. The php patches are
+	only executed when a corresponding sql patch exists.
+*/
+
+class upd_0001 extends installer_patch_update {
+
+   public function onBeforeSQL() {
+     // Do something
+   }
+   public function onAfterSQL() {
+     // Do something
+   }
+}
+
+?>
diff --git a/install/update.php b/install/update.php
index b7753dc7e7..cbaeaed2aa 100644
--- a/install/update.php
+++ b/install/update.php
@@ -34,6 +34,8 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 error_reporting(E_ALL|E_STRICT);
 
+define('INSTALLER_RUN', true);
+
 //** The banner on the command line
 echo "\n\n".str_repeat('-',80)."\n";
 echo " _____ ___________   _____              __ _         ____
-- 
GitLab