File Manager

Current Directory: /home/astoriaah/www/old15/administrator/components/com_admintools/models
Viewing File: /home/astoriaah/www/old15/administrator/components/com_admintools/models/dbchcol.php
<?php /** * @package AdminTools * @copyright Copyright (c)2010-2015 Nicholas K. Dionysopoulos * @license GNU General Public License version 3, or later * @version $Id$ */ // Protect from unauthorized access defined('_JEXEC') or die; JLoader::import('joomla.application.component.model'); /** * Database collation changer model * * @author nicholas */ class AdmintoolsModelDbchcol extends F0FModel { /** * Get all tables starting with this site's prefix * * @return array */ public function findTables() { JLoader::import('models.dbtools', JPATH_COMPONENT_ADMINISTRATOR); if (interface_exists('JModel')) { $dbtoolsModel = JModelLegacy::getInstance('Dbtools', 'AdmintoolsModel'); } else { $dbtoolsModel = JModel::getInstance('Dbtools', 'AdmintoolsModel'); } return $dbtoolsModel->findTables(); } public function changeCollation($new_collation = 'utf8_general_ci') { // Make sure we have at least MySQL 4.1.2 $db = $this->getDBO(); $old_collation = $db->getCollation(); if ($old_collation == 'N/A (mySQL < 4.1.2)') { // We can't change the collation on MySQL versions earlier than 4.1.2 return false; } // Get this database's name and try to change its collation $conf = JFactory::getConfig(); if (version_compare(JVERSION, '3.0', 'ge')) { $dbname = $conf->get('db'); } else { $dbname = $conf->getValue('config.db'); } $sql = "ALTER DATABASE `$dbname` DEFAULT COLLATE $new_collation"; $db->setQuery($sql); $db->execute(); // Get all tables $tables = $this->findTables(); $queryStack = ''; if (!empty($tables)) { foreach ($tables as $tableName) { $sql = 'SHOW FULL COLUMNS FROM `' . $tableName . '`'; $db->setQuery($sql); $columns = $db->loadAssocList(); $mods = array(); // array to hold individual MODIFY COLUMN commands if (is_array($columns)) { foreach ($columns as $column) { // Make sure we are redefining only columns which do support a collation $col = (object)$column; if (empty($col->Collation)) { continue; } $null = $col->Null == 'YES' ? 'NULL' : 'NOT NULL'; $default = is_null($col->Default) ? '' : "DEFAULT '" . $db->escape($col->Default) . "'"; $mods[] = "MODIFY COLUMN `{$col->Field}` {$col->Type} $null $default COLLATE $new_collation"; } } // Begin the modification statement $sql = "ALTER TABLE `$tableName` "; // Add commands to modify columns if (!empty($mods)) { $sql .= implode(', ', $mods) . ', '; } // Add commands to modify the table collation $sql .= 'DEFAULT CHARACTER SET UTF8 COLLATE utf8_general_ci;'; $queryStack .= "$sql\n"; } } if (!empty($queryStack)) { if (version_compare(JVERSION, '3.0', 'ge')) { // Joomla! 3.0 and later... God help us! $queries = explode(';', $queryStack); foreach ($queries as $q) { $q = trim($q); if (!empty($q)) { $db->setQuery($q); $db->execute(); } } } else { // Execute the stacked queries in a transaction $db->setQuery($queryStack); $db->queryBatch(false, true); } } } }