* @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2014 PradoSoft * @license http://www.pradosoft.com/license/ * @package Prado\Data\SqlMap\Configuration */ namespace Prado\Data\SqlMap\Configuration; use Prado\Data\SqlMap\DataMapper\TSqlMapUndefinedException; /** * TInlineParameterMapParser class. * * The inline parameter map syntax lets you embed the property name, * the property type, the column type, and a null value replacement into a * parametrized SQL statement. * * @author Wei Zhuo * @package Prado\Data\SqlMap\Configuration * @since 3.1 */ class TInlineParameterMapParser { /** * Regular expression for parsing inline parameter maps. */ const PARAMETER_TOKEN_REGEXP = '/#([^#]+)#/'; /** * Parse the sql text for inline parameters. * @param string sql text * @param array file and node details for exception message. * @return array 'sql' and 'parameters' name value pairs. */ public function parse($sqlText, $scope) { $matches = array(); $mappings = array(); preg_match_all(self::PARAMETER_TOKEN_REGEXP, $sqlText, $matches); for($i = 0, $k=count($matches[1]); $i<$k; $i++) { $mappings[] = $this->parseMapping($matches[1][$i], $scope); $sqlText = str_replace($matches[0][$i], '?', $sqlText); } return array('sql'=>$sqlText, 'parameters'=>$mappings); } /** * Parse inline parameter with syntax as * #propertyName,type=string,dbype=Varchar,nullValue=N/A,handler=string# * @param string parameter token * @param array file and node details for exception message. */ protected function parseMapping($token, $scope) { $mapping = new TParameterProperty; $properties = explode(',', $token); $mapping->setProperty(trim(array_shift($properties))); foreach($properties as $property) { $prop = explode('=',$property); $name = trim($prop[0]); $value=trim($prop[1]); if($mapping->canSetProperty($name)) $mapping->{'set'.$name}($value); else { throw new TSqlMapUndefinedException( 'sqlmap_undefined_property_inline_map', $name, $scope['file'], $scope['node'], $token); } } return $mapping; } }