$Date: 2006-12-13 16:16:03 -0500 (Wed, 13 Dec 2006) $
| > $Revision: 791 $
| > $Author: bfarber $
+---------------------------------------------------------------------------
|
| > mySQL Admin Stuff
| > Module written by Matt Mecham
| > Date started: 21st October 2002
|
| > Module Version Number: 1.0.0
| > Music listen to when coding this: Martin Grech - Open Heart Zoo
| > Talk about useless information!
+--------------------------------------------------------------------------
*/
if ( ! defined( 'IN_ACP' ) )
{
print "
Некорректный адрес
Вы не имеете доступа к этому файлу напрямую. Если вы недавно обновляли форум, вы должны обновить все соответствующие файлы.";
exit();
}
@set_time_limit(1200);
class ad_sql_module {
var $base_url;
var $mysql_version = "";
var $true_version = "";
var $str_gzip_header = "\x1f\x8b\x08\x00\x00\x00\x00\x00";
var $db_has_issues = false;
/**
* Section title name
*
* @var string
*/
var $perm_main = "admin";
/**
* Section title name
*
* @var string
*/
var $perm_child = "sql";
/*-------------------------------------------------------------------------*/
// Auto run module
/*-------------------------------------------------------------------------*/
function auto_run()
{
$this->ipsclass->admin->nav[] = array( $this->ipsclass->form_code, 'Инструменты' );
//-----------------------------------------
// Make sure we're a root admin, or else!
//-----------------------------------------
if ($this->ipsclass->member['mgroup'] != $this->ipsclass->vars['admin_group'])
{
$this->ipsclass->admin->error("Извините, но эти функции только для администраторской группы");
}
//-----------------------------------------
// Get the mySQL version.
//-----------------------------------------
$this->ipsclass->DB->sql_get_version();
$this->true_version = $this->ipsclass->DB->true_version;
$this->mysql_version = $this->ipsclass->DB->mysql_version;
switch($this->ipsclass->input['code'])
{
case 'dotool':
$this->run_tool();
break;
case 'runtime':
$this->view_sql("SHOW STATUS");
break;
case 'system':
$this->view_sql("SHOW VARIABLES");
break;
case 'processes':
$this->view_sql("SHOW PROCESSLIST");
break;
case 'runsql':
$_POST['query'] = isset($_POST['query']) ? $_POST['query'] : '';
$q = $_POST['query'] == "" ? urldecode($_GET['query']) : $_POST['query'];
$this->view_sql(trim(stripslashes($q)));
break;
case 'backup':
$this->show_backup_form();
break;
case 'safebackup':
$this->sbup_splash();
break;
case 'dosafebackup':
$this->do_safe_backup();
break;
case 'export_tbl':
$this->do_safe_backup(trim(urldecode(stripslashes($_GET['tbl']))));
break;
//-----------------------------------------
default:
$this->list_index();
break;
}
}
//-----------------------------------------
// Back up baby, back up
//-----------------------------------------
function do_safe_backup($tbl_name="")
{
if ($tbl_name == "")
{
// Auto all tables
$skip = intval($this->ipsclass->input['skip']);
$create_tbl = intval($this->ipsclass->input['create_tbl']);
$enable_gzip = intval($this->ipsclass->input['enable_gzip']);
$filename = 'ibf_dbbackup';
}
else
{
// Man. click export
$skip = 0;
$create_tbl = 0;
$enable_gzip = 1;
$filename = $tbl_name;
}
$output = "";
@header("Pragma: no-cache");
$do_gzip = 0;
if( $enable_gzip )
{
$phpver = phpversion();
if($phpver >= "4.0")
{
if(extension_loaded("zlib"))
{
$do_gzip = 1;
}
}
}
if( $do_gzip != 0 )
{
@ob_start();
@ob_implicit_flush(0);
header("Content-Type: text/x-delimtext; name=\"$filename.sql.gz\"");
header("Content-disposition: attachment; filename=$filename.sql.gz");
}
else
{
header("Content-Type: text/x-delimtext; name=\"$filename.sql\"");
header("Content-disposition: attachment; filename=$filename.sql");
}
//-----------------------------------------
// Get tables to work on
//-----------------------------------------
if ($tbl_name == "")
{
$tmp_tbl = $this->ipsclass->DB->get_table_names();
foreach($tmp_tbl as $tbl)
{
// Ensure that we're only peeking at IBF tables
if ( preg_match( "/^".$this->ipsclass->vars['sql_tbl_prefix']."/", $tbl ) )
{
// We've started our headers, so print as we go to stop
// poss memory problems
$this->get_table_sql($tbl, $create_tbl, $skip);
}
}
}
else
{
$this->get_table_sql($tbl_name, $create_tbl, $skip);
}
//-----------------------------------------
// GZIP?
//-----------------------------------------
if($do_gzip)
{
$size = ob_get_length();
$crc = crc32(ob_get_contents());
$contents = gzcompress(ob_get_contents());
ob_end_clean();
echo $this->str_gzip_header
.substr($contents, 0, strlen($contents) - 4)
.$this->gzip_four_chars($crc)
.$this->gzip_four_chars($size);
}
exit();
}
//-----------------------------------------
// Internal handler to return content from table
//-----------------------------------------
function get_table_sql($tbl, $create_tbl, $skip=0)
{
if ($create_tbl)
{
// Generate table structure
if ( $this->ipsclass->input['addticks'] )
{
$this->ipsclass->DB->query("SHOW CREATE TABLE `".$this->ipsclass->vars['sql_database'].".".$tbl."`");
}
else
{
$this->ipsclass->DB->query("SHOW CREATE TABLE ".$this->ipsclass->vars['sql_database'].".".$tbl);
}
$ctable = $this->ipsclass->DB->fetch_row();
echo $this->sql_strip_ticks($ctable['Создать таблицу']).";\n";
}
// Are we skipping? Woohoo, where's me rope?!
if ($skip == 1)
{
if ($tbl == $this->ipsclass->vars['sql_tbl_prefix'].'admin_sessions'
OR $tbl == $this->ipsclass->vars['sql_tbl_prefix'].'sessions'
OR $tbl == $this->ipsclass->vars['sql_tbl_prefix'].'reg_anti_spam'
OR $tbl == $this->ipsclass->vars['sql_tbl_prefix'].'search_results'
)
{
return $ret;
}
}
// Get the data
$this->ipsclass->DB->query("SELECT * FROM $tbl");
// Check to make sure rows are in this
// table, if not return.
$row_count = $this->ipsclass->DB->get_num_rows();
if ($row_count < 1)
{
return TRUE;
}
//-----------------------------------------
// Get col names
//-----------------------------------------
$f_list = "";
$fields = $this->ipsclass->DB->get_result_fields();
$cnt = count($fields);
for( $i = 0; $i < $cnt; $i++ )
{
$f_list .= $fields[$i]->name . ", ";
}
$f_list = preg_replace( "/, $/", "", $f_list );
while ( $row = $this->ipsclass->DB->fetch_row() )
{
//-----------------------------------------
// Get col data
//-----------------------------------------
$d_list = "";
for( $i = 0; $i < $cnt; $i++ )
{
if ( ! isset($row[ $fields[$i]->name ]) )
{
$d_list .= "NULL,";
}
elseif ( $row[ $fields[$i]->name ] != '' )
{
$d_list .= "'".$this->sql_add_slashes($row[ $fields[$i]->name ]). "',";
}
else
{
$d_list .= "'',";
}
}
$d_list = preg_replace( "/,$/", "", $d_list );
echo "INSERT INTO $tbl ($f_list) VALUES($d_list);\n";
}
return TRUE;
}
//-----------------------------------------
// sql_strip_ticks from field names
//-----------------------------------------
function sql_strip_ticks($data)
{
return str_replace( "`", "", $data );
}
//-----------------------------------------
// Add slashes to single quotes to stop sql breaks
//-----------------------------------------
function sql_add_slashes($data)
{
$data = str_replace('\\', '\\\\', $data);
$data = str_replace('\'', '\\\'', $data);
$data = str_replace("\r", '\r' , $data);
$data = str_replace("\n", '\n' , $data);
return $data;
}
//-----------------------------------------
// Almost there!
//-----------------------------------------
function sbup_splash()
{
$this->ipsclass->admin->page_detail = "В этой секции вы можете произвести резервную копию вашей базы данных.";
$this->ipsclass->admin->nav[] = array( '', 'Резервное копирование MySQL' );
$this->ipsclass->admin->page_title = "mySQL ".$this->true_version." — резервное копирование";
// Check for mySQL version..
// Might change at some point..
if ( $this->mysql_version < 3232 )
{
$this->ipsclass->admin->error("Извините, но версия mySQL ниже, чем 3.23.21 и Вы не сможете осуществить резервное копирование");
}
$this->ipsclass->adskin->td_header[] = array( " " , "100%" );
$this->ipsclass->html .= $this->ipsclass->adskin->start_table( "Простое копирование" );
$this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array(
"Резервное копирование базы mySQL
После того, как Вы нажмёте на ссылку ниже, необходимо будет подождать, пока Ваш браузер не загрузит следующую страницу. Время загрузки может затянуться на несколько минут, в зависимости от размера копируемой базы данных.