MySQL Dump 파일 분석함수

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;
}

어떻게 나오는지는 직접 해보시기 바랍니다( 샘플 데이타 만들기 귀찮아서… ( -_-);; )

Leave a Reply