add(DBLAN_53, E_MESSAGE_WARNING);
}
else
{
$_POST[$type] = true;
}
}
if(isset($_POST['exportXmlFile']))
{
if(exportXmlFile($_POST['xml_prefs'],$_POST['xml_tables'],$_POST['package_images']))
{
$mes = e107::getMessage();
$mes->add(LAN_SUCCESS, E_MESSAGE_SUCCESS);
}
}
require_once ("auth.php");
$st = new system_tools;
/* No longer needed after XML feature added.
if(isset($_POST['backup_core']) || $_GET['mode']=='backup_core')
{
backup_core();
//message_handler("MESSAGE", DBLAN_1);
$mes->add(DBLAN_1, E_MESSAGE_SUCCESS);
}
*/
require_once ("footer.php");
class system_tools
{
public $_options = array();
function __construct()
{
global $mySQLdefaultdb;
$this->_options = array(
"db_update" => array('diz'=>DBLAN_15, 'label'=>DBLAN_16),
"verify_sql" => array('diz'=>DBLAN_4, 'label'=>DBLAN_5),
'optimize_sql' => array('diz'=>DBLAN_6, 'label'=> DBLAN_7),
'plugin_scan' => array('diz'=>DBLAN_28, 'label'=> DBLAN_29),
'pref_editor' => array('diz'=>DBLAN_19, 'label'=> DBLAN_20),
// 'backup_core' => array('diz'=>DBLAN_8, 'label'=> DBLAN_9),
// 'verify_sql_record' => array('diz'=>DBLAN_35, 'label'=> DBLAN_36),
'importForm' => array('diz'=>DBLAN_59, 'label'=> DBLAN_59),
'exportForm' => array('diz'=>DBLAN_58, 'label'=> DBLAN_58),
'sc_override_scan' => array('diz'=>DBLAN_55, 'label'=> DBLAN_56),
'convert_to_utf8' => array('diz'=>'Check Database Charset','label'=>'Check Charset'),
'correct_perms' => array('diz'=>'Correct File and Directory permissions','label'=>'Correct Perms')
);
$this->_options = multiarray_sort($this->_options, 'label');
if(isset($_POST['delplug']))
{
$this->delete_plugin_entry($_POST['pref_type']);
}
if(isset($_POST['upload']))
{
$this->importXmlFile();
}
if(isset($_POST['delpref']) || (isset($_POST['delpref_checked']) && isset($_POST['delpref2'])))
{
$this->del_pref_val($_POST['pref_type']);
}
if(isset($_POST['verify_sql']) || varset($_GET['mode'])=='verify_sql')
{
require_once(e_HANDLER."db_verify_class.php");
$dbv = new db_verify;
$dbv->backUrl = e_SELF."?mode=verify_sql";
$dbv->verify();
return;
}
// if(isset($_POST['verify_sql_record']) || varset($_GET['mode'])=='verify_sql_record' || isset($_POST['check_verify_sql_record']) || isset($_POST['delete_verify_sql_record']))
// {
//$this->verify_sql_record(); // - currently performed in db_verify_class.php
// }
if(isset($_POST['importForm']) || $_GET['mode']=='importForm')
{
$this->importForm();
}
if(isset($_POST['db_update']) || varset($_GET['mode'])=='db_update') // Requires further testing.
{
// header("location: ".e_ADMIN."e107_update.php");
require_once(e_ADMIN."update_routines.php");
new e107Update($dbupdate);
return;
}
if(isset($_POST['convert_to_utf8']) || $_GET['mode']=='convert_to_utf8')
{
$this->convertUTF8Form();
}
if(isset($_POST['exportForm']) || $_GET['mode']=='exportForm')
{
$this->exportXmlForm();
}
if(isset($_POST['optimize_sql']) || $_GET['mode']=='optimize_sql')
{
$this->optimizesql($mySQLdefaultdb);
}
if(isset($_POST['pref_editor']) || $_GET['mode']=='pref_editor' || isset($_POST['delpref']) || isset($_POST['delpref_checked']))
{
$type = isset($_GET['type']) ? $_GET['type'] : "core";
$this->pref_editor($type);
}
if(isset($_POST['sc_override_scan']) || $_GET['mode']=='sc_override_scan')
{
$this->scan_override();
}
if(isset($_POST['plugin_scan']) || e_QUERY == "plugin" || isset($_POST['delplug']) || $_GET['mode']=='plugin_scan')
{
$this->plugin_viewscan('refresh');
}
if(vartrue($_POST['perform_utf8_convert']))
{
$this->perform_utf8_convert();
return;
}
if(varset($_GET['mode'])=='correct_perms')
{
$this->correct_perms();
return;
}
if(!vartrue($_GET['mode']) && !isset($_POST['db_execute']))
{
$this->render_options();
}
}
/**
* Correct Folder and File permissions.
*/
function correct_perms()
{
$mes = e107::getMessage();
$fl = e107::getFile();
ob_start();
$fl->chmod(e_BASE);
$fl->chmod(e_BASE."cron.php",0755);
$errors = ob_get_clean();
if($errors !='')
{
$mes->addError($errors);
}
else
{
$mes->addSuccess("Folder and File permissions have been updated");
}
e107::getRender()->tablerender(DBLAN_10.SEP."Correcting File and Directory Permissions", $mes->render());
}
private function convertUTF8Form()
{
$mes = e107::getMessage();
$frm = e107::getForm();
$config = e107::getMySQLConfig();
$sql = e107::getDb();
$sql->gen('SHOW TABLE STATUS WHERE Name LIKE "'.$config['mySQLprefix'].'%" ');
$text = "
Table
Engine
Collation
Status
";
$invalidCollations = false;
while($row = $sql->fetch())
{
$text .= "
".$row['Name']."
".$row['Engine']."
".$row['Collation']."
".(($row['Collation'] == 'utf8_general_ci') ? ADMIN_TRUE_ICON : ADMIN_FALSE_ICON)."
";
// print_a($row);
if($row['Collation'] != 'utf8_general_ci')
{
$invalidCollations = true;
}
}
$text .= "
";
if($invalidCollations == true)
{
//TODO LAN
$message = '
This function will permanently modify all tables in your database. ('.$config['mySQLdefaultdb'].')
It is HIGHLY recommended that you first backup your database and switch your site into maintenance mode.
Please note:
The conversion process can take up to one minute or much much more depending on the size of your database.
The conversion does not work with serialized arrays.
Be sure that you have followed all steps of the upgrade process first.
';
$mes->add($message, E_MESSAGE_WARNING);
$text .= "
";
}
else
{
$mes->addSuccess("Your tables are using the correct character set.");
}
e107::getRender()->tablerender(DBLAN_10.SEP."Check Charset".SEP.$config['mySQLdefaultdb'], $mes->render().$text);
}
private function perform_utf8_convert()
{
$config = e107::getMySQLConfig();
$dbtable = $config['mySQLdefaultdb'];
//TODO Add a check to be sure the database is not already utf-8.
// yep, needs more methods - possibly a class in e107_handler
$sql = e107::getDb('utf8-convert');
$mes = e107::getMessage();
$ERROR = FALSE;
// if(!$sql->gen("USE information_schema;"))
// {
// $mes->add("Couldn't read information_schema", E_MESSAGE_ERROR);
// return;
// }
$queries = array();
$queries[] = $this->getQueries("SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY ', column_name, ' ', REPLACE(column_type, 'char', 'binary'), ';') FROM information_schema.columns WHERE TABLE_SCHEMA = '".$dbtable."' AND TABLE_NAME LIKE '".$config['mySQLprefix']."%' AND COLLATION_NAME != 'utf8_general_ci' and data_type LIKE '%char%';");
$queries[] = $this->getQueries("SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY ', column_name, ' ', REPLACE(column_type, 'text', 'blob'), ';') FROM information_schema.columns WHERE TABLE_SCHEMA = '".$dbtable."' AND TABLE_NAME LIKE '".$config['mySQLprefix']."%' AND COLLATION_NAME != 'utf8_general_ci' and data_type LIKE '%text%';");
$queries2 = array();
$queries2[] = $this->getQueries("SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY ', column_name, ' ', column_type, ' CHARACTER SET utf8;') FROM information_schema.columns WHERE TABLE_SCHEMA ='".$dbtable."' AND TABLE_NAME LIKE '".$config['mySQLprefix']."%' AND COLLATION_NAME != 'utf8_general_ci' and data_type LIKE '%char%';");
$queries2[] = $this->getQueries("SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY ', column_name, ' ', column_type, ' CHARACTER SET utf8;') FROM information_schema.columns WHERE TABLE_SCHEMA = '".$dbtable."' AND TABLE_NAME LIKE '".$config['mySQLprefix']."%' AND COLLATION_NAME != 'utf8_general_ci' and data_type LIKE '%text%';");
// $sql->gen("USE ".$dbtable);
// print_a($queries2);
// echo $mes->render();
// return;
// Convert Text tables to Binary.
foreach($queries as $qry)
{
foreach($qry as $q)
{
if(!$sql->db_Query($q))
{
$mes->addError($q);
$ERROR = TRUE;
}
else
{
$mes->addDebug($q);
}
}
}
//------------
// Convert Table Fields to utf8
$sql2 = e107::getDb('sql2');
$sql->gen('SHOW TABLE STATUS WHERE Collation != "utf8_general_ci" ');
while ($row = $sql->fetch())
{
$table = $row['Name'];
$tab_query = "ALTER TABLE ".$table." DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; ";
//echo "TABQRT= ".$tab_query;
if(!$sql2->db_Query($tab_query))
{
$mes->addError($tab_query);
$ERROR = TRUE;
}
else
{
$mes->addDebug($tab_query);
}
}
// ---------------
// Convert Table Fields back to Text/varchar etc.
foreach($queries2 as $qry)
{
foreach($qry as $q)
{
if(!$sql->db_Query($q))
{
$mes->addError($q);
$ERROR = TRUE;
}
else
{
$mes->addDebug($q);
}
}
}
//------------
$lastQry = "ALTER DATABASE `".$dbtable."` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
if(!$sql->db_Query($lastQry))
{
$mes->add($lastQry, E_MESSAGE_ERROR);
}
elseif($ERROR != TRUE)
{
$message = "Database Converted successfully to UTF-8. ";
//$message .= " Please now add the following line to your e107_config.php file:\$mySQLcharset = 'utf8'; ";
$mes->add($message, E_MESSAGE_SUCCESS);
}
echo $mes->render();
}
function getQueries($query)
{
$mes = e107::getMessage();
$sql = e107::getDb('utf8-convert');
if($sql->gen($query))
{
while ($row = $sql->fetch(MYSQL_NUM))
{
$qry[] = $row[0];
}
}
else
{
$mes->addError($query);
}
return $qry;
/*
if(!$result = mysql_query($query))
{
$mes->addError("Query Failed: ".$query);
return;
}
while ($row = mysql_fetch_array($result, MYSQL_NUM))
{
$qry[] = $row[0];
}
return $qry;
* */
}
/**
* Delete selected preferences.
* @return none
*/
private function del_pref_val($mode='core')
{
$mes = e107::getMessage();
$deleted_list = "";
$config = ($mode == 'core' || $mode='') ? e107::getConfig('core') : e107::getPlugConfig($mode);
// Single Pref Deletion using button
if(varset($_POST['delpref']))
{
$delpref = key($_POST['delpref']);
if($config->remove($delpref))
{
$deleted_list .= "".$delpref." ";
}
}
// Multiple Pref deletion using checkboxes
if(varset($_POST['delpref2']))
{
foreach($_POST['delpref2'] as $k => $v)
{
if($config->remove($k))
{
$deleted_list .= "".$k." ";
}
}
}
if($deleted_list && $config->save())
{
$mes->add(LAN_DELETED."");
e107::getCache()->clear();
}
}
private function delete_plugin_entry()
{
$mes = e107::getMessage();
$sql = e107::getDb();
$del = array_keys($_POST['delplug']);
if($sql->db_Delete("plugin", "plugin_id='".intval($del[0])."' LIMIT 1"))
{
$mes->add(LAN_DELETED, E_MESSAGE_SUCCESS);
}
else
{
$mes->add(LAN_DELETED_FAILED, E_MESSAGE_WARNING);
}
}
/**
* Render Options
* @return none
*/
private function render_options()
{
$frm = e107::getForm();
$mes = e107::getMessage();
$text = "
";
*/
e107::getRender()->tablerender(DBLAN_10, $mes->render().$text);
}
/**
* Import XML Form
* @return none
*/
private function importForm()
{
// Get largest allowable file upload
$frm = e107::getSingleton('e_form');
$mes = e107::getMessage();
require_once(e_HANDLER.'upload_handler.php');
$max_file_size = get_user_max_upload();
$text = "
\n";
e107::getRender()->tablerender(DBLAN_10.SEP.DBLAN_59, $mes->render().$text);
}
/**
* Export XML Dump
* @return none
*/
private function exportXmlForm()
{
$mes = e107::getMessage();
$frm = e107::getSingleton('e_form');
//TODO LANs
$text = " ";
e107::getRender()->tablerender(DBLAN_10.SEP."Export Options",$mes->render(). $text);
}
/**
* Import XML Dump
* @return none
*/
private function importXmlFile()
{
$ret = e107::getSingleton('xmlClass')->e107Import($_FILES['file_userfile']['tmp_name'][0]);
foreach($ret['success'] as $table)
{
e107::getMessage()->addSuccess("Inserted $table");
}
foreach($ret['failed'] as $table)
{
e107::getMessage()->addError("Failed to Insert $table");
}
}
/**
* Optimize SQL
* @return none
*/
private function optimizesql($mySQLdefaultdb) //FIXME Use mysql class.
{
// global $mes;
$result = mysql_list_tables($mySQLdefaultdb);
while($row = mysql_fetch_row($result))
{
mysql_query("OPTIMIZE TABLE ".$row[0]);
}
// $mes->add(DBLAN_11." $mySQLdefaultdb ".DBLAN_12, E_MESSAGE_SUCCESS);
e107::getRender()->tablerender(DBLAN_10.SEP.DBLAN_7, DBLAN_11." $mySQLdefaultdb ".DBLAN_12);
}
/**
* Preferences Editor
* @return string text for display
*/
private function pref_editor($type='core')
{
//TODO Add drop-down for editing personal perfs also. ie. user pref of self. (admin)
global $e107;
$frm = e107::getForm();
$mes = e107::getMessage();
$tp = e107::getParser();
$pref = e107::getPref();
$config = ($type == 'core') ? e107::getConfig('core') : e107::getPlugConfig($type);
$spref = $config->getPref();
ksort($spref);
$text = "
\n\n";
e107::getRender()->tablerender(DBLAN_10.SEP.DBLAN_20.SEP.ucwords($type), $mes->render().$text);
return $text;
}
/**
* Preferences Editor
* @return none
*/
private function scan_override()
{
$pref = e107::getPref();
$mes = e107::getMessage();
$f = e107::getFile();
$config = e107::getConfig();
$scList = '';
$fList = $f->get_files(e_CORE.'override/shortcodes/single', '\.php$');
$scList = array();
if(count($fList))
{
foreach($fList as $file)
{
$scList[] = strtoupper(substr($file['fname'], 0, -4));
}
$scList = implode(',', $scList);
}
$config->set('sc_override', $scList)->save(false);
// core batch overrides
$fList = $f->get_files(e_CORE.'override/shortcodes/batch', '\.php$');
$scList = array();
if(count($fList))
{
foreach($fList as $file)
{
$scList[] = substr($file['fname'], 0, -4);
}
$scList = implode(',', $scList);
}
$config->set('sc_batch_override', $scList)->save(false);
//$pref['sc_override'] = $scList;
//save_prefs();
// $mes->add(DBLAN_57.': '.$pref['sc_override'], E_MESSAGE_SUCCESS);
// FIXME lan
e107::getRender()->tablerender(
''.DBLAN_56, DBLAN_57.': '
.($config->get('sc_override') ? ' '.$config->get('sc_override') : '(empty)')
.'Batch shortcodes: '
.($config->get('sc_batch_override') ? ' '.$config->get('sc_batch_override') : '(empty)')
);
}
/**
* Plugin Folder Scanner
* @return none
*/
private function plugin_viewscan($mode = 'update')
{
$error_messages = array(0 => DBLAN_31, 1 => DBLAN_32, 2 => DBLAN_33, 3 => DBLAN_34);
// $error_image = array("integrity_pass.png", "integrity_fail.png", "warning.png", "blank.png");
$error_glyph = array(ADMIN_TRUE_ICON,ADMIN_FALSE_ICON," "," ");
$error_type = array('warning'=>2, 'error'=>1);
global $e107;
$sql = e107::getDb();
$tp = e107::getParser();
$frm = e107::getForm();
$mes = e107::getMessage();
require_once (e_HANDLER."plugin_class.php");
$ep = new e107plugin();
$ep->update_plugins_table($mode); // scan for e_xxx changes and save to plugin table.
$ep->save_addon_prefs($mode); // generate global e_xxx_list prefs from plugin table.
/* we all are awaiting for PHP5 only support - method chaining...
$mes->add(DBLAN_22.' - '.DBLAN_23, E_MESSAGE_SUCCESS)
->add("".LAN_BACK." ", E_MESSAGE_SUCCESS)
->add(DBLAN_30);
*/
$mes->add(DBLAN_23, E_MESSAGE_SUCCESS);
$mes->add("".LAN_BACK." ", E_MESSAGE_SUCCESS);
$mes->add(DBLAN_30);
$text = "
";
e107::getRender()->tablerender(DBLAN_10.SEP.DBLAN_22, $mes->render().$text);
}
}
//XXX - what is this for (backup core)?
function db_adminmenu() //FIXME - has problems when navigation is on the LEFT instead of the right.
{
global $st;
foreach($st->_options as $key=>$val)
{
$var[$key]['text'] = $val['label'];
$var[$key]['link'] = e_SELF."?mode=".$key;
}
e107::getNav()->admin(DBLAN_10, $_GET['mode'], $var);
}
/**
* Export XML File and Copy Images.
* @param object $prefs
* @param object $tables
* @param object $debug [optional]
* @return none
*/
function exportXmlFile($prefs,$tables,$package=FALSE,$debug=FALSE)
{
$xml = e107::getSingleton('xmlClass');
$tp = e107::getParser();
$mes = e107::getMessage();
//TODO LANs
if(vartrue($package))
{
$xml->convertFilePaths = TRUE;
$xml->filePathDestination = EXPORT_PATH;
$xml->filePathPrepend = array(
'news_thumbnail' => "{e_IMAGE}newspost_images/"
);
$desinationFolder = $tp->replaceConstants($xml->filePathDestination);
if(!is_writable($desinationFolder))
{
$mes->add($desinationFolder." is not writable", E_MESSAGE_ERROR);
return ;
}
}
if($xml->e107Export($prefs,$tables,$debug))
{
$mes->add("Created: ".$desinationFolder."install.xml", E_MESSAGE_SUCCESS);
if(varset($xml->fileConvertLog))
{
foreach($xml->fileConvertLog as $oldfile)
{
$file = basename($oldfile);
$newfile = $desinationFolder.$file;
if($oldfile == $newfile || (copy($oldfile,$newfile)))
{
$mes->add("Copied: ".$newfile, E_MESSAGE_SUCCESS);
}
else
{
$mes->add("Couldn't copy: ".$newfile, E_MESSAGE_ERROR);
}
}
}
}
}
function table_list()
{
// grab default language lists.
//TODO - a similar function is in db_verify.php. Should probably all be moved to mysql_class.php.
$exclude = array();
$exclude[] = "core";
$exclude[] = "rbinary";
$exclude[] = "parser";
$exclude[] = "tmp";
$exclude[] = "online";
$exclude[] = "upload";
$exclude[] = "user_extended_country";
$exclude[] = "plugin";
$coreTables = e107::getDb()->db_TableList('nolan');
$tables = array_diff($coreTables,$exclude);
foreach($tables as $e107tab)
{
$count = e107::getDb()->db_Select_gen("SELECT * FROM #".$e107tab);
if($count)
{
$tabs[$e107tab] = $count;
}
}
return $tabs;
}
/* Still needed?
function backup_core()
{
global $pref, $sql;
$tmp = base64_encode((serialize($pref)));
if(!$sql->db_Insert("core", "'pref_backup', '{$tmp}' "))
{
$sql->db_Update("core", "e107_value='{$tmp}' WHERE e107_name='pref_backup'");
}
}
*/
/*
function verify_sql_record() // deprecated by db_verify.php ( i think).
{
global $e107;
$sql = e107::getDb();
$sql2 = e107::getDb('sql2');
$sql3 = e107::getDb('sql3');
$frm = e107::getForm();
$tp = e107::getParser();
$mes = e107::getMessage();
$tables = array();
$tables[] = 'rate';
$tables[] = 'comments';
if(isset($_POST['delete_verify_sql_record']))
{
if(!varset($_POST['del_dbrec']))
{
$mes->add('Nothing to delete', E_MESSAGE_DEBUG);
}
else
{
$msg = "ok, so you want to delete some records? not a problem at all! ";
$msg .= "but, since this is still an experimental procedure, i won't actually delete anything ";
$msg .= "instead, i will show you the queries that would be performed ";
$text .= " ";
$mes->add($msg, E_MESSAGE_DEBUG);
foreach($_POST['del_dbrec'] as $k => $v)
{
if($k == 'rate')
{
$keys = implode(", ", array_keys($v));
$qry .= "DELETE * FROM rate WHERE rate_id IN (".$keys.") ";
}
elseif($k == 'comments')
{
$keys = implode(", ", array_keys($v));
$qry .= "DELETE * FROM comments WHERE comment_id IN (".$keys.") ";
}
}
$mes->add($qry, E_MESSAGE_DEBUG);
$mes->add("".LAN_BACK." ", E_MESSAGE_DEBUG);
}
}
//Nothing selected
if(isset($_POST['check_verify_sql_record']) && (!isset($_POST['table_rate']) && !isset($_POST['table_comments'])))
{
$_POST['check_verify_sql_record'] = '';
unset($_POST['check_verify_sql_record']);
$mes->add(DBLAN_53, E_MESSAGE_WARNING);
}
if(!isset($_POST['check_verify_sql_record']))
{
//select table to verify
$text = "
";
$ns->tablerender(DBLAN_10.SEP.DBLAN_39, $mes->render().$text);
}
else
{
//function to sort the results
function verify_sql_record_cmp($a, $b)
{
$orderby = array('type' => 'asc', 'itemid' => 'asc');
$result = 0;
foreach($orderby as $key => $value)
{
if($a[$key] == $b[$key])
continue;
$result = ($a[$key] < $b[$key]) ? - 1 : 1;
if($value == 'desc')
$result = - $result;
break;
}
return $result;
}
//function to display the results
//$err holds the error data
//$ctype holds the tablename
function verify_sql_record_displayresult($err, $ctype)
{
global $frm;
usort($err, 'verify_sql_record_cmp');
$text = "
".DBLAN_40." ".$ctype."
".DBLAN_41."
".DBLAN_42."
".DBLAN_43."
".LAN_OPTIONS."
";
if(is_array($err) && !empty($err))
{
foreach($err as $k => $v)
{
$delkey = $v['sqlid'];
$text .= "
{$v['type']}
{$v['itemid']}
".($v['table_exist'] ? DBLAN_45 : DBLAN_46)."
".$frm->checkbox('del_dbrec['.$ctype.']['.$delkey.'][]', '1').$frm->label(LAN_DELETE, 'del_dbrec['.$ctype.']['.$delkey.'][]', '1')."
";
}
}
else
{
$text .= "
{$err}
";
}
$text .= "
";
return $text;
}
function verify_sql_record_gettables()
{
$sql2 = e107::getDb('sql2');
//array which will hold all db tables
$dbtables = array();
//get all tables in the db
$sql2->db_Select_gen("SHOW TABLES");
while($row2 = $sql2->db_Fetch())
{
$dbtables[] = $row2[0];
}
return $dbtables;
}
$text = "
";
$ns->tablerender(DBLAN_10.SEP.DBLAN_50, $mes->render().$text);
}
}
*/
?>