function fixcbdb($dryRun, $dbId = 0) { global $_CB_database, $ueConfig, $_PLUGINS; // Try extending time, as unziping/ftping took already quite some... : @set_time_limit(240); $dryRun = $dryRun == 1; if ($dbId == 0) { // Fix mandatory basics of core CB: cbimport('cb.dbchecker'); $dbName = CBTxt::T('Core CB mandatory basics'); $dbChecker = new CBDatabaseChecker(); $result = $dbChecker->checkCBMandatoryDb(true, $dryRun); $messagesAfter = array(); $messagesBefore = array(); ob_start(); CBDatabaseChecker::renderDatabaseResults($dbChecker, true, $dryRun, $result, $messagesBefore, $messagesAfter, $dbName, $dbId); $html = ob_get_contents(); ob_end_clean(); // Fix core CB: $_PLUGINS->loadPluginGroup('user'); $dbName = CBTxt::T('Core CB'); $messagesBefore = $_PLUGINS->trigger('onBeforeFixDb', array($dryRun)); $messagesBefore[] = $html; $dbChecker = new CBDatabaseChecker(); $result = $dbChecker->checkDatabase(true, $dryRun); $messagesAfter = $_PLUGINS->trigger('onAfterFixDb', array($dryRun)); // adapt published fields to global CB config (regarding name type) _cbAdaptNameFieldsPublished($ueConfig); } elseif ($dbId == 1) { // Fix plugin $dbId: $dbName = CBTxt::T('CB plugin'); $messagesBefore = array(); $messagesAfter = array(); $result = true; cbimport('cb.installer'); $sql = 'SELECT `id`, `name` FROM `#__comprofiler_plugin` ORDER BY `ordering`'; $_CB_database->setQuery($sql); $plugins = $_CB_database->loadObjectList(); if (!$_CB_database->getErrorNum()) { $cbInstaller = new cbInstallerPlugin(); foreach ($plugins as $plug) { $result = $cbInstaller->checkDatabase($plug->id, true, $dryRun); if (is_bool($result)) { CBDatabaseChecker::renderDatabaseResults($cbInstaller, true, $dryRun, $result, $messagesBefore, $messagesAfter, $dbName . ' "' . $plug->name . '"', $dbId, false); } elseif (is_string($result)) { echo '<div class="form-group cb_form_line clearfix text-warning">' . $dbName . ' "' . $plug->name . '"' . ': ' . $result . '</div>'; } else { echo '<div class="form-group cb_form_line clearfix">' . sprintf(CBTxt::T('%s "%s": no database or no database description.'), $dbName, $plug->name) . '</div>'; } } } $dbName = CBTxt::T('CB plugins'); } elseif ($dbId == 3) { // adapt published fields to global CB config (regarding name type) _cbAdaptNameFieldsPublished($ueConfig); $_PLUGINS->loadPluginGroup('user'); $messagesBefore = $_PLUGINS->trigger('onBeforeFixFieldsDb', array($dryRun)); $strictcolumns = cbGetParam($_REQUEST, 'strictcolumns', 0) == 1; // Check fields db: cbimport('cb.dbchecker'); $dbChecker = new CBDatabaseChecker(); $result = $dbChecker->checkAllCBfieldsDb(true, $dryRun, $strictcolumns); $dbName = CBTxt::T('CB fields data storage'); $messagesAfter = array(); if ($strictcolumns) { $dbId = $dbId . '&strictcolumns=1'; } } else { $dbName = CBTxt::T('DATABASE_CHECK_NO_DATABASE_SPECIFIED', 'No Database Specified'); $result = $dbName; $messagesBefore = array(); $messagesAfter = array(); } _CBsecureAboveForm('fixcbdb'); outputCbTemplate(2); outputCbJs(2); global $_CB_Backend_Title; $_CB_Backend_Title = array(0 => array('fa fa-wrench', sprintf(CBTxt::T("CB Tools: Fix %s database: "), $dbName) . ($dryRun ? CBTxt::T('Dry-run:') : CBTxt::T('Fixed:')) . " " . CBTXT::T("Results"))); CBDatabaseChecker::renderDatabaseResults($dbChecker, true, $dryRun, $result, $messagesBefore, $messagesAfter, $dbName, $dbId); }
/** * Plugin un-installer with best effort depending on what it finds. * * @param int $pluginId Plugin id to uninstall * @param string $option Option request of component * @return boolean Success */ function uninstall($pluginId, $option) { global $_CB_framework, $_CB_database; $db = false; $success = false; if (!$this->checkPluginGetXml($pluginId, $option)) { return false; } if ($this->i_xmldocument !== null && count($this->i_xmldocument->children()) > 0) { $cbInstallXML = $this->i_xmldocument; // get the element name: $e = $cbInstallXML->getElementByPath('name'); $this->elementName($e->data()); // $cleanedElementName = strtolower(str_replace(array(" ","."),array("","_"),$this->elementName())); // get the files element $files_element = $cbInstallXML->getElementByPath('files'); if ($files_element !== false) { if (count($files_element->children())) { foreach ($files_element->children() as $file) { if ($file->attributes("plugin")) { $this->elementSpecial($file->attributes("plugin")); break; } } } $cleanedMainFileName = strtolower(str_replace(array(" ", "."), array("", "_"), $this->elementSpecial())); // Is there an uninstallfile $uninstallfile_elemet = $cbInstallXML->getElementByPath('uninstallfile'); if ($uninstallfile_elemet !== false) { if (is_file($this->i_elementdir . $uninstallfile_elemet->data())) { global $_PLUGINS; // needed for the require_once below ! /** @noinspection PhpIncludeInspection */ require_once $this->i_elementdir . $uninstallfile_elemet->data(); $ret = call_user_func_array("plug_" . $cleanedMainFileName . "_uninstall", array()); if ($ret != '') { $this->setError(0, $ret); } } } $adminFS = cbAdminFileSystem::getInstance(); $installFileName = basename($this->i_installfilename); $this->deleteFiles($files_element, $adminFS, $installFileName); // Are there any CBLib libraries ? $libraries_element = $cbInstallXML->getElementByPath('libraries'); if ($libraries_element !== false) { foreach ($libraries_element->children() as $library) { if ($library->getName() != 'library') { continue; } // Delete files from library package: $savePackage = $this->i_xmldocument; $subFolder = $library->attributes('name'); $saveElement = $this->elementDir(); $this->elementDir($_CB_framework->getCfg('absolute_path') . '/components/com_comprofiler/plugin/libraries/' . ($subFolder ? $subFolder . '/' : null)); $this->i_xmldocument = $library; $this->deleteFiles($library->getElementByPath('files'), $adminFS, null); $this->i_xmldocument = $savePackage; $this->elementDir($saveElement); } } // Are there any SQL queries?? $query_element = $cbInstallXML->getElementByPath('uninstall/queries'); if ($query_element !== false) { foreach ($query_element->children() as $query) { $_CB_database->setQuery(trim($query->data())); if (!$_CB_database->query()) { $this->setError(1, "SQL Error " . $_CB_database->getErrorMsg()); return false; } } } // Are there any Database statements ?? $db = $cbInstallXML->getElementByPath('database'); if ($db !== false && count($db->children()) > 0) { $sqlUpgrader = new DatabaseUpgrade(null, false); //$sqlUpgrader->setDryRun( true ); $success = $sqlUpgrader->checkXmlDatabaseDescription($db, $cleanedMainFileName, 'drop', null, null); /* var_dump( $success ); echo "<br>\nERRORS: " . $sqlUpgrader->getErrors( "<br /><br />\n\n", "<br />\n" ); echo "<br>\nLOGS: " . $sqlUpgrader->getLogs( "<br /><br />\n\n", "<br />\n" ); exit; */ if (!$success) { $this->setError(1, "Plugin database XML SQL Error " . $sqlUpgrader->getErrors()); return false; } } // Delete tabs and private fields of plugin: $this->deleteTabAndFieldsOfPlugin($pluginId); // remove XML file from front $xmlRemoveResult = $adminFS->unlink(_cbPathName($this->i_installfilename, false)); $filesRemoveResult = true; /* // define folders that should not be removed $sysFolders = array( 'content', 'search' ); if ( ! in_array( $row->folder, $sysFolders ) ) { */ // delete the non-system folders if empty if (count(cbReadDirectory($this->i_elementdir)) < 1) { $filesRemoveResult = $adminFS->deldir($this->i_elementdir); } /* } */ if (!$xmlRemoveResult) { self::renderInstallMessage('Could not delete XML file: ' . _cbPathName($this->i_installfilename, false) . ' due to permission error. Please remove manually.', 'Uninstall - warning', $this->returnTo($option, 'showPlugins')); } if (!$filesRemoveResult) { self::renderInstallMessage('Could not delete directory: ' . $this->i_elementdir . ' due to permission error. Please remove manually.', 'Uninstall - warning', $this->returnTo($option, 'showPlugins')); } } } $_CB_database->setQuery("DELETE FROM #__comprofiler_plugin WHERE id = " . (int) $pluginId); if (!$_CB_database->query()) { $msg = $_CB_database->getErrorMsg(); self::renderInstallMessage('Cannot delete plugin database entry due to error: ' . $msg, 'Uninstall - error', $this->returnTo($option, 'showPlugins')); return false; } if ($this->i_xmldocument !== null && $db !== false && count($db->children()) > 0) { CBDatabaseChecker::renderDatabaseResults($sqlUpgrader, true, false, $success, array(), array(), $this->elementName(), 1, false); } return true; }