1
0
Fork 0
MySQLDumper/inc/mysql.php
2011-06-10 22:58:43 +00:00

470 Zeilen
11 KiB
PHP

<?php
if (!defined('MSD_VERSION')) die('No direct access.');
//Feldspezifikationen
$feldtypen=Array(
"VARCHAR",
"TINYINT",
"TEXT",
"DATE",
"SMALLINT",
"MEDIUMINT",
"INT",
"BIGINT",
"FLOAT",
"DOUBLE",
"DECIMAL",
"DATETIME",
"TIMESTAMP",
"TIME",
"YEAR",
"CHAR",
"TINYBLOB",
"TINYTEXT",
"BLOB",
"MEDIUMBLOB",
"MEDIUMTEXT",
"LONGBLOB",
"LONGTEXT",
"ENUM",
"SET"
);
$feldattribute=ARRAY(
"",
"BINARY",
"UNSIGNED",
"UNSIGNED ZEROFILL"
);
$feldnulls=Array(
"NOT NULL",
"NULL"
);
$feldextras=Array(
"",
"AUTO_INCREMENT"
);
$feldkeys=Array(
"",
"PRIMARY KEY",
"UNIQUE KEY",
"FULLTEXT"
);
$feldrowformat=Array(
"",
"FIXED",
"DYNAMIC",
"COMPRESSED"
);
$rechte_daten=Array(
"SELECT",
"INSERT",
"UPDATE",
"DELETE",
"FILE"
);
$rechte_struktur=Array(
"CREATE",
"ALTER",
"INDEX",
"DROP",
"CREATE TEMPORARY TABLES"
);
$rechte_admin=Array(
"GRANT",
"SUPER",
"PROCESS",
"RELOAD",
"SHUTDOWN",
"SHOW DATABASES",
"LOCK TABLES",
"REFERENCES",
"EXECUTE",
"REPLICATION CLIENT",
"REPLICATION SLAVE"
);
$rechte_resourcen=Array(
"MAX QUERIES PER HOUR",
"MAX UPDATES PER HOUR",
"MAX CONNECTIONS PER HOUR"
);
$sql_keywords=array(
'ALTER',
'AND',
'ADD',
'AUTO_INCREMENT',
'BETWEEN',
'BINARY',
'BOTH',
'BY',
'BOOLEAN',
'CHANGE',
'CHARSET',
'CHECK',
'COLLATE',
'COLUMNS',
'COLUMN',
'CROSS',
'CREATE',
'DATABASES',
'DATABASE',
'DATA',
'DELAYED',
'DESCRIBE',
'DESC',
'DISTINCT',
'DELETE',
'DROP',
'DEFAULT',
'ENCLOSED',
'ENGINE',
'ESCAPED',
'EXISTS',
'EXPLAIN',
'FIELDS',
'FIELD',
'FLUSH',
'FOR',
'FOREIGN',
'FUNCTION',
'FROM',
'GROUP',
'GRANT',
'HAVING',
'IGNORE',
'INDEX',
'INFILE',
'INSERT',
'INNER',
'INTO',
'IDENTIFIED',
'JOIN',
'KEYS',
'KILL',
'KEY',
'LEADING',
'LIKE',
'LIMIT',
'LINES',
'LOAD',
'LOCAL',
'LOCK',
'LOW_PRIORITY',
'LEFT',
'LANGUAGE',
'MEDIUMINT',
'MODIFY',
'MyISAM',
'NATURAL',
'NOT',
'NULL',
'NEXTVAL',
'OPTIMIZE',
'OPTION',
'OPTIONALLY',
'ORDER',
'OUTFILE',
'OR',
'OUTER',
'ON',
'PROCEEDURE',
'PROCEDURAL',
'PRIMARY',
'READ',
'REFERENCES',
'REGEXP',
'RENAME',
'REPLACE',
'RETURN',
'REVOKE',
'RLIKE',
'RIGHT',
'SHOW',
'SONAME',
'STATUS',
'STRAIGHT_JOIN',
'SELECT',
'SETVAL',
'TABLES',
'TEMINATED',
'TO',
'TRAILING',
'TRUNCATE',
'TABLE',
'TEMPORARY',
'TRIGGER',
'TRUSTED',
'UNIQUE',
'UNLOCK',
'USE',
'USING',
'UPDATE',
'UNSIGNED',
'VALUES',
'VARIABLES',
'VIEW',
'WITH',
'WRITE',
'WHERE',
'ZEROFILL',
'XOR',
'ALL',
'ASC',
'AS',
'SET',
'IN',
'IS',
'IF'
);
$mysql_doc=Array(
"Feldtypen" => "http://dev.mysql.com/doc/mysql/de/Column_types.html"
);
$mysql_SQLhasRecords=array(
'SELECT',
'SHOW',
'EXPLAIN',
'DESCRIBE',
'DESC'
);
function MSD_mysql_connect($encoding='utf8', $keycheck_off=false, $actual_table='')
{
global $config,$databases;
$port=( isset($config['dbport']) && !empty($config['dbport']) ) ? ':' . $config['dbport'] : '';
$socket=( isset($config['dbsocket']) && !empty($config['dbsocket']) ) ? ':' . $config['dbsocket'] : '';
$config['dbconnection']=mysql_connect($config['dbhost'] . $port . $socket,$config['dbuser'],$config['dbpass']) or die(SQLError("Database connection error: ",mysql_error()));
if (!defined('MSD_MYSQL_VERSION')) GetMySQLVersion();
if (!isset($config['mysql_standard_character_set']) || $config['mysql_standard_character_set'] == '') get_sql_encodings();
if ($config['mysql_standard_character_set'] != $encoding)
{
$set_encoding=@mysql_query('SET NAMES \'' . $encoding . '\'',$config['dbconnection']);
if ($set_encoding === false) $config['mysql_can_change_encoding']=false;
else $config['mysql_can_change_encoding']=true;
}
if ($keycheck_off) mysql_query('SET FOREIGN_KEY_CHECKS=0',$config['dbconnection']);
return $config['dbconnection'];
}
function GetMySQLVersion()
{
$res=MSD_query("select version()");
$row=mysql_fetch_array($res);
$version=$row[0];
if (!defined('MSD_MYSQL_VERSION')) define('MSD_MYSQL_VERSION',$version);
$versions=explode('.',$version);
$new=false;
if ($versions[0] == 4 && $versions[1] >= 1) $new=true;
if ($versions[0] > 4) $new=true;
if (!defined('MSD_NEW_VERSION')) define('MSD_NEW_VERSION',$new);
return $version;
}
function MSD_query($query, $error_output=true)
{
global $config;
if (!isset($config['dbconnection'])) MSD_mysql_connect();
//echo "<br>Query: ".htmlspecialchars($query);
$res=mysql_query($query,$config['dbconnection']);
if (false === $res && $error_output) SQLError($query,mysql_error($config['dbconnection']));
return $res;
}
function SQLError($sql, $error, $return_output=false)
{
// v(debug_backtrace());
global $lang;
$ret='<div align="center"><table style="border:1px solid #ff0000" cellspacing="0">
<tr bgcolor="#ff0000"><td style="color:white;font-size:16px;"><strong>MySQL-ERROR</strong></td></tr>
<tr><td style="width:80%;overflow: auto;">' . $lang['L_SQL_ERROR2'] . '<br><span style="color:red;">' . $error . '</span></td></tr>
<tr><td width="600"><br>' . $lang['L_SQL_ERROR1'] . '<br>' . Highlight_SQL($sql) . '</td></tr>
</table></div>';
if ($return_output) return $ret;
else echo $ret;
}
function Highlight_SQL($sql)
{
global $sql_keywords;
$end='';
$tickstart=false;
if (function_exists("token_get_all")) $a=@token_get_all("<?$sql?>");
else return $sql;
foreach ($a as $token)
{
if (!is_array($token))
{
if ($token == '`') $tickstart=!$tickstart;
$end.=$token;
}
else
{
if ($tickstart) $end.=$token[1];
else
{
switch (token_name($token[0]))
{
case "T_STRING":
case "T_AS":
case "T_FOR":
$end.=( in_array(strtoupper($token[1]),$sql_keywords) ) ? "<span style=\"color:#990099;font-weight:bold;\">" . $token[1] . "</span>" : $token[1];
break;
case "T_IF":
case "T_LOGICAL_AND":
case "T_LOGICAL_OR":
case "T_LOGICAL_XOR":
$end.=( in_array(strtoupper($token[1]),$sql_keywords) ) ? "<span style=\"color:#0000ff;font-weight:bold;\">" . $token[1] . "</span>" : $token[1];
break;
case "T_CLOSE_TAG":
case "T_OPEN_TAG":
break;
default:
$end.=$token[1];
}
}
}
}
$end=preg_replace("/`(.*?)`/si","<span style=\"color:red;\">`$1`</span>",$end);
return $end;
}
function Fieldlist($db, $tbl)
{
$fl='';
$res=MSD_query("SHOW FIELDS FROM `$db`.`$tbl`;");
if ($res)
{
$fl='(';
for ($i=0; $i < mysql_num_rows($res); $i++)
{
$row=mysql_fetch_row($res);
$fl.='`' . $row[0] . '`,';
}
$fl=substr($fl,0,strlen($fl) - 1) . ')';
}
return $fl;
}
// reads all Tableinfos and place them in $dump-Array
function getDBInfos()
{
global $databases,$dump,$config,$tbl_sel,$flipped;
for ($ii=0; $ii < count($databases['multi']); $ii++)
{
$dump['dbindex']=$flipped[$databases['multi'][$ii]];
$tabellen=mysql_query('SHOW TABLE STATUS FROM `' . $databases['Name'][$dump['dbindex']] . '`',$config['dbconnection']) or die('getDBInfos: ' . mysql_error());
$num_tables=mysql_num_rows($tabellen);
// Array mit den gewünschten Tabellen zusammenstellen... wenn Präfix angegeben, werden die anderen einfach nicht übernommen
if ($num_tables > 0)
{
for ($i=0; $i < $num_tables; $i++)
{
$row=mysql_fetch_array($tabellen);
if (isset($row['Type'])) $row['Engine']=$row['Type'];
if (isset($row['Comment']) && substr(strtoupper($row['Comment']),0,4) == 'VIEW') $dump['table_types'][]='VIEW';
else $dump['table_types'][]=strtoupper($row['Engine']);
// check if data needs to be backed up
if (strtoupper($row['Comment']) == 'VIEW' || ( isset($row['Engine']) && in_array(strtoupper($row['Engine']),array(
'MEMORY'
)) ))
{
$dump['skip_data'][]=$databases['Name'][$dump['dbindex']] . '|' . $row['Name'];
}
if ($config['optimize_tables_beforedump'] == 1 && $dump['table_offset'] == -1) mysql_query('OPTIMIZE `' . $row['Name'] . '`');
if (isset($tbl_sel))
{
if (in_array($row['Name'],$dump['tblArray']))
{
$dump['tables'][]=$databases['Name'][$dump['dbindex']] . '|' . $row['Name'];
$dump['records'][]=$databases['Name'][$dump['dbindex']] . '|' . $row['Rows'];
$dump['totalrecords']+=$row['Rows'];
}
}
elseif ($databases['praefix'][$dump['dbindex']] != '' && !isset($tbl_sel))
{
if (substr($row['Name'],0,strlen($databases['praefix'][$dump['dbindex']])) == $databases['praefix'][$dump['dbindex']])
{
$dump['tables'][]=$databases['Name'][$dump['dbindex']] . '|' . $row['Name'];
$dump['records'][]=$databases['Name'][$dump['dbindex']] . '|' . $row['Rows'];
$dump['totalrecords']+=$row['Rows'];
}
}
else
{
$dump['tables'][]=$databases['Name'][$dump['dbindex']] . '|' . $row['Name'];
$dump['records'][]=$databases['Name'][$dump['dbindex']] . '|' . $row['Rows'];
// Get nr of records -> need to do it this way because of incorrect returns when using InnoDBs
$sql_2="SELECT count(*) as `count_records` FROM `" . $databases['Name'][$dump['dbindex']] . "`.`" . $row['Name'] . "`";
$res2=@mysql_query($sql_2);
if ($res2 === false)
{
$read_error='(' . mysql_errno() . ') ' . mysql_error();
SQLError($read_error,$sql_2);
WriteLog($read_error);
if ($config['stop_with_error'] > 0)
{
die($read_error);
}
}
else
{
$row2=@mysql_fetch_array($res2);
$row['Rows']=$row2['count_records'];
$dump['totalrecords']+=$row['Rows'];
}
}
}
// Correct total number of records; substract skipped data
foreach ($dump['skip_data'] as $skip_data)
{
$index=false;
$records_to_skip=0;
//find index of table to get the nr of records
$count=sizeof($dump['tables']);
for ($a=0; $a < $count; $a++)
{
if ($dump['tables'][$a] == $skip_data)
{
$index=$a;
$t=explode('|',$dump['records'][$a]);
$rekords_to_skip=$t[1];
break;
}
}
if ($index) $dump['totalrecords']-=$rekords_to_skip;
}
}
}
}
// gets the numeric index in dump-array and returns it
function getDBIndex($db, $table)
{
global $dump;
$index=array_keys($dump['tables'],$db . '|' . $table);
return $index[0];
}
?>