- Timestamp:
- 09/30/08 21:36:14 (2 months ago)
- Location:
- lang/php/misc/Hermit
- Files:
-
- 14 added
- 2 removed
- 6 modified
-
src/Hermit/Hermit.php (modified) (3 diffs)
-
src/Hermit/HermitCallWrapper.php (added)
-
src/Hermit/HermitDelegater.php (added)
-
src/Hermit/HermitListener.php (deleted)
-
src/Hermit/HermitRegister.php (added)
-
src/Hermit/HermitResponder.php (added)
-
src/Hermit/HermitTransactionManager.php (modified) (1 diff)
-
src/Hermit/command/HermitSqlCommandFactory.php (modified) (1 diff)
-
src/Hermit/meta/HermitMySQLDatabaseMeta.php (modified) (3 diffs)
-
src/Hermit/meta/HermitProcedureInfo.php (added)
-
src/Hermit/valuetype/HermitValueTypeFactory.php (modified) (2 diffs)
-
test/HermitProcedureInfo_mysqlTest.php (added)
-
test/HermitRegisterTest.php (added)
-
test/HermitTableInfo_mysqlTest.php (added)
-
test/Hermit_TransactionManagerWrapTest.php (modified) (1 diff)
-
test/Hermit_WrapTest.php (deleted)
-
test/db_init.php (added)
-
test/resource (added)
-
test/resource/procedure-mysql.sql (added)
-
test/resource/procedure-mysql.sql.php (added)
-
test/resource/test-mysql.sql (added)
-
test/resource/test-mysql.sql.php (added)
Legend:
- Unmodified
- Added
- Removed
-
lang/php/misc/Hermit/src/Hermit/Hermit.php
r20200 r20314 6 6 class Hermit { 7 7 protected $proxy; 8 protected $listeners = array(); 9 protected $delegators = array(); 10 protected static $wrappers = array(); 8 protected $calls = array(); 9 protected static $behaviors = array(); 11 10 public function __construct($class = null){ 12 11 if(is_null($class)){ … … 21 20 } 22 21 public function __call($name, $parameters = array()){ 23 if(isset($this->delegators[$name])){ 24 $delegator = $this->delegators[$name]; 25 return self::__request($delegator, $name, $parameters); 26 } 27 if(isset($this->listeners[$name])){ 28 $response = self::__request($this->proxy, $name, $parameters); 29 $listeners = $this->listeners[$name]; 30 foreach($listeners as $listener){ 31 self::__request($listener, $name, array($response)); 22 if(0 < count($this->calls)){ 23 foreach($this->calls as $call){ 24 if($call->has($name)){ 25 return $call->execute($this->proxy, $name, $parameters); 26 } 32 27 } 33 return $response;34 28 } 35 29 return self::__request($this->proxy, $name, $parameters); … … 49 43 } 50 44 protected static function wrap(HermitProxy $proxy, $targetClass){ 51 if(HermitTransactionManager::has($targetClass)){ 52 return HermitTransactionManager::createProxy($proxy, $targetClass); 45 if(0 < count(self::$behaviors)){ 46 foreach(self::$behaviors as $behavior){ 47 if($behavior->has($targetClass)){ 48 return $behavior->createProxy($proxy, $targetClass); 49 } 50 } 53 51 } 54 52 return $proxy; -
lang/php/misc/Hermit/src/Hermit/HermitTransactionManager.php
r20152 r20314 4 4 * @author nowelium 5 5 */ 6 abstract class HermitTransactionManager { 7 private static $transactionScripts = array(); 6 class HermitTransactionManager implements HermitBehaviorWrapper { 7 private static $instance; 8 private $transactionScripts = array(); 8 9 private function __construct(){ 9 10 // nop 10 11 } 11 public static function set($targetClass, HermitTx $tx){ 12 protected static function getInstance(){ 13 if(null === self::$instance){ 14 self::$instance = new self; 15 } 16 if(!HermitRegister::hasBehavior(__CLASS__)){ 17 HermitRegister::putBehavior(__CLASS__, self::$instance); 18 } 19 return self::$instance; 12 20 } 13 public static function get($targetClass){ 21 public function set($targetClass, HermitTx $tx){ 22 $instance = self::getInstance(); 23 $instance->transactionScripts[$targetClass] = $tx; 14 24 } 15 public static function has($targetClass){ 25 public function get($targetClass){ 26 $instance = self::getInstance(); 27 if(isset($instance->transactionScripts[$targetClass])){ 28 return null; 29 } 30 return $instance->transactionScripts[$targetClass]; 16 31 } 17 public static function createProxy(HermitProxy $proxy, $targetClass){ 32 public function has($targetClass){ 33 $instance = self::getInstance(); 34 return isset($instance->transactionScripts[$targetClass]); 35 } 36 public function createProxy(HermitProxy $proxy, $targetClass){ 18 37 $tx = self::get($targetClass); 19 38 return new HermitCallableProxy($proxy, array($tx, 'proceed')); -
lang/php/misc/Hermit/src/Hermit/command/HermitSqlCommandFactory.php
r20200 r20314 18 18 } 19 19 public function create(PDO $pdo, $methodName){ 20 if(isset($this->createdCommands[$methodName])){ 21 return $this->createdCommands[$methodName]; 22 } 20 23 $method = $this->annote->getMethod($methodName); 21 $methodId = spl_object_hash($method);22 if(isset($this->createdCommands[$methodId])){23 return $this->createdCommands[$methodId];24 }25 24 $command = $this->createCommand($pdo, $method); 26 return $this->createdCommands[$method Id] = $command;25 return $this->createdCommands[$methodName] = $command; 27 26 } 28 27 protected function createCommand(PDO $pdo, ReflectionMethod $method){ -
lang/php/misc/Hermit/src/Hermit/meta/HermitMySQLDatabaseMeta.php
r20200 r20314 5 5 */ 6 6 class HermitMySQLDatabaseMeta implements HermitDatabaseMeta { 7 const TABLE_INFO_SQL = 'SELECT * FROM :TABLE LIMIT 0'; 7 const USING_DB_NAME_SQL = 'SELECT database()'; 8 const TABLE_INFO_SQL = 'SELECT * FROM %s LIMIT 0'; 9 const PROCEDIRE_INFO_SQL = 'SELECT param_list, returns FROM mysql.proc WHERE db = :db AND name = :name'; 8 10 private $tables = array(); 11 private $procedures = array(); 9 12 private $pdo; 13 private $databaseName; 10 14 public function __construct(PDO $pdo){ 11 15 $this->pdo = $pdo; 16 $this->databaseName = $this->getUsingDatabaseName(); 12 17 } 13 18 public function getTableInfo($table){ … … 15 20 return $this->tables[$table]; 16 21 } 17 18 $stmt = $this->pdo->prepare(self::TABLE_INFO_SQL); 19 $stmt->execute(array(':TABLE' => $table)); 22 23 $sql = sprintf(self::TABLE_INFO_SQL, $table); 24 $stmt = $this->pdo->prepare($sql); 25 $stmt->execute(); 20 26 $count = $stmt->columnCount(); 21 27 $info = new HermitTableInfo; … … 34 40 } 35 41 public function getProcedureInfo($procedure){ 36 throw new RuntimeException('T.B.D'); 42 if(isset($this->procedures[$procedure])){ 43 return $this->procedures[$procedure]; 44 } 45 $stmt = $this->pdo->prepare(self::PROCEDIRE_INFO_SQL); 46 $stmt->execute(array(':db' => $this->databaseName, ':name' => $procedure)); 47 $paramList = $stmt->fetchColumn(0); 48 49 $info = new HermitProcedureInfo; 50 $chunk = array_map('trim', explode(',', $paramList)); 51 foreach($chunk as $field){ 52 $sp = preg_split('/\s+/', $field); 53 54 $inoutType = null; 55 $paramName = null; 56 $paramType = null; 57 58 $upper = strtoupper($sp[0]); 59 if(in_array($upper, array('IN', 'OUT', 'INOUT'), true)){ 60 $inoutType = $upper; 61 $paramName = $sp[1]; 62 $paramType = $sp[2]; 63 } else { 64 // default IN: http://dev.mysql.com/doc/refman/5.1/ja/create-procedure.html 65 $inoutType = 'IN'; 66 $paramName = $sp[0]; 67 $paramType = $sp[1]; 68 } 69 $info->addParamName($paramName); 70 $info->putParamType($paramName, $paramType); 71 if(strcmp('IN', $inoutType) === 0){ 72 $info->putInType($paramName); 73 } else if(strcmp('OUT', $inoutType) === 0){ 74 $info->putOutType($paramName); 75 } else { 76 $info->putInOutType($paramName); 77 } 78 } 79 80 return $this->procedures[$procedure] = $info; 81 } 82 83 protected function getUsingDatabaseName(){ 84 $stmt = $this->pdo->prepare(self::USING_DB_NAME_SQL); 85 $stmt->execute(); 86 return $stmt->fetchColumn(0); 37 87 } 38 88 } -
lang/php/misc/Hermit/src/Hermit/valuetype/HermitValueTypeFactory.php
r20200 r20314 11 11 public static function create(HermitAnnote $annote, ReflectionMethod $method){ 12 12 $value = $annote->getValueType($method); 13 if(null === $value){ 14 return new HermitNopValueType($annote, $method, null); 15 } 13 16 foreach(self::$valueTypes as $type){ 14 17 if(call_user_func(array($type, 'accept'), $value)){ … … 16 19 } 17 20 } 18 return new HermitNopValueType ;21 return new HermitNopValueType($annote, $method, $value); 19 22 } 20 23 } -
lang/php/misc/Hermit/test/Hermit_TransactionManagerWrapTest.php
r20200 r20314 1 1 <?php 2 2 require dirname(__FILE__) . '/setup.php'; 3
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)