. * * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, * California 94120-7775, or email info@knowledgetree.com. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices * must display the words "Powered by KnowledgeTree" and retain the original * copyright notice. * * @copyright 2008-2009, KnowledgeTree Inc. * @license GNU General Public License version 3 * @author KnowledgeTree Team * @package Upgrader * @version Version 0.1 */ // include defaults require '../../config/dmsDefaults.php'; require_once KT_LIB_DIR . '/config/config.inc.php'; require_once KT_LIB_DIR . '/plugins/pluginutil.inc.php'; include KT_LIB_DIR . '/upgrades/upgrade.inc.php'; class upgradeDatabase extends Step { /** * Reference to Database object * * @author KnowledgeTree Team * @access public * @var object */ public $_dbhandler = null; /** * Reference to Database object * * @author KnowledgeTree Team * @access public * @var object */ public $_util = null; /** * Database type * * @author KnowledgeTree Team * @access private * @var array */ private $dtype = ''; /** * Database types * * @author KnowledgeTree Team * @access private * @var array */ private $dtypes = array(); /** * Database host * * @author KnowledgeTree Team * @access private * @var string */ private $dhost = ''; /** * Database port * * @author KnowledgeTree Team * @access private * @var string */ private $dport = ''; /** * Database name * * @author KnowledgeTree Team * @access private * @var string */ private $dname = ''; /** * Database root username * * @author KnowledgeTree Team * @access private * @var string */ private $duname = ''; /** * Database root password * * @author KnowledgeTree Team * @access private * @var string */ private $dpassword = ''; /** * Database dms username * * @author KnowledgeTree Team * @access private * @var string */ private $dmsname = ''; /** * Database dms password * * @author KnowledgeTree Team * @access private * @var string */ private $dmspassword = ''; /** * Default dms user username * * @author KnowledgeTree Team * @access private * @var boolean */ private $dmsusername = ''; /** * Default dms user password * * @author KnowledgeTree Team * @access private * @var boolean */ private $dmsuserpassword = ''; /** * Location of database binaries. * * @author KnowledgeTree Team * @access private * @var string */ private $mysqlDir; // TODO:multiple databases /** * Name of database binary. * * @author KnowledgeTree Team * @access private * @var string */ private $dbbinary = ''; // TODO:multiple databases /** * Database table prefix * * @author KnowledgeTree Team * @access private * @var string */ private $tprefix = ''; /** * Flag to drop database * * @author KnowledgeTree Team * @access private * @var boolean */ private $ddrop = false; /** * List of errors encountered * * @author KnowledgeTree Team * @access public * @var array */ public $error = array(); /** * List of errors used in template * * @author KnowledgeTree Team * @access public * @var array */ public $templateErrors = array('dmspassword', 'dmsuserpassword', 'con', 'dname', 'dtype', 'duname', 'dpassword'); /** * Flag to store class information in session * * @author KnowledgeTree Team * @access public * @var array */ public $storeInSession = true; /** * Flag if step needs to be upgraded * * @author KnowledgeTree Team * @access public * @var array */ protected $runUpgrade = true; /** * Flag if step needs to run silently * * @author KnowledgeTree Team * @access public * @var array */ protected $silent = true; /** * Constructs database object * * @author KnowledgeTree Team * @access public * @param none */ public function __construct() { $this->temp_variables = array("step_name"=>"database", "silent"=>$this->silent); $this->_dbhandler = new UpgradedbUtil(); $this->_util = new UpgradeUtil(); if(WINDOWS_OS) $this->mysqlDir = MYSQL_BIN; } /** * Main control of database setup * * @author KnowledgeTree Team * @param none * @access public * @return string */ public function doStep() { parent::doStep(); $this->initErrors(); $this->setDetails(); // Set any posted variables // if(!$this->inStep("database")) { // $this->doRun(); // return 'landing'; // } if($this->next()) { return 'next'; } else if($this->previous()) { return 'previous'; } else if ($this->confirmUpgrade()) { $this->doRun('confirm'); return 'next'; } else if ($this->upgrading()) { if ($this->doRun('runUpgrade')) { return 'next'; } return 'error'; } $this->doRun(); return 'landing'; } function confirmUpgrade() { return isset($_POST['ConfirmUpgrade']); } function upgrading() { return isset($_POST['RunUpgrade']); } function doRun($action = null) { $this->readConfig(KTConfig::getConfigFilename()); if($this->dbSettings['dbPort'] == '') { $con = $this->_dbhandler->load($this->dbSettings['dbHost'], $this->dbSettings['dbUser'], $this->dbSettings['dbPass'], $this->dbSettings['dbName']); } else { $con = $this->_dbhandler->load($this->dbSettings['dbHost'].":".$this->dbSettings['dbPort'], $this->dbSettings['dbUser'], $this->dbSettings['dbPass'], $this->dbSettings['dbName']); } $this->temp_variables['action'] = $action; if (is_null($action) || ($action == 'preview')) { $this->temp_variables['title'] = 'Preview Upgrade'; $this->temp_variables['upgradeTable'] = $this->generateUpgradeTable(); } else if ($action == 'confirm') { $this->temp_variables['title'] = 'Confirm Upgrade'; $this->temp_variables['upgradeTable'] = $this->upgradeConfirm(); } else if ($action == 'runUpgrade') { $this->temp_variables['title'] = 'Upgrade In Progress'; if (!$this->upgrade()) { // $this->temp_variables['upgradeTable'] = '';//$this->upgradeErrors(); return false; } } return true; } public function generateUpgradeTable() { global $default; $this->temp_variables['systemVersion'] = $default->systemVersion; $query = sprintf('SELECT value FROM %s WHERE name = "databaseVersion"', $default->system_settings_table); $result = $this->_dbhandler->query($query); if ($result) { $lastVersionObj = $this->_dbhandler->fetchNextObject($result); $lastVersion = $lastVersionObj->value; } $currentVersion = $default->systemVersion; $upgrades = describeUpgrade($lastVersion, $currentVersion); $ret = "
| Code | Description | Applied |
|---|---|---|
| %s | %s | %s |
The table below describes the upgrades that have occurred to upgrade your KnowledgeTree installation to ' . $default->systemVersion . ''; ?>
performPreUpgradeActions();
if (PEAR::isError($pre_res)) {
$this->temp_variables['preUpgrade'] = 'Pre-Upgrade actions failed.';
}
else {
$this->temp_variables['preUpgrade'] = 'Pre-Upgrade actions succeeded.';
}
?>
performAllUpgrades(); if (PEAR::isError($res) || PEAR::isError($pres)) { $this->temp_variables['upgradeStatus'] = 'Upgrade failed.'; } else { $this->temp_variables['upgradeStatus'] = 'Upgrade succeeded.'; } ?>
performPostUpgradeActions(); if (PEAR::isError($post_res)) { $this->temp_variables['postUpgrade'] = 'Post-Upgrade actions failed.'; } else { $this->temp_variables['postUpgrade'] = 'Post-Upgrade actions succeeded.'; } } function performPreUpgradeActions() { // This is just to test and needs to be updated to a more sane and error resistent architrcture if it works. // It should idealy work the same as the upgrades. global $default; // Lock the scheduler $lockFile = $default->cacheDirectory . DIRECTORY_SEPARATOR . 'scheduler.lock'; touch($lockFile); return true; } function performPostUpgradeActions() { // This is just to test and needs to be updated to a more sane and error resistent architrcture if it works. // It should idealy work the same as the upgrades. global $default; // Ensure all plugins are re-registered. $sql = "TRUNCATE plugin_helper"; $res = DBUtil::runQuery($sql); // Clear out all caches and proxies - they need to be regenerated with the new code $proxyDir = $default->proxyCacheDirectory; KTUtil::deleteDirectory($proxyDir); $oKTCache = new KTCache(); $oKTCache->deleteAllCaches(); // Clear the configuration cache, it'll regenerate on next load $oKTConfig = new KTConfig(); $oKTConfig->clearCache(); // Unlock the scheduler $lockFile = $default->cacheDirectory . DIRECTORY_SEPARATOR . 'scheduler.lock'; if(file_exists($lockFile)){ @unlink($lockFile); } return true; } function performAllUpgrades () { global $default; $query = sprintf('SELECT value FROM %s WHERE name = "databaseVersion"', $default->system_settings_table); $lastVersion = DBUtil::getOneResultKey($query, 'value'); $currentVersion = $default->systemVersion; $upgrades = describeUpgrade($lastVersion, $currentVersion); $this->temp_variables['upgradeTable'] = ''; foreach ($upgrades as $upgrade) { if (($GLOBALS['row'] % 2) == 1) { $class = "odd"; } else { $class = "even"; } $this->temp_variables['upgradeTable'] .= sprintf('