diff --git a/phpgwapi/inc/class.setup_process.inc.php b/phpgwapi/inc/class.setup_process.inc.php
new file mode 100644
index 0000000000..19db411d73
--- /dev/null
+++ b/phpgwapi/inc/class.setup_process.inc.php
@@ -0,0 +1,877 @@
+ *
+ * Originally written for phpGroupWare. *
+ * (C) 2001-2004 Miles Lott *
+ * -------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU General Public License as published by the *
+ * Free Software Foundation; either version 2 of the License, or (at your *
+ * option) any later version. *
+ \**************************************************************************/
+ /* $Id$ */
+
+ /* app status values:
+ U Upgrade required/available
+ R upgrade in pRogress
+ C upgrade Completed successfully
+ D Dependency failure
+ F upgrade Failed
+ V Version mismatch at end of upgrade (Not used, proposed only)
+ M Missing files at start of upgrade (Not used, proposed only)
+ */
+
+ class setup_process
+ {
+ var $oProc;
+ var $tables;
+ var $updateincluded = array();
+ var $translation;
+
+ function setup_process()
+ {
+ $this->translation = CreateObject('phpgwapi.setup_translation');
+ }
+
+ /*!
+ @function init_process
+ @abstract create schema_proc object
+ @param none
+ */
+ function init_process()
+ {
+ $ConfigDomain = get_var('ConfigDomain',array('COOKIE','POST'));
+ $phpgw_domain = $GLOBALS['phpgw_domain'];
+
+ $GLOBALS['phpgw_setup']->oProc = CreateObject('phpgwapi.schema_proc',$phpgw_domain[$ConfigDomain]['db_type']);
+ $GLOBALS['phpgw_setup']->oProc->m_odb = $GLOBALS['phpgw_setup']->db;
+ $GLOBALS['phpgw_setup']->oProc->m_odb->Host = $phpgw_domain[$ConfigDomain]['db_host'];
+ $GLOBALS['phpgw_setup']->oProc->m_odb->Database = $phpgw_domain[$ConfigDomain]['db_name'];
+ $GLOBALS['phpgw_setup']->oProc->m_odb->User = $phpgw_domain[$ConfigDomain]['db_user'];
+ $GLOBALS['phpgw_setup']->oProc->m_odb->Password = $phpgw_domain[$ConfigDomain]['db_pass'];
+ $GLOBALS['phpgw_setup']->oProc->m_odb->Halt_On_Error = 'report';
+ $GLOBALS['phpgw_setup']->oProc->m_odb->connect();
+ }
+
+ /*!
+ @function pass
+ @abstract the mother of all multipass upgrade parental loop functions
+ @param $setup_info array of application info from setup.inc.php files
+ @param $type optional, defaults to new(install), could also be 'upgrade'
+ @param $DEBUG optional, print debugging info
+ @param $force_en optional, install english language files
+ */
+ function pass($setup_info,$method='new',$DEBUG=False,$force_en=False)
+ {
+ if(!$method)
+ {
+ return False;
+ }
+ // Place api first
+ $pass['phpgwapi'] = $setup_info['phpgwapi'];
+ $pass['admin'] = $setup_info['admin'];
+ $pass['preferences'] = $setup_info['preferences'];
+ @reset($setup_info);
+ $setup_info = $GLOBALS['phpgw_setup']->detection->get_versions($setup_info);
+ @reset($setup_info);
+
+ $i = 1;
+ $passed = array();
+ $passing = array();
+ $pass_string = implode (':', $pass);
+ $passing_string = implode (':', $passing);
+ while($pass_string != $passing_string)
+ {
+ $passing = array();
+ if($DEBUG) { echo '
process->pass(): #' . $i . ' for ' . $method . ' processing' . "\n"; }
+ /* Check current versions and dependencies */
+ $setup_info = $GLOBALS['phpgw_setup']->detection->get_db_versions($setup_info);
+ $setup_info = $GLOBALS['phpgw_setup']->detection->compare_versions($setup_info);
+ //_debug_array($setup_info);exit;
+ $setup_info = $GLOBALS['phpgw_setup']->detection->check_depends($setup_info);
+ //if($i==2) { _debug_array($passed);exit; }
+
+ /* stuff the rest of the apps, but only those with available upgrades */
+ while(list($key,$value) = @each($setup_info))
+ {
+ if(($value['name'] != 'phpgwapi') && ($value['status'] == 'U'))
+ {
+ if(($passed[$value['name']]['status'] != 'F') && ($passed[$value['name']]['status'] != 'C'))
+ {
+ $pass[$value['name']] = $setup_info[$value['name']];
+ }
+ }
+ /*
+ Now if we are on the 2nd or more passes, add api in
+ if (!$pass['phpgwapi'])
+ {
+ $pass['phpgwapi'] = $setup_info['phpgwapi'];
+ }
+ */
+ }
+
+ switch($method)
+ {
+ case 'new':
+ /* Create tables and insert new records for each app in this list */
+ $passing = $this->current($pass,$DEBUG);
+ $passing = $this->default_records($passing,$DEBUG);
+ $passing = $this->add_langs($passing,$DEBUG,array(get_var('ConfigLang',Array('POST','COOKIE')),'en'));
+ $this->save_minimal_config();
+ break;
+ case 'upgrade':
+ /* Run upgrade scripts on each app in the list */
+ $passing = $this->upgrade($pass,$DEBUG);
+ $passing = $this->upgrade_langs($passing,$DEBUG);
+ //_debug_array($pass);exit;
+ break;
+ default:
+ /* What the heck are you doing? */
+ return False;
+ break;
+ }
+
+ $pass = array();
+ @reset($passing);
+ while(list($key,$value) = @each($passing))
+ {
+ if($value['status'] == 'C')
+ {
+ $passed[$value['name']] = $passing[$value['name']];
+ if($DEBUG) { echo '
process->pass(): '.$passed[$value['name']]['name'] . ' install completed'."\n"; }
+ }
+ elseif($value['status'] == 'F')
+ {
+ $setup_info[$value['name']] = $passing[$value['name']];
+ if($DEBUG) { echo '
process->pass(): '.$setup_info[$value['name']]['name'] . ' install failed'."\n"; }
+ }
+ elseif($value['status'] == 'D')
+ {
+ $pass[$value['name']] = $setup_info[$value['name']];
+ if($DEBUG) { echo '
process->pass(): '.$pass[$value['name']]['name'] . ' fails dependency check on this pass'."\n"; }
+ }
+ else
+ {
+ $tmp = $passing[$value['name']]['name'];
+ if($DEBUG) { echo '
process->pass(): '.$tmp . ' skipped on this pass'."\n"; }
+ }
+ }
+
+ $i++;
+ if($i == 20) /* Then oops it broke */
+ {
+ echo '
Setup failure: excess looping in process->pass():'."\n";
+ echo '
Pass:
'."\n";
+ _debug_array($pass);
+ echo '
Passed:
'."\n";
+ _debug_array($passed);
+ exit;
+ }
+ $pass_string = implode (':', $pass);
+ $passing_string = implode (':', $passing);
+ }
+
+ /* now return the list */
+ @reset($passed);
+ while(list($key,$value) = @each($passed))
+ {
+ $setup_info[$value['name']] = $passed[$value['name']];
+ }
+
+ return ($setup_info);
+ }
+
+ /*!
+ @function save_minimal_config
+ @abstract saves a minimal default config, so you get a running install without entering and saveing Step #2 config
+ */
+ function save_minimal_config()
+ {
+ $GLOBALS['current_config']['site_title'] = 'eGroupWare';
+ $GLOBALS['current_config']['hostname'] = $_SERVER['HTTP_HOST'];
+ // files-dir is not longer allowed in document root, for security reasons !!!
+ $GLOBALS['current_config']['files_dir'] = '/outside/webserver/docroot';
+
+ if(@is_dir('/tmp'))
+ {
+ $GLOBALS['current_config']['temp_dir'] = '/tmp';
+ }
+ elseif(@is_dir('c:\\temp'))
+ {
+ $GLOBALS['current_config']['temp_dir'] = 'c:\\temp';
+ }
+ else
+ {
+ $GLOBALS['current_config']['temp_dir'] = '/path/to/temp/dir';
+ }
+ // guessing the phpGW url
+ $parts = explode('/',$_SERVER['PHP_SELF']);
+ array_pop($parts); // remove config.php
+ array_pop($parts); // remove setup
+ $GLOBALS['current_config']['webserver_url'] = implode('/',$parts);
+
+ $datetime = CreateObject('phpgwapi.datetime');
+ $GLOBALS['current_config']['tz_offset'] = $datetime->getbestguess();
+ unset($datetime);
+
+ // RalfBecker: php.net recommend this for security reasons, it should be our default too
+ $GLOBALS['current_config']['usecookies'] = 'True';
+
+ foreach($GLOBALS['current_config'] as $setting => $value)
+ {
+ $setting = $GLOBALS['phpgw_setup']->db->db_addslashes($setting);
+ $value = $GLOBALS['phpgw_setup']->db->db_addslashes($value);
+ @$GLOBALS['phpgw_setup']->db->query("DELETE FROM phpgw_config WHERE config_app='phpgwapi' AND config_name='$setting'",__LINE__,__FILE__);
+ $GLOBALS['phpgw_setup']->db->query("INSERT INTO phpgw_config (config_app,config_name, config_value) VALUES ('phpgwapi','$setting','$value')");
+ }
+ }
+
+ /*!
+ @function droptables
+ @abstract drop tables per application, check that they are in the db first
+ @param $setup_info array of application info from setup.inc.php files, etc.
+ */
+ function droptables($setup_info,$DEBUG=False)
+ {
+ if(!@$GLOBALS['phpgw_setup']->oProc)
+ {
+ $this->init_process();
+ }
+ $GLOBALS['phpgw_setup']->oProc->m_bDeltaOnly = False;
+
+ /* The following is built so below we won't try to drop a table that isn't there. */
+ $tablenames = $GLOBALS['phpgw_setup']->db->table_names();
+ if (!is_array($setup_info) || !is_array($tablenames))
+ {
+ return $setup_info; // nothing to do
+ }
+ $tables = array();
+ foreach($tablenames as $data)
+ {
+ $tables[] = $data['table_name'];
+ }
+
+ if (!is_array($setup_info))
+ {
+ return $setup_info;
+ }
+ foreach($setup_info as $app_name => $data)
+ {
+ if(is_array($data['tables']))
+ {
+ foreach($data['tables'] as $table)
+ {
+ //echo $table;
+ if(in_array($table,$tables))
+ {
+ if($DEBUG){ echo '
process->droptables(): Dropping :'. $app_name . ' table: ' . $table; }
+ $GLOBALS['phpgw_setup']->oProc->DropTable($table);
+ // Update the array values for return below
+ $setup_info[$app_name]['status'] = 'U';
+ }
+ }
+ }
+ }
+
+ /* Done, return current status */
+ return $setup_info;
+ }
+
+ /*!
+ @function current
+ @abstract process current table setup in each application/setup dir
+ @param $appinfo array of application info from setup.inc.php files, etc.
+ @discussion This duplicates the old newtables behavior, using schema_proc
+ */
+ function current($setup_info,$DEBUG=False)
+ {
+ if(!@$GLOBALS['phpgw_setup']->oProc)
+ {
+ $this->init_process();
+ }
+ $GLOBALS['phpgw_setup']->oProc->m_bDeltaOnly = False;
+
+ @reset($setup_info);
+ while(list($key,$null) = @each($setup_info))
+ {
+ $enabled = False;
+ $appname = $setup_info[$key]['name'];
+ $apptitle = $setup_info[$key]['title'];
+
+ if($DEBUG) { echo '
process->current(): Incoming status: ' . $appname . ',status: '. $setup_info[$key]['status']; }
+
+ $appdir = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'setup' . SEP;
+
+ if($setup_info[$key]['tables'] && file_exists($appdir.'tables_current.inc.php'))
+ {
+ if($DEBUG) { echo '
process->current(): Including: ' . $appdir.'tables_current.inc.php'; }
+ include ($appdir.'tables_current.inc.php');
+ $ret = $this->post_process($phpgw_baseline,$DEBUG);
+ if($ret)
+ {
+ if($GLOBALS['phpgw_setup']->app_registered($appname))
+ {
+ $GLOBALS['phpgw_setup']->update_app($appname);
+ $GLOBALS['phpgw_setup']->update_hooks($appname);
+ }
+ else
+ {
+ $GLOBALS['phpgw_setup']->register_app($appname);
+ $GLOBALS['phpgw_setup']->register_hooks($appname);
+ }
+ // Update the array values for return below
+ $setup_info[$key]['status'] = 'C';
+ }
+ else
+ {
+ /* script processing failed */
+ if($DEBUG) { echo '
process->current(): Failed for ' . $appname . ',status: '. $setup_info[$key]['status']; }
+ $setup_info[$key]['status'] = 'F';
+ }
+ }
+ else
+ {
+ if($DEBUG) { echo '
process->current(): No current tables for ' . $apptitle . "\n"; }
+ /*
+ Add the app, but disable it if it has tables defined.
+ A manual sql script install is needed, but we do add the hooks
+ */
+ $enabled = 99;
+ if($setup_info[$key]['tables'][0] != '')
+ {
+ $enabled = False;
+ }
+ if($GLOBALS['phpgw_setup']->app_registered($appname))
+ {
+ $GLOBALS['phpgw_setup']->update_app($appname);
+ $GLOBALS['phpgw_setup']->update_hooks($appname);
+ }
+ else
+ {
+ $GLOBALS['phpgw_setup']->register_app($appname,$enabled);
+ $GLOBALS['phpgw_setup']->register_hooks($appname);
+ }
+ $setup_info[$key]['status'] = 'C';
+ }
+ if($DEBUG) { echo '
process->current(): Outgoing status: ' . $appname . ',status: '. $setup_info[$key]['status']; }
+ }
+
+ /* Done, return current status */
+ return ($setup_info);
+ }
+
+ /*!
+ @function default_records
+ @abstract process default_records.inc.php in each application/setup dir
+ @param $setup_info array of application info from setup.inc.php files, etc.
+ */
+ function default_records($setup_info,$DEBUG=False)
+ {
+ if(!@$GLOBALS['phpgw_setup']->oProc)
+ {
+ $this->init_process();
+ }
+ $GLOBALS['phpgw_setup']->oProc->m_bDeltaOnly = False;
+// $oProc = $GLOBALS['phpgw_setup']->oProc;
+
+ @reset($setup_info);
+ while(list($key,$null) = @each($setup_info))
+ {
+ $appname = $setup_info[$key]['name'];
+ $appdir = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'setup' . SEP;
+
+ if($setup_info[$key]['tables'] && file_exists($appdir.'default_records.inc.php'))
+ {
+ if($DEBUG)
+ {
+ echo '
process->default_records(): Including default records for ' . $appname . "\n";
+ }
+ $GLOBALS['phpgw_setup']->oProc->m_odb->transaction_begin();
+ $oProc = &$GLOBALS['phpgw_setup']->oProc; // to be compatible with old apps
+ include ($appdir.'default_records.inc.php');
+ $GLOBALS['phpgw_setup']->oProc->m_odb->transaction_commit();
+ }
+ /* $setup_info[$key]['status'] = 'C'; */
+ }
+
+ /* Done, return current status */
+ return ($setup_info);
+ }
+
+ /*!
+ @function add_langs
+ @abstract process application lang files and uninstall
+ @param $setup_info array of application info from setup.inc.php files, etc.
+ */
+ function add_langs($setup_info,$DEBUG=False,$force_langs=False)
+ {
+ @reset($setup_info);
+ while(list($key,$null) = @each($setup_info))
+ {
+ $appname = $setup_info[$key]['name'];
+ $this->translation->add_langs($appname,$DEBUG,$force_langs);
+ if($DEBUG)
+ {
+ echo '
process->add_langs(): Translations added for ' . $appname . "\n";
+ }
+ }
+ /* Done, return current status */
+ return ($setup_info);
+ }
+
+ /*!
+ @function drop_langs
+ @abstract process application lang files and install
+ @param $setup_info array of application info from setup.inc.php files, etc.
+ */
+ function drop_langs($setup_info,$DEBUG=False)
+ {
+ @reset($setup_info);
+ while(list($key,$null) = @each($setup_info))
+ {
+ $appname = $setup_info[$key]['name'];
+ $this->translation->drop_langs($appname,$DEBUG);
+ if($DEBUG)
+ {
+ echo '
process->drop_langs(): Translations removed for ' . $appname . "\n";
+ }
+ }
+ /* Done, return current status */
+ return ($setup_info);
+ }
+
+ /*!
+ @function upgrade_langs
+ @abstract process application lang files and reinstall
+ @param $setup_info array of application info from setup.inc.php files, etc.
+ */
+ function upgrade_langs($setup_info,$DEBUG=False)
+ {
+ @reset($setup_info);
+ while(list($key,$null) = @each($setup_info))
+ {
+ /* Don't upgrade lang files in the middle of an upgrade */
+ if($setup_info[$key]['status'] == 'R')
+ {
+ continue;
+ }
+ $appname = $setup_info[$key]['name'];
+ $this->translation->drop_langs($appname,$DEBUG);
+ $this->translation->add_langs($appname,$DEBUG);
+ if($DEBUG)
+ {
+ echo '
process->upgrade_langs(): Translations reinstalled for ' . $appname . "\n";
+ }
+ }
+ /* Done, return current status */
+ return ($setup_info);
+ }
+
+ /*!
+ @function test_data
+ @abstract process test_data.inc.php in each application/setup dir for developer tests
+ This data should work with the baseline tables
+ @param $setup_info array of application info from setup.inc.php files, etc.
+ */
+ function test_data($setup_info,$DEBUG=False)
+ {
+ if(!@$GLOBALS['phpgw_setup']->oProc)
+ {
+ $this->init_process();
+ }
+ $GLOBALS['phpgw_setup']->oProc->m_bDeltaOnly = False;
+// $oProc = $GLOBALS['phpgw_setup']->oProc;
+
+ @reset($setup_info);
+ while(list($key,$null) = @each($setup_info))
+ {
+ $appname = $setup_info[$key]['name'];
+ $appdir = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'setup' . SEP;
+
+ if(file_exists($appdir.'test_data.inc.php'))
+ {
+ if($DEBUG)
+ {
+ echo '
process->test_data(): Including baseline test data for ' . $appname . "\n";
+ }
+ $GLOBALS['phpgw_setup']->oProc->m_odb->transaction_begin();
+ include ($appdir.'test_data.inc.php');
+ $GLOBALS['phpgw_setup']->oProc->m_odb->transaction_commit();
+ }
+ }
+
+ /* Done, return current status */
+ return ($setup_info);
+ }
+
+ /*!
+ @function baseline
+ @abstract process baseline table setup in each application/setup dir
+ @param $appinfo array of application info from setup.inc.php files, etc.
+ */
+ function baseline($setup_info,$DEBUG=False)
+ {
+ if(!@$GLOBALS['phpgw_setup']->oProc)
+ {
+ $this->init_process();
+ }
+
+ @reset($setup_info);
+ while(list($key,$null) = @each($setup_info))
+ {
+ $appname = $setup_info[$key]['name'];
+ $appdir = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'setup' . SEP;
+
+ if(file_exists($appdir.'tables_baseline.inc.php'))
+ {
+ if($DEBUG)
+ {
+ echo '
process->baseline(): Including baseline tables for ' . $appname . "\n";
+ }
+ include ($appdir.'tables_baseline.inc.php');
+ $GLOBALS['phpgw_setup']->oProc->GenerateScripts($phpgw_baseline, $DEBUG);
+ $this->post_process($phpgw_baseline,$DEBUG);
+
+ /* Update the array values for return below */
+ /* $setup_info[$key]['status'] = 'R'; */
+ }
+ else
+ {
+ if($DEBUG)
+ {
+ echo '
process->baseline(): No baseline tables for ' . $appname . "\n";
+ }
+ //$setup_info[$key]['status'] = 'C';
+ }
+ }
+
+ /* Done, return current status */
+ return ($setup_info);
+ }
+
+ /*!
+ @function upgrade
+ @abstract process available upgrades in each application/setup dir
+ @param $appinfo array of application info from setup.inc.php files, etc.
+ */
+ function upgrade($setup_info,$DEBUG=False)
+ {
+ if(!@$GLOBALS['phpgw_setup']->oProc)
+ {
+ $this->init_process();
+ }
+ $GLOBALS['phpgw_setup']->oProc->m_odb->HaltOnError = 'no';
+ $GLOBALS['phpgw_setup']->oProc->m_bDeltaOnly = True;
+
+ @reset($setup_info);
+ while(list($key,$null) = @each($setup_info))
+ {
+ /* Don't try to upgrade an app that is not installed */
+ if(!$GLOBALS['phpgw_setup']->app_registered($setup_info[$key]['name']))
+ {
+ if($DEBUG)
+ {
+ echo '
process->upgrade(): Application not installed: ' . $appname . "\n";
+ }
+ unset($setup_info[$key]);
+ continue;
+ }
+
+ /* if upgrade required, or if we are running again after an upgrade or dependency failure */
+ if($DEBUG) { echo '
process->upgrade(): Incoming : appname: '.$setup_info[$key]['name'] . ' status: ' . $setup_info[$key]['status']; }
+ if($setup_info[$key]['status'] == 'U' ||
+ $setup_info[$key]['status'] == 'D' ||
+ $setup_info[$key]['status'] == 'V' ||
+ $setup_info[$key]['status'] == '') // TODO this is not getting set for api upgrade, sometimes ???
+ {
+ $appname = $setup_info[$key]['name'];
+ $apptitle = $setup_info[$key]['title'];
+ $currentver = $setup_info[$key]['currentver'];
+ $targetver = $setup_info[$key]['version']; // The version we need to match when done
+ $appdir = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'setup' . SEP;
+
+ $test = array();
+ $GLOBALS['phpgw_setup']->oProc->m_aTables = $phpgw_baseline = array();
+/*
+ $phpgw_baseline = array();
+
+ $tmpapp = array();
+ $tmpapp[] = $setup_info[$key];
+ $this->baseline($tmpapp,$DEBUG);
+ $GLOBALS['phpgw_setup']->oProc->m_aTables = $phpgw_baseline;
+ // So far, including the baseline file is not helping.
+ // Only AlterColumn/RenameColumn seem to be failing silently.
+ // This is because we are not keeping up with table changes, so a table in baseline
+ // either does not exist anymore, or the baseline is being lost.
+ // 10-18-2003 milosch - The baseline file is definitely needed for any app with and update file.
+*/
+ if($setup_info[$key]['tables'] && file_exists($appdir.'tables_baseline.inc.php'))
+ {
+ if($DEBUG)
+ {
+ echo '
process->baseline(): Including baseline tables for ' . $appname . "\n";
+ }
+ include ($appdir.'tables_baseline.inc.php');
+ $GLOBALS['phpgw_setup']->oProc->m_aTables = $phpgw_baseline;
+ /* $GLOBALS['phpgw_setup']->oProc->GenerateScripts($phpgw_baseline, $DEBUG); */
+ }
+ else
+ {
+ if($DEBUG)
+ {
+ echo '
process->baseline(): No baseline tables for ' . $appname . "\n";
+ }
+ /* This should be a break with a status setting, or not at all
+ break;
+ */
+ }
+ if(file_exists($appdir . 'tables_update.inc.php') && !@$this->updateincluded[$appname])
+ {
+ include ($appdir . 'tables_update.inc.php');
+ $this->updateincluded[$appname] = True;
+
+ /* $test array comes from update file. It is a list of available upgrade functions */
+ @reset($test);
+ while(list($x,$value) = @each($test))
+ {
+ $this->currentversion = $currentver = $setup_info[$key]['currentver'];
+
+ /* build upgrade function name */
+ $function = $appname . '_upgrade' . str_replace(".", '_', $value);
+
+ if($DEBUG)
+ {
+ echo '
process->upgrade(): appname: ' . $appname;
+ echo '
process->upgrade(): currentver: ' . $currentver;
+ echo '
process->upgrade(): targetver: ' . $targetver;
+ echo '
process->upgrade(): status: ' . $setup_info[$key]['status'];
+ echo '
process->upgrade(): checking: ' . $value;
+ echo '
process->upgrade(): function: ' . $function;
+ }
+
+ if($value == $targetver)
+ {
+ $GLOBALS['phpgw_setup']->oProc->m_bDeltaOnly = False;
+ /* Done upgrading */
+ if($DEBUG)
+ {
+ echo '
process->upgrade(): Upgrade of ' . $appname . ' to ' . $targetver . ' is completed.' . "\n";
+ }
+ $appstatus = 'C';
+ $setup_info[$key]['status'] = $appstatus;
+ $setup_info[$key]['currentver'] = $targetver;
+ if($GLOBALS['phpgw_setup']->app_registered($appname))
+ {
+ $GLOBALS['phpgw_setup']->update_app($appname);
+ $GLOBALS['phpgw_setup']->update_hooks($appname);
+ }
+ else
+ {
+ $GLOBALS['phpgw_setup']->register_app($appname);
+ $GLOBALS['phpgw_setup']->register_hooks($appname);
+ }
+ //break;
+ }
+ elseif(($value == $currentver) || !$currentver)
+ {
+ /* start upgrading db in addition to baseline */
+ $GLOBALS['phpgw_setup']->oProc->m_bDeltaOnly = False;
+ if($DEBUG) { echo '
process->upgrade(): running ' . $function; }
+ /* run upgrade function */
+ $success = $function();
+ if($success != False)
+ {
+ $setup_info[$key]['currentver'] = $success;
+ if($DEBUG)
+ {
+ echo '
process->upgrade(): Upgrade of ' . $appname
+ . ' from ' . $value
+ . ' to ' . $setup_info[$key]['currentver']
+ . ' is completed.' . "\n";
+ }
+ $appstatus = 'R';
+ $setup_info[$key]['status'] = $appstatus;
+ if($GLOBALS['phpgw_setup']->app_registered($appname))
+ {
+ if($DEBUG)
+ {
+ echo '
process->upgrade(): Updating registration of ' . $appname . ', new version: ' . $setup_info[$key]['currentver'];
+ }
+ $GLOBALS['phpgw_setup']->update_app($appname);
+ $GLOBALS['phpgw_setup']->update_hooks($appname);
+ }
+ else
+ {
+ if($DEBUG)
+ {
+ echo '
process->upgrade(): Registering ' . $appname . ', version: ' . $setup_info[$key]['currentver'];
+ }
+ $GLOBALS['phpgw_setup']->register_app($appname);
+ $GLOBALS['phpgw_setup']->register_hooks($appname);
+ }
+ // is the next update the one we need?
+ if ($success && $test[$x+1] != $success &&
+ ($num = array_search($success,$test)) !== False)
+ {
+ // do we have the needed update somewhere else in the row?
+ // if yes, position the array-pointer just before that update and continue
+ reset($test);
+ while((list($x,$value) = each($test)) && $x < $num-1);
+ continue;
+ }
+ }
+ else
+ {
+ if($DEBUG)
+ {
+ echo '
process->upgrade(): Upgrade of ' . $appname
+ . ' from ' . $currentver
+ . ' to ' . $value
+ . ' failed!!!' . "\n";
+ }
+ $appstatus = 'F';
+ break;
+ }
+ }
+ elseif ($GLOBALS['phpgw_setup']->alessthanb($value,$currentver))
+ {
+ if($DEBUG) { echo '
process->upgrade(): running baseline delta only: ' . $function . '...'; }
+ $GLOBALS['phpgw_setup']->oProc->m_bDeltaOnly = True;
+ $success = $function();
+
+ // is the next update the one we need?
+ if ($success && $test[$x+1] != $success &&
+ ($num = array_search($success,$test)) !== False)
+ {
+ // do we have the needed update somewhere else in the row?
+ // if yes, position the array-pointer just before that update and continue
+ reset($test);
+ while((list($x,$value) = each($test)) && $x < $num-1);
+ continue;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ if($setup_info[$appname]['tables'])
+ {
+ $appstatus = 'F';
+
+ if($DEBUG)
+ {
+ echo '
process->upgrade(): No table upgrade available for ' . $appname . "\n";
+ }
+ }
+ else
+ {
+ $setup_info[$key]['currentver'] == $targetver;
+ $appstatus = 'C';
+ if($GLOBALS['phpgw_setup']->app_registered($appname))
+ {
+ $GLOBALS['phpgw_setup']->update_app($appname);
+ $GLOBALS['phpgw_setup']->update_hooks($appname);
+ }
+ else
+ {
+ $GLOBALS['phpgw_setup']->register_app($appname);
+ $GLOBALS['phpgw_setup']->register_hooks($appname);
+ }
+
+ if($DEBUG)
+ {
+ echo '
process->upgrade(): No table upgrade required for ' . $appname . "\n";
+ }
+ }
+ }
+ }
+ else
+ {
+ $appstatus = 'C';
+ if($DEBUG)
+ {
+ echo '
process->upgrade(): No upgrade required for ' . $appname . "\n";
+ }
+ }
+
+ /* Done with this app, update status */
+ $setup_info[$key]['status'] = $appstatus;
+ if($DEBUG)
+ {
+ echo '
process->upgrade(): Outgoing : appname: '.$setup_info[$key]['name'] . ' status: ' . $setup_info[$key]['status'];
+ }
+ }
+
+ /* Done, return current status */
+ return ($setup_info);
+ }
+
+ /*!
+ @function post_process
+ @abstract commit above processing to the db
+ */
+ function post_process($tables,$DEBUG=False)
+ {
+ if(!$tables)
+ {
+ return False;
+ }
+
+ $ret = $GLOBALS['phpgw_setup']->oProc->GenerateScripts($tables,$DEBUG);
+ if($ret)
+ {
+ $oret = $GLOBALS['phpgw_setup']->oProc->ExecuteScripts($tables,$DEBUG);
+ if($oret)
+ {
+ return True;
+ }
+ else
+ {
+ return False;
+ }
+ }
+ else
+ {
+ return False;
+ }
+ }
+
+ /*!
+ @function sql_to_array
+ @abstract send this a table name, returns printable column spec and keys for the table from schema_proc
+ @param $tablename table whose array you want to see
+ */
+ function sql_to_array($tablename='')
+ {
+ if(!$tablename)
+ {
+ return False;
+ }
+
+ if(!$GLOBALS['phpgw_setup']->oProc)
+ {
+ $this->init_process();
+ }
+
+ $GLOBALS['phpgw_setup']->oProc->m_oTranslator->_GetColumns($GLOBALS['phpgw_setup']->oProc, $tablename, $sColumns, $sColumnName);
+
+ while(list($key,$tbldata) = each($GLOBALS['phpgw_setup']->oProc->m_oTranslator->sCol))
+ {
+ $arr .= $tbldata;
+ }
+ $pk = $GLOBALS['phpgw_setup']->oProc->m_oTranslator->pk;
+ $fk = $GLOBALS['phpgw_setup']->oProc->m_oTranslator->fk;
+ $ix = $GLOBALS['phpgw_setup']->oProc->m_oTranslator->ix;
+ $uc = $GLOBALS['phpgw_setup']->oProc->m_oTranslator->uc;
+
+ return array($arr,$pk,$fk,$ix,$uc);
+ }
+ }
+?>