cvs: pear /DBA DBA_Sql.php
| From: | Brent Cook | Date: | Thu, 11 Jul 2002 04:48:20 +0000 |
| Subject: | cvs: pear /DBA DBA_Sql.php | ||
| Groups: | php.pear.cvs | ||
| Request: | Send a blank email to pear-cvs+get-5024@lists.php.net to get a copy of this message | ||
busterb Thu Jul 11 00:48:20 2002 EDT
Modified files:
/pear/DBA DBA_Sql.php
Log:
remove type checking from parser; leave validation to higher-level functions.
Index: pear/DBA/DBA_Sql.php diff -u pear/DBA/DBA_Sql.php:1.10 pear/DBA/DBA_Sql.php:1.11 --- pear/DBA/DBA_Sql.php:1.10 Wed Jul 10 00:13:55 2002 +++ pear/DBA/DBA_Sql.php Thu Jul 11 00:48:20 2002 @@ -18,7 +18,7 @@ // | Foundation, Inc., 59 Temple Place, Suite 330,Boston,MA 02111-1307 USA| // +----------------------------------------------------------------------+ // -// $Id: DBA_Sql.php,v 1.10 2002/07/10 04:13:55 busterb Exp $ +// $Id: DBA_Sql.php,v 1.11 2002/07/11 04:48:20 busterb Exp $ // require_once "PEAR.php"; @@ -48,11 +48,14 @@ function getString() { $string = strtok(" \n\t"); $quote = substr($string, 0, 1); - if (($quote != '"') && ($quote != "'")) { - // this was not quoted, just return the token + $endquote = ($quote == '(') ? ')' : $quote; + + if (($quote != '"') && ($quote != "'") && ($quote != '(')) { + // this is a bare string, just return the token return $string; - } elseif ((substr($string, -1) == $quote) && - (substr($string, -2) != "\\$quote") && + + } elseif ((substr($string, -1) == $endquote) && + (substr($string, -2) != "\\$endquote") && (strlen($string) > 1)) { // corner case of a single quoted word return substr($string, 1, -1); @@ -60,64 +63,16 @@ // strip the first quote $string = substr($string, 1).' '; // read until the next quote - $string .= strtok($quote); + $string .= strtok($endquote); // was this an escaped quote? while (substr($string, -1) == "\\") { // insert the quote, keep reading - $string = substr($string,0,-2).$quote.substr(strtok($quote), 1); + $string = substr($string,0,-2).$endquote.substr(strtok($endquote), 1); } return $string; } } -function isIntType ($type) { - return in_array($type, array('int','integer','bigint','mediumint', - 'littleint','tinyint','int2','int8','oid')); -} - -function isFloatType ($type) { - return in_array($type, array('float','real','double','float4','float8')); -} - -function isFixedType ($type) { - return in_array($type, array('numeric','decimal')); -} - -function isNumberType ($type) { - return (Sql::isFixedType($type) || Sql::isFloatType($type) - || Sql::isIntType($type)); -} - -function isSetType($type) { - return in_array($type, array('enum','set')); -} - -function isLogicalType($type) { - return in_array($type, array('bool','boolean')); -} - -function isStringType($type) { - return in_array($type, array('text','varchar','tinytext','mediumtext', - 'longtext','char','character')); -} - -function isBinaryType($type) { - return in_array($type, array('tinyblob','mediumblob','longblob','blob')); -} - -function isTimeType($type) { - return in_array($type, array('date','time','timestamp','datetime', - 'interval')); -} - -function isType($type) -{ - return (Sql::isIntType($type) || Sql::isFixedType($type) - || Sql::isSetType($type) || Sql::isStringType($type) - || Sql::isBinaryType($type) || Sql::isTimeType($type) - || Sql::isFloatType($type) || Sql::isLogicalType($type)); -} - function parseCreate($rawquery) { $query = Sql::cookQuery($rawquery); @@ -130,149 +85,97 @@ $thing = Sql::getTokenL(); if ($thing == 'table') { $tableName = Sql::getToken(); - $token = Sql::getToken(); - if ($token != '(') { - return PEAR::raiseError( - "No field definitions found in table $tableName"); - exit; - } else { - while ($token && ($token != ')')) { - $token = Sql::getToken(); - - if ($token == ')') { - // we must have had a trailing comma in the field list - break; - } + $tableDefn =& Sql::parseTableDefinition(); + return array($tableName, $tableDefn); + } else { + return PEAR::raiseError("Do not know how to create $thing"); + } +} - $fieldName = $token; - $fieldType = Sql::getTokenL(); - $table[$fieldName]['type'] = $fieldType; +function &parseTableDefinition() +{ + $token = Sql::getToken(); + if ($token != '(') { + return PEAR::raiseError('No field definitions'); + } else { + while ($token && ($token != ')')) { + + // check if we're at the end of our rope, otherwise + // it's another day at the office + if (($token = SQL::getToken()) == ')') { + break; + } + $fieldName = $token; + + $table[$fieldName]['type'] = $fieldType = Sql::getTokenL(); + + // parse field-specific parameters + $token = Sql::getTokenL(); + if ($token == '(') { + $element = 0; + while ($token && ($token != ')')) { + $table[$fieldName]['opts'][$element] = Sql::getString(); + $token = Sql::getToken(); + if ($token == ',') { + ++$element; + } else + if ($token != ')') { + return PEAR::raiseError("Expected ')', got '$token' on '$fieldName'"); + } + } $token = Sql::getTokenL(); + } - // parse field-specific parameters - if (Sql::isIntType($fieldType)) { - if ($token == '(') { - $table[$fieldName]['size'] = Sql::getToken(); - if (Sql::getToken() != ')') { - return PEAR::raiseError( - "expected ) on $fieldName, $fieldType"); - } + // parse extra options + while ($token && !(($token == ',') || ($token == ')'))){ + switch ($token) { + case 'default': + $table[$fieldName]['default'] = Sql::getString(); + break; + case 'primary': $token = Sql::getTokenL(); - } - } elseif (Sql::isNumberType($fieldType)) { - if ($token != '(') { - if (Sql::isFixedType($fieldType)) { + if ($token != 'key') { return PEAR::raiseError( - "expected ( on $fieldName, $fieldType"); - } - } else { - $table[$fieldName]['size'] = Sql::getToken(); - $token = Sql::getToken(); - if ($token == ',') { - $table[$fieldName]['decimals'] = Sql::getToken(); - $token = Sql::getToken(); + "Expected 'key', got $token on '$fieldName'"); + } else { + $table[$fieldName]['primarykey'] = true; } - if ($token != ')') { + break; + case 'not': + $token = Sql::getTokenL(); + if ($token != 'null') { return PEAR::raiseError( - "expected ) on $fieldName, $fieldType"); + "Parse error at $token on $rawquery"); + } else { + $table[$fieldName]['notnull'] = true; } + break; + case 'check': case 'varying': + $table[$fieldName][$token] = Sql::getString(); + break; + case 'year':case'month':case 'day':case 'hour':case 'minute':case 'second': + $table[$fieldName]['from'] = $token; $token = Sql::getTokenL(); - } - } elseif (Sql::isStringType($fieldType)) { - if ($token == '(') { - $table[$fieldName]['size'] = strtok(')'); - $token = Sql::getTokenL(); - } - } elseif (Sql::isSetType($fieldType)) { - if ($token != '(') { - return PEAR::raiseError('Missing domain on ' - .$fieldName); - } - $element = 0; - while ($token && ($token != ')')) { - $table[$fieldName]['domain'][$element] = - Sql::getString(); - $token = Sql::getToken(); - if ($token == ',') { - ++$element; - } elseif ($token != ')') { - return PEAR::raiseError('Invalid element at ' - .$token); + if ($token != 'to') { + return PEAR::raiseError( + "Expected 'to', got $token on '$fieldName'"); } - } - $token = Sql::getTokenL(); - } - - // parse extra options - while ($token && !(($token == ',') || ($token == ')') - || ($token == ';'))) { - switch ($token) { - case 'default': - $table[$fieldName]['default'] =Sql::getString(); - break; - case 'primary': - $token = Sql::getTokenL(); - if ($token != 'key') { - return PEAR::raiseError( - "Expected 'key', got $token on $fieldName,". - $fieldType); - } else { - $table[$fieldName]['primarykey'] = true; - } - break; - case 'not': - $token = Sql::getTokenL(); - if ($token != 'null') { - return PEAR::raiseError( - "Parse error at $token on $rawquery"); - } else { - $table[$fieldName]['notnull'] = true; - } - break; - case 'auto_increment': case 'zerofill': - case 'unique': - $table[$fieldName][$token] = true; - break; - case 'unsigned': case 'zerofill': - if (!Sql::isNumberType($fieldType)) { - return PEAR::raiseError( - "$fieldType cannot have the $token option"); - } else { - $table[$fieldName][$token] = true; - } - break; - case 'varying': - if (!Sql::isStringType($fieldType)) { - return PEAR::raiseError( - "$fieldType cannot vary in length"); - } else { - $table[$fieldName]['type'] = 'varchar'; - if (Sql::getToken() != '(') { - PEAR::raiseError('expecting ('); - } else { - $table[$fieldName]['size']=strtok(')'); - } - } - break; - case 'check': - if (Sql::getToken() != '(') { - PEAR::raiseError('expecting ('); - } else { - $table[$fieldName]['check']=strtok(')'); - } - } - // grab the next option - $token = Sql::getTokenL(); + $table[$fieldName]['to'] = Sql::getTokenL(); + break; + default: + $table[$fieldName][$token] = true; + break; } - } - if ($token != ')') { - echo ("Unexpected end of input with $token\n"); + // grab the next option + $token = Sql::getTokenL(); } } - } else { - return PEAR::raiseError("Do not know how to create $thing"); + if ($token != ')') { + echo ("Unexpected end of input with $token\n"); + } + return $table; } - return array($tableName, $table); } + } ?>
Index: pear/DBA/DBA_Sql.php diff -u pear/DBA/DBA_Sql.php:1.10 pear/DBA/DBA_Sql.php:1.11 --- pear/DBA/DBA_Sql.php:1.10 Wed Jul 10 00:13:55 2002 +++ pear/DBA/DBA_Sql.php Thu Jul 11 00:48:20 2002 @@ -18,7 +18,7 @@ // | Foundation, Inc., 59 Temple Place, Suite 330,Boston,MA 02111-1307 USA| // +----------------------------------------------------------------------+ // -// $Id: DBA_Sql.php,v 1.10 2002/07/10 04:13:55 busterb Exp $ +// $Id: DBA_Sql.php,v 1.11 2002/07/11 04:48:20 busterb Exp $ // require_once "PEAR.php"; @@ -48,11 +48,14 @@ function getString() { $string = strtok(" \n\t"); $quote = substr($string, 0, 1); - if (($quote != '"') && ($quote != "'")) { - // this was not quoted, just return the token + $endquote = ($quote == '(') ? ')' : $quote; + + if (($quote != '"') && ($quote != "'") && ($quote != '(')) { + // this is a bare string, just return the token return $string; - } elseif ((substr($string, -1) == $quote) && - (substr($string, -2) != "\\$quote") && + + } elseif ((substr($string, -1) == $endquote) && + (substr($string, -2) != "\\$endquote") && (strlen($string) > 1)) { // corner case of a single quoted word return substr($string, 1, -1); @@ -60,64 +63,16 @@ // strip the first quote $string = substr($string, 1).' '; // read until the next quote - $string .= strtok($quote); + $string .= strtok($endquote); // was this an escaped quote? while (substr($string, -1) == "\\") { // insert the quote, keep reading - $string = substr($string,0,-2).$quote.substr(strtok($quote), 1); + $string = substr($string,0,-2).$endquote.substr(strtok($endquote), 1); } return $string; } } -function isIntType ($type) { - return in_array($type, array('int','integer','bigint','mediumint', - 'littleint','tinyint','int2','int8','oid')); -} - -function isFloatType ($type) { - return in_array($type, array('float','real','double','float4','float8')); -} - -function isFixedType ($type) { - return in_array($type, array('numeric','decimal')); -} - -function isNumberType ($type) { - return (Sql::isFixedType($type) || Sql::isFloatType($type) - || Sql::isIntType($type)); -} - -function isSetType($type) { - return in_array($type, array('enum','set')); -} - -function isLogicalType($type) { - return in_array($type, array('bool','boolean')); -} - -function isStringType($type) { - return in_array($type, array('text','varchar','tinytext','mediumtext', - 'longtext','char','character')); -} - -function isBinaryType($type) { - return in_array($type, array('tinyblob','mediumblob','longblob','blob')); -} - -function isTimeType($type) { - return in_array($type, array('date','time','timestamp','datetime', - 'interval')); -} - -function isType($type) -{ - return (Sql::isIntType($type) || Sql::isFixedType($type) - || Sql::isSetType($type) || Sql::isStringType($type) - || Sql::isBinaryType($type) || Sql::isTimeType($type) - || Sql::isFloatType($type) || Sql::isLogicalType($type)); -} - function parseCreate($rawquery) { $query = Sql::cookQuery($rawquery); @@ -130,149 +85,97 @@ $thing = Sql::getTokenL(); if ($thing == 'table') { $tableName = Sql::getToken(); - $token = Sql::getToken(); - if ($token != '(') { - return PEAR::raiseError( - "No field definitions found in table $tableName"); - exit; - } else { - while ($token && ($token != ')')) { - $token = Sql::getToken(); - - if ($token == ')') { - // we must have had a trailing comma in the field list - break; - } + $tableDefn =& Sql::parseTableDefinition(); + return array($tableName, $tableDefn); + } else { + return PEAR::raiseError("Do not know how to create $thing"); + } +} - $fieldName = $token; - $fieldType = Sql::getTokenL(); - $table[$fieldName]['type'] = $fieldType; +function &parseTableDefinition() +{ + $token = Sql::getToken(); + if ($token != '(') { + return PEAR::raiseError('No field definitions'); + } else { + while ($token && ($token != ')')) { + + // check if we're at the end of our rope, otherwise + // it's another day at the office + if (($token = SQL::getToken()) == ')') { + break; + } + $fieldName = $token; + + $table[$fieldName]['type'] = $fieldType = Sql::getTokenL(); + + // parse field-specific parameters + $token = Sql::getTokenL(); + if ($token == '(') { + $element = 0; + while ($token && ($token != ')')) { + $table[$fieldName]['opts'][$element] = Sql::getString(); + $token = Sql::getToken(); + if ($token == ',') { + ++$element; + } else + if ($token != ')') { + return PEAR::raiseError("Expected ')', got '$token' on '$fieldName'"); + } + } $token = Sql::getTokenL(); + } - // parse field-specific parameters - if (Sql::isIntType($fieldType)) { - if ($token == '(') { - $table[$fieldName]['size'] = Sql::getToken(); - if (Sql::getToken() != ')') { - return PEAR::raiseError( - "expected ) on $fieldName, $fieldType"); - } + // parse extra options + while ($token && !(($token == ',') || ($token == ')'))){ + switch ($token) { + case 'default': + $table[$fieldName]['default'] = Sql::getString(); + break; + case 'primary': $token = Sql::getTokenL(); - } - } elseif (Sql::isNumberType($fieldType)) { - if ($token != '(') { - if (Sql::isFixedType($fieldType)) { + if ($token != 'key') { return PEAR::raiseError( - "expected ( on $fieldName, $fieldType"); - } - } else { - $table[$fieldName]['size'] = Sql::getToken(); - $token = Sql::getToken(); - if ($token == ',') { - $table[$fieldName]['decimals'] = Sql::getToken(); - $token = Sql::getToken(); + "Expected 'key', got $token on '$fieldName'"); + } else { + $table[$fieldName]['primarykey'] = true; } - if ($token != ')') { + break; + case 'not': + $token = Sql::getTokenL(); + if ($token != 'null') { return PEAR::raiseError( - "expected ) on $fieldName, $fieldType"); + "Parse error at $token on $rawquery"); + } else { + $table[$fieldName]['notnull'] = true; } + break; + case 'check': case 'varying': + $table[$fieldName][$token] = Sql::getString(); + break; + case 'year':case'month':case 'day':case 'hour':case 'minute':case 'second': + $table[$fieldName]['from'] = $token; $token = Sql::getTokenL(); - } - } elseif (Sql::isStringType($fieldType)) { - if ($token == '(') { - $table[$fieldName]['size'] = strtok(')'); - $token = Sql::getTokenL(); - } - } elseif (Sql::isSetType($fieldType)) { - if ($token != '(') { - return PEAR::raiseError('Missing domain on ' - .$fieldName); - } - $element = 0; - while ($token && ($token != ')')) { - $table[$fieldName]['domain'][$element] = - Sql::getString(); - $token = Sql::getToken(); - if ($token == ',') { - ++$element; - } elseif ($token != ')') { - return PEAR::raiseError('Invalid element at ' - .$token); + if ($token != 'to') { + return PEAR::raiseError( + "Expected 'to', got $token on '$fieldName'"); } - } - $token = Sql::getTokenL(); - } - - // parse extra options - while ($token && !(($token == ',') || ($token == ')') - || ($token == ';'))) { - switch ($token) { - case 'default': - $table[$fieldName]['default'] =Sql::getString(); - break; - case 'primary': - $token = Sql::getTokenL(); - if ($token != 'key') { - return PEAR::raiseError( - "Expected 'key', got $token on $fieldName,". - $fieldType); - } else { - $table[$fieldName]['primarykey'] = true; - } - break; - case 'not': - $token = Sql::getTokenL(); - if ($token != 'null') { - return PEAR::raiseError( - "Parse error at $token on $rawquery"); - } else { - $table[$fieldName]['notnull'] = true; - } - break; - case 'auto_increment': case 'zerofill': - case 'unique': - $table[$fieldName][$token] = true; - break; - case 'unsigned': case 'zerofill': - if (!Sql::isNumberType($fieldType)) { - return PEAR::raiseError( - "$fieldType cannot have the $token option"); - } else { - $table[$fieldName][$token] = true; - } - break; - case 'varying': - if (!Sql::isStringType($fieldType)) { - return PEAR::raiseError( - "$fieldType cannot vary in length"); - } else { - $table[$fieldName]['type'] = 'varchar'; - if (Sql::getToken() != '(') { - PEAR::raiseError('expecting ('); - } else { - $table[$fieldName]['size']=strtok(')'); - } - } - break; - case 'check': - if (Sql::getToken() != '(') { - PEAR::raiseError('expecting ('); - } else { - $table[$fieldName]['check']=strtok(')'); - } - } - // grab the next option - $token = Sql::getTokenL(); + $table[$fieldName]['to'] = Sql::getTokenL(); + break; + default: + $table[$fieldName][$token] = true; + break; } - } - if ($token != ')') { - echo ("Unexpected end of input with $token\n"); + // grab the next option + $token = Sql::getTokenL(); } } - } else { - return PEAR::raiseError("Do not know how to create $thing"); + if ($token != ')') { + echo ("Unexpected end of input with $token\n"); + } + return $table; } - return array($tableName, $table); } + } ?>