From 76aca62376e08e1ca42d97ba08f920dfd844591e Mon Sep 17 00:00:00 2001 From: DSB Date: Mon, 20 Jun 2011 08:07:13 +0000 Subject: [PATCH] SQl-Parser: - fix if statement is unknown --- library/Msd/Sql/Object.php | 16 +++++---- library/Msd/Sql/Parser.php | 36 +++++++++------------ library/Msd/Sql/Parser/Statement/Select.php | 2 +- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/library/Msd/Sql/Object.php b/library/Msd/Sql/Object.php index d18614e..b50919e 100644 --- a/library/Msd/Sql/Object.php +++ b/library/Msd/Sql/Object.php @@ -109,10 +109,15 @@ class Msd_Sql_Object $pointer = $this->getPointer(); $dataSize = strlen($this->_data); $skip = array(';', ' ', "\n", "\r"); - while ($pointer < $dataSize && in_array($this->_data[$pointer], $skip)) { - $pointer++; + if (in_array($this->_data[$pointer], $skip)) { + while ($pointer < $dataSize && in_array($this->_data[$pointer], $skip)) { + $pointer++; + } } $this->setPointer($pointer); + if ($pointer == $this->getLength()) { + $pointer = false; + } return $pointer; } @@ -182,13 +187,12 @@ class Msd_Sql_Object $pointer = $this->getPointer(); $offset = $pointer; $notFound = true; + $nextHit = 0; $length = $this->getLength() - 1; while ($notFound && $offset < $length) { - //echo "
Checking: ". substr($this->_data, $offset); $nextHit = strpos($this->_data, $match, $offset); - //echo "
Next hit is :".intval($nextHit); if ($nextHit === false) { - $nextHit = $this->getLength() - $pointer; + return $this->getLength() - $pointer; } // now check if we found an escaped occurance $string = substr($this->_data, $pointer, $nextHit); @@ -200,7 +204,7 @@ class Msd_Sql_Object $notFound = false; } else { // keep on looking, this was escaped - $offset = $pointer + $nextHit + 1; + $offset = $pointer + $nextHit; } } return $nextHit; diff --git a/library/Msd/Sql/Parser.php b/library/Msd/Sql/Parser.php index e36089d..a1f0679 100644 --- a/library/Msd/Sql/Parser.php +++ b/library/Msd/Sql/Parser.php @@ -18,13 +18,6 @@ */ class Msd_Sql_Parser implements Iterator { - /** - * Saves the raw MySQL Query. - * - * @var string - */ - private $_rawQuery = null; - /** * Parsed MySQL statements. * @@ -73,7 +66,7 @@ class Msd_Sql_Parser implements Iterator */ public function __construct(Msd_Sql_Object $sqlObject, $debug = false) { - $this->_sql = $sqlObject; + $this->_sql = $sqlObject; $this->_debug = $debug; } @@ -87,23 +80,27 @@ class Msd_Sql_Parser implements Iterator */ public function parse() { - // get first characters to extract the kind of query we have to process $statementCounter = 0; - while ($this->_sql->hasMoreToProcess()) { - $this->_sql->movePointerToNextCommand(); - $endOfCommand = $this->_sql->getPosition(' '); - $sqlQuery = $this->_sql->getData($endOfCommand); - //echo "
Query beginn: ".$sqlQuery; - - $parts = explode(' ', $sqlQuery); - $statement = strtolower($parts[0]); + while ($this->_sql->hasMoreToProcess() && $this->_sql->movePointerToNextCommand()!==false) { + $startPosition = $this->_sql->getPointer(); + // get first "word" of query to extract the kind we have to process + $endOfFirstWord = $this->_sql->getPosition(' '); + // get substring from actual position to found position + $sqlQuery = $this->_sql->getData($endOfFirstWord - $startPosition); + $statement = strtolower($sqlQuery); // check for comments or conditional comments $commentCheck = substr($sqlQuery, 0, 2); if (isset($this->_sqlComments[$commentCheck]) || substr($statement, 0, 3) == '/*!') { $statement = 'Comment'; } - $foundStatement = $this->_parseStatement($this->_sql, ucwords($statement)); + try { + $foundStatement = $this->_parseStatement($this->_sql, ucfirst($statement)); + } catch (Msd_Sql_Parser_Exception $e) { + // stop parsing by setting pointer to the end + $this->_sql->setPointer($this->_sql->getLength()-1); + //echo "
Error: ".$e->getMessage(); + } if ($this->_debug) { $this->_debugOutput .= '
Extracted statement: '.$foundStatement; } @@ -130,12 +127,11 @@ class Msd_Sql_Parser implements Iterator private function _parseStatement(Msd_Sql_Object $sqlObject, $statement) { $statementPath = '/Msd/Sql/Parser/Statement/' . $statement; - if ($statement !== 'Select') die("Not implemented yet: ".$statement); if (!file_exists(LIBRARY_PATH . $statementPath . '.php')) { throw new Msd_Sql_Parser_Exception("Can't find statement class for statement: " . $statement); } $statementClass = 'Msd_Sql_Parser_Statement_' . $statement; - $parserObject = new $statementClass; + $parserObject = new $statementClass(); return $parserObject->parse($sqlObject); } diff --git a/library/Msd/Sql/Parser/Statement/Select.php b/library/Msd/Sql/Parser/Statement/Select.php index cac02e6..f3af527 100644 --- a/library/Msd/Sql/Parser/Statement/Select.php +++ b/library/Msd/Sql/Parser/Statement/Select.php @@ -30,7 +30,7 @@ class Msd_Sql_Parser_Statement_Select implements Msd_Sql_Parser_Interface $sql->setState('Select'); $endOfStatement = $sql->getPosition(';'); $statement = $sql->getData($endOfStatement); - $sql->setPointer($endOfStatement+1); + $sql->setPointer($endOfStatement); return $statement; } }