КИТА unofficial

Компьютерный => Программирование => Тема начата: zer_owlet от Август 06, 2010, 10:11:05



Название: SQL parser
Отправлено: zer_owlet от Август 06, 2010, 10:11:05
Задача вот какая: есть SQL конструкция, ее нужно преобразовать в удобоваримый массив чтобы было понятно какие какие таблицы юзаются, что за операция проходит и что за значения полей записываются.

Мож кто-то реализовывал уже подобную задачу или видел нечто подобное? Желательно на ПХП.

Смысл этой задачи: логировать все нужные действия (например, запись кеша не нужна, обновление времени доступа тоже неинтересная информация) на сервере с целью переноса их (и только их, а не всей базы) на другой сервер.


Название: Re: SQL parser
Отправлено: naxellar от Август 06, 2010, 11:49:33
zer_owlet, это как задача для нас или для помощи вам?
Насколько я понял, это решается с использованием RexExp, только нужно сначала выписать все варианты, то есть между какими словами находится имя таблицы, в каких местах изменяемые столбцы.


Название: Re: SQL parser
Отправлено: Alder от Август 07, 2010, 03:58:43
zer_owlet,
http://www.phpclasses.org/package/4916-PHP-Build-a-tree-to-represent-an-SQL-query.html (http://www.phpclasses.org/package/4916-PHP-Build-a-tree-to-represent-an-SQL-query.html)
http://www.tehuber.com/article.php?story=20081016164856267 (http://www.tehuber.com/article.php?story=20081016164856267)


Название: Re: SQL parser
Отправлено: zer_owlet от Август 08, 2010, 10:31:16
zer_owlet, это как задача для нас или для помощи вам?
Насколько я понял, это решается с использованием RexExp, только нужно сначала выписать все варианты, то есть между какими словами находится имя таблицы, в каких местах изменяемые столбцы.

Эта задача из типа "мож кто уже делал и может подсказать оптимальное решение?" :)

zer_owlet,
http://www.phpclasses.org/package/4916-PHP-Build-a-tree-to-represent-an-SQL-query.html (http://www.phpclasses.org/package/4916-PHP-Build-a-tree-to-represent-an-SQL-query.html)
http://www.tehuber.com/article.php?story=20081016164856267 (http://www.tehuber.com/article.php?story=20081016164856267)

Ага, видел эти классы. Второй практически ничего не дает, т.к. выдает результаты в виде:
Код:
SqlParser Object
(
    [handle] =>
    [query:SqlParser:private] => Array
        (
            [select] => SELECT DISTINCT b.*
            [from] => FROM blocks b LEFT JOIN blocks_roles r ON b.module = r.module AND b.delta = r.delta
            [where] => WHERE b.theme = 'garland' AND b.status = 1 AND (r.rid IN (2) OR r.rid IS NULL)
            [order] => ORDER BY b.region, b.weight, b.module
        )

)

Первый выдает результаты чуть лучше, но это дерево потом хрен прочитаешь ))


Название: Re: SQL parser
Отправлено: zer_owlet от Август 17, 2010, 03:03:12
Свой выбор я таки остановил на http://www.phpclasses.org/package/5007-PHP-Parse-and-compose-SQL-queries-programatically.html
Во время тестов этот класс выдал очень хорошие результаты. Правда, не знаю как быстро он работает и сколько памяти ест. До тестирования этих моментов руки еще не дошли.


Название: Re: SQL parser
Отправлено: Alder от Август 17, 2010, 04:20:36
zer_owlet, а его планируется запускать постоянно при каждой операции с БД или только на время тестирования наиболее требовательных к производительности моментов?


Название: Re: SQL parser
Отправлено: zer_owlet от Август 17, 2010, 07:02:48
Мне нужно в момент окончания работы скрипта проанализировать все запросы и сохранить лишь важные: изменение настроек, инсталяция модуля, операции с контентом. Для этого нужно определить тип запроса, таблицу, поля. Если операция попадает в список логируемых, таблица и поле не попадают в список игнорируемых, то что-то там бдует выполняться.

Вот как-то так.


Название: Re: SQL parser
Отправлено: artri от Август 17, 2010, 09:00:56
изменение настроек, инсталяция модуля, операции с контентом. Для этого нужно определить тип запроса, таблицу, поля. Если операция попадает в список логируемых, таблица и поле не попадают в список игнорируемых, то что-то там бдует выполняться.

А не проще ли будет необходимые операции вынести в отдельный уровень бизнес логики и уже там сразу что-то выполнять?


Название: Re: SQL parser
Отправлено: Alder от Август 17, 2010, 09:09:28
artri, тоже хотел задать вопрос этот.


Название: Re: SQL parser
Отправлено: zer_owlet от Август 17, 2010, 10:14:21
Дело в том что эта фича является надстройкой над системой и логирует все важные выполняемые запросы, не меняя логику самого сайта. Что-то типа шпионской тулзы, поэтому приходится пристыковываться к системе и фильтровать запросы.

В итоге получится лог-файл со всеми изменениями на одном сервере, которые можно будет перенести на другой сервер, не запоминая и не записывая на бумажку.