/**
  * 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
  * @param  boolean|null           $strictlyColumns  FALSE: allow for other columns, TRUE: doesn't allow for other columns
  * @param  boolean|string|null    $strictlyEngine   FALSE: engine unchanged, TRUE: force engine change to type, updatewithtable: updates to match table, NULL: checks for attribute 'strict' in table
  * @return string                 Message to display
  */
 public function checkDatabase($upgrade = false, $dryRun = false, $strictlyColumns = true, $strictlyEngine = 'updatewithtable')
 {
     $xml = $this->_getCbDbXml();
     if ($xml !== null) {
         $db = $xml->getElementByPath('database');
         if ($db) {
             $this->_sqlUpgrader = new DatabaseUpgrade($this->_db, $this->_silentWhenOK);
             $this->_sqlUpgrader->setDryRun($dryRun);
             $success = $this->_sqlUpgrader->checkXmlDatabaseDescription($db, '', $upgrade, $strictlyColumns, $strictlyEngine);
             /*
             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;
 }
Example #2
0
 /**
  * Check or fix field according to XML description if exsitant (or old method otherwise)
  *
  * @param  DatabaseUpgrade  $sqlUpgrader
  * @param  FieldTable       $field
  * @param  boolean          $change
  * @return boolean
  */
 public 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 SimpleXMLElement($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:
         $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="\\CB\\Database\\Table\\ComprofilerTable" maintable="true" strict="false" drop="never" shared="true">' . '<columns>' . '<column name="" nametype="namesuffix" type="sql:text||sql:varchar(255)" null="true" default="NULL" />' . '</columns>' . '</table>' . '</database>';
             $dbXml = new SimpleXMLElement($xmlText);
             $success = $sqlUpgrader->checkXmlDatabaseDescription($dbXml, $colNamePrefix, $change, null);
         }
     }
     if (!$success) {
         // Temporary way to workaround _error protected, as this whole function should probably go to to new FieldModel:
         $field->set('_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 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;
 }