Автор Тема: SQL запрос (обработка строки)  (Прочитано 9591 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн xmolex

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 75
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
SQL запрос (обработка строки)
« : 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 значение аргумента.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
SQL запрос (обработка строки)
« Ответ #1 : 22 Февраля 2008, 14:37:40 »
Цитировать
Пишу серьезный проект


Цитировать
понадобилось сделать небольшой модуль понимающий урезанный SQL для легкой замены баз данных.


)))))))))))))))
And no religion too...

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
SQL запрос (обработка строки)
« Ответ #2 : 22 Февраля 2008, 14:40:45 »
xmolex
Цитировать
$command = "SELECT `name` FROM table WHERE name = 1 ";
# разобрал с помощью регулярок.


чувак...  оставь эту идею...
And no religion too...

Оффлайн xmolex

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 75
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
SQL запрос (обработка строки)
« Ответ #3 : 22 Февраля 2008, 14:48:45 »
Цитировать
commander:
чувак... оставь эту идею...

Ну, я в принципе понимаю, что обработка команд достаточно сложна и сейчас я занимаюсь придумыванием колеса, но к сожалению исходников обработки синтаксиса я нигде не нарыл, а  также я понимаю что благодаря этому модулю, я могу сэкономить нервы многим, использующим этот проект у хостеров без поддержки баз данных. Хотелось бы по существу получать комментарии. Если у вас есть интересные мысли, то буду рад их услышать, если же нет, то и отписываться зачем?

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
SQL запрос (обработка строки)
« Ответ #4 : 22 Февраля 2008, 15:21:24 »
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 ...

и говорит:

чуваки... давайте абстрагируемся от БД...


мне смешно... ))))
And no religion too...

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
SQL запрос (обработка строки)
« Ответ #5 : 22 Февраля 2008, 15:31:17 »
xmolex
если тебе уж так хочецца от бд отойти... ну пользуй ты файлы... и делу конец... хотя конечно при наличии БЕСПЛАТНОЙ БД !!! PostgreSQL - которая в состоянии тянуть мега серьездные проекты... это как-то не очень понятно зачем..
And no religion too...

Оффлайн xmolex

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 75
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
SQL запрос (обработка строки)
« Ответ #6 : 22 Февраля 2008, 15:31:23 »
Понятно, спасибо за комментарий.
P.S. я файлы и собирался использовать, только с урезанным SQL синтаксисом.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
SQL запрос (обработка строки)
« Ответ #7 : 22 Февраля 2008, 15:41:54 »
xmolex
я тебе скажу... что любые надстройки, любое абстракции, ну за исключением очевидных, надо 10... а лучше 50 раз подумать, прежде чем писать... ибо:
1. ты якобы убыстряя процесс разработки (что кстати ещё не факт, ибо стандартные библиотеки знают многие, а твою надстройку, им придеться изучать, и не факт что ты напишешь толковый мануал...), явно замедляешь скорость выполнения...
2. в начале разработки не имея серьездного опыта, а судя по тому что ты тут, ты его не имеешь, ты не сможешь предвидить все ситуации в результате шансы на то, что в один далеко не прекрасный день твой "небольшой модуль" не наебнет всю систему... увеличиваются в разы!
And no religion too...

Оффлайн xmolex

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 75
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
SQL запрос (обработка строки)
« Ответ #8 : 22 Февраля 2008, 16:21:10 »
Я просто понял, что надо делать, а потом демонстрировать, потому что в противном случае отобьют всю охоту, даже если идея стоящая.
Что плохого в том, что я хочу работать с файлами используя облегченный sql синтаксис? К этой идее я шел долго и вот настрал тот момент, когда картина вылилась в готовый алгоритм. Вопросы только возникли с обработкой синтаксиса, решил поинтересоваться кто что может подсказать и вот вы подсказали.
Перепробовал около полтора десятка хостеров и у половины из них есть тарифные планы без баз данных. И что делать? Разумеется работать с файлами. А если я не хочу людей напрягать переписывать код, почему я не могу предоставить им возможность используя просто другой модуль работы с базой забыть о проблемах, когда у них нет MySQL или PostgreSQL?
Модуль пишется для конструктора сайтов, чтобы люди могли работать как с реляционой базой данных, так и с файловой. В шаблонах люди могут использовать SQL запросы для вывода.
Вот и весь сказ. Зачем вообще писать программы, если они не облегчают труд другим? Что касается того, что мой модуль может убить систему (я так понял данные), то я не дурак и проверку синтаксиса буду запускать до его выполнения.
Вообщем, спасибо за потраченное вами время.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
SQL запрос (обработка строки)
« Ответ #9 : 22 Февраля 2008, 16:24:19 »
xmolex
чувак... - пеши...

говорить тут больше нечего...
And no religion too...

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
SQL запрос (обработка строки)
« Ответ #10 : 22 Февраля 2008, 18:49:22 »
Цитировать
xmolex:
 хочу работать с файлами используя облегченный sql синтаксис


и все таки какой стандарт SQL Вы будите использовать? SQL-92
SQL-89

Писать свой sql-движок задача не из легких. вы ее усложняете еще и сложностью инструментов реализации. то есть дом построить сложно, но еще сложнее его построить над водопадом виктория. я бы еще понял если бы вы взяли исходники скажем мускула версии 1.какойто и попытались переделать реализованные в ней алгоритмы. в общем конечно же удачи только можно пожелать. я бы с удовольствием поизучал вопрос sqlных движков и пообсуждал различные варианты их реализации, дописать функционал куда не шло. ну грубо говоря изобретать велосипед (. вы прям фанатик какойта
убили кенни, сволочи

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
SQL запрос (обработка строки)
« Ответ #11 : 23 Февраля 2008, 21:41:21 »
xmolex Если Вам нужен эскуэл парсер то вот он
http://search.cpan.org/~jzucker/SQL-Statement-1.15/lib/SQL/Parser.pm
насколько он "прямой" судить не буду, но скажу, что у меня дружба с этим модулем не сложилась, было необходимо из перловых скриптов выпарсивать стейтменты из которых было необходимо получть список столбцов и список таблиц используемых в стейтментах. Однако стейтменты были совсем не тривиальные. Так что посмотрите, может Вам поможет.
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн xmolex

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 75
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
SQL запрос (обработка строки)
« Ответ #12 : 26 Февраля 2008, 09:34:11 »
Цитировать
vladsu:
http://search.cpan.org/~jzucker/SQL...b/SQL/Parser.pm

Большое спасибо за модуль. Для ознакомления очень полезен.
Работа ведется.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28