SQL_Parser
[ class tree: SQL_Parser ] [ index: SQL_Parser ] [ all elements ]

Source for file Compiler.php

Documentation is available at Compiler.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. // +----------------------------------------------------------------------+
  4. // | Copyright (c) 2003-2004 John Griffin                                 |
  5. // +----------------------------------------------------------------------+
  6. // | This library is free software; you can redistribute it and/or        |
  7. // | modify it under the terms of the GNU Lesser General Public           |
  8. // | License as published by the Free Software Foundation; either         |
  9. // | version 2.1 of the License, or (at your option) any later version.   |
  10. // |                                                                      |
  11. // | This library is distributed in the hope that it will be useful,      |
  12. // | but WITHOUT ANY WARRANTY; without even the implied warranty of       |
  13. // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    |
  14. // | Lesser General Public License for more details.                      |
  15. // |                                                                      |
  16. // | You should have received a copy of the GNU Lesser General Public     |
  17. // | License along with this library; if not, write to the Free Software  |
  18. // | Foundation, Inc., 59 Temple Place, Suite 330,Boston,MA 02111-1307 USA|
  19. // +----------------------------------------------------------------------+
  20. // | Authors: John Griffin <jgriffin316@netscape.net>                     |
  21. // +----------------------------------------------------------------------+
  22. //
  23. // $Id: Compiler.php 239225 2007-07-06 13:44:33Z cybot $
  24. //
  25.  
  26. require_once 'PEAR.php';
  27.  
  28. /**
  29.  * A SQL parse tree compiler.
  30.  *
  31.  * @author  John Griffin <jgriffin316@netscape.net>
  32.  * @version 0.1
  33.  * @access  public
  34.  * @package SQL_Parser
  35.  */
  36. {
  37.     var $tree;
  38.  
  39. // {{{ function SQL_Parser_Compiler($array = null)
  40.     function SQL_Parser_Compiler($array = null)
  41.     {
  42.         $this->tree = $array;
  43.     }
  44. // }}}
  45.  
  46. //    {{{ function getWhereValue ($arg)
  47.     function getWhereValue ($arg)
  48.     {
  49.         switch ($arg['type']{
  50.             case 'ident':
  51.             case 'real_val':
  52.             case 'int_val':
  53.             case 'null':
  54.                 $value $arg['value'];
  55.                 break;
  56.             case 'text_val':
  57.                 $value '\''.$arg['value'].'\'';
  58.                 break;
  59.             case 'subclause':
  60.                 $value '('.$this->compileSearchClause($arg['value']).')';
  61.                 break;
  62.             default:
  63.                 return PEAR::raiseError('Unknown type: '.$arg['type']);
  64.         }
  65.         return $value;
  66.     }
  67. //    }}}
  68.  
  69. //    {{{ function getParams($arg)
  70.     function getParams($arg)
  71.     {
  72.         $types count($arg['type']);
  73.         for ($i = 0; $i $types$i++{
  74.             switch ($arg['type'][$i]{
  75.                 case 'ident':
  76.                 case 'real_val':
  77.                 case 'int_val':
  78.                 case 'null':
  79.                     $value[$arg['value'][$i];
  80.                     break;
  81.                 case 'text_val':
  82.                     $value['\''.$arg['value'][$i].'\'';
  83.                     break;
  84.                 default:
  85.                     return PEAR::raiseError('Unknown type: '.$arg['type'][$i]);
  86.             }
  87.         }
  88.         $value ='('.implode(', '$value).')';
  89.         return $value;
  90.     }
  91. //    }}}
  92.  
  93. //    {{{ function compileFunctionOpts($arg)
  94.     function compileFunctionOpts($arg)
  95.     {
  96.         $types count($arg['type']);
  97.         for ($i = 0; $i $types$i++{
  98.             switch ($arg['type'][$i]{
  99.                 case 'ident':
  100.                 case 'real_val':
  101.                 case 'int_val':
  102.                 case 'null':
  103.                     $value[$arg['arg'][$i];
  104.                     break;
  105.                 case 'text_val':
  106.                     $value['\''.$arg['arg'][$i].'\'';
  107.                     break;
  108.                 default:
  109.                     return PEAR::raiseError('Unknown type: '.$arg['type'][$i]);
  110.             }
  111.         }
  112.         $value implode(', '$value);
  113.         return $value;
  114.     }
  115. //    }}}
  116.  
  117. //    {{{ function compileSearchClause
  118.     function compileSearchClause($where_clause)
  119.     {
  120.         $value '';
  121.         if (isset ($where_clause['arg_1']['value'])) {
  122.             $value $this->getWhereValue ($where_clause['arg_1']);
  123.             if (PEAR::isError($value)) {
  124.                 return $value;
  125.             }
  126.             $sql $value;
  127.         else {
  128.             $value $this->compileSearchClause($where_clause['arg_1']);
  129.             if (PEAR::isError($value)) {
  130.                 return $value;
  131.             }
  132.             $sql $value;
  133.         }
  134.         if (isset ($where_clause['op'])) {
  135.             if ($where_clause['op'== 'in'{
  136.                 $value $this->getParams($where_clause['arg_2']);
  137.                 if (PEAR::isError($value)) {
  138.                     return $value;
  139.                 }
  140.                 if (isset($where_clause['neg'])) {
  141.                     $sql .= ' not';
  142.                 }
  143.                 $sql .= ' '.$where_clause['op'].' '.$value;
  144.             elseif ($where_clause['op'== 'is'{
  145.                 $value = isset ($where_clause['neg']'not null' 'null';
  146.                 $sql .= ' is '.$value;
  147.             else {
  148.                 $sql .= ' '.$where_clause['op'].' ';
  149.                 if (isset ($where_clause['arg_2']['value'])) {
  150.                     $value $this->getWhereValue ($where_clause['arg_2']);
  151.                     if (PEAR::isError($value)) {
  152.                         return $value;
  153.                     }
  154.                     $sql .= $value;
  155.                 else {
  156.                     $value $this->compileSearchClause($where_clause['arg_2']);
  157.                     if (PEAR::isError($value)) {
  158.                         return $value;
  159.                     }
  160.                     $sql .= $value;
  161.                 }
  162.             }
  163.         }
  164.         return $sql;
  165.     }
  166. //    }}}
  167.  
  168. //    {{{ function compileSelect()
  169.     function compileSelect()
  170.     {
  171.         // save the command and set quantifiers
  172.         $sql 'select ';
  173.         if (isset($this->tree['set_quantifier'])) {
  174.             $sql .= $this->tree['set_quantifier'].' ';
  175.         }
  176.  
  177.         // save the column names and set functions
  178.         $cols count($this->tree['column_names']);
  179.         for ($i = 0; $i $cols$i++{
  180.             $column $this->tree['column_names'][$i];
  181.             if ($this->tree['column_aliases'][$i!= ''{
  182.                 $column .= ' as '.$this->tree['column_aliases'][$i];
  183.             }
  184.             $column_names[$column;
  185.         }
  186.  
  187.         $funcs count($this->tree['set_function']);
  188.         for ($i = 0; $i $funcs$i++{
  189.             $column $this->tree['set_function'][$i]['name'].'(';
  190.             if (isset ($this->tree['set_function'][$i]['distinct'])) {
  191.                 $column .= 'distinct ';
  192.             }
  193.             if (isset ($this->tree['set_function'][$i]['arg'])) {
  194.                 $column .= $this->compileFunctionOpts($this->tree['set_function'][$i]);
  195.             }
  196.             $column .= ')';
  197.             if ($this->tree['set_function'][$i]['alias'!= ''{
  198.                 $column .= ' as '.$this->tree['set_function'][$i]['alias'];
  199.             }
  200.             $column_names[$column;
  201.         }
  202.         if (isset($column_names)) {
  203.             $sql .= implode (", "$column_names);
  204.         }
  205.  
  206.         // save the tables
  207.         $sql .= ' from ';
  208.         $c_tables count($this->tree['table_names']);
  209.         for ($i = 0; $i $c_tables$i++{
  210.             $sql .= $this->tree['table_names'][$i];
  211.             if ($this->tree['table_aliases'][$i!= ''{
  212.                 $sql .= ' as '.$this->tree['table_aliases'][$i];
  213.             }
  214.             if ($this->tree['table_join_clause'][$i!= ''{
  215.                 $search_string $this->compileSearchClause ($this->tree['table_join_clause'][$i]);
  216.                 if (PEAR::isError($search_string)) {
  217.                     return $search_string;
  218.                 }
  219.                 $sql .= ' on '.$search_string;
  220.             }
  221.             if (isset($this->tree['table_join'][$i])) {
  222.                 $sql .= ' '.$this->tree['table_join'][$i].' ';
  223.             }
  224.         }
  225.  
  226.         // save the where clause
  227.         if (isset($this->tree['where_clause'])) {
  228.             $search_string $this->compileSearchClause ($this->tree['where_clause']);
  229.             if (PEAR::isError($search_string)) {
  230.                 return $search_string;
  231.             }
  232.             $sql .= ' where '.$search_string;
  233.         }
  234.  
  235.         // save the group by clause
  236.         if (isset ($this->tree['group_by'])) {
  237.             $sql .= ' group by '.implode(', '$this->tree['group_by']);
  238.         }
  239.  
  240.         // save the order by clause
  241.         if (isset ($this->tree['sort_order'])) {
  242.             foreach ($this->tree['sort_order'as $key => $value{
  243.                 $sort_order[$key.' '.$value;
  244.             }
  245.             $sql .= ' order by '.implode(', '$sort_order);
  246.         }
  247.  
  248.         // save the limit clause
  249.         if (isset ($this->tree['limit_clause'])) {
  250.             $sql .= ' limit '.$this->tree['limit_clause']['start'].','.$this->tree['limit_clause']['length'];
  251.         }
  252.  
  253.         return $sql;
  254.     }
  255. //    }}}
  256.  
  257. //    {{{ function compileUpdate()
  258.     function compileUpdate()
  259.     {
  260.         $sql 'update '.implode(', '$this->tree['table_names']);
  261.  
  262.         // save the set clause
  263.         $cols count($this->tree['column_names']);
  264.         for ($i = 0; $i $cols$i++{
  265.             $set_columns[$this->tree['column_names'][$i].' = '.$this->getWhereValue($this->tree['values'][$i]);
  266.         }
  267.         $sql .= ' set '.implode (', '$set_columns);
  268.  
  269.         // save the where clause
  270.         if (isset($this->tree['where_clause'])) {
  271.             $search_string $this->compileSearchClause ($this->tree['where_clause']);
  272.             if (PEAR::isError($search_string)) {
  273.                 return $search_string;
  274.             }
  275.             $sql .= ' where '.$search_string;
  276.         }
  277.         return $sql;
  278.     }
  279. //    }}}
  280.  
  281. //    {{{ function compileDelete()
  282.     function compileDelete()
  283.     {
  284.         $sql 'delete from '.implode(', '$this->tree['table_names']);
  285.  
  286.         // save the where clause
  287.         if (isset($this->tree['where_clause'])) {
  288.             $search_string $this->compileSearchClause ($this->tree['where_clause']);
  289.             if (PEAR::isError($search_string)) {
  290.                 return $search_string;
  291.             }
  292.             $sql .= ' where '.$search_string;
  293.         }
  294.         return $sql;
  295.     }
  296. //    }}}
  297.  
  298. //    {{{ function compileInsert()
  299.     function compileInsert()
  300.     {
  301.         $sql 'insert into '.$this->tree['table_names'][0].' ('.
  302.                 implode(', '$this->tree['column_names']).') values (';
  303.  
  304.         $c_vals count($this->tree['values']);
  305.         for ($i = 0; $i $c_vals$i++{
  306.             $value $this->getWhereValue ($this->tree['values'][$i]);
  307.             if (PEAR::isError($value)) {
  308.                 return $value;
  309.             }
  310.             $value_array[$value;
  311.         }
  312.         $sql .= implode(', '$value_array).')';
  313.         return $sql;
  314.     }
  315. //    }}}
  316.  
  317. //    {{{ function compile($array = null)
  318.     function compile($array = null)
  319.     {
  320.         $this->tree = $array;
  321.  
  322.         switch ($this->tree['command']{
  323.             case 'select':
  324.                 return $this->compileSelect();
  325.                 break;
  326.             case 'update':
  327.                 return $this->compileUpdate();
  328.                 break;
  329.             case 'delete':
  330.                 return $this->compileDelete();
  331.                 break;
  332.             case 'insert':
  333.                 return $this->compileInsert();
  334.                 break;
  335.             case 'create':
  336.             case 'drop':
  337.             case 'alter':
  338.             default:
  339.                 return PEAR::raiseError('Unknown action: '.$this->tree['command']);
  340.         }    // switch ($this->_tree["command"])
  341.  
  342.     }
  343. //    }}}
  344. }

Documentation generated on Mon, 11 Mar 2019 15:39:48 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.