From cbb7a11179b9c1c46e35f04d07d6386a44e400b2 Mon Sep 17 00:00:00 2001 From: wei <> Date: Sun, 23 Jul 2006 11:11:21 +0000 Subject: Update time-tracker demo and add simple dynamic SQLMap --- .../SQLMap/Configuration/TDomSqlMapBuilder.php | 120 +++++++++++---------- .../Configuration/TInlineParameterMapParser.php | 2 +- .../SQLMap/Configuration/TParameterProperty.php | 10 +- .../SQLMap/Configuration/TResultProperty.php | 6 +- .../SQLMap/Configuration/TSimpleDynamicParser.php | 23 ++++ .../SQLMap/DataMapper/TTypeHandlerFactory.php | 10 +- .../SQLMap/Statements/TMappedStatement.php | 1 - .../SQLMap/Statements/TPreparedCommand.php | 2 +- .../Statements/TPreparedStatementFactory.php | 15 --- .../SQLMap/Statements/TSimpleDynamicSql.php | 32 ++++++ .../DataAccess/SQLMap/Statements/TStaticSql.php | 2 +- framework/DataAccess/TAdodb.php | 12 +-- framework/DataAccess/TDatabaseProvider.php | 6 -- framework/Web/Javascripts/js/validator.js | 2 +- framework/Web/Javascripts/prado/validation3.js | 2 +- 15 files changed, 139 insertions(+), 106 deletions(-) create mode 100644 framework/DataAccess/SQLMap/Configuration/TSimpleDynamicParser.php create mode 100644 framework/DataAccess/SQLMap/Statements/TSimpleDynamicSql.php (limited to 'framework') diff --git a/framework/DataAccess/SQLMap/Configuration/TDomSqlMapBuilder.php b/framework/DataAccess/SQLMap/Configuration/TDomSqlMapBuilder.php index ba8323cc..0d1172b0 100644 --- a/framework/DataAccess/SQLMap/Configuration/TDomSqlMapBuilder.php +++ b/framework/DataAccess/SQLMap/Configuration/TDomSqlMapBuilder.php @@ -64,8 +64,8 @@ class TDomSqlMapBuilder if(isset($document->settings) && isset($document->settings->setting)) $this->configureSettings($document->settings); - if(isset($document->typeHandler)) - $this->loadTypeHandler($document, $this->_configFile); + foreach($document->xpath('//typeHandler') as $handler) + $this->loadTypeHandler($handler, $this->_configFile); //load database provider if(isset($document->provider) && isset($document->provider->datasource)) @@ -79,8 +79,8 @@ class TDomSqlMapBuilder 'sqlmap_unable_to_find_db_config', $this->_configFile); } - if(isset($document->sqlMaps) && isset($document->sqlMaps->sqlMap)) - $this->loadSqlMappingFiles($document->sqlMaps); + foreach($document->xpath('//sqlMap') as $sqlmap) + $this->loadSqlMappingFiles($sqlmap); if($this->_sqlMapper->getIsCacheModelsEnabled()) $this->attachCacheModel(); @@ -182,46 +182,40 @@ class TDomSqlMapBuilder //var_dump($node); } - protected function loadTypeHandler($nodes, $file) + protected function loadTypeHandler($node, $file) { - foreach($nodes->typeHandler as $node) + if(!is_null($node['type']) && !is_null($node['callback'])) { - if(!is_null($node['type']) && !is_null($node['callback'])) + $type = (string)$node['type']; + $dbType = (string)$node['dbType']; + $class = (string)$node['callback']; + if(class_exists('Prado', false)) { - $type = (string)$node['type']; - $class = (string)$node['callback']; - if(class_exists('Prado', false)) - { - $handler = Prado::createComponent($class); - } - else - { - if(class_exists($class,false)) - $handler = new $class; - else - throw new TSqlMapConfigurationException( - 'sqlmap_type_handler_class_undef', $file, $class); - } - $factory = $this->_sqlMapper->getTypeHandlerFactory(); - $factory->register($type, $handler); + $handler = Prado::createComponent($class); } else { + if(class_exists($class,false)) + $handler = new $class; + else throw new TSqlMapConfigurationException( - 'sqlmap_type_handler_callback_undef', $file); + 'sqlmap_type_handler_class_undef', $file, $class); } + $factory = $this->_sqlMapper->getTypeHandlerFactory(); + $factory->register($type, $handler, $dbType); } - } - - protected function loadSqlMappingFiles($sqlmappings) - { - foreach($sqlmappings->sqlMap as $node) + else { - $resource = $this->getResourceFromPath((string)$node['resource']); - $sqlmap = $this->getConfigAsXmlDocument($resource); - $this->configureSqlMap($sqlmap,$resource); + throw new TSqlMapConfigurationException( + 'sqlmap_type_handler_callback_undef', $file); } + } + protected function loadSqlMappingFiles($node) + { + $resource = $this->getResourceFromPath((string)$node['resource']); + $sqlmap = $this->getConfigAsXmlDocument($resource); + $this->configureSqlMap($sqlmap,$resource); $this->resolveResultMapping(); } @@ -243,27 +237,26 @@ class TDomSqlMapBuilder // if(isset($document->typeAlias)) // foreach($document->typeAlias as $node) // TTypeAliasDeSerializer::Deserialize($node, $this->_sqlMapper); - if(isset($document->resultMap)) - foreach($document->resultMap as $node) - $this->loadResultMap($node,$document,$file); - if(isset($document->parameterMap)) - foreach($document->parameterMap as $node) - $this->loadParameterMap($node, $document, $file); - if(isset($document->statement)) - foreach($document->statement as $node) - $this->loadStatementTag($node, $document,$file); - if(isset($document->select)) - foreach($document->select as $node) - $this->loadSelectTag($node, $document, $file); - if(isset($document->insert)) - foreach($document->insert as $node) - $this->loadInsertTag($node, $document, $file); - if(isset($document->update)) - foreach($document->update as $node) - $this->loadUpdateTag($node, $document, $file); - if(isset($document->delete)) - foreach($document->delete as $node) - $this->loadDeleteTag($node, $document, $file); + foreach($document->xpath('//resultMap') as $node) + $this->loadResultMap($node,$document,$file); + + foreach($document->xpath('//parameterMap') as $node) + $this->loadParameterMap($node, $document, $file); + + foreach($document->xpath('//statement') as $node) + $this->loadStatementTag($node, $document,$file); + + foreach($document->xpath('//select') as $node) + $this->loadSelectTag($node, $document, $file); + + foreach($document->xpath('//insert') as $node) + $this->loadInsertTag($node, $document, $file); + + foreach($document->xpath('//update') as $node) + $this->loadUpdateTag($node, $document, $file); + + foreach($document->xpath('//delete') as $node) + $this->loadDeleteTag($node, $document, $file); /* if(isset($document->procedure)) foreach($document->procedure as $node) $this->loadProcedureTag($node); @@ -391,7 +384,7 @@ class TDomSqlMapBuilder if(isset($superNodes[0])) $commandText = (string)$superNodes[0] . $commandText; else - throw TSqlMapConfigurationException( + throw new TSqlMapConfigurationException( 'sqlmap_unable_to_find_parent_sql', $extend, $file); } @@ -404,15 +397,15 @@ class TDomSqlMapBuilder protected function applyInlineParameterMap($statement, $sqlStatement, $node, $file) { + $scope['statement'] = $statement->getID(); + $scope['file'] = $file; + if($statement->parameterMap() == null) { - $scope['statement'] = $statement->getID(); - $scope['file'] = $file; - // Build a Parametermap with the inline parameters. // if they exist. Then delete inline infos from sqltext. $parameterParser = new TInlineParameterMapParser; - $sqlText = $parameterParser->parseInlineParameterMap( + $sqlText = $parameterParser->parse( $this->_sqlMapper, $statement, $sqlStatement, $scope); if(count($sqlText['parameters']) > 0) { @@ -424,7 +417,16 @@ class TDomSqlMapBuilder } $sqlStatement = $sqlText['sql']; } - $sql = new TStaticSql(); + + $simpleDynamic = new TSimpleDynamicParser; + $dynamics = $simpleDynamic->parse($this->_sqlMapper, $statement, $sqlStatement, $scope); + if(count($dynamics['parameters']) > 0) + { + $sql = new TSimpleDynamicSql($dynamics['parameters']); + $sqlStatement = $dynamics['sql']; + } + else + $sql = new TStaticSql(); $sql->buildPreparedStatement($statement, $sqlStatement); $statement->setSql($sql); } diff --git a/framework/DataAccess/SQLMap/Configuration/TInlineParameterMapParser.php b/framework/DataAccess/SQLMap/Configuration/TInlineParameterMapParser.php index 8b1ecf04..bc633b2c 100644 --- a/framework/DataAccess/SQLMap/Configuration/TInlineParameterMapParser.php +++ b/framework/DataAccess/SQLMap/Configuration/TInlineParameterMapParser.php @@ -4,7 +4,7 @@ class TInlineParameterMapParser { private $PARAMETER_TOKEN_REGEXP = '/#(#?[^#]+#?)#/'; - public function parseInlineParameterMap($sqlMap, $statement, $sqlText, $scope) + public function parse($sqlMap, $statement, $sqlText, $scope) { $parameterClass = !is_null($statement) ? $statement->getParameterClass() : null; diff --git a/framework/DataAccess/SQLMap/Configuration/TParameterProperty.php b/framework/DataAccess/SQLMap/Configuration/TParameterProperty.php index 2ff55f73..196f27f5 100644 --- a/framework/DataAccess/SQLMap/Configuration/TParameterProperty.php +++ b/framework/DataAccess/SQLMap/Configuration/TParameterProperty.php @@ -19,9 +19,13 @@ class TParameterProperty extends TComponent { if(is_null($this->_typeHandlerFactory)) return null; if(!is_null($this->_typeHandler)) - return $this->_typeHandlerFactory->getTypeHandler($this->_typeHandler); - else if(!is_null($this->getType())) - return $this->_typeHandlerFactory->getTypeHandler($this->getType()); + { + return $this->_typeHandlerFactory->getTypeHandler( + $this->_typeHandler, $this->_dbType); + } + else if(!is_null($this->getType())) + return $this->_typeHandlerFactory->getTypeHandler( + $this->getType(), $this->_dbType); else return null; } diff --git a/framework/DataAccess/SQLMap/Configuration/TResultProperty.php b/framework/DataAccess/SQLMap/Configuration/TResultProperty.php index 9cc0df3a..29ee366e 100644 --- a/framework/DataAccess/SQLMap/Configuration/TResultProperty.php +++ b/framework/DataAccess/SQLMap/Configuration/TResultProperty.php @@ -45,9 +45,11 @@ class TResultProperty extends TComponent { if(is_null($this->_typeHandlerFactory)) return null; if(!is_null($this->_typeHandler)) - return $this->_typeHandlerFactory->getTypeHandler($this->_typeHandler); + return $this->_typeHandlerFactory->getTypeHandler( + $this->_typeHandler, $this->_dbType); else if(!is_null($this->getType())) - return $this->_typeHandlerFactory->getTypeHandler($this->getType()); + return $this->_typeHandlerFactory->getTypeHandler( + $this->getType(), $this->_dbType); else return null; } diff --git a/framework/DataAccess/SQLMap/Configuration/TSimpleDynamicParser.php b/framework/DataAccess/SQLMap/Configuration/TSimpleDynamicParser.php new file mode 100644 index 00000000..e58d8af8 --- /dev/null +++ b/framework/DataAccess/SQLMap/Configuration/TSimpleDynamicParser.php @@ -0,0 +1,23 @@ +PARAMETER_TOKEN_REGEXP, $sqlText, $matches); + for($i = 0, $k=count($matches[1]); $i<$k; $i++) + { + $mappings[] = $matches[1][$i]; + $sqlText = str_replace($matches[0][$i], self::DYNAMIC_TOKEN, $sqlText); + } + return array('sql'=>$sqlText, 'parameters'=>$mappings); + } +} + +?> \ No newline at end of file diff --git a/framework/DataAccess/SQLMap/DataMapper/TTypeHandlerFactory.php b/framework/DataAccess/SQLMap/DataMapper/TTypeHandlerFactory.php index 55fb1f20..80af4345 100644 --- a/framework/DataAccess/SQLMap/DataMapper/TTypeHandlerFactory.php +++ b/framework/DataAccess/SQLMap/DataMapper/TTypeHandlerFactory.php @@ -11,25 +11,25 @@ class TTypeHandlerFactory $this->_typeHandlerMap = new TMap; } - public function getTypeHandler($type, $dbType=null) + public function getTypeHandler($type, $dbType='') { $dbTypeHandlerMap = $this->_typeHandlerMap[$type]; $handler = null; if(!is_null($dbTypeHandlerMap)) { - if(is_null($dbType)) + if(empty($dbType)) $handler = $dbTypeHandlerMap[self::NullDbType]; else { $handler = $dbTypeHandlerMap[$dbType]; - if(is_null($handler)) + if(is_null($handler)) $handler = $dbTypeHandlerMap[self::NullDbType]; } } return $handler; } - public function register($type, $handler, $dbType=null) + public function register($type, $handler, $dbType='') { $map = $this->_typeHandlerMap[$type]; if(is_null($map)) @@ -37,7 +37,7 @@ class TTypeHandlerFactory $map = new TMap; $this->_typeHandlerMap->add($type, $map); } - if(is_null($dbType)) + if(empty($dbType)) $map->add(self::NullDbType, $handler); else $map->add($dbType, $handler); diff --git a/framework/DataAccess/SQLMap/Statements/TMappedStatement.php b/framework/DataAccess/SQLMap/Statements/TMappedStatement.php index c621f285..9bc1143f 100644 --- a/framework/DataAccess/SQLMap/Statements/TMappedStatement.php +++ b/framework/DataAccess/SQLMap/Statements/TMappedStatement.php @@ -220,7 +220,6 @@ class TMappedStatement extends TComponent implements IMappedStatement $list = $result instanceof ArrayAccess ? $result : $this->_statement->createInstanceOfListClass(); $recordSet = $this->executeSQLQueryLimit($connection, $sql, $max, $skip); - if(!is_null($delegate)) { while($row = $recordSet->fetchRow()) diff --git a/framework/DataAccess/SQLMap/Statements/TPreparedCommand.php b/framework/DataAccess/SQLMap/Statements/TPreparedCommand.php index 1c0e5ad7..3557fc1f 100644 --- a/framework/DataAccess/SQLMap/Statements/TPreparedCommand.php +++ b/framework/DataAccess/SQLMap/Statements/TPreparedCommand.php @@ -5,7 +5,7 @@ class TPreparedCommand public function create($connection, $statement, $parameterObject) { - $prepared = $statement->getSQL()->getPreparedStatement(); + $prepared = $statement->getSQL()->getPreparedStatement($parameterObject); $parameters = $this->applyParameterMap($connection, $prepared, $statement, $parameterObject); return array('sql'=>$prepared->getPreparedSql(), diff --git a/framework/DataAccess/SQLMap/Statements/TPreparedStatementFactory.php b/framework/DataAccess/SQLMap/Statements/TPreparedStatementFactory.php index 41059934..52461983 100644 --- a/framework/DataAccess/SQLMap/Statements/TPreparedStatementFactory.php +++ b/framework/DataAccess/SQLMap/Statements/TPreparedStatementFactory.php @@ -11,36 +11,21 @@ class TPreparedStatementFactory { $this->_statement = $statement; $this->_commandText = $sqlString; - // $this->_statement = new TPreparedStatement(); -// $this->_statement->setSqlString($sqlString); } public function prepare() { - //$this->createParametersFromTextCommand(); - //return $this->_statement; $this->_preparedStatement = new TPreparedStatement(); $this->_preparedStatement->setPreparedSql($this->_commandText); if(!is_null($this->_statement->parameterMap())) - { $this->createParametersForTextCommand(); - //$this->evaluateParameterMap(); - } - //var_dump($this->_preparedStatement); return $this->_preparedStatement; } protected function createParametersForTextCommand() { - /*$matches = array(); - $string = $this->_statement->getSqlString(); - preg_match_all('/#([a-zA-Z0-9._]+)#/', $string, $matches); - $this->_statement->getParameterNames()->copyFrom($matches[0]);*/ - //var_dump($this->_statement); foreach($this->_statement->ParameterMap()->getProperties() as $prop) - { $this->_preparedStatement->getParameterNames()->add($prop->getProperty()); - } } } diff --git a/framework/DataAccess/SQLMap/Statements/TSimpleDynamicSql.php b/framework/DataAccess/SQLMap/Statements/TSimpleDynamicSql.php new file mode 100644 index 00000000..1230b4f7 --- /dev/null +++ b/framework/DataAccess/SQLMap/Statements/TSimpleDynamicSql.php @@ -0,0 +1,32 @@ +_mappings = $mappings; + } + + public function getPreparedStatement($parameter=null) + { + $statement = parent::getPreparedStatement($parameter); + if($parameter !== null) + $this->mapDynamicParameter($statement, $parameter); + return $statement; + } + + protected function mapDynamicParameter($statement, $parameter) + { + $sql = $statement->getPreparedSql(); + foreach($this->_mappings as $property) + { + $value = TPropertyAccess::get($parameter, $property); + $sql = preg_replace('/'.TSimpleDynamicParser::DYNAMIC_TOKEN.'/', $value, $sql, 1); + } + $statement->setPreparedSql($sql); + } +} + +?> \ No newline at end of file diff --git a/framework/DataAccess/SQLMap/Statements/TStaticSql.php b/framework/DataAccess/SQLMap/Statements/TStaticSql.php index bf6e4a18..b99b86ed 100644 --- a/framework/DataAccess/SQLMap/Statements/TStaticSql.php +++ b/framework/DataAccess/SQLMap/Statements/TStaticSql.php @@ -10,7 +10,7 @@ class TStaticSql extends TComponent $this->_preparedStatement = $factory->prepare(); } - public function getPreparedStatement() + public function getPreparedStatement($parameter=null) { return $this->_preparedStatement; } diff --git a/framework/DataAccess/TAdodb.php b/framework/DataAccess/TAdodb.php index cd188e49..a9b55e1e 100644 --- a/framework/DataAccess/TAdodb.php +++ b/framework/DataAccess/TAdodb.php @@ -401,14 +401,6 @@ class TAdodbConnection extends TDbConnection return $this->_connection->StartTrans(); } - /** - * Finish and cleanup transactions. - */ - public function completeTransaction() - { - return $this->connection->CompleteTrans(); - } - /** * End a transaction successfully. * @return true if successful. If the database does not support @@ -416,7 +408,7 @@ class TAdodbConnection extends TDbConnection */ public function commit() { - return $this->connection->CommitTrans(); + return $this->_connection->CommitTrans(); } /** @@ -426,7 +418,7 @@ class TAdodbConnection extends TDbConnection */ public function rollback() { - return $this->connection->RollbackTrans(); + return $this->_connection->RollbackTrans(); } /** diff --git a/framework/DataAccess/TDatabaseProvider.php b/framework/DataAccess/TDatabaseProvider.php index a39213f1..067c7243 100644 --- a/framework/DataAccess/TDatabaseProvider.php +++ b/framework/DataAccess/TDatabaseProvider.php @@ -267,12 +267,6 @@ interface IDbConnection */ public function beginTransaction(); - /** - * Finish and cleanup transactions. Not all database will support - * transactions. - */ - public function completeTransaction(); - /** * Makes all changes made since the previous commit/rollback permanent and * releases any database locks. Not all database will support transactions. diff --git a/framework/Web/Javascripts/js/validator.js b/framework/Web/Javascripts/js/validator.js index fd206508..8869ab9e 100644 --- a/framework/Web/Javascripts/js/validator.js +++ b/framework/Web/Javascripts/js/validator.js @@ -55,7 +55,7 @@ this.visible=this.visible&&this.messages.style.display!="none";Prado.Validation. return;} var refresh=update||this.visible==false||this.options.Refresh!=false;if(this.options.ShowSummary!=false&&refresh) {this.updateHTMLMessages(this.getMessages(validators));this.showSummary(validators);} -if(this.options.ScrollToSummary!=false) +if(this.options.ScrollToSummary!=false&&refresh) window.scrollTo(this.messages.offsetLeft-20,this.messages.offsetTop-20);if(this.options.ShowMessageBox==true&&refresh) {this.alertMessages(this.getMessages(validators));this.visible=true;}},updateHTMLMessages:function(messages) {while(this.messages.childNodes.length>0) diff --git a/framework/Web/Javascripts/prado/validation3.js b/framework/Web/Javascripts/prado/validation3.js index ae28e1fa..9535f8c5 100644 --- a/framework/Web/Javascripts/prado/validation3.js +++ b/framework/Web/Javascripts/prado/validation3.js @@ -396,7 +396,7 @@ Prado.WebUI.TValidationSummary.prototype = this.showSummary(validators); } - if(this.options.ScrollToSummary != false) + if(this.options.ScrollToSummary != false && refresh) window.scrollTo(this.messages.offsetLeft-20, this.messages.offsetTop-20); if(this.options.ShowMessageBox == true && refresh) -- cgit v1.2.3