Forum Webscript.Ru
Программирование => Perl => Тема начата: xmolex от 22 Февраля 2008, 12:05:47
-
Здравствуйте уважаемые. Пишу серьезный проект и понадобилось сделать небольшой модуль понимающий урезанный SQL для легкой замены баз данных.
Требуется разобрать команду:
SELECT `name` FROM table WHERE name = 1
Вы понимаете, что name может быть и без кавычек, а 1 может быть как в одинарных, так и в двойных кавычках, а также могут использоваться экранированные кавычки. Т.к. версия облегченная, то OR и т.п. использоваться не будет. Сделал разбор строки нижеуказанным кодом. Хотелось бы спросить у других, кто что думает. Можно ли облегчить алгоритм? Может кто знает другой алгоритм? Может как-то можно сэкономить ресурсы при выполнении?
$command = "SELECT `name` FROM table WHERE name = 1 ";
# разобрал с помощью регулярок. В $temp3 попало все после WHERE
my$length = length($temp3);
my($i,$flag,$pos_beg,$pos_end,$pos_beg_val,$pos_end_val);
my$step = 0;
my@temp3 = split(/|/, $temp3);
for ($i = 0; $i < ($length+1); $i++)
{
if ($step == 0)
{
if ($temp3[$i] ne " ")
{
if ($temp3[$i] eq "`")
{
$flag = "`";
$pos_beg = $i;
$step = 1;
next;
}
else
{
$flag = " ";
$pos_beg = $i-1;
$step = 1;
next;
}
}
}
if ($step == 1)
{
if ($flag eq "`")
{
if ($temp3[$i] eq "`" && $temp3[$i-1] ne "\\\\")
{
$pos_end = $i;
$step = 2;
next;
}
}
elsif ($flag eq " ")
{
if ($temp3[$i] eq " " || $temp3[$i] eq "=")
{
$pos_end = $i;
$step = 2;
next;
}
}
}
if ($step == 2) {if ($temp3[$i-1] eq "=") {$step = 3;}}
if ($step == 3)
{
if ($temp3[$i] ne " ")
{
if ($temp3[$i] eq "\'")
{
$flag = "\'";
$pos_beg_val = $i;
$step = 4;
next;
}
elsif ($temp3[$i] eq "\\"")
{
$flag = "\\"";
$pos_beg_val = $i;
$step = 4;
next;
}
else
{
$flag = " ";
$pos_beg_val = $i - 1;
$step = 4;
next;
}
}
}
if ($step == 4)
{
if ($flag eq "\'")
{
if ($temp3[$i] eq "\'" && $temp3[$i-1] ne "\\\\")
{
$pos_end_val = $i;
last;
}
}
if ($flag eq "\\"")
{
if ($temp3[$i] eq "\\"" && $temp3[$i-1] ne "\\\\")
{
$pos_end_val = $i;
last;
}
}
elsif ($flag eq " ")
{
if ($temp3[$i] eq " " || $temp3[$i+1] eq "")
{
$pos_end_val = $i;
last;
}
}
}
}
my$temp4 = substr($temp3, $pos_beg_val+1, ($pos_end_val - ($pos_beg_val+1)));
$temp3 = substr($temp3, $pos_beg+1, ($pos_end - ($pos_beg+1)));
# в $temp3 у нас название аргумента, в $temp4 значение аргумента.
-
Пишу серьезный проект
понадобилось сделать небольшой модуль понимающий урезанный SQL для легкой замены баз данных.
)))))))))))))))
-
xmolex
$command = "SELECT `name` FROM table WHERE name = 1 ";
# разобрал с помощью регулярок.
чувак... оставь эту идею...
-
commander:
чувак... оставь эту идею...
Ну, я в принципе понимаю, что обработка команд достаточно сложна и сейчас я занимаюсь придумыванием колеса, но к сожалению исходников обработки синтаксиса я нигде не нарыл, а также я понимаю что благодаря этому модулю, я могу сэкономить нервы многим, использующим этот проект у хостеров без поддержки баз данных. Хотелось бы по существу получать комментарии. Если у вас есть интересные мысли, то буду рад их услышать, если же нет, то и отписываться зачем?
-
xmolex
чувак, в свое время пришли некие люди, и сказали:
чуваки... давайте абстрагируемся от БД...
и был рожден уродец под названием Class::DBI который на уровне абстракции даже GROUP BY не умеет делать... и на чуть более серьездных проэктах нахуй валит сервера...
хотя конечно вместо :
my $results = $dbh->selectall_arrayref(\'SELECT * FROM table\');
можно написать:
my $results = MYClass::table ->search();
ууу.... круто...
а то что на каждую таблицу в бд надо делать свой класс... это похуй.. - абстракция...
и то что чуть сложнее запрос чем SELECT name FROM table WHERE id = 5; надо все равно писать плэйн sql - это тоже похуй... - абстракция....
и то что памяти этот уродец жрет немерянно - это конечно тоже похуй...
и вот приходит чувак: xmolex ...
и говорит:
чуваки... давайте абстрагируемся от БД...
мне смешно... ))))
-
xmolex
если тебе уж так хочецца от бд отойти... ну пользуй ты файлы... и делу конец... хотя конечно при наличии БЕСПЛАТНОЙ БД !!! PostgreSQL - которая в состоянии тянуть мега серьездные проекты... это как-то не очень понятно зачем..
-
Понятно, спасибо за комментарий.
P.S. я файлы и собирался использовать, только с урезанным SQL синтаксисом.
-
xmolex
я тебе скажу... что любые надстройки, любое абстракции, ну за исключением очевидных, надо 10... а лучше 50 раз подумать, прежде чем писать... ибо:
1. ты якобы убыстряя процесс разработки (что кстати ещё не факт, ибо стандартные библиотеки знают многие, а твою надстройку, им придеться изучать, и не факт что ты напишешь толковый мануал...), явно замедляешь скорость выполнения...
2. в начале разработки не имея серьездного опыта, а судя по тому что ты тут, ты его не имеешь, ты не сможешь предвидить все ситуации в результате шансы на то, что в один далеко не прекрасный день твой "небольшой модуль" не наебнет всю систему... увеличиваются в разы!
-
Я просто понял, что надо делать, а потом демонстрировать, потому что в противном случае отобьют всю охоту, даже если идея стоящая.
Что плохого в том, что я хочу работать с файлами используя облегченный sql синтаксис? К этой идее я шел долго и вот настрал тот момент, когда картина вылилась в готовый алгоритм. Вопросы только возникли с обработкой синтаксиса, решил поинтересоваться кто что может подсказать и вот вы подсказали.
Перепробовал около полтора десятка хостеров и у половины из них есть тарифные планы без баз данных. И что делать? Разумеется работать с файлами. А если я не хочу людей напрягать переписывать код, почему я не могу предоставить им возможность используя просто другой модуль работы с базой забыть о проблемах, когда у них нет MySQL или PostgreSQL?
Модуль пишется для конструктора сайтов, чтобы люди могли работать как с реляционой базой данных, так и с файловой. В шаблонах люди могут использовать SQL запросы для вывода.
Вот и весь сказ. Зачем вообще писать программы, если они не облегчают труд другим? Что касается того, что мой модуль может убить систему (я так понял данные), то я не дурак и проверку синтаксиса буду запускать до его выполнения.
Вообщем, спасибо за потраченное вами время.
-
xmolex
чувак... - пеши...
говорить тут больше нечего...
-
xmolex:
хочу работать с файлами используя облегченный sql синтаксис
и все таки какой стандарт SQL Вы будите использовать? SQL-92
SQL-89
Писать свой sql-движок задача не из легких. вы ее усложняете еще и сложностью инструментов реализации. то есть дом построить сложно, но еще сложнее его построить над водопадом виктория. я бы еще понял если бы вы взяли исходники скажем мускула версии 1.какойто и попытались переделать реализованные в ней алгоритмы. в общем конечно же удачи только можно пожелать. я бы с удовольствием поизучал вопрос sqlных движков и пообсуждал различные варианты их реализации, дописать функционал куда не шло. ну грубо говоря изобретать велосипед (. вы прям фанатик какойта
-
xmolex Если Вам нужен эскуэл парсер то вот он
http://search.cpan.org/~jzucker/SQL-Statement-1.15/lib/SQL/Parser.pm
насколько он "прямой" судить не буду, но скажу, что у меня дружба с этим модулем не сложилась, было необходимо из перловых скриптов выпарсивать стейтменты из которых было необходимо получть список столбцов и список таблиц используемых в стейтментах. Однако стейтменты были совсем не тривиальные. Так что посмотрите, может Вам поможет.
-
vladsu:
http://search.cpan.org/~jzucker/SQL...b/SQL/Parser.pm
Большое спасибо за модуль. Для ознакомления очень полезен.
Работа ведется.