parse_sql_dump 함수는 mysql 덤프파일의 내용을 분석해서, 배열로 추출합니다.
배열형태로 추출하므로, DB 변환과 같은 작업에서 유용하게 사용할 수 있을 것 같습니다(사실, 그 용도로 만들었던 겁니다. ^^)
/**
* parse mysql dump sql
*
* created by 행복한고니 (gonom9@gmail.com)
*/
function parse_sql_dump($str)
{
$data = $cols = array();
$in_table = $in_quote = false;
$lines = explode("\n", $str);
foreach ($lines as $line) {
$line = trim($line);
if (!$line) continue;
if (substr($line,0,2) == '--') continue;
if ($in_table === false) {
if (preg_match('/^CREATE TABLE `?([a-z0-9_]+)`?/i', $line, $match)) {
$table = $match[1];
$data[$table] = array();
$cols[$table] = array();
$in_table = true;
continue;
} elseif (preg_match('/^INSERT INTO ([a-zA-Z0-9_]+) VALUES \(/i', $line, $match)) {
$table = $match[1];
$line = substr($line, strlen($match[0]));
preg_match_all('/\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|[0-9\.]+|NULL/i', $line, $match);
$arr = array();
foreach ($match[0] as $key=>$value) {
if (strtolower($value) == 'NULL') $value = 'NULL';
$arr[$cols[$table][$key]] = $value;
}
$data[$table][] = $arr;
}
} elseif ($in_table) {
if ($line{0} == ')') { $in_table = false; continue; }
if (preg_match('/`?([a-zA-Z0-9_]+)`? ((tiny|small|big)?int|(var)?char|date(time)?|time(stamp)?|enum|set|(tiny|medium|long)?(blob|text)|year|float|double)/i', $line, $match)) {
$cols[$table][] = $match[1];
}
continue;
}
}
return $data;
}
어떻게 나오는지는 직접 해보시기 바랍니다( 샘플 데이타 만들기 귀찮아서... ( -_-);; )