oDb = $oDb; } function executeCheck ($sModule = '') { if (!$this->sFolder) return 'Upgrade path folder is not defined'; $sFile = BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/' . ($sModule ? 'modules/' . $sModule . '/' : '') . 'check.php'; if (!file_exists($sFile)) return $sModule ? true : 'Check script was not found: ' . $sFile; return include ($sFile); } function executeConclusion ($sModule = '') { if (!$this->sFolder) return ''; $sFile = BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/' . ($sModule ? 'modules/' . $sModule . '/' : '') . 'conclusion.html'; if (!file_exists($sFile)) return ''; return file_get_contents ($sFile); } function isExecuteScriptAvail ($sModule = '') { if (!$this->sFolder) return 'Upgrade path folder is not defined'; $sFile = BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/' . ($sModule ? 'modules/' . $sModule . '/' : '') . 'script.php'; return file_exists($sFile) ? true : false; } function executeScript ($sModule = '') { if (!$this->sFolder) return 'Upgrade path folder is not defined'; $sFile = BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/' . ($sModule ? 'modules/' . $sModule . '/' : '') . 'script.php'; if (!file_exists($sFile)) return true; // if custom script was not found just skip it return include ($sFile); } function isExecuteSQLAvail ($sModule = '') { if (!$this->sFolder) return 'Upgrade path folder is not defined'; $sFile = BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/' . ($sModule ? 'modules/' . $sModule . '/' : '') . 'sql.sql'; return file_exists($sFile) ? true : false; } function executeSQL ($sModule = '') { if (!$this->sFolder) return 'Upgrade path folder is not defined'; $sFile = BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/' . ($sModule ? 'modules/' . $sModule . '/' : '') . 'sql.sql'; if (!file_exists($sFile)) return true; // if sql script was not found just skip it $aReplace = array (); if ($sModule) { $aModule = $this->oDb->getRow ("SELECT * FROM `sys_modules` WHERE `uri` = '$sModule' LIMIT 1"); if (!$aModule) return true; // it looks like module is not installed - skip it $aReplace = array ( 'from' => array ('{db_prefix}', '{db_name}'), 'to' => array ($aModule['db_prefix'], defined('BX_DATABASE_NAME') ? BX_DATABASE_NAME : ''), ); } $mixedResult = $this->oDb->executeSQL ($sFile, $aReplace); if (true === $mixedResult) return true; if (!is_array($mixedResult)) // it looks like string error, return it return $mixedResult; $s = ''; foreach ($mixedResult as $a) $s .= "{$a['query']}: {$a['error']}
"; return $s; } function executeLangsAdd ($sModule = '') { if (!$this->sFolder) return 'Upgrade path folder is not defined'; $aLangs = $this->readLangs ($sModule); foreach ($aLangs as $sLang) { $this->_executeLangAdd($sModule, $sLang); } return true; } function _executeLangAdd ($sModule, $sLang = 'en') { $sFile = BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/' . ($sModule ? 'modules/' . $sModule . '/' : '') . 'lang_' . $sLang . '.php'; if (!file_exists($sFile)) return true; // just skip if language file is not found include ($sFile); if (!$aLangContent && !is_array($aLangContent)) return true; $iLanguageId = (int)$this->oDb->getOne("SELECT `ID` FROM `sys_localization_languages` WHERE `Name`='$sLang' LIMIT 1"); if (!$iLanguageId) return true; // just skip the language if it is not available if ($sModule) { $aModule = $this->oDb->getRow ("SELECT * FROM `sys_modules` WHERE `uri` = '$sModule' LIMIT 1"); if (!$aModule) return true; // it looks like module is not installed - skip it $sModuleConfigFile = BX_DIRECTORY_PATH_MODULES . $aModule['path'] . 'install/config.php'; require ($sModuleConfigFile); $iCategoryId = $this->oDb->getOne ("SELECT `ID` FROM `sys_localization_categories` WHERE `Name`='" . $aConfig['language_category'] . "' LIMIT 1"); if (!$iCategoryId && $aConfig['language_category']) { if ($this->oDb->query ("INSERT INTO `sys_localization_categories` SET `Name`='" . $aConfig['language_category'] . "'")) $iCategoryId = $this->oDb->lastId(); else return "Can not determine or create language category ID"; } } else { $iCategoryId = 1; } foreach ($aLangContent as $sKey => $sValue) { $aLangKey = $this->oDb->getRow("SELECT `ID`, `IDCategory` FROM `sys_localization_keys` WHERE `Key`='" . $this->oDb->escape($sKey) . "' LIMIT 1"); $iLangKeyId = isset($aLangKey['ID']) && (int)$aLangKey['ID'] ? (int)$aLangKey['ID'] : false; if (!$iLangKeyId) { if (!$this->oDb->query("INSERT INTO `sys_localization_keys`(`IDCategory`, `Key`) VALUES('$iCategoryId', '" . $this->oDb->escape($sKey) . "')")) continue; $iLangKeyId = $this->oDb->lastId(); } else { $iLangKeyCat = isset($aLangKey['IDCategory']) && (int)$aLangKey['IDCategory'] ? (int)$aLangKey['IDCategory'] : 0; if ($iLangKeyCat != $iCategoryId) $this->oDb->query("UPDATE `sys_localization_keys` SET `IDCategory` = '$iCategoryId' WHERE `Key` = '" . $this->oDb->escape($sKey) . "' LIMIT 1"); } $this->oDb->res("DELETE FROM `sys_localization_strings` WHERE `IDKey` = '$iLangKeyId' AND `IDLanguage` = '$iLanguageId'"); $this->oDb->res("INSERT INTO `sys_localization_strings`(`IDKey`, `IDLanguage`, `String`) VALUES('$iLangKeyId', '$iLanguageId', '" . $this->oDb->escape($sValue) . "')"); } return true; } function readLangs ($sModule = '') { $sDir = BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/' . ($sModule ? 'modules/' . $sModule . '/' : ''); if (!($h = opendir($sDir))) return false; $aRet = array(); while (false !== ($sFile = readdir($h))) { if ('.' == $sFile || '..' == $sFile || '.' == $sFile[0] || !is_file($sDir . '/' . $sFile) || !preg_match('/^lang_([a-z]+)\.php$/', $sFile, $m)) continue; $sLang = $m[1]; if ($sLang != $this->oDb->getOne("SELECT `Name` FROM `sys_localization_languages` WHERE `Name` = '$sLang' LIMIT 1")) continue; $aRet[] = $sLang; } closedir($h); return $aRet; } function readModules () { if (!$this->sFolder) return false; if (!file_exists(BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/modules/')) return false; if (!($h = opendir(BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/modules/'))) return false; $aRet = array(); while (false !== ($sModule = readdir($h))) { if ('.' == $sModule || '..' == $sModule || '.' == $sModule[0] || !is_dir(BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/modules/' . $sModule)) continue; if ($sModule != $this->oDb->getOne("SELECT `uri` FROM `sys_modules` WHERE `uri` = '$sModule' LIMIT 1")) continue; $aRet[] = $sModule; } closedir($h); return $aRet; } function checkFolder ($sFolder = '') { if (!$sFolder) $sFolder = $this->sFolder; $sFullPath = BX_UPGRADE_DIR_UPGRADES . $sFolder . '/'; if (!preg_match('/^[A-Za-z0-9\.\-]+$/', $sFolder) || !file_exists($sFullPath)) return 'Upgrade path was not found'; return true; } function setFolder ($sFolder) { $this->sFolder = $sFolder; } function readUpgrades () { if (!($h = opendir(BX_UPGRADE_DIR_UPGRADES))) { return false; } $aRet = array(); while (false !== ($sFolder = readdir($h))) { if ('.' == $sFolder || '..' == $sFolder || !is_dir(BX_UPGRADE_DIR_UPGRADES . $sFolder) || !$this->checkFolder($sFolder)) continue; $aRet[] = $sFolder; } closedir($h); return $aRet; } function checkPermissions () { $aFilesFailedRead = array(); $aFilesFailedWrite = array(); $sPathBaseUpgrade = BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/files/'; $aFiles = array(); if (!$this->_checkPermissionGetFilesList($sPathBaseUpgrade, $aFiles) || empty($aFiles)) return 'Can\'t retrieve list of files for the upgrade'; foreach ($aFiles as $sFileSource) { if (!is_readable($sFileSource)) // check if source file is readable $aFilesFailedRead[] = $sFileSource; $sFileDest = BX_DIRECTORY_PATH_ROOT . bx_ltrim_str($sFileSource, $sPathBaseUpgrade); if (file_exists($sFileDest)) { if (!is_writable($sFileDest)) // check if destination file exists and is writable $aFilesFailedWrite[] = $sFileDest; } else { $sDir = pathinfo($sFileDest, PATHINFO_DIRNAME); if (file_exists($sDir) && !is_writable($sDir)) // check if directory is writable, where new desination file will be places $aFilesFailedWrite[] = $sFileDest; } } if (empty($aFilesFailedRead) && empty($aFilesFailedWrite)) return true; $s = !empty($aFilesFailedRead) ? sprintf('The following files can\'t be read: %s. ', implode(', ', $aFilesFailedRead)) : ''; $s .= !empty($aFilesFailedWrite) ? sprintf('The following files can\'t be written: %s.', implode(', ', $aFilesFailedWrite)) : ''; return $s; } function _checkPermissionGetFilesList ($sPath, &$aFiles) { if (!file_exists($sPath) || !is_dir($sPath) || !($rSource = opendir($sPath))) return false; while (($sFile = readdir($rSource)) !== false) { if ($sFile == '.' || $sFile =='..') continue; if (is_dir($sPath . $sFile)) $this->_checkPermissionGetFilesList($sPath . $sFile . '/', $aFiles); else $aFiles[] = $sPath . $sFile; } closedir($rSource); return true; } function copyFiles () { // TODO: use standalone copying require_once(BX_DIRECTORY_PATH_CLASSES . 'BxDolFile.php'); $o = BxDolFile::getInstance(); $sDirSource = bx_ltrim_str(BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/files/', BX_DIRECTORY_PATH_ROOT); if (!$o->copy($sDirSource, '')) return "Files copying failed"; return true; } function filesDelete () { $sFile = BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/files_delete.php'; if (!file_exists($sFile)) return true; // just skip it if file isn't found include ($sFile); if (!$aFilesDelete && !is_array($aFilesDelete)) return true; foreach ($aFilesDelete as $sFile) { if (is_dir(BX_DIRECTORY_PATH_ROOT . $sFile)) $this->rrmdir(BX_DIRECTORY_PATH_ROOT . $sFile); else @unlink(BX_DIRECTORY_PATH_ROOT . $sFile); } return true; } function updateFilesHash () { require_once(BX_DIRECTORY_PATH_CLASSES . 'BxDolIO.php'); require_once(BX_DIRECTORY_PATH_CLASSES . 'BxDolInstallerUtils.php'); require_once(BX_DIRECTORY_PATH_CLASSES . 'BxDolInstallerHasher.php'); $o = new BxDolInstallerHasher(); $aFiles = $o->getSystemFilesHash (); if (!$aFiles) return 'Can\'t get files list to update hash'; $sQuery = $this->oDb->prepare("DELETE FROM `sys_modules_file_tracks` WHERE `module_id` = ?", BX_SYSTEM_MODULE_ID); $this->oDb->query($sQuery); foreach($aFiles as $aFile) { $sQuery = $this->oDb->prepare("INSERT IGNORE INTO `sys_modules_file_tracks`(`module_id`, `file`, `hash`) VALUES(?, ?, ?)", BX_SYSTEM_MODULE_ID, $aFile['file'], $aFile['hash']); $this->oDb->query($sQuery); } return true; } function rrmdir($directory) { if (substr($directory,-1) == "/") $directory = substr($directory,0,-1); if (!file_exists($directory) || !is_dir($directory)) return false; elseif (!is_readable($directory)) return false; if (!($directoryHandle = opendir($directory))) return false; while ($contents = readdir($directoryHandle)) { if ($contents != '.' && $contents != '..') { $path = $directory . "/" . $contents; if (is_dir($path)) bx_rrmdir($path); else @unlink($path); } } closedir($directoryHandle); if (!@rmdir($directory)) return false; return true; } } /** @} */