component = $component; $this->xmlFileName = $xmlFileName; $this->subdir = $subdir; $this->versionTable = $db->getPrefix() . $versionTablePrefix . "version"; $this->silent = $silent; } // helper function to create new version table function createVersionTable() { $kunena_db =& JFactory::getDBO(); $kunena_db->setQuery( "CREATE TABLE IF NOT EXISTS `$this->versionTable` (`id` INTEGER NOT NULL AUTO_INCREMENT, `version` VARCHAR(20) NOT NULL, `versiondate` DATE NOT NULL, `installdate` DATE NOT NULL, `build` VARCHAR(20) NOT NULL, `versionname` VARCHAR(40) NULL, PRIMARY KEY(`id`)) DEFAULT CHARSET=utf8;" ); // Let the install handle the error return $kunena_db->query(); check_dberror("Version table creation failed."); } // helper function to drop existing version table function dropVersionTable() { $kunena_db =& JFactory::getDBO(); $kunena_db->setQuery("DROP TABLE IF EXISTS `$this->versionTable`;"); $kunena_db->query(); check_dbwarning('Unable to drop version table.'); } // helper function retrieve latest version from version table function getLatestVersion($versionTable) { $kunena_db =& JFactory::getDBO(); $query = "SELECT `version`, `versiondate`, `installdate`, `build`, `versionname` FROM `$versionTable` ORDER BY `id` DESC"; $kunena_db->setQuery($query,0,1);// LIMIT 1 $currentVersion = $kunena_db->loadObject(); check_dberror('Could not load latest Version record.'); return $currentVersion; } function insertVersionData( $version, $versiondate, $build, $versionname) { $kunena_db =& JFactory::getDBO(); $kunena_db->setQuery( "INSERT INTO `$this->versionTable` SET `version` = '".$version."', `versiondate` = '".$versiondate."', `installdate` = CURDATE(), `build` = '".$build."', `versionname` = '".$versionname."';" ); $kunena_db->query(); check_dberror('Unable to insert version record.'); } function insertDummyVersion() { $this->insertVersionData('0.0.1','2007-01-01',0,'Placeholder for unknown prior version'); } function backupVersionTable() { $kunena_db =& JFactory::getDBO(); $kunena_db->setQuery("DROP TABLE IF EXISTS `".$this->versionTable."_backup`;"); $kunena_db->query(); check_dberror('Unable to drop previous backup version table.'); $kunena_db->setQuery("CREATE TABLE `".$this->versionTable."_backup` SELECT * FROM `".$this->versionTable."`;"); $kunena_db->query(); check_dberror('Unable to backup version table.'); } /** * Main upgrade function. Processes XML file */ function doUpgrade() { require_once( KUNENA_ROOT_PATH .DS. 'includes/domit/xml_domit_lite_include.php' ); if(!$this->silent) { ?> _upgradeDir = $componentBaseDir . $this->component .DS . $this->subdir; //get current version, check if version table exists $createVersionTable = 1; $upgrade=null; // Legacy enabler // Versions prior to 1.0.5 did not came with a version table inside the database // this would make the installer believe this is a fresh install. We need to perform // a 'manual' check if this is going to be an upgrade and if so create that table // and write a dummy version entry to force an upgrade. $kunena_db =& JFactory::getDBO(); $kunena_db->setQuery( "SHOW TABLES LIKE ".$kunena_db->quote($kunena_db->getPrefix().'fb_messages') ); $kunena_db->query(); check_dberror("Unable to search for messages table."); if($kunena_db->getNumRows()) { // fb tables exist, now lets see if we have a version table $kunena_db->setQuery( "SHOW TABLES LIKE ".$kunena_db->quote($this->versionTable) ); $createVersionTable = $kunena_db->loadResult(); $createVersionTable = empty($createVersionTable); check_dberror("Unable to search for version table."); if($createVersionTable) { //version table does not exist - this is a pre 1.0.5 install - lets create $this->createVersionTable(); // insert dummy version entry to force upgrade $this->insertDummyVersion(); $createVersionTable = 0; } } if(!$createVersionTable) { // lets see if we need to update the version table layout from it original $currentVersion = $this->getLatestVersion($this->versionTable); if(!is_object($currentVersion)) { // version table exisits, but we cannot retrieve the latest version // in this case we assume the table layout might have changed // backup old table and create new version table $this->backupVersionTable(); $this->dropVersionTable(); $this->createVersionTable(); // insert dummy version info to start with $this->insertDummyVersion(); } //check for latest version and date entry $currentVersion = $this->getLatestVersion($this->versionTable); if(!$currentVersion->version && !$currentVersion->versiondate) { //there was an error in retrieving the version and date, goto install mode $upgrade = 0; } else { //OK, no error, there is a version table and it also contains version and date information, switching to upgrade mode $upgrade = 1; } } //Create version table if($createVersionTable == 1) { if (!$this->createVersionTable()) { $this->_error = "DB function failed with error number " . $kunena_db->_errorNum . "
"; $this->_error .= $kunena_db->getErrorMsg(); $img = "publish_x.png"; $this->_return = false; } else { $img = "tick.png"; } if(!$this->silent) { ?>
Creating version table
loadXML( $this->_upgradeDir .DS. $this->xmlFileName, false, true ); //load root element and check XML version (for future use) $root = &$xmlDoc->documentElement; $comUpgradeVersion = $root->getAttribute( "version" ); //here comes the real stuff if($upgrade == 0) { $installElement =& $root->firstChild; $version = $installElement->getAttribute( "version" ); $versiondate = $installElement->getAttribute( "versiondate" ); $build = $installElement->getAttribute( "build" ); $versionname = $installElement->getAttribute( "versionname" ); if(!$this->silent) { ?> getElementsByPath('install', 1); if (!is_null($installElement)) { $this->processNode($installElement,1); } if(!$this->silent) { ?>
Installing "component?>" (Version: / Date: / Build: / VersionName: )
insertVersionData( $version, $versiondate, $build, $versionname); } else { if(!$this->silent) { ?> getElementsByPath('upgrade', 1); if (!is_null($upgradeElement)) { //walk through the versions $numChildrenMain =& $upgradeElement->childCount; $childNodesMain =& $upgradeElement->childNodes; for($k = 0; $k < $numChildrenMain; $k++) { $versionElement =& $childNodesMain[$k]; $version = $versionElement->getAttribute( "version" ); $versiondate = $versionElement->getAttribute( "versiondate" ); $build = $versionElement->getAttribute( "build" ); $versionname = $versionElement->getAttribute( "versionname" ); //when legacy version exists, just compare version, if date exists as well, compare date if(($currentVersion->versiondate && $versiondate > $currentVersion->versiondate) OR (version_compare($version, $currentVersion->version, '>')) OR (version_compare($version, $currentVersion->version, '==') && $build > $currentVersion->build)) { //these instructions are for a newer version than the currently installed version if(!$this->silent) { ?> insertVersionData( $version, $versiondate, $build, $versionname); $added_version=1; $this->processNode($versionElement,$k); } //end if version newer check } //end version element loop if (!isset($added_version)) $this->insertVersionData( $version, $versiondate, $build, $versionname); } //end if !is_null($upgradeElement) if(!$this->silent) { ?>
Upgrading "component?>" (Version: version; ?> / Version Date: versiondate;?> / Install Date: installdate;?> / Build: build;?> / Version Name: versionname;?>)
 
Version: (Version Date: , Build: , Version Name: )
_return; } //end doUpgrade function /** * Processes "phpfile", "query" and "phpcode" child-nodes of the node provided */ function processNode(&$startNode,$batch = 0) { $numChildren =& $startNode->childCount; $childNodes =& $startNode->childNodes; for($i = 0; $i < $numChildren; $i++) { $currentNode =& $childNodes[$i]; $nodeName =& $currentNode->nodeName; $nodemode = strtolower($currentNode->getAttribute( "mode" )); switch($nodeName) { case "phpfile": //include file $fileName = $currentNode->getAttribute( "name" ); $include = $this->_upgradeDir .DS . $fileName; $fileCheck = file_exists($include); if($fileCheck) { ob_start(); require( $include ); $img = "tick.png"; $this->_error = ob_get_contents(); ob_end_clean(); } else { $this->_error = "File not found!"; } if (!$fileCheck || $this->_error) { $img = "publish_x.png"; $this->_return = false; } if(!$this->silent) { ?>
Including file
getText(); $kunena_db =& JFactory::getDBO(); $kunena_db->setQuery($query); $kunena_db->query(); if ($kunena_db->getErrorNum() != 0) { $this->_error = "DB function failed with error number ".$kunena_db->getErrorNum()."
"; $this->_error .= $kunena_db->stderr(true); $this->_error .= ""; $img = "publish_x.png"; $this->_return = false; } else { $this->_error = ""; $img = "tick.png"; } $kunena_db->setQuery($currentNode->getText()); if(!$this->silent) { if (!($nodemode=='silenterror' AND $this->_error != "")) { ?>
Running SQL Query
getText(); ini_set ("track_errors", 1); if(@eval($code) === FALSE) { $img = "publish_x.png"; $this->_error = "".$php_errormsg."

"; } else { $img = "tick.png"; $this->_error = ""; } if(!$this->silent) { ?>
Executing PHP Code