- Timestamp:
- 10/02/08 18:12:10 (2 months ago)
- Location:
- lang/php/misc/Hermit
- Files:
-
- 6 added
- 18 modified
-
src/Hermit/HermitParam.php (modified) (2 diffs)
-
src/Hermit/annote/HermitAnnoteConst.php (modified) (1 diff)
-
src/Hermit/command/HermitProcedureCommand.php (modified) (1 diff)
-
src/Hermit/creator/HermiSetupSqlCreator.php (added)
-
src/Hermit/creator/HermitProcedureCallSqlCreator.php (modified) (1 diff)
-
src/Hermit/meta/HermitMySQLDatabaseMeta.php (modified) (5 diffs)
-
src/Hermit/meta/HermitProcedureInfo.php (modified) (2 diffs)
-
src/Hermit/parameter/HermitMySqlProcedureParameter.php (modified) (1 diff)
-
src/Hermit/parameter/HermitProcedureParameter.php (modified) (1 diff)
-
src/Hermit/resultset/HermitDefaultResultSet.php (modified) (1 diff)
-
src/Hermit/resultset/HermitIteratorMultiResultSet.php (added)
-
src/Hermit/resultset/HermitIteratorResultSet.php (added)
-
src/Hermit/resultset/HermitMySqlProcedureResultSet.php (modified) (2 diffs)
-
src/Hermit/resultset/HermitProcedureIteratorResultSet.php (added)
-
src/Hermit/resultset/HermitProcedureResultSet.php (modified) (2 diffs)
-
src/Hermit/resultset/HermitProcedureResultSetFactory.php (modified) (1 diff)
-
src/Hermit/statement/HermitDefaultStatement.php (added)
-
src/Hermit/statement/HermitProcedureStatementBuilder.php (modified) (3 diffs)
-
src/Hermit/statement/HermitSetupStatementBuilder.php (added)
-
src/Hermit/statement/HermitStatement.php (modified) (1 diff)
-
src/Hermit/statement/HermitStatementBuilder.php (modified) (2 diffs)
-
test/HermitProcedure_mysqlTest.php (modified) (3 diffs)
-
test/resource/procedure-mysql.sql (modified) (3 diffs)
-
test/resource/procedure-mysql.sql.php (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/php/misc/Hermit/src/Hermit/HermitParam.php
r20387 r20492 5 5 */ 6 6 class HermitParam extends stdClass { 7 public function set($name, $value){ 8 $this->$name = $value; 9 } 10 public function get($name){ 11 return $this->$name; 12 } 7 13 public function getPropertyNames(){ 8 14 $names = array(); … … 12 18 return $names; 13 19 } 20 public function __toString(){ 21 $tos = array(); 22 foreach($this as $name => $value){ 23 $tos[] = $name . '=>' . $value; 24 } 25 return __CLASS__ . ' {' . join(',', $tos) . '}'; 26 } 14 27 } -
lang/php/misc/Hermit/src/Hermit/annote/HermitAnnoteConst.php
r20387 r20492 11 11 const FILE_SUFFIX = '_FILE'; 12 12 const PROCEDURE_SUFFIX = '_PROCEDURE'; 13 const DELEGATE_SUFFIX = '_DELEGATE';14 13 const VALUE_TYPE_SUFFIX = '_VALUE_TYPE'; 15 14 -
lang/php/misc/Hermit/src/Hermit/command/HermitProcedureCommand.php
r20417 r20492 21 21 $this->annote = $annote; 22 22 } 23 24 23 public function execute(PDO $pdo, array $parameters){ 24 if($this->sqlCreator instanceof HermiSetupSqlCreator){ 25 if($this->sqlCreator->hasSetupSql()){ 26 $setupBuilder = new HermitSetupStatementBuilder($this->method, $this->annote, $this->sqlCreator); 27 $setupStatement = $setupBuilder->build($pdo); 28 $setupStatement->execute($parameters); 29 } 30 } 31 25 32 $builder = new HermitProcedureStatementBuilder($this->method, $this->annote, $this->sqlCreator); 26 33 $stmt = $builder->build($pdo); 27 34 $stmt->execute($parameters); 28 35 $rs = HermitProcedureResultSetFactory::create($pdo, $stmt->getSqlParameter()); 36 // 37 // to pdo_mysql cause: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. 38 // if($rs instanceof HermitParameterBind){ 39 // $rs->bindParameter($pdo, $parameters); 40 // } 41 // return $rs->execute($stmt, $this->type); 42 // 43 $returnValue = $rs->execute($stmt, $this->type); 29 44 if($rs instanceof HermitParameterBind){ 30 45 $rs->bindParameter($pdo, $parameters); 31 46 } 32 return $r s->execute($stmt, $this->type);47 return $returnValue; 33 48 } 34 49 } -
lang/php/misc/Hermit/src/Hermit/creator/HermitProcedureCallSqlCreator.php
r20387 r20492 4 4 * @author nowelum 5 5 */ 6 class HermitProcedureCallSqlCreator implements HermitSqlCreator {6 class HermitProcedureCallSqlCreator implements HermitSqlCreator, HermiSetupSqlCreator { 7 7 private $sql; 8 private $setupSql; 8 9 public function initialize(PDO $pdo, ReflectionMethod $method, HermitAnnote $annote){ 9 10 $procedureName = $annote->getProcedure($method); 10 11 $dbMeta = HermitDatabaseMetaFactory::get($pdo); 11 12 $info = $dbMeta->getProcedureInfo($procedureName); 12 $parameterNames = $info->getParamNames(); 13 $sql = 'CALL'; 14 $sql .= ' '; 15 $sql .= $procedureName; 16 $sql .= '('; 17 foreach($parameterNames as $parameterName){ 18 $sql .= '/*' . $parameterName . '*/'; 19 $sql .= '"' . $parameterName . '"'; 20 $sql .= ','; 21 } 22 $sql = substr($sql, 0, -1); 23 $sql .= ')'; 24 $this->sql = $sql; 13 14 $this->setupSql = self::generateSetupSql($info); 15 $this->sql = self::generateCallSql($info); 25 16 } 26 17 public function createSql(){ 27 18 return $this->sql; 28 19 } 20 public function createSetupSql(){ 21 return $this->setupSql; 22 } 23 public function hasSetupSql(){ 24 return null !== $this->setupSql; 25 } 26 protected static function generateCallSql(HermitProcedureInfo $info){ 27 $parameterNames = $info->getParamNames(); 28 $callSql = 'CALL'; 29 $callSql .= ' '; 30 $callSql .= $info->getName(); 31 $callSql .= '('; 32 foreach($parameterNames as $parameterName){ 33 $callSql .= '/*' . $parameterName . '*/'; 34 $callSql .= '"' . $parameterName . '"'; 35 $callSql .= ','; 36 } 37 $callSql = substr($callSql, 0, -1); 38 $callSql .= ')'; 39 return $callSql; 40 } 41 protected static function generateSetupSql(HermitProcedureInfo $info){ 42 $begin = false; 43 $parameterNames = $info->getParamNames(); 44 45 $setupSql = 'SET'; 46 $setupSql .= ' '; 47 foreach($parameterNames as $parameterName){ 48 if($info->typeofIn($parameterName)){ 49 continue; 50 } 51 $begin = true; 52 $setupSql .= '@' . $parameterName; 53 $setupSql .= ' = '; 54 $setupSql .= '/*' . $parameterName . '*/'; 55 $setupSql .= '"' . $parameterName . '"'; 56 $setupSql .= ','; 57 } 58 if(!$begin){ 59 return null; 60 } 61 return substr($setupSql, 0, -1); 62 } 29 63 } -
lang/php/misc/Hermit/src/Hermit/meta/HermitMySQLDatabaseMeta.php
r20314 r20492 5 5 */ 6 6 class HermitMySQLDatabaseMeta implements HermitDatabaseMeta { 7 7 8 const USING_DB_NAME_SQL = 'SELECT database()'; 8 9 const TABLE_INFO_SQL = 'SELECT * FROM %s LIMIT 0'; 9 10 const PROCEDIRE_INFO_SQL = 'SELECT param_list, returns FROM mysql.proc WHERE db = :db AND name = :name'; 11 10 12 private $tables = array(); 11 13 private $procedures = array(); … … 37 39 } 38 40 } 41 $stmt->closeCursor(); 42 unset($stmt); 39 43 return $this->tables[$table] = $info; 40 44 } … … 46 50 $stmt->execute(array(':db' => $this->databaseName, ':name' => $procedure)); 47 51 $paramList = $stmt->fetchColumn(0); 52 if(false === $paramList){ 53 throw new InvalidArgumentException('not found procedure name: ' . $procedure . ' in db: ' . $this->databaseName); 54 } 48 55 49 56 $info = new HermitProcedureInfo; 57 $info->setName($procedure); 50 58 $chunk = array_map('trim', explode(',', $paramList)); 51 59 foreach($chunk as $field){ … … 78 86 } 79 87 88 $stmt->closeCursor(); 89 unset($stmt); 80 90 return $this->procedures[$procedure] = $info; 81 91 } … … 84 94 $stmt = $this->pdo->prepare(self::USING_DB_NAME_SQL); 85 95 $stmt->execute(); 86 return $stmt->fetchColumn(0); 96 $result = $stmt->fetchColumn(0); 97 98 $stmt->closeCursor(); 99 unset($stmt); 100 return $result; 87 101 } 88 102 } -
lang/php/misc/Hermit/src/Hermit/meta/HermitProcedureInfo.php
r20325 r20492 5 5 */ 6 6 class HermitProcedureInfo implements Serializable { 7 7 8 const IN_TYPE = 1; 8 9 const OUT_TYPE = 2; 9 10 const INOUT_TYPE = 3; 10 11 12 private $procedureName; 11 13 private $names = array(); 12 14 private $inout = array(); … … 29 31 } 30 32 } 31 33 34 public function setName($name){ 35 $this->procedureName = $name; 36 } 37 public function getName(){ 38 return $this->procedureName; 39 } 32 40 public function addParamName($name){ 33 41 $this->names[] = $name; -
lang/php/misc/Hermit/src/Hermit/parameter/HermitMySqlProcedureParameter.php
r20417 r20492 31 31 $param = $value[0]; 32 32 foreach($this->bindKeys as $index => $key){ 33 $prefix = '';34 33 if($this->info->typeofIn($key)){ 35 34 $stmt->bindParam(':' . $key, $param->$key); -
lang/php/misc/Hermit/src/Hermit/parameter/HermitProcedureParameter.php
r20417 r20492 30 30 public function bind(PDOStatement $stmt, $value){ 31 31 $param = $value[0]; 32 $propertyNames = $param->getPropertyNames(); 33 32 34 foreach($this->bindKeys as $index => $key){ 33 35 $bindKey = ':' . $key; 34 36 if($this->info->typeofIn($key)){ 37 if(!in_array($key, $propertyNames)){ 38 throw new InvalidArgumentException('param ' . $param . ' has not propery: ' . $key . ' instatement: ' . $stmt->queryString); 39 } 35 40 $stmt->bindParam($bindKey, $param->$key); 36 41 continue; 37 42 } 38 $paramValue = $param->$key; 43 44 $paramValue = null; 45 if(isset($param->$key)){ 46 $paramValue = $param->$key; 47 } 39 48 if(null === $paramValue){ 40 $stmt->bindParam($bindKey, null, PDO::PARAM_NULL | PDO::PARAM_INPUT_OUTPUT);49 $stmt->bindParam($bindKey, $paramValue, PDO::PARAM_NULL | PDO::PARAM_INPUT_OUTPUT); 41 50 continue; 42 51 } -
lang/php/misc/Hermit/src/Hermit/resultset/HermitDefaultResultSet.php
r20417 r20492 7 7 public function execute(HermitStatement $stmt, HermitValueType $type){ 8 8 $type->apply($stmt); 9 return $stmt->fetch(); 9 if($row = $stmt->fetch()){ 10 $stmt->closeCursor(); 11 return $row; 12 } 13 return null; 10 14 } 11 15 } -
lang/php/misc/Hermit/src/Hermit/resultset/HermitMySqlProcedureResultSet.php
r20417 r20492 4 4 * @author nowelium 5 5 */ 6 class HermitMySqlProcedureResultSet extends HermitProcedureResultSet {6 class HermitMySqlProcedureResultSet extends HermitProcedureResultSet implements HermitParameterBind { 7 7 /** 8 8 * @override … … 18 18 $stmt->bindColumn(1, $param->$name); 19 19 $stmt->execute(); 20 20 21 21 $stmt->fetch(PDO::FETCH_BOUND); 22 22 $stmt->closeCursor(); -
lang/php/misc/Hermit/src/Hermit/resultset/HermitProcedureResultSet.php
r20417 r20492 4 4 * @author nowelium 5 5 */ 6 class HermitProcedureResultSet implements HermitResultSet , HermitParameterBind{6 class HermitProcedureResultSet implements HermitResultSet { 7 7 protected $procParameter; 8 8 public function __construct(HermitProcedureParameter $procParameter){ … … 10 10 } 11 11 public function execute(HermitStatement $stmt, HermitValueType $type){ 12 if($stmt->columnCount() < 1){ 13 $stmt->closeCursor(); 14 unset($stmt); 15 return null; 16 } 12 17 $type->apply($stmt); 13 18 14 if($stmt->columnCount() < 1){ 15 return null; 16 } 19 // $rows = array(); 20 // while($row = $stmt->fetch()){ 21 // $rows[] = $row; 22 // } 23 // if(!$stmt->nextRowset()){ 24 // return $rows; 25 // } 26 // 27 // $results = array(); 28 // $results[] = $rows; 29 // do { 30 // $rows = array(); 31 // while($row = $stmt->fetch()){ 32 // $rows[] = $row; 33 // } 34 // $results[] = $rows; 35 // } while($stmt->nextRowset()); 36 // 37 // $stmt->closeCursor(); 38 // unset($stmt); 39 // return $results; 17 40 41 // multiresult so always to array[array] 18 42 $results = array(); 19 43 do { 20 $row = $stmt->fetch();21 if(false === $row){22 break;44 $rows = array(); 45 while($row = $stmt->fetch()){ 46 $rows[] = $row; 23 47 } 24 $results[] = $row ;48 $results[] = $rows; 25 49 } while($stmt->nextRowset()); 50 51 $stmt->closeCursor(); 52 unset($stmt); 26 53 return $results; 27 54 } 28 public function bindParameter(PDO $pdo, array $parameter){29 }30 55 } -
lang/php/misc/Hermit/src/Hermit/resultset/HermitProcedureResultSetFactory.php
r20417 r20492 11 11 // nop 12 12 } 13 public function create(PDO $pdo, HermitProcedureParameter $parameter){13 public static function create(PDO $pdo, HermitProcedureParameter $parameter){ 14 14 $dbms = HermitDatabaseMetaFactory::getDbms($pdo); 15 15 $rs = null; -
lang/php/misc/Hermit/src/Hermit/statement/HermitProcedureStatementBuilder.php
r20417 r20492 5 5 */ 6 6 class HermitProcedureStatementBuilder extends HermitStatementBuilder { 7 pr ivate$method;8 pr ivate$annote;9 pr ivate$sqlCreator;7 protected $method; 8 protected $annote; 9 protected $sqlCreator; 10 10 11 11 protected static $procedureParameters = array( … … 14 14 15 15 public function __construct(ReflectionMethod $method, HermitAnnote $annote, HermitSqlCreator $sqlCreator){ 16 parent::__construct($method, $sqlCreator); 16 17 $this->method = $method; 17 18 $this->annote = $annote; … … 34 35 $parameter = new HermitProcedureParameter($info, $dbms); 35 36 } 36 $sql = $this->sqlCreator->createSql($pdo);37 $sql = self::preparedSql($parameter, $ sql);38 return new Hermit Statement($parameter, $pdo->prepare($sql));37 38 $sql = self::preparedSql($parameter, $this->sqlCreator->createSql()); 39 return new HermitDefaultStatement($parameter, $pdo->prepare($sql)); 39 40 } 40 41 -
lang/php/misc/Hermit/src/Hermit/statement/HermitStatement.php
r20387 r20492 4 4 * @author nowelium 5 5 */ 6 class HermitStatement { 7 protected $parameter; 8 protected $statement; 9 public function __construct(HermitSqlParameter $parameter, PDOStatement $statement){ 10 $this->parameter = $parameter; 11 $this->statement = $statement; 12 } 13 public function getSqlParameter(){ 14 return $this->parameter; 15 } 16 public function execute($parameterValue = array()){ 17 $this->parameter->bind($this->statement, $parameterValue); 18 return $this->statement->execute(); 19 } 20 public function fetch(){ 21 $args = func_get_args(); 22 $c = count($args); 23 if($c < 1){ 24 return $this->statement->fetch(); 25 } 26 if($c < 2){ 27 return $this->statement->fetch($args[0]); 28 } 29 return call_user_func_array(array($this->statement, 'fetch'), $args); 30 } 31 public function __call($name, $params){ 32 return call_user_func_array(array($this->statement, $name), $params); 33 } 6 interface HermitStatement { 7 public function getSqlParameter(); 8 public function execute($parameterValue = array()); 9 public function __call($name, $params); 34 10 } -
lang/php/misc/Hermit/src/Hermit/statement/HermitStatementBuilder.php
r20387 r20492 5 5 */ 6 6 class HermitStatementBuilder { 7 const REGEX= '/(\/\*([^\*\/]*)\*\/)(\w+|((\'|")([^(\'|")]*)(\'|")))?/m';7 const SQL_COMMENT_REGEXP = '/(\/\*([^\*\/]*)\*\/)(\w+|((\'|")([^(\'|")]*)(\'|")))?/m'; 8 8 private $method; 9 9 private $sqlCreator; … … 16 16 $sql = $this->sqlCreator->createSql($pdo); 17 17 $sql = self::preparedSql($parameter, $sql); 18 return new Hermit Statement($parameter, $pdo->prepare($sql));18 return new HermitDefaultStatement($parameter, $pdo->prepare($sql)); 19 19 } 20 20 21 21 protected static function preparedSql(HermitSqlParameter $parameter, $sql){ 22 return preg_replace_callback(self:: REGEX, array($parameter, 'match'), $sql);22 return preg_replace_callback(self::SQL_COMMENT_REGEXP, array($parameter, 'match'), $sql); 23 23 } 24 24 -
lang/php/misc/Hermit/test/HermitProcedure_mysqlTest.php
r20417 r20492 6 6 const callIN_OUT_PROCEDURE = 'PROC_IN_OUT'; 7 7 public function callIN_OUT(HermitParam $param); 8 9 const callINOUT_PROCEDURE = 'PROC_INOUT'; 10 public function callINOUT(HermitParam $param); 11 12 const callIN_OUT_OUT_PROCEDURE = 'PROC_IN_OUT_OUT'; 13 public function callIN_OUT_OUT(HermitParam $param); 14 15 const callIN_MULTI_PROCEDURE = 'PROC_IN_MULTIRESULT'; 16 const callIN_MULTI_VALUE_TYPE = 'OBJ'; 17 public function callIN_MULTI(HermitParam $param); 18 19 const callIN_IN_MULTI_PROCEDURE = 'PROC_IN_IN_MULTIRESULT'; 20 const callIN_IN_MULTI_VALUE_TYPE = 'ASSOC'; 21 public function callIN_IN_MULTI(HermitParam $param); 22 23 const callIN_OUT_MULTI_PROCEDURE = 'PROC_IN_OUT_MULTIRESULT'; 24 const callIN_OUT_MULTI_VALUE_TYPE = 'OBJ'; 25 public function callIN_OUT_MULTI(HermitParam $param); 26 27 const callINOUT_MULTI_PROCEDURE = 'PROC_INOUT_MULTIRESULT'; 28 const callINOUT_MULTI_VALUE_TYPE = 'OBJ'; 29 public function callINOUT_MULTI(HermitParam $param); 30 31 const callOUT_MULTI_PROCEDURE = 'PROC_OUT_MULTIRESULT'; 32 const callOUT_MULTI_VALUE_TYPE = 'OBJ'; 33 public function callOUT_MULTI(HermitParam $param); 34 35 const callNOSPEC_PARAM_PROCEDURE = 'PROC_NOSPEC_PARAM'; 36 const callNOSPEC_PARAM_VALUE_TYPE = 'OBJ'; 37 public function callNOSPEC_PARAM(HermitParam $param); 8 38 } 9 39 … … 21 51 $param->sales = 1000; 22 52 $param->tax = -1; 53 23 54 $result = $hermit->callIN_OUT($param); 24 55 … … 27 58 $test->ok($result === null); 28 59 } 60 { 61 $param = new HermitParam; 62 $param->sales = 5000; 63 64 $result = $hermit->callINOUT($param); 65 66 $test->ok($result === null); 67 $test->is($param->sales, 1000); 68 69 $result2 = $hermit->callINOUT($param); 70 $test->ok($result === null); 71 $test->is($param->sales, 200); 72 } 73 { 74 $param = new HermitParam; 75 $param->sales = 300; 76 77 $result = $hermit->callIN_OUT_OUT($param); 78 $test->ok($result === null); 79 $test->ok($param->tax !== null); 80 $test->ok($param->total !== null); 81 $test->is($param->tax, 60); 82 $test->is($param->total, 360); 83 } 84 { 85 $param = new HermitParam; 86 $param->set('IN_MGR', 7902); 87 88 $result = $hermit->callIN_MULTI($param); 89 $test->ok(is_array($result)); 90 $test->is(count($result), 3); 91 // same results... 0 to 3 92 { 93 $test->is(count($result[0]), 1); 94 $rs = $result[0][0]; 95 $test->is($rs->EMPNO, 7369); 96 $test->is($rs->ENAME, 'SMITH'); 97 $test->is($rs->JOB, 'CLERK'); 98 } 99 { 100 $test->is(count($result[1]), 1); 101 $rs = $result[1][0]; 102 $test->is($rs->EMPNO, 7369); 103 $test->is($rs->ENAME, 'SMITH'); 104 $test->is($rs->JOB, 'CLERK'); 105 } 106 { 107 $test->is(count($result[2]), 1); 108 $rs = $result[2][0]; 109 $test->is($rs->EMPNO, 7369); 110 $test->is($rs->ENAME, 'SMITH'); 111 $test->is($rs->JOB, 'CLERK'); 112 } 113 } 114 { 115 $param = new HermitParam; 116 $param->set('IN_MGR_1', '7698'); 117 $param->set('IN_MGR_2', '7902'); 118 119 $result = $hermit-
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)