Программирование > Perl

SQL запрос (обработка строки)

(1/3) > >>

xmolex:
Здравствуйте уважаемые. Пишу серьезный проект и понадобилось сделать небольшой модуль понимающий урезанный 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:

--- Цитировать ---Пишу серьезный проект
--- Конец цитаты ---



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


)))))))))))))))

commander:
xmolex

--- Цитировать ---$command = "SELECT `name` FROM table WHERE name = 1 ";
# разобрал с помощью регулярок.
--- Конец цитаты ---


чувак...  оставь эту идею...

xmolex:

--- Цитировать ---commander:
чувак... оставь эту идею...
--- Конец цитаты ---

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

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 ...

и говорит:

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


мне смешно... ))))

Навигация

[0] Главная страница сообщений

[#] Следующая страница

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 
Перейти к полной версии