Простой парсер SQL-дампов

Это код простого SQL-парсера, у которого только одна задача - извлекать запросы из SQL-дампов (файлов). Почему парсер простой? Потому что сложный используется в подсветке кода :)

Код вполне может содержать ошибки, не судите строго. Если ошибки есть, присылайте их мне, обязательно исправлю!

 

Код - Простой парсер SQL-дампов

 

<?php

/**

 * Простой парсер SQL-дампов для извлечения запросов

 * 

 * Использование:

 *   SQLParser::getQueriesFromFile('Имя файла')  - Извлечение запросов из файла

 *   SQLParser::getQueries('SQL-дамп')           - Извлечение запросов из строки

 *   

 *   Обе функции возвращают массив из запросов. Пустые запросы опускаются.

 * 

 * Лицензия:

 *   Это свободный код, используйте его на свой страх и риск.

 *   Автор не несёт никакой ответственности! :)

 * 

 * @author Прибора Антон Николаевич (http://anton-pribora.ru)

 * @copyright (c) Прибора Антон Николаевич, 2008-11-07

 */



/**

 * Парсер SQL-запросов

 *

 */

class SQLParser

{

    /**

     * Выборка SQL-запросов из файла

     *

     * @param string $file

     * @return array

     */

    static public function getQueriesFromFile( $file )

    {

        return self::getQueries( file_get_contents($file) );

    }

    

    /**

     * Разбор SQL-строки на запросы

     *

     * @param string $sql

     * @return array

     */

    static public function getQueries( $sql )

    {

        $queries  = array();

        $strlen   = strlen($sql);

        $position = 0;

        $query    = '';

        

        for ( ; $position < $strlen; ++$position )

        {

            $char  = $sql{ $position };

            

            switch ( $char )

            {

                case '-':

                    if ( substr($sql, $position, 3) !== '-- ' )

                    {

                        $query .= $char;

                        break;

                    }

                    

                case '#':

                    while ( $char !== "r" && $char !== "n" && $position < $strlen - 1 )

                        $char = $sql{ ++$position };

                    break;

                    

                case '`':

                case ''':

                case '"':

                    $quote  = $char;

                    $query .= $quote;

                    

                    while ( $position < $strlen - 1 )

                    {

                        $char = $sql{ ++$position };

                        

                        if ( $char === '' )

                        {

                            $query .= $char;

                            

                            if ( $position < $strlen - 1 )

                            {

                                $char   = $sql{ ++$position };

                                $query .= $char;

                                

                                if ( $position < $strlen - 1 ) $char = $sql{ ++$position };

                            }

                            else 

                            {

                                break;

                            }

                        }

                        

                        if ( $char === $quote ) break;

                        

                        $query .= $char;

                    }

                    

                    $query .= $quote;

                    break;

                    

                case ';':

                    $query = trim($query);

                    if ( $query ) $queries[] = $query;

                    $query     = '';

                    break;

                    

                default:

                    $query .= $char;

                    break;

            }

        }

        

        $query = trim( $query );

        if ( $query ) $queries[] = $query;

        

        return $queries;

    }

}


?>


Пример использования.

 

<?php


require('SQLParser.class.php');


header('Content-Type: text/plain; charset=windows-1251');


$SQL = <<<SQL

-- phpMyAdmin SQL Dump

-- version 2.6.1

-- http://www.phpmyadmin.net

-- 

-- Хост: localhost

-- Время создания: Ноя 07 2008 г., 20:48

-- Версия сервера: 4.1.16

-- Версия PHP: 5.2.3

-- 

-- БД: `my_db`

-- 


-- 

-- Дамп данных таблицы `table`

-- 


INSERT INTO `table` VALUES ('`; ';'); -- Comment

INSERT INTO `table` VALUES ("";asdasd;asd asd; asd""); # Comment

        

SQL;


print_r( SQLParser::getQueries($SQL) );


?>

 

Код - Результат

 

Array

(

    [0] => INSERT INTO `table` VALUES ('`; ';')

    [1] => INSERT INTO `table` VALUES ("";asdasd;asd asd; asd"")




Рекомендуем почитать

 

Добавить комментарий


Ваше имя:


Комментарий:


Введите: Картинка