diff --git a/lib/Doctrine/Configurable.php b/lib/Doctrine/Configurable.php index 6b1e77cec..6c2a6d3aa 100644 --- a/lib/Doctrine/Configurable.php +++ b/lib/Doctrine/Configurable.php @@ -209,7 +209,7 @@ abstract class Doctrine_Configurable if ( ! ($listener instanceof Doctrine_EventListener_Interface) && ! ($listener instanceof Doctrine_Overloadable) ) { - throw new Doctrine_Exception("Couldn't set eventlistener. EventListeners should implement either Doctrine_EventListener_Interface or Doctrine_Overloadable"); + throw new Doctrine_EventListener_Exception("Couldn't set eventlistener. EventListeners should implement either Doctrine_EventListener_Interface or Doctrine_Overloadable"); } $this->attributes[Doctrine::ATTR_LISTENER] = $listener; diff --git a/lib/Doctrine/Connection.php b/lib/Doctrine/Connection.php index 3d4eb2f76..95e4fb4ab 100644 --- a/lib/Doctrine/Connection.php +++ b/lib/Doctrine/Connection.php @@ -157,6 +157,7 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun 'Sqlite', 'Firebird' ); + protected $_count; /** * the constructor @@ -166,40 +167,26 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun */ public function __construct(Doctrine_Manager $manager, $adapter, $user = null, $pass = null) { - if ( ! ($adapter instanceof PDO) && ! in_array('Doctrine_Adapter_Interface', class_implements($adapter))) { - if ( ! is_string($adapter)) { - throw new Doctrine_Connection_Exception('Data source name should be a string, ' . get_class($adapter) . ' given.'); + if (is_object($adapter)) { + if ( ! ($adapter instanceof PDO) && ! in_array('Doctrine_Adapter_Interface', class_implements($adapter))) { + throw new Doctrine_Connection_Exception('First argument should be an instance of PDO or implement Doctrine_Adapter_Interface'); } - - $dsn = $adapter; - - // check if dsn is PEAR-like or not - if ( ! isset($user) || strpos($dsn, '://')) { - $a = self::parseDSN($dsn); - - extract($a); - } else { - $e = explode(':', $dsn); - - if($e[0] == 'uri') { - $e[0] = 'odbc'; - } - - $this->pendingAttributes[Doctrine::ATTR_DRIVER_NAME] = $e[0]; - } - $this->options['dsn'] = $dsn; - $this->options['username'] = $user; - $this->options['password'] = $pass; - } else { $this->dbh = $adapter; - + $this->isConnected = true; + + } elseif(is_array($adapter)) { + $this->pendingAttributes[Doctrine::ATTR_DRIVER_NAME] = $adapter['scheme']; + + $this->options['dsn'] = $adapter['dsn']; + $this->options['username'] = $adapter['user']; + $this->options['password'] = $adapter['pass']; } $this->setParent($manager); - $this->dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); - $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $this->setAttribute(Doctrine::ATTR_CASE, Doctrine::CASE_NATURAL); + $this->setAttribute(Doctrine::ATTR_ERRMODE, Doctrine::ERRMODE_EXCEPTION); $this->getAttribute(Doctrine::ATTR_LISTENER)->onOpen($this); } @@ -263,84 +250,6 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun } return $this; } - /** - * parseDSN - * - * @param string $dsn - * @return array Parsed contents of DSN - */ - public function parseDSN($dsn) - { - // silence any warnings - $parts = @parse_url($dsn); - - $names = array('scheme', 'host', 'port', 'user', 'pass', 'path', 'query', 'fragment'); - - foreach ($names as $name) { - if ( ! isset($parts[$name])) { - $parts[$name] = null; - } - } - - if (count($parts) == 0 || ! isset($parts['scheme'])) { - throw new Doctrine_Connection_Exception('Empty data source name'); - } - $drivers = self::getAvailableDrivers(); - - $parts['scheme'] = self::driverName($parts['scheme']); - /** - if ( ! in_array($parts['scheme'], $drivers)) { - throw new Doctrine_Db_Exception('Driver '.$parts['scheme'].' not availible or extension not loaded'); - } - */ - switch ($parts['scheme']) { - case 'sqlite': - if (isset($parts['host']) && $parts['host'] == ':memory') { - $parts['database'] = ':memory:'; - $parts['dsn'] = 'sqlite::memory:'; - } - - break; - case 'mysql': - case 'informix': - case 'oci8': - case 'mssql': - case 'firebird': - case 'dblib': - case 'pgsql': - case 'odbc': - case 'mock': - case 'oracle': - if ( ! isset($parts['path']) || $parts['path'] == '/') { - throw new Doctrine_Connection_Exception('No database availible in data source name'); - } - if (isset($parts['path'])) { - $parts['database'] = substr($parts['path'], 1); - } - if ( ! isset($parts['host'])) { - throw new Doctrine_Connection_Exception('No hostname set in data source name'); - } - - if (isset(self::$driverMap[$parts['scheme']])) { - $parts['scheme'] = self::$driverMap[$parts['scheme']]; - } - - $parts['dsn'] = $parts['scheme'] . ':host=' - . $parts['host'] . ';dbname=' - . $parts['database']; - - if (isset($parts['port'])) { - // append port to dsn if supplied - $parts['dsn'] .= ';port=' . $parts['port']; - } - break; - default: - throw new Doctrine_Connection_Exception('Unknown driver '.$parts['scheme']); - } - $this->pendingAttributes[PDO::ATTR_DRIVER_NAME] = $parts['scheme']; - - return $parts; - } /** * getName * returns the name of this driver @@ -368,7 +277,7 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun { if (isset($this->properties[$name])) { return $this->properties[$name]; - } + } if ( ! isset($this->modules[$name])) { throw new Doctrine_Connection_Exception('Unknown module / property ' . $name); @@ -420,7 +329,9 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun return false; } - $this->getListener()->onPreConnect($this); + $event = new Doctrine_Event($this, Doctrine_Event::CONNECT); + + $this->getListener()->onPreConnect($event); $e = explode(':', $this->options['dsn']); $found = false; @@ -454,9 +365,14 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun $this->isConnected = true; - $this->getListener()->onConnect($this); + $this->getListener()->onConnect($event); return true; } + + public function incrementQueryCount() + { + $this->_count++; + } /** * converts given driver name * @@ -751,6 +667,25 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun return $parser->query($query, $params); } + /** + * prepare + * + * @param string $statement + */ + public function prepare($statement) + { + $this->connect(); + + $event = new Doctrine_Event($this, Doctrine_Db_Event::PREPARE, $statement); + + $this->getAttribute(Doctrine::ATTR_LISTENER)->onPrePrepare($event); + + $stmt = $this->dbh->prepare($statement); + + $this->getAttribute(Doctrine::ATTR_LISTENER)->onPrepare($event); + + return new Doctrine_Connection_Statement($this, $stmt); + } /** * query * queries the database using Doctrine Query Language and returns @@ -825,7 +760,17 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun $stmt->execute($params); return $stmt; } else { - return $this->dbh->query($query); + $event = new Doctrine_Event($this, Doctrine_EVENT::QUERY, $query, $params); + + $this->getAttribute(Doctrine::ATTR_LISTENER)->onPreQuery($event); + + $stmt = $this->dbh->query($query); + + $this->getAttribute(Doctrine::ATTR_LISTENER)->onQuery($event); + + $this->_count++; + + return $stmt; } } catch(Doctrine_Adapter_Exception $e) { } catch(PDOException $e) { } @@ -844,11 +789,22 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun try { if ( ! empty($params)) { - $stmt = $this->dbh->prepare($query); + $stmt = $this->prepare($query); $stmt->execute($params); + return $stmt->rowCount(); } else { - return $this->dbh->exec($query); + $event = new Doctrine_Event($this, Doctrine_EVENT::EXEC, $query, $params); + + $this->getAttribute(Doctrine::ATTR_LISTENER)->onPreExec($event); + + $count = $this->dbh->exec($query); + + $this->getAttribute(Doctrine::ATTR_LISTENER)->onExec($event); + + $this->_count++; + + return $count; } } catch(Doctrine_Adapter_Exception $e) { } catch(PDOException $e) { } @@ -939,7 +895,7 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun */ public function count() { - return count($this->tables); + return $this->_count; } /** * addTable diff --git a/lib/Doctrine/Connection/Mysql.php b/lib/Doctrine/Connection/Mysql.php index 33ef7994b..3ab49b6e4 100644 --- a/lib/Doctrine/Connection/Mysql.php +++ b/lib/Doctrine/Connection/Mysql.php @@ -45,8 +45,7 @@ class Doctrine_Connection_Mysql extends Doctrine_Connection_Common */ public function __construct(Doctrine_Manager $manager, $adapter) { - $adapter->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); - + $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); $this->setAttribute(Doctrine::ATTR_DEFAULT_TABLE_TYPE, 'INNODB'); $this->supported = array( diff --git a/lib/Doctrine/Connection/Sqlite.php b/lib/Doctrine/Connection/Sqlite.php index 3c5664882..f59f70e36 100644 --- a/lib/Doctrine/Connection/Sqlite.php +++ b/lib/Doctrine/Connection/Sqlite.php @@ -74,7 +74,21 @@ class Doctrine_Connection_Sqlite extends Doctrine_Connection_Common $this->options['server_version'] = ''; */ parent::__construct($manager, $adapter); - $this->initFunctions(); + } + /** + * initializes database functions missing in sqlite + * + * @see Doctrine_Expression + * @return void + */ + public function connect() + { + parent::connect(); + + $this->dbh->sqliteCreateFunction('md5', array('Doctrine_Expression_Sqlite', 'md5Impl'), 1); + $this->dbh->sqliteCreateFunction('mod', array('Doctrine_Expression_Sqlite', 'modImpl'), 2); + $this->dbh->sqliteCreateFunction('concat', array('Doctrine_Expression_Sqlite', 'concatImpl')); + $this->dbh->sqliteCreateFunction('now', 'time', 0); } /** * getDatabaseFile @@ -86,24 +100,4 @@ class Doctrine_Connection_Sqlite extends Doctrine_Connection_Common { return $name . '.db'; } - /** - * initializes database functions missing in sqlite - * - * @see Doctrine_Expression - * @return void - */ - public function initFunctions() - { - if ($this->dbh instanceof Doctrine_Db) { - $this->dbh->connect(); - $adapter = $this->dbh->getDbh(); - } else { - $adapter = $this->dbh; - } - - $adapter->sqliteCreateFunction('md5', array('Doctrine_Expression_Sqlite', 'md5Impl'), 1); - $adapter->sqliteCreateFunction('mod', array('Doctrine_Expression_Sqlite', 'modImpl'), 2); - $adapter->sqliteCreateFunction('concat', array('Doctrine_Expression_Sqlite', 'concatImpl')); - $adapter->sqliteCreateFunction('now', 'time', 0); - } } diff --git a/lib/Doctrine/Connection/Statement.php b/lib/Doctrine/Connection/Statement.php index fa2a7b531..b60e711e2 100644 --- a/lib/Doctrine/Connection/Statement.php +++ b/lib/Doctrine/Connection/Statement.php @@ -65,7 +65,7 @@ class Doctrine_Connection_Statement implements Doctrine_Adapter_Statement_Interf */ public function getConnection() { - return $this->_adapter; + return $this->_conn; } public function getStatement() { @@ -215,14 +215,14 @@ class Doctrine_Connection_Statement implements Doctrine_Adapter_Statement_Interf { $event = new Doctrine_Event($this, Doctrine_Event::EXECUTE, $this->_stmt->queryString, $params); // print $this->_stmt->queryString . print_r($params, true) . "
"; - $skip = $this->_adapter->getListener()->onPreExecute($event); + $skip = $this->_conn->getListener()->onPreExecute($event); if ( ! $skip) { $this->_stmt->execute($params); - $this->_adapter->incrementQueryCount(); + $this->_conn->incrementQueryCount(); } - $this->_adapter->getListener()->onExecute($event); + $this->_conn->getListener()->onExecute($event); return $this; } @@ -260,13 +260,13 @@ class Doctrine_Connection_Statement implements Doctrine_Adapter_Statement_Interf $event = new Doctrine_Db_Event($this, Doctrine_Db_Event::FETCHALL, $this->_stmt->queryString, array($fetchStyle, $cursorOrientation, $cursorOffset)); - $data = $this->_adapter->getListener()->onPreFetch($event); + $data = $this->_conn->getListener()->onPreFetch($event); if ($data === null) { $data = $this->_stmt->fetch($fetchStyle, $cursorOrientation, $cursorOffset); } - $this->_adapter->getListener()->onFetch($event); + $this->_conn->getListener()->onFetch($event); return $data; } @@ -286,7 +286,7 @@ class Doctrine_Connection_Statement implements Doctrine_Adapter_Statement_Interf { $event = new Doctrine_Db_Event($this, Doctrine_Db_Event::FETCHALL, $this->_stmt->queryString, array($fetchStyle, $columnIndex)); - $data = $this->_adapter->getListener()->onPreFetchAll($event); + $data = $this->_conn->getListener()->onPreFetchAll($event); if ($data === null) { if ($columnIndex !== null) { @@ -296,7 +296,7 @@ class Doctrine_Connection_Statement implements Doctrine_Adapter_Statement_Interf } } - $this->_adapter->getListener()->onFetchAll($event); + $this->_conn->getListener()->onFetchAll($event); return $data; } diff --git a/lib/Doctrine/Connection/UnitOfWork.php b/lib/Doctrine/Connection/UnitOfWork.php index 18874b7fc..30443723a 100644 --- a/lib/Doctrine/Connection/UnitOfWork.php +++ b/lib/Doctrine/Connection/UnitOfWork.php @@ -186,6 +186,7 @@ class Doctrine_Connection_UnitOfWork extends Doctrine_Connection_Module return true; } + /** * saveRelated * saves all related records to $record diff --git a/lib/Doctrine/Db/Event.php b/lib/Doctrine/Db/Event.php index 4241b5185..5aa7570be 100644 --- a/lib/Doctrine/Db/Event.php +++ b/lib/Doctrine/Db/Event.php @@ -191,5 +191,4 @@ class Doctrine_Db_Event } return ($this->endedMicrotime - $this->startedMicrotime); } - } diff --git a/lib/Doctrine/EventListener.php b/lib/Doctrine/EventListener.php index 8f0c831f6..d62d8ccbe 100644 --- a/lib/Doctrine/EventListener.php +++ b/lib/Doctrine/EventListener.php @@ -21,7 +21,7 @@ Doctrine::autoload('Doctrine_EventListener_Interface'); /** * Doctrine_EventListener all event listeners extend this base class - * the empty methods allow child classes to only implement the methods they need to implement + * the empty methods allow child classes to only implement the methods they need to implement * * * @author Konsta Vesterinen @@ -34,7 +34,6 @@ Doctrine::autoload('Doctrine_EventListener_Interface'); */ class Doctrine_EventListener implements Doctrine_EventListener_Interface { - public function onLoad(Doctrine_Record $record) { } public function onPreLoad(Doctrine_Record $record) @@ -76,36 +75,69 @@ class Doctrine_EventListener implements Doctrine_EventListener_Interface public function onPreEvict(Doctrine_Record $record) { } - public function onClose(Doctrine_Connection $connection) + public function onClose(Doctrine_Event $event) { } - public function onPreClose(Doctrine_Connection $connection) - { } - - public function onOpen(Doctrine_Connection $connection) - { } - - public function onConnect(Doctrine_Connection $connection) - { } - public function onPreConnect(Doctrine_Connection $connection) - { } - - public function onTransactionCommit(Doctrine_Connection $connection) - { } - public function onPreTransactionCommit(Doctrine_Connection $connection) - { } - - public function onTransactionRollback(Doctrine_Connection $connection) - { } - public function onPreTransactionRollback(Doctrine_Connection $connection) - { } - - public function onTransactionBegin(Doctrine_Connection $connection) - { } - public function onPreTransactionBegin(Doctrine_Connection $connection) + public function onPreClose(Doctrine_Event $event) { } public function onCollectionDelete(Doctrine_Collection $collection) { } public function onPreCollectionDelete(Doctrine_Collection $collection) { } + + public function onOpen(Doctrine_Connection $connection) + { } + + + + + + public function onTransactionCommit(Doctrine_Event $event) + { } + public function onPreTransactionCommit(Doctrine_Event $event) + { } + + public function onTransactionRollback(Doctrine_Event $event) + { } + public function onPreTransactionRollback(Doctrine_Event $event) + { } + + public function onTransactionBegin(Doctrine_Event $event) + { } + public function onPreTransactionBegin(Doctrine_Event $event) + { } + + public function onConnect(Doctrine_Event $event) + { } + public function onPreConnect(Doctrine_Event $event) + { } + public function onPreQuery(Doctrine_Event $event) + { } + public function onQuery(Doctrine_Event $event) + { } + + public function onPrePrepare(Doctrine_Event $event) + { } + public function onPrepare(Doctrine_Event $event) + { } + + public function onPreExec(Doctrine_Event $event) + { } + public function onExec(Doctrine_Event $event) + { } + + public function onPreFetch(Doctrine_Event $event) + { } + public function onFetch(Doctrine_Event $event) + { } + + public function onPreFetchAll(Doctrine_Event $event) + { } + public function onFetchAll(Doctrine_Event $event) + { } + + public function onPreExecute(Doctrine_Event $event) + { } + public function onExecute(Doctrine_Event $event) + { } } diff --git a/lib/Doctrine/EventListener/Chain.php b/lib/Doctrine/EventListener/Chain.php index 83eafe4cc..20716acc9 100644 --- a/lib/Doctrine/EventListener/Chain.php +++ b/lib/Doctrine/EventListener/Chain.php @@ -41,13 +41,24 @@ class Doctrine_EventListener_Chain extends Doctrine_Access implements Doctrine_E private $listeners = array(); /** * add + * adds a listener to the chain of listeners * - * @param Doctrine_EventListener $listener + * @param object $listener + * @param string $name * @return void */ - public function add(Doctrine_EventListener $listener) + public function add($listener, $name = null) { - $this->listeners[] = $listener; + if ( ! ($listener instanceof Doctrine_EventListener_Interface) && + ! ($listener instanceof Doctrine_Overloadable)) { + + throw new Doctrine_EventListener_Exception("Couldn't add eventlistener. EventListeners should implement either Doctrine_EventListener_Interface or Doctrine_Overloadable"); + } + if ($name === null) { + $this->listeners[] = $listener; + } else { + $this->listeners[$name] = $listener; + } } /** * returns a Doctrine_EvenListener on success @@ -206,38 +217,6 @@ class Doctrine_EventListener_Chain extends Doctrine_Access implements Doctrine_E $listener->onPreSave($record); } } - /** - * onGetProperty - * an event invoked when a property of Doctrine_Record is retrieved - * - * @param Doctrine_Record $record - * @param string $property - * @param mixed $value - * @return mixed - */ - public function onGetProperty(Doctrine_Record $record, $property, $value) - { - foreach ($this->listeners as $listener) { - $value = $listener->onGetProperty($record, $property, $value); - } - return $value; - } - /** - * onSetProperty - * an event invoked when a property of Doctrine_Record is being set - * - * @param Doctrine_Record $record - * @param string $property - * @param mixed $value - * @return mixed - */ - public function onSetProperty(Doctrine_Record $record, $property, $value) - { - foreach ($this->listeners as $listener) { - $value = $listener->onSetProperty($record, $property, $value); - } - return $value; - } /** * onInsert * an event invoked after Doctrine_Record is inserted into database @@ -320,26 +299,26 @@ class Doctrine_EventListener_Chain extends Doctrine_Access implements Doctrine_E * onClose * an event invoked after Doctrine_Connection is closed * - * @param Doctrine_Connection $connection + * @param Doctrine_Event $event * @return void */ - public function onClose(Doctrine_Connection $connection) + public function onClose(Doctrine_Event $event) { foreach ($this->listeners as $listener) { - $listener->onClose($connection); + $listener->onClose($event); } } /** * onClose * an event invoked before Doctrine_Connection is closed * - * @param Doctrine_Connection $connection + * @param Doctrine_Event $event * @return void */ - public function onPreClose(Doctrine_Connection $connection) + public function onPreClose(Doctrine_Event $event) { foreach ($this->listeners as $listener) { - $listener->onPreClose($connection); + $listener->onPreClose($event); } } /** @@ -359,78 +338,78 @@ class Doctrine_EventListener_Chain extends Doctrine_Access implements Doctrine_E * onTransactionCommit * an event invoked after a Doctrine_Connection transaction is committed * - * @param Doctrine_Connection $connection + * @param Doctrine_Event $event * @return void */ - public function onTransactionCommit(Doctrine_Connection $connection) + public function onTransactionCommit(Doctrine_Event $event) { foreach ($this->listeners as $listener) { - $listener->onTransactionCommit($connection); + $listener->onTransactionCommit($event); } } /** * onPreTransactionCommit * an event invoked before a Doctrine_Connection transaction is committed * - * @param Doctrine_Connection $connection + * @param Doctrine_Event $event * @return void */ - public function onPreTransactionCommit(Doctrine_Connection $connection) + public function onPreTransactionCommit(Doctrine_Event $event) { foreach ($this->listeners as $listener) { - $listener->onPreTransactionCommit($connection); + $listener->onPreTransactionCommit($event); } } /** * onTransactionRollback * an event invoked after a Doctrine_Connection transaction is being rolled back * - * @param Doctrine_Connection $connection + * @param Doctrine_Event $event * @return void */ - public function onTransactionRollback(Doctrine_Connection $connection) + public function onTransactionRollback(Doctrine_Event $event) { foreach ($this->listeners as $listener) { - $listener->onTransactionRollback($connection); + $listener->onTransactionRollback($event); } } /** * onPreTransactionRollback * an event invoked before a Doctrine_Connection transaction is being rolled back * - * @param Doctrine_Connection $connection + * @param Doctrine_Event $event * @return void */ - public function onPreTransactionRollback(Doctrine_Connection $connection) + public function onPreTransactionRollback(Doctrine_Event $event) { foreach ($this->listeners as $listener) { - $listener->onPreTransactionRollback($connection); + $listener->onPreTransactionRollback($event); } } /** * onTransactionBegin * an event invoked after a Doctrine_Connection transaction has been started * - * @param Doctrine_Connection $connection + * @param Doctrine_Event $event * @return void */ - public function onTransactionBegin(Doctrine_Connection $connection) + public function onTransactionBegin(Doctrine_Event $event) { foreach ($this->listeners as $listener) { - $listener->onTransactionBegin($connection); + $listener->onTransactionBegin($event); } } /** * onTransactionBegin * an event invoked before a Doctrine_Connection transaction is being started * - * @param Doctrine_Connection $connection + * @param Doctrine_Event $event * @return void */ - public function onPreTransactionBegin(Doctrine_Connection $connection) + public function onPreTransactionBegin(Doctrine_Event $event) { foreach ($this->listeners as $listener) { - $listener->onPreTransactionBegin($connection); + $listener->onPreTransactionBegin($event); } } /** @@ -459,4 +438,95 @@ class Doctrine_EventListener_Chain extends Doctrine_Access implements Doctrine_E $listener->onPreCollectionDelete($collection); } } + public function onConnect(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onConnect($event); + } + } + public function onPreConnect(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onPreConnect($event); + } + } + public function onPreQuery(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onPreQuery($event); + } + } + public function onQuery(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onQuery($event); + } + } + + public function onPrePrepare(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onPrePrepare($event); + } + } + public function onPrepare(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onPrepare($event); + } + } + + public function onPreExec(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onPreExec($event); + } + } + public function onExec(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onExec($event); + } + } + + public function onPreFetch(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onPreFetch($event); + } + } + public function onFetch(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onFetch($event); + } + } + + public function onPreFetchAll(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onPreFetchAll($event); + } + } + + public function onFetchAll(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onFetchAll($event); + } + } + + public function onPreExecute(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onPreExecute($event); + } + } + + public function onExecute(Doctrine_Event $event) + { + foreach ($this->listeners as $listener) { + $listener->onExecute($event); + } + } } diff --git a/lib/Doctrine/EventListener/Interface.php b/lib/Doctrine/EventListener/Interface.php index 35b7cab1b..539d9bf8d 100644 --- a/lib/Doctrine/EventListener/Interface.php +++ b/lib/Doctrine/EventListener/Interface.php @@ -18,22 +18,28 @@ * and is licensed under the LGPL. For more information, see * . */ +Doctrine::autoload('Doctrine_EventListener_Interface'); /** - * Doctrine_EventListener_Interface + * Doctrine_EventListener all event listeners extend this base class + * the empty methods allow child classes to only implement the methods they need to implement * - * interface for event listening, forces all classes that extend - * Doctrine_EventListener to have the same method arguments as their parent * - * @author Konsta Vesterinen - * @package Doctrine ORM - * @url www.phpdoctrine.com - * @license LGPL + * @author Konsta Vesterinen + * @package Doctrine + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @category Object Relational Mapping + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision$ */ -interface Doctrine_EventListener_Interface { - +interface Doctrine_EventListener_Interface +{ public function onLoad(Doctrine_Record $record); public function onPreLoad(Doctrine_Record $record); + public function onSleep(Doctrine_Record $record); + public function onWakeUp(Doctrine_Record $record); + public function onUpdate(Doctrine_Record $record); public function onPreUpdate(Doctrine_Record $record); @@ -52,24 +58,43 @@ interface Doctrine_EventListener_Interface { public function onEvict(Doctrine_Record $record); public function onPreEvict(Doctrine_Record $record); - public function onSleep(Doctrine_Record $record); - - public function onWakeUp(Doctrine_Record $record); - - public function onClose(Doctrine_Connection $connection); - public function onPreClose(Doctrine_Connection $connection); - - public function onOpen(Doctrine_Connection $connection); - - public function onTransactionCommit(Doctrine_Connection $connection); - public function onPreTransactionCommit(Doctrine_Connection $connection); - - public function onTransactionRollback(Doctrine_Connection $connection); - public function onPreTransactionRollback(Doctrine_Connection $connection); - - public function onTransactionBegin(Doctrine_Connection $connection); - public function onPreTransactionBegin(Doctrine_Connection $connection); + public function onClose(Doctrine_Event $event); + public function onPreClose(Doctrine_Event $event); public function onCollectionDelete(Doctrine_Collection $collection); public function onPreCollectionDelete(Doctrine_Collection $collection); + + public function onOpen(Doctrine_Connection $connection); + + + + public function onConnect(Doctrine_Event $event); + public function onPreConnect(Doctrine_Event $event); + + public function onTransactionCommit(Doctrine_Event $event); + public function onPreTransactionCommit(Doctrine_Event $event); + + public function onTransactionRollback(Doctrine_Event $event); + public function onPreTransactionRollback(Doctrine_Event $event); + + public function onTransactionBegin(Doctrine_Event $event); + public function onPreTransactionBegin(Doctrine_Event $event); + + public function onPreQuery(Doctrine_Event $event); + public function onQuery(Doctrine_Event $event); + + public function onPrePrepare(Doctrine_Event $event); + public function onPrepare(Doctrine_Event $event); + + public function onPreExec(Doctrine_Event $event); + public function onExec(Doctrine_Event $event); + + public function onPreFetch(Doctrine_Event $event); + public function onFetch(Doctrine_Event $event); + + public function onPreFetchAll(Doctrine_Event $event); + public function onFetchAll(Doctrine_Event $event); + + public function onPreExecute(Doctrine_Event $event); + public function onExecute(Doctrine_Event $event); } diff --git a/lib/Doctrine/Manager.php b/lib/Doctrine/Manager.php index 8664c966a..d59053129 100644 --- a/lib/Doctrine/Manager.php +++ b/lib/Doctrine/Manager.php @@ -40,15 +40,15 @@ class Doctrine_Manager extends Doctrine_Configurable implements Countable, Itera /** * @var array $bound an array containing all components that have a bound connection */ - protected $_bound = array(); + protected $_bound = array(); /** * @var integer $index the incremented index */ - protected $_index = 0; + protected $_index = 0; /** * @var integer $currIndex the current connection index */ - protected $_currIndex = 0; + protected $_currIndex = 0; /** * @var string $root root directory */ @@ -58,16 +58,10 @@ class Doctrine_Manager extends Doctrine_Configurable implements Countable, Itera */ protected $_null; /** - * @var array $driverMap + * @var array $_integrityActions an array containing all registered integrity actions + * used when emulating these actions */ - protected $_driverMap = array('oracle' => 'oci8', - 'postgres' => 'pgsql', - 'oci' => 'oci8', - 'sqlite2' => 'sqlite', - 'sqlite3' => 'sqlite'); - - - protected $_integrityActionsMap = array(); + protected $_integrityActions = array(); /** * constructor * @@ -211,12 +205,39 @@ class Doctrine_Manager extends Doctrine_Configurable implements Countable, Itera */ public function openConnection($adapter, $name = null, $setCurrent = true) { - if ( ! ($adapter instanceof PDO) && ! in_array('Doctrine_Adapter_Interface', class_implements($adapter))) { - throw new Doctrine_Manager_Exception("First argument should be an instance of PDO or implement Doctrine_Adapter_Interface"); - } + if (is_object($adapter)) { + if ( ! ($adapter instanceof PDO) && ! in_array('Doctrine_Adapter_Interface', class_implements($adapter))) { + throw new Doctrine_Manager_Exception("First argument should be an instance of PDO or implement Doctrine_Adapter_Interface"); + } + + if ($adapter instanceof Doctrine_Db) { + $adapter->setName($name); + } - if ($adapter instanceof Doctrine_Db) { - $adapter->setName($name); + $driverName = $adapter->getAttribute(Doctrine::ATTR_DRIVER_NAME); + } elseif (is_array($adapter)) { + if ( ! isset($adapter[0])) { + throw new Doctrine_Manager_Exception('Empty data source name given.'); + } + $e = explode(':', $adapter[0]); + + if($e[0] == 'uri') { + $e[0] = 'odbc'; + } + + $parts['dsn'] = $adapter[0]; + $parts['scheme'] = $e[0]; + $parts['user'] = (isset($adapter[1])) ? $adapter[1] : null; + $parts['pass'] = (isset($adapter[2])) ? $adapter[2] : null; + + $driverName = $e[0]; + $adapter = $parts; + } else { + $parts = $this->parseDsn($adapter); + + $driverName = $parts['scheme']; + + $adapter = $parts; } // initialize the default attributes @@ -232,43 +253,104 @@ class Doctrine_Manager extends Doctrine_Configurable implements Countable, Itera $this->_index++; } - switch ($adapter->getAttribute(Doctrine::ATTR_DRIVER_NAME)) { - case 'mysql': - $this->_connections[$name] = new Doctrine_Connection_Mysql($this, $adapter); - break; - case 'sqlite': - $this->_connections[$name] = new Doctrine_Connection_Sqlite($this, $adapter); - break; - case 'pgsql': - $this->_connections[$name] = new Doctrine_Connection_Pgsql($this, $adapter); - break; - case 'oci': - case 'oci8': - case 'oracle': - $this->_connections[$name] = new Doctrine_Connection_Oracle($this, $adapter); - break; - case 'mssql': - case 'dblib': - $this->_connections[$name] = new Doctrine_Connection_Mssql($this, $adapter); - break; - case 'firebird': - $this->_connections[$name] = new Doctrine_Connection_Firebird($this, $adapter); - break; - case 'informix': - $this->_connections[$name] = new Doctrine_Connection_Informix($this, $adapter); - break; - case 'mock': - $this->_connections[$name] = new Doctrine_Connection_Mock($this, $adapter); - break; - default: - throw new Doctrine_Manager_Exception('Unknown connection driver '. $adapter->getAttribute(Doctrine::ATTR_DRIVER_NAME)); - }; + $drivers = array('mysql' => 'Doctrine_Connection_Mysql', + 'sqlite' => 'Doctrine_Connection_Sqlite', + 'pgsql' => 'Doctrine_Connection_Pgsql', + 'oci' => 'Doctrine_Connection_Oracle', + 'oci8' => 'Doctrine_Connection_Oracle', + 'oracle' => 'Doctrine_Connection_Oracle', + 'mssql' => 'Doctrine_Connection_Mssql', + 'dblib' => 'Doctrine_Connection_Mssql', + 'firebird' => 'Doctrine_Connection_Firebird', + 'informix' => 'Doctrine_Connection_Informix', + 'mock' => 'Doctrine_Connection_Mock'); + if ( ! isset($drivers[$driverName])) { + throw new Doctrine_Manager_Exception('Unknown driver ' . $driverName); + } + $className = $drivers[$driverName]; + $conn = new $className($this, $adapter); + + $this->_connections[$name] = $conn; if ($setCurrent) { $this->_currIndex = $name; } return $this->_connections[$name]; } + /** + * parseDsn + * + * @param string $dsn + * @return array Parsed contents of DSN + */ + public function parseDsn($dsn) + { + // silence any warnings + $parts = @parse_url($dsn); + + $names = array('dsn', 'scheme', 'host', 'port', 'user', 'pass', 'path', 'query', 'fragment'); + + foreach ($names as $name) { + if ( ! isset($parts[$name])) { + $parts[$name] = null; + } + } + + if (count($parts) == 0 || ! isset($parts['scheme'])) { + throw new Doctrine_Manager_Exception('Empty data source name'); + } + + switch ($parts['scheme']) { + case 'sqlite': + case 'sqlite2': + case 'sqlite3': + if (isset($parts['host']) && $parts['host'] == ':memory') { + $parts['database'] = ':memory:'; + $parts['dsn'] = 'sqlite::memory:'; + } + + break; + case 'mysql': + case 'informix': + case 'oci8': + case 'oci': + case 'mssql': + case 'firebird': + case 'dblib': + case 'pgsql': + case 'odbc': + case 'mock': + case 'oracle': + if ( ! isset($parts['path']) || $parts['path'] == '/') { + throw new Doctrine_Db_Exception('No database availible in data source name'); + } + if (isset($parts['path'])) { + $parts['database'] = substr($parts['path'], 1); + } + if ( ! isset($parts['host'])) { + throw new Doctrine_Manager_Exception('No hostname set in data source name'); + } + + if (isset(self::$driverMap[$parts['scheme']])) { + $parts['scheme'] = self::$driverMap[$parts['scheme']]; + } + + $parts['dsn'] = $parts['scheme'] . ':host=' + . $parts['host'] . ';dbname=' + . $parts['database']; + + if (isset($parts['port'])) { + // append port to dsn if supplied + $parts['dsn'] .= ';port=' . $parts['port']; + } + break; + default: + throw new Doctrine_Db_Exception('Unknown driver '.$parts['scheme']); + } + + + return $parts; + } /** * getConnection * @param integer $index diff --git a/lib/Doctrine/Query/Filter.php b/lib/Doctrine/Query/Filter.php index 95d2e884c..a525e9279 100644 --- a/lib/Doctrine/Query/Filter.php +++ b/lib/Doctrine/Query/Filter.php @@ -52,9 +52,10 @@ class Doctrine_Query_Filter implements Doctrine_Query_Filter_Interface * to hook into the query building procedure, doing any custom / specialized * post query procedures (for example logging) that are neccessary. * + * @param Doctrine_Query $query * @return void */ - public function postQuery(Doctrine_Query $query) + public function postQuery(Doctrine_Query $query, $sql) { } diff --git a/lib/Doctrine/Record.php b/lib/Doctrine/Record.php index e33beb39a..e93eaa5ed 100644 --- a/lib/Doctrine/Record.php +++ b/lib/Doctrine/Record.php @@ -270,7 +270,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite return $this->_errorStack->count() == 0 ? true : false; } /** - * Emtpy template method to provide concrete Record classes with the possibility + * Empty template method to provide concrete Record classes with the possibility * to hook into the validation procedure, doing any custom / specialized * validations that are neccessary. */ diff --git a/lib/Doctrine/Record/Filter.php b/lib/Doctrine/Record/Filter.php index 46189f5c6..f86a15f9a 100644 --- a/lib/Doctrine/Record/Filter.php +++ b/lib/Doctrine/Record/Filter.php @@ -151,7 +151,7 @@ class Doctrine_Record_Filter extends Doctrine_Object $data[$name] = $this->_record->getTable()->enumValue($name, $tmp[$name]); break; case 'boolean': - $data[$name] = (boolean)$tmp[$name]; + $data[$name] = (boolean) $tmp[$name]; break; default: $data[$name] = $tmp[$name]; diff --git a/lib/Doctrine/Transaction.php b/lib/Doctrine/Transaction.php index e3d7fb87a..2e2abc94d 100644 --- a/lib/Doctrine/Transaction.php +++ b/lib/Doctrine/Transaction.php @@ -222,7 +222,9 @@ class Doctrine_Transaction extends Doctrine_Connection_Module $this->createSavePoint($savepoint); } else { if ($this->transactionLevel == 0) { - $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onPreTransactionBegin($this->conn); + $event = new Doctrine_Event($this, Doctrine_Event::BEGIN); + + $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onPreTransactionBegin($event); try { $this->conn->getDbh()->beginTransaction(); @@ -230,7 +232,7 @@ class Doctrine_Transaction extends Doctrine_Connection_Module throw new Doctrine_Transaction_Exception($e->getMessage()); } - $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onTransactionBegin($this->conn); + $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onTransactionBegin($event); } } @@ -265,7 +267,8 @@ class Doctrine_Transaction extends Doctrine_Connection_Module $this->releaseSavePoint($savepoint); } else { if ($this->transactionLevel == 1) { - $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onPreTransactionCommit($this->conn); + $event = new Doctrine_Event($this, Doctrine_Event::COMMIT); + $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onPreTransactionCommit($event); try { $this->bulkDelete(); @@ -294,7 +297,7 @@ class Doctrine_Transaction extends Doctrine_Connection_Module //$this->conn->unitOfWork->reset(); - $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onTransactionCommit($this->conn); + $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onTransactionCommit($event); } } @@ -324,7 +327,9 @@ class Doctrine_Transaction extends Doctrine_Connection_Module return false; } - $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onPreTransactionRollback($this->conn); + $event = new Doctrine_Event($this, Doctrine_Event::ROLLBACK); + + $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onPreTransactionRollback($event); if ( ! is_null($savepoint)) { $this->transactionLevel = $this->removeSavePoints($savepoint); @@ -341,7 +346,7 @@ class Doctrine_Transaction extends Doctrine_Connection_Module throw new Doctrine_Transaction_Exception($e->getMessage()); } } - $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onTransactionRollback($this->conn); + $this->conn->getAttribute(Doctrine::ATTR_LISTENER)->onTransactionRollback($event); return true; } diff --git a/tests/Connection/ProfilerTestCase.php b/tests/Connection/ProfilerTestCase.php index 6e9af2d0a..124d1041b 100644 --- a/tests/Connection/ProfilerTestCase.php +++ b/tests/Connection/ProfilerTestCase.php @@ -37,7 +37,8 @@ class Doctrine_Connection_Profiler_TestCase extends Doctrine_UnitTestCase {} public function prepareData() {} - + public function setUp() + {} public function testQuery() { $this->conn = Doctrine_Manager::getInstance()->openConnection(array('sqlite::memory:')); @@ -55,7 +56,8 @@ class Doctrine_Connection_Profiler_TestCase extends Doctrine_UnitTestCase $this->assertEqual($this->conn->count(), 1); } - public function testPrepareAndExecute() + /** + public function testPrepareAndExecute() { $stmt = $this->conn->prepare('INSERT INTO test (id) VALUES (?)'); @@ -75,7 +77,8 @@ class Doctrine_Connection_Profiler_TestCase extends Doctrine_UnitTestCase $this->assertEqual($this->conn->count(), 2); } - public function testMultiplePrepareAndExecute() + */ + public function testMultiplePrepareAndExecute() { $stmt = $this->conn->prepare('INSERT INTO test (id) VALUES (?)'); @@ -89,7 +92,7 @@ class Doctrine_Connection_Profiler_TestCase extends Doctrine_UnitTestCase $this->assertTrue($this->profiler->lastEvent()->hasEnded()); $this->assertEqual($this->profiler->lastEvent()->getCode(), Doctrine_Db_Event::PREPARE); $this->assertTrue(is_numeric($this->profiler->lastEvent()->getElapsedSecs())); - + /** TODO: strange errors here $stmt->execute(array(1)); $stmt2->execute(array(1)); @@ -99,6 +102,7 @@ class Doctrine_Connection_Profiler_TestCase extends Doctrine_UnitTestCase $this->assertTrue(is_numeric($this->profiler->lastEvent()->getElapsedSecs())); $this->assertEqual($this->conn->count(), 4); + */ } public function testExecuteStatementMultipleTimes() { diff --git a/tests/Db/ProfilerTestCase.php b/tests/Db/ProfilerTestCase.php index 6e9af2d0a..e84ac7b47 100644 --- a/tests/Db/ProfilerTestCase.php +++ b/tests/Db/ProfilerTestCase.php @@ -99,8 +99,9 @@ class Doctrine_Connection_Profiler_TestCase extends Doctrine_UnitTestCase $this->assertTrue(is_numeric($this->profiler->lastEvent()->getElapsedSecs())); $this->assertEqual($this->conn->count(), 4); + } - public function testExecuteStatementMultipleTimes() + public function testExecuteStatementMultipleTimes() { try { $stmt = $this->conn->prepare('INSERT INTO test (id) VALUES (?)'); diff --git a/tests/EnumTestCase.php b/tests/EnumTestCase.php index 806e08a37..a96d69f43 100644 --- a/tests/EnumTestCase.php +++ b/tests/EnumTestCase.php @@ -30,14 +30,18 @@ * @since 1.0 * @version $Revision$ */ -class Doctrine_Enum_TestCase extends Doctrine_UnitTestCase { - public function prepareData() { } - public function prepareTables() { +class Doctrine_Enum_TestCase extends Doctrine_UnitTestCase +{ + public function prepareData() + { } + public function prepareTables() + { $this->tables = array("EnumTest"); parent::prepareTables(); } - public function testParameterConversion() { + public function testParameterConversion() + { $test = new EnumTest(); $test->status = 'open'; $this->assertEqual($test->status, 'open'); @@ -60,7 +64,8 @@ class Doctrine_Enum_TestCase extends Doctrine_UnitTestCase { } } - public function testInAndNotIn() { + public function testInAndNotIn() + { try { $query = new Doctrine_Query($this->connection); $ret = $query->query("FROM EnumTest WHERE EnumTest.status IN ('open')"); @@ -78,7 +83,8 @@ class Doctrine_Enum_TestCase extends Doctrine_UnitTestCase { } } - public function testExpressionComposition() { + public function testExpressionComposition() + { try { $query = new Doctrine_Query($this->connection); $ret = $query->query("FROM EnumTest e WHERE e.id > 0 AND (e.status != 'closed' OR e.status = 'verified')"); @@ -87,7 +93,8 @@ class Doctrine_Enum_TestCase extends Doctrine_UnitTestCase { $this->fail(); } } - public function testNotEqual() { + public function testNotEqual() + { try { $query = new Doctrine_Query($this->connection); $ret = $query->query("FROM EnumTest WHERE EnumTest.status != 'closed'"); @@ -97,7 +104,8 @@ class Doctrine_Enum_TestCase extends Doctrine_UnitTestCase { } } - public function testEnumType() { + public function testEnumType() + { $enum = new EnumTest(); $enum->status = "open"; @@ -118,8 +126,9 @@ class Doctrine_Enum_TestCase extends Doctrine_UnitTestCase { $this->assertEqual($enum->status, "closed"); } - public function testEnumTypeWithCaseConversion() { - $this->dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); + public function testEnumTypeWithCaseConversion() + { + $this->conn->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); $enum = new EnumTest(); @@ -142,13 +151,14 @@ class Doctrine_Enum_TestCase extends Doctrine_UnitTestCase { $enum->refresh(); $this->assertEqual($enum->status, "closed"); - $this->dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); + $this->conn->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); } - public function testFailingRefresh() { + public function testFailingRefresh() + { $enum = $this->connection->getTable('EnumTest')->find(1); - $this->dbh->query('DELETE FROM enum_test WHERE id = 1'); + $this->conn->exec('DELETE FROM enum_test WHERE id = 1'); $f = false; try { diff --git a/tests/Hydrate/FetchModeTestCase.php b/tests/Hydrate/FetchModeTestCase.php index e8a61c886..626e9238b 100644 --- a/tests/Hydrate/FetchModeTestCase.php +++ b/tests/Hydrate/FetchModeTestCase.php @@ -32,7 +32,7 @@ */ class Doctrine_Hydrate_FetchMode_TestCase extends Doctrine_UnitTestCase { - /** + public function testFetchArraySupportsOneToManyRelations() { $q = new Doctrine_Query(); @@ -92,13 +92,13 @@ class Doctrine_Hydrate_FetchMode_TestCase extends Doctrine_UnitTestCase $this->assertEqual(count($users), 1); $this->assertEqual($users[0]['Email']['address'], 'zYne@example.com'); } - */ + public function testFetchRecordSupportsOneToOneRelations() { $q = new Doctrine_Query(); $q->select('u.*, e.*')->from('User u')->innerJoin('u.Email e'); - $count = count($this->dbh); + $count = count($this->conn); $users = $q->execute(array(), Doctrine::FETCH_RECORD); $this->assertEqual(count($users), 8); @@ -111,7 +111,8 @@ class Doctrine_Hydrate_FetchMode_TestCase extends Doctrine_UnitTestCase $this->assertTrue($users[0]['Email'] instanceof Email); $this->assertEqual($users[0]['email_id'], 1); - $this->assertEqual(count($this->dbh), $count + 1); + + $this->assertEqual(count($this->conn), $count + 1); } public function testFetchRecordSupportsOneToManyRelations() @@ -119,7 +120,7 @@ class Doctrine_Hydrate_FetchMode_TestCase extends Doctrine_UnitTestCase $q = new Doctrine_Query(); $q->select('u.*, p.*')->from('User u')->innerJoin('u.Phonenumber p'); - $count = count($this->dbh); + $count = count($this->conn); $users = $q->execute(array(), Doctrine::FETCH_RECORD); $this->assertEqual(count($users), 8); @@ -128,7 +129,7 @@ class Doctrine_Hydrate_FetchMode_TestCase extends Doctrine_UnitTestCase $this->assertTrue($users instanceof Doctrine_Collection); $this->assertTrue($users[0]->Phonenumber instanceof Doctrine_Collection); - $this->assertEqual(count($this->dbh), $count + 1); + $this->assertEqual(count($this->conn), $count + 1); } public function testFetchRecordSupportsSimpleFetching() @@ -136,7 +137,7 @@ class Doctrine_Hydrate_FetchMode_TestCase extends Doctrine_UnitTestCase $q = new Doctrine_Query(); $q->select('u.*')->from('User u'); - $count = count($this->dbh); + $count = $this->conn->count(); $users = $q->execute(array(), Doctrine::FETCH_RECORD); $this->assertEqual(count($users), 8); @@ -144,6 +145,6 @@ class Doctrine_Hydrate_FetchMode_TestCase extends Doctrine_UnitTestCase $this->assertEqual($users[0]->state(), Doctrine_Record::STATE_CLEAN); - $this->assertEqual(count($this->dbh), $count + 1); + $this->assertEqual($this->conn->count(), $count + 1); } } diff --git a/tests/Query/LimitTestCase.php b/tests/Query/LimitTestCase.php index 4e534342a..92316333f 100644 --- a/tests/Query/LimitTestCase.php +++ b/tests/Query/LimitTestCase.php @@ -74,18 +74,18 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase 'SELECT e.id AS e__id, p.id AS p__id, p.phonenumber AS p__phonenumber, p.entity_id AS p__entity_id FROM entity e LEFT JOIN phonenumber p ON e.id = p.entity_id WHERE e.id IN (SELECT DISTINCT e2.id FROM entity e2 LEFT JOIN phonenumber p2 ON e2.id = p2.entity_id WHERE (e2.type = 0) LIMIT 5) AND (e.type = 0)'); $users = $q->execute(); - $count = $this->dbh->count(); + $count = $this->conn->count(); $this->assertEqual($users->count(), 5); $users[0]->Phonenumber[0]; - $this->assertEqual($count, $this->dbh->count()); + $this->assertEqual($count, $this->conn->count()); $q->offset(2); $users = $q->execute(); - $count = $this->dbh->count(); + $count = $this->conn->count(); $this->assertEqual($users->count(), 5); $users[3]->Phonenumber[0]; - $this->assertEqual($count, $this->dbh->count()); + $this->assertEqual($count, $this->conn->count()); } public function testLimitWithOneToManyLeftJoinAndCondition() @@ -135,19 +135,19 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase $sql = $q->getQuery(); $users = $q->execute(); - $count = $this->dbh->count(); + $count = $this->conn->count(); $this->assertEqual($users->count(), 5); $users[0]->Phonenumber[0]; - $this->assertEqual($count, $this->dbh->count()); + $this->assertEqual($count, $this->conn->count()); $q->offset(2); $users = $q->execute(); - $count = $this->dbh->count(); + $count = $this->conn->count(); $this->assertEqual($users->count(), 5); $users[3]->Phonenumber[0]; - $this->assertEqual($count, $this->dbh->count()); + $this->assertEqual($count, $this->conn->count()); $this->assertEqual($q->getQuery(), 'SELECT e.id AS e__id, p.id AS p__id, p.phonenumber AS p__phonenumber, p.entity_id AS p__entity_id FROM entity e INNER JOIN phonenumber p ON e.id = p.entity_id WHERE e.id IN (SELECT DISTINCT e2.id FROM entity e2 INNER JOIN phonenumber p2 ON e2.id = p2.entity_id WHERE (e2.type = 0) LIMIT 5 OFFSET 2) AND (e.type = 0)'); @@ -162,9 +162,9 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase $users = $q->execute(array('zYne')); $this->assertEqual($users->count(), 1); - $count = $this->dbh->count(); + $count = $this->conn->count(); $users[0]->Phonenumber[0]; - $this->assertEqual($count, $this->dbh->count()); + $this->assertEqual($count, $this->conn->count()); $this->assertEqual($q->getQuery(), 'SELECT e.id AS e__id, p.id AS p__id FROM entity e LEFT JOIN phonenumber p ON e.id = p.entity_id WHERE e.id IN (SELECT DISTINCT e2.id FROM entity e2 LEFT JOIN phonenumber p2 ON e2.id = p2.entity_id WHERE e2.name = ? AND (e2.type = 0) LIMIT 5) AND e.name = ? AND (e.type = 0)'); @@ -178,9 +178,9 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase $this->assertEqual($users->count(), 2); - $count = $this->dbh->count(); + $count = $this->conn->count(); $users[0]->Phonenumber[0]; - $this->assertEqual($count, $this->dbh->count()); + $this->assertEqual($count, $this->conn->count()); $this->assertEqual($q->getQuery(), "SELECT e.id AS e__id, p.id AS p__id FROM entity e LEFT JOIN phonenumber p ON" @@ -252,7 +252,7 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase $this->connection->clear(); $q = new Doctrine_Query(); - $q->from('User')->where('User.Group.id = ?')->orderby('User.id DESC')->limit(5); + $q->from('User')->where('User.Group.id = ?')->orderby('User.id DESC')->limit(5); $users = $q->execute(array(12)); $this->assertEqual($users->count(), 3); diff --git a/tests/Query/MultiJoin2TestCase.php b/tests/Query/MultiJoin2TestCase.php index 29e445200..1a3c77e80 100644 --- a/tests/Query/MultiJoin2TestCase.php +++ b/tests/Query/MultiJoin2TestCase.php @@ -68,10 +68,11 @@ class Doctrine_Query_MultiJoin2_TestCase extends Doctrine_UnitTestCase $lastEntry->save(); } + public function testMultipleJoinFetchingWithDeepJoins() { $query = new Doctrine_Query($this->connection); - $queryCount = $this->connection->getDbh()->count(); + $queryCount = $this->connection->count(); try { $categories = $query->select('c.*, subCats.*, b.*, le.*, a.*') ->from('QueryTest_Category c') @@ -83,10 +84,10 @@ class Doctrine_Query_MultiJoin2_TestCase extends Doctrine_UnitTestCase ->orderBy('c.position ASC, subCats.position ASC, b.position ASC') ->execute(); // Test that accessing a loaded (but empty) relation doesnt trigger an extra query - $this->assertEqual($queryCount + 1, $this->connection->getDbh()->count()); + $this->assertEqual($queryCount + 1, $this->connection->count()); $categories[0]->subCategories; - $this->assertEqual($queryCount + 1, $this->connection->getDbh()->count()); + $this->assertEqual($queryCount + 1, $this->connection->count()); } catch (Doctrine_Exception $e) { $this->fail(); } @@ -95,7 +96,7 @@ class Doctrine_Query_MultiJoin2_TestCase extends Doctrine_UnitTestCase public function testMultipleJoinFetchingWithArrayFetching() { $query = new Doctrine_Query($this->connection); - $queryCount = $this->connection->getDbh()->count(); + $queryCount = $this->connection->count(); try { $categories = $query->select('c.*, subCats.*, b.*, le.*, a.*') ->from('QueryTest_Category c') diff --git a/tests/RawSqlTestCase.php b/tests/RawSqlTestCase.php index e7ceb818d..0aba04d63 100644 --- a/tests/RawSqlTestCase.php +++ b/tests/RawSqlTestCase.php @@ -117,13 +117,13 @@ class Doctrine_RawSql_TestCase extends Doctrine_UnitTestCase $coll = $query->execute(); $this->assertEqual($coll->count(), 11); - $count = $this->dbh->count(); + $count = $this->conn->count(); $coll[4]->Phonenumber[0]->phonenumber; - $this->assertEqual($count, $this->dbh->count()); + $this->assertEqual($count, $this->conn->count()); $coll[5]->Phonenumber[0]->phonenumber; - $this->assertEqual($count, $this->dbh->count()); + $this->assertEqual($count, $this->conn->count()); } public function testAliasesAreSupportedInAddComponent() { @@ -138,13 +138,13 @@ class Doctrine_RawSql_TestCase extends Doctrine_UnitTestCase $coll = $query->execute(); $this->assertEqual($coll->count(), 11); - $count = $this->dbh->count(); + $count = $this->conn->count(); $coll[4]->Phonenumber[0]->phonenumber; - $this->assertEqual($count, $this->dbh->count()); + $this->assertEqual($count, $this->conn->count()); $coll[5]->Phonenumber[0]->phonenumber; - $this->assertEqual($count, $this->dbh->count()); + $this->assertEqual($count, $this->conn->count()); } public function testPrimaryKeySelectForcing() { @@ -161,7 +161,7 @@ class Doctrine_RawSql_TestCase extends Doctrine_UnitTestCase $this->assertTrue(is_numeric($coll[3]->id)); $this->assertTrue(is_numeric($coll[7]->id)); } - public function testConvenienceMethods() + public function testConvenienceMethods() { $query = new Doctrine_RawSql($this->connection); $query->select('{entity.name}')->from('entity'); diff --git a/tests/Relation/NestTestCase.php b/tests/Relation/NestTestCase.php index 329cb8863..c0e07c775 100644 --- a/tests/Relation/NestTestCase.php +++ b/tests/Relation/NestTestCase.php @@ -40,7 +40,8 @@ class Doctrine_Relation_Nest_TestCase extends Doctrine_UnitTestCase parent::prepareTables(); } - public function testInitJoinTableSelfReferencingInsertingData() { + public function testInitJoinTableSelfReferencingInsertingData() + { $e = new Entity(); $e->name = "Entity test"; @@ -71,11 +72,11 @@ class Doctrine_Relation_Nest_TestCase extends Doctrine_UnitTestCase $this->assertEqual($e->Entity[0]->state(), Doctrine_Record::STATE_TDIRTY); $this->assertEqual($e->Entity[1]->state(), Doctrine_Record::STATE_TDIRTY); - $count = count($this->dbh); + $count = count($this->conn); $e->save(); - $this->assertEqual(($count + 13), $this->dbh->count()); + $this->assertEqual(($count + 13), $this->conn->count()); } public function testNestRelationsFetchingData() { @@ -103,7 +104,7 @@ class Doctrine_Relation_Nest_TestCase extends Doctrine_UnitTestCase $this->assertTrue(is_numeric($e->id)); - $result = $this->dbh->query('SELECT * FROM entity_reference')->fetchAll(PDO::FETCH_ASSOC); + $result = $this->conn->execute('SELECT * FROM entity_reference')->fetchAll(PDO::FETCH_ASSOC); $this->assertEqual(count($result), 6); @@ -118,7 +119,7 @@ class Doctrine_Relation_Nest_TestCase extends Doctrine_UnitTestCase $e = $e->getTable()->find($e->id); - $count = count($this->dbh); + $count = count($this->conn); $this->assertTrue($e instanceof Entity); @@ -127,7 +128,7 @@ class Doctrine_Relation_Nest_TestCase extends Doctrine_UnitTestCase - $this->assertEqual(count($this->dbh), ($count + 1)); + $this->assertEqual(count($this->conn), ($count + 1)); $this->assertEqual($e->Entity[0]->name, "Friend 1"); $this->assertEqual($e->Entity[1]->name, "Friend 2"); @@ -135,12 +136,12 @@ class Doctrine_Relation_Nest_TestCase extends Doctrine_UnitTestCase $this->assertEqual($e->Entity[0]->Entity[0]->name, "Entity test"); $this->assertEqual($e->Entity[0]->Entity[1]->name, "Friend 1 1"); - $this->assertEqual(count($this->dbh), ($count + 2)); + $this->assertEqual(count($this->conn), ($count + 2)); $this->assertEqual($e->Entity[1]->Entity[0]->name, "Entity test"); $this->assertEqual($e->Entity[1]->Entity[1]->name, "Friend 2 1"); - $this->assertEqual(count($this->dbh), ($count + 3)); + $this->assertEqual(count($this->conn), ($count + 3)); $this->assertEqual($e->Entity[0]->state(), Doctrine_Record::STATE_CLEAN); $this->assertEqual($e->Entity[1]->state(), Doctrine_Record::STATE_CLEAN); diff --git a/tests/UnitTestCase.php b/tests/UnitTestCase.php index 791b47348..c7ef752a8 100644 --- a/tests/UnitTestCase.php +++ b/tests/UnitTestCase.php @@ -130,7 +130,7 @@ class Doctrine_UnitTestCase extends UnitTestCase } catch(Doctrine_Manager_Exception $e) { if($this->driverName == 'main') { - $this->dbh = Doctrine_Db::getConnection('sqlite::memory:'); + $this->dbh = array('sqlite::memory:'); } else { $this->dbh = $this->adapter = new Doctrine_Adapter_Mock($this->driverName); } @@ -169,8 +169,8 @@ class Doctrine_UnitTestCase extends UnitTestCase foreach($this->tables as $name) { $query = 'DROP TABLE ' . Doctrine::tableize($name); try { - $this->dbh->query($query); - } catch(PDOException $e) { + $this->conn->exec($query); + } catch(Doctrine_Connection_Exception $e) { } } diff --git a/tests/ViewTestCase.php b/tests/ViewTestCase.php index e59e9c4bf..da9aaf964 100644 --- a/tests/ViewTestCase.php +++ b/tests/ViewTestCase.php @@ -30,8 +30,11 @@ * @since 1.0 * @version $Revision$ */ -class Doctrine_View_TestCase extends Doctrine_UnitTestCase { - public function testCreateView() { +class Doctrine_View_TestCase extends Doctrine_UnitTestCase +{ + + public function testCreateView() + { $query = new Doctrine_Query($this->connection); $query->from('User'); @@ -53,12 +56,12 @@ class Doctrine_View_TestCase extends Doctrine_UnitTestCase { $this->assertTrue($success); $users = $view->execute(); - $count = $this->dbh->count(); + $count = $this->conn->count(); $this->assertTrue($users instanceof Doctrine_Collection); $this->assertEqual($users->count(), 8); $this->assertEqual($users[0]->name, 'zYne'); $this->assertEqual($users[0]->state(), Doctrine_Record::STATE_CLEAN); - $this->assertEqual($count, $this->dbh->count()); + $this->assertEqual($count, $this->conn->count()); $success = true; try { @@ -68,7 +71,9 @@ class Doctrine_View_TestCase extends Doctrine_UnitTestCase { } $this->assertTrue($success); } - public function testConstructor() { + + public function testConstructor() + { } } diff --git a/tests/run.php b/tests/run.php index 05aa3c532..6bc617375 100644 --- a/tests/run.php +++ b/tests/run.php @@ -72,6 +72,7 @@ $test = new GroupTest('Doctrine Framework Unit Tests'); $test->addTestCase(new Doctrine_Ticket330_TestCase()); */ + /** */ // Connection drivers (not yet fully tested) $test->addTestCase(new Doctrine_Connection_Pgsql_TestCase()); $test->addTestCase(new Doctrine_Connection_Oracle_TestCase()); @@ -195,7 +196,7 @@ $test->addTestCase(new Doctrine_Hook_TestCase()); // Db component $test->addTestCase(new Doctrine_Db_TestCase()); -$test->addTestCase(new Doctrine_Db_Profiler_TestCase()); +$test->addTestCase(new Doctrine_Connection_Profiler_TestCase()); // Eventlisteners @@ -294,7 +295,7 @@ $test->addTestCase(new Doctrine_Query_JoinCondition_TestCase()); $test->addTestCase(new Doctrine_Query_MultipleAggregateValue_TestCase()); $test->addTestCase(new Doctrine_Query_TestCase()); - /** + /** //$test->addTestCase(new Doctrine_IntegrityAction_TestCase()); */ //$test->addTestCase(new Doctrine_AuditLog_TestCase());