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)
{
?>
| Installing "component?>" (Version: / Date: / Build: / VersionName: ) |
getElementsByPath('install', 1);
if (!is_null($installElement)) {
$this->processNode($installElement,1);
}
if(!$this->silent) {
?>
insertVersionData( $version, $versiondate, $build, $versionname);
} else {
if(!$this->silent) {
?>
| Upgrading "component?>" (Version: version; ?> / Version Date: versiondate;?> / Install Date: installdate;?> / Build: build;?> / Version Name: versionname;?>) |
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) {
?>
| |
| Version: (Version Date: , Build: , Version Name: ) |
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) {
?>
_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
_error;?>" );?>
|
 |