/** * Checks the all tables and upgrades if needed * Backend-use only. * @access private * * @param boolean $upgrade False: only check table, True: upgrades table (depending on $dryRun) * @param boolean $dryRun True: doesn't do the modifying queries, but lists them, False: does the job * @return string Message to display */ function checkDatabase( $upgrade = false, $dryRun = false ) { $xml = $this->_getCbDbXml(); if ( $xml !== null ) { $db =& $xml->getElementByPath( 'database' ); if ( $db ) { cbimport( 'cb.sql.upgrader' ); $this->_sqlUpgrader = new CBSQLupgrader( $this->_db, $this->_silentWhenOK ); $this->_sqlUpgrader->setDryRun( $dryRun ); $success = $this->_sqlUpgrader->checkXmlDatabaseDescription( $db, '', $upgrade, true ); /* var_dump( $success ); echo "<br>\nERRORS: " . $this->_sqlUpgrader->getErrors( "<br /><br />\n\n", "<br />\n" ); echo "<br>\nLOGS: " . $this->_sqlUpgrader->getLogs( "<br /><br />\n\n", "<br />\n" ); exit; */ } else { $success = array( 'Error: could not find element database in XML file', null ); } } else { $success = array( 'Error: could not find XML file', null ); } return $success; }
/** * Check or fix field according to XML description if exsitant (or old method otherwise) * * @param CBSQLupgrader $sqlUpgrader * @param moscomprofilerFields $field * @param boolean $change * @return unknown */ function checkFixSQL(&$sqlUpgrader, &$field, $change = true) { $fieldXML =& $this->_loadFieldXML($field); if ($fieldXML) { $db =& $fieldXML->getElementByPath('database'); if ($db !== false) { // <database><table><columns>.... structure: $success = $sqlUpgrader->checkXmlDatabaseDescription($db, $field->name, $change, null); } else { $data =& $fieldXML->getElementByPath('data'); if ($data !== false) { // <data ....> structure: $xmlText = '<?xml version="1.0" encoding="UTF-8"?> <database version="1"> <table name="' . $field->table . '" maintable="true" strict="false" drop="never" shared="true"> <columns> </columns> </table> </database>'; $dbXml = new CBSimpleXMLElement($xmlText); $columns =& $dbXml->getElementByPath('table/columns'); $columns->addChildWithAttr('column', '', null, $data->attributes()); $success = $sqlUpgrader->checkXmlDatabaseDescription($dbXml, $field->name, $change, null); } else { $success = true; } } } else { // no XML file or no <fieldtype> in xml, must be an old plugin or one which is uninstalled or missing files: cbimport('cb.xml.simplexml'); $cols = $field->getTableColumns(); if (count($cols) == 0) { // the comprofiler_files database is upgraded, but this (status) field does not require comprofiler entries: $success = true; } else { // database has been upgraded, take a guess and take first column name as name of the comprofiler table: // or database has not been upgraded: take name: $colNamePrefix = $cols[0]; $xmlText = '<?xml version="1.0" encoding="UTF-8"?> <database version="1"> <table name="#__comprofiler" class="moscomprofiler" maintable="true" strict="false" drop="never" shared="true"> <columns> <column name="" nametype="namesuffix" type="sql:varchar(255)" null="true" default="NULL" /> </columns> </table> </database>'; $dbXml = new CBSimpleXMLElement($xmlText); $success = $sqlUpgrader->checkXmlDatabaseDescription($dbXml, $colNamePrefix, $change, null); } } if (!$success) { $field->_error .= $sqlUpgrader->getErrors(); } /* 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; */ return $success; }
/** * plugin uninstaller with best effort depending on what it finds. * * @param int $id * @param string $option * @param int $client * @param string $action * @return boolean */ function uninstall($id, $option, $client = 0) { global $_CB_database; $db = false; if ($this->checkPluginGetXml($id, $option, $client)) { 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) { 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 ! 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(); foreach ($files_element->children() as $file) { // delete the files $filename = $file->data(); if (file_exists($this->i_elementdir . $filename)) { $parts = pathinfo($filename); $subpath = $parts['dirname']; if ($subpath != '' && $subpath != '.' && $subpath != '..') { //echo '<br />'. 'Deleting' .': '. $this->i_elementdir . $subpath; $result = $adminFS->deldir(_cbPathName($this->i_elementdir . $subpath . '/')); } else { //echo '<br />'. 'Deleting' .': '. $this->i_elementdir . $filename; $result = $adminFS->unlink(_cbPathName($this->i_elementdir . $filename, false)); } //echo intval( $result ); } } // 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->stderr(true)); return false; } } } // Are there any Database statements ?? $db =& $cbInstallXML->getElementByPath('database'); if ($db !== false && count($db->children()) > 0) { cbimport('cb.sql.upgrader'); $sqlUpgrader = new CBSQLupgrader($_CB_database, false); //$sqlUpgrader->setDryRun( true ); $success = $sqlUpgrader->checkXmlDatabaseDescription($db, $cleanedMainFileName, 'drop', 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($id); // 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) { HTML_comprofiler::showInstallMessage('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) { HTML_comprofiler::showInstallMessage('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) $id); if (!$_CB_database->query()) { $msg = $_CB_database->stderr; HTML_comprofiler::showInstallMessage('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) { HTML_comprofiler::fixcbdbShowResults($sqlUpgrader, true, false, $success, array(), array(), $this->elementName(), 1, false); } return true; } return false; }