diff --git a/lib/Doctrine.php b/lib/Doctrine.php index 8f68bb770..d685e21a5 100644 --- a/lib/Doctrine.php +++ b/lib/Doctrine.php @@ -149,6 +149,14 @@ final class Doctrine { * accessor invoking attribute */ const ATTR_ACCESSORS = 18; + /** + * automatic length validations attribute + */ + const ATTR_AUTO_LENGTH_VLD = 19; + /** + * automatic type validations attribute + */ + const ATTR_AUTO_TYPE_VLD = 20; /** diff --git a/lib/Doctrine/Configurable.php b/lib/Doctrine/Configurable.php index e2977b814..ef9e58c0f 100644 --- a/lib/Doctrine/Configurable.php +++ b/lib/Doctrine/Configurable.php @@ -1,231 +1,233 @@ -. - */ -/** - * Doctrine_Configurable - * the base for Doctrine_Table, Doctrine_Manager and Doctrine_Connection - * - * - * @package Doctrine ORM - * @url www.phpdoctrine.com - * @license LGPL - */ -abstract class Doctrine_Configurable { - - /** - * @var array $attributes an array of containing all attributes - */ - private $attributes = array(); - /** - * @var $parent the parents of this component - */ - private $parent; - /** - * sets a given attribute - * - * @throws Doctrine_Exception if the value is invalid - * @param integer $attribute - * @param mixed $value - * @return void - */ - public function setAttribute($attribute,$value) { - switch($attribute): - case Doctrine::ATTR_BATCH_SIZE: - if($value < 0) - throw new Doctrine_Exception("Batch size should be greater than or equal to zero"); - break; - case Doctrine::ATTR_CACHE_DIR: - if(substr(trim($value),0,6) == "%ROOT%") { - $dir = dirname(__FILE__); - $value = $dir.substr($value,6); - } - break; - case Doctrine::ATTR_CACHE_TTL: - if($value < 1) - throw new Doctrine_Exception("Cache TimeToLive should be greater than or equal to 1"); - break; - case Doctrine::ATTR_CACHE_SIZE: - if($value < 1) - throw new Doctrine_Exception("Cache size should be greater than or equal to 1"); - break; - case Doctrine::ATTR_CACHE_SLAM: - if($value < 0 || $value > 1) - throw new Doctrine_Exception("Cache slam defense should be a floating point number between 0 and 1"); - break; - case Doctrine::ATTR_FETCHMODE: - if($value < 0) - throw new Doctrine_Exception("Unknown fetchmode. See Doctrine::FETCH_* constants."); - break; - case Doctrine::ATTR_LISTENER: - $this->setEventListener($value); - break; - case Doctrine::ATTR_LOCKMODE: - if($this instanceof Doctrine_Connection) { - if($this->getTransaction()->getState() != Doctrine_Connection_Transaction::STATE_OPEN) - throw new Doctrine_Exception("Couldn't set lockmode. There are transactions open."); - - } elseif($this instanceof Doctrine_Manager) { - foreach($this as $connection) { - if($connection->getTransaction()->getState() != Doctrine_Connection_Transaction::STATE_OPEN) - throw new Doctrine_Exception("Couldn't set lockmode. There are transactions open."); - } - } else { - throw new Doctrine_Exception("Lockmode attribute can only be set at the global or connection level."); - } - break; - case Doctrine::ATTR_CREATE_TABLES: - $value = (bool) $value; - break; - case Doctrine::ATTR_ACCESSORS: - $accessors = array('none','get','set','both'); - - // if( ! in_array($value,$accessors)) - // throw new Doctrine_Exception(); - - break; - case Doctrine::ATTR_COLL_LIMIT: - if($value < 1) { - throw new Doctrine_Exception("Collection limit should be a value greater than or equal to 1."); - } - break; - case Doctrine::ATTR_COLL_KEY: - if( ! ($this instanceof Doctrine_Table)) - throw new Doctrine_Exception("This attribute can only be set at table level."); - - if( ! $this->hasColumn($value)) - throw new Doctrine_Exception("Couldn't set collection key attribute. No such column '$value'"); - - - break; - case Doctrine::ATTR_VLD: - case Doctrine::ATTR_QUERY_LIMIT: - - break; - case Doctrine::ATTR_CACHE: - if($value != Doctrine::CACHE_SQLITE && $value != Doctrine::CACHE_NONE) - throw new Doctrine_Exception("Unknown cache container. See Doctrine::CACHE_* constants for availible containers."); - break; - default: - throw new Doctrine_Exception("Unknown attribute."); - endswitch; - - $this->attributes[$attribute] = $value; - - } - /** - * @param Doctrine_EventListener $listener - * @return void - */ - public function setEventListener($listener) { - return $this->setListener($listener); - } - /** - * addListener - * - * @param Doctrine_DB_EventListener_Interface|Doctrine_Overloadable $listener - * @return Doctrine_DB - */ - public function addListener($listener, $name = null) { - if( ! ($this->attributes[Doctrine::ATTR_LISTENER] instanceof Doctrine_EventListener_Chain)) - $this->attributes[Doctrine::ATTR_LISTENER] = new Doctrine_EventListener_Chain(); - - $this->attributes[Doctrine::ATTR_LISTENER]->add($listener, $name); - - return $this; - } - /** - * getListener - * - * @return Doctrine_DB_EventListener_Interface|Doctrine_Overloadable - */ - public function getListener() { - if( ! isset($this->attributes[Doctrine::ATTR_LISTENER])) { - if(isset($this->parent)) - return $this->parent->getListener(); - - return null; - } - return $this->attributes[Doctrine::ATTR_LISTENER]; - } - /** - * setListener - * - * @param Doctrine_DB_EventListener_Interface|Doctrine_Overloadable $listener - * @return Doctrine_DB - */ - public function setListener($listener) { - 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"); - - $this->attributes[Doctrine::ATTR_LISTENER] = $listener; - - return $this; - } - /** - * returns the value of an attribute - * - * @param integer $attribute - * @return mixed - */ - public function getAttribute($attribute) { - $attribute = (int) $attribute; - - if($attribute < 1 || $attribute > 18) - throw new InvalidKeyException(); - - if( ! isset($this->attributes[$attribute])) { - if(isset($this->parent)) - return $this->parent->getAttribute($attribute); - - return null; - } - return $this->attributes[$attribute]; - } - /** - * getAttributes - * returns all attributes as an array - * - * @return array - */ - public function getAttributes() { - return $this->attributes; - } - /** - * sets a parent for this configurable component - * the parent must be configurable component itself - * - * @param Doctrine_Configurable $component - * @return void - */ - public function setParent(Doctrine_Configurable $component) { - $this->parent = $component; - } - /** - * getParent - * returns the parent of this component - * - * @return Doctrine_Configurable - */ - public function getParent() { - return $this->parent; - } -} - +. + */ +/** + * Doctrine_Configurable + * the base for Doctrine_Table, Doctrine_Manager and Doctrine_Connection + * + * + * @package Doctrine ORM + * @url www.phpdoctrine.com + * @license LGPL + */ +abstract class Doctrine_Configurable { + + /** + * @var array $attributes an array of containing all attributes + */ + private $attributes = array(); + /** + * @var $parent the parents of this component + */ + private $parent; + /** + * sets a given attribute + * + * @throws Doctrine_Exception if the value is invalid + * @param integer $attribute + * @param mixed $value + * @return void + */ + public function setAttribute($attribute,$value) { + switch($attribute): + case Doctrine::ATTR_BATCH_SIZE: + if($value < 0) + throw new Doctrine_Exception("Batch size should be greater than or equal to zero"); + break; + case Doctrine::ATTR_CACHE_DIR: + if(substr(trim($value),0,6) == "%ROOT%") { + $dir = dirname(__FILE__); + $value = $dir.substr($value,6); + } + break; + case Doctrine::ATTR_CACHE_TTL: + if($value < 1) + throw new Doctrine_Exception("Cache TimeToLive should be greater than or equal to 1"); + break; + case Doctrine::ATTR_CACHE_SIZE: + if($value < 1) + throw new Doctrine_Exception("Cache size should be greater than or equal to 1"); + break; + case Doctrine::ATTR_CACHE_SLAM: + if($value < 0 || $value > 1) + throw new Doctrine_Exception("Cache slam defense should be a floating point number between 0 and 1"); + break; + case Doctrine::ATTR_FETCHMODE: + if($value < 0) + throw new Doctrine_Exception("Unknown fetchmode. See Doctrine::FETCH_* constants."); + break; + case Doctrine::ATTR_LISTENER: + $this->setEventListener($value); + break; + case Doctrine::ATTR_LOCKMODE: + if($this instanceof Doctrine_Connection) { + if($this->getTransaction()->getState() != Doctrine_Connection_Transaction::STATE_OPEN) + throw new Doctrine_Exception("Couldn't set lockmode. There are transactions open."); + + } elseif($this instanceof Doctrine_Manager) { + foreach($this as $connection) { + if($connection->getTransaction()->getState() != Doctrine_Connection_Transaction::STATE_OPEN) + throw new Doctrine_Exception("Couldn't set lockmode. There are transactions open."); + } + } else { + throw new Doctrine_Exception("Lockmode attribute can only be set at the global or connection level."); + } + break; + case Doctrine::ATTR_CREATE_TABLES: + $value = (bool) $value; + break; + case Doctrine::ATTR_ACCESSORS: + $accessors = array('none','get','set','both'); + + // if( ! in_array($value,$accessors)) + // throw new Doctrine_Exception(); + + break; + case Doctrine::ATTR_COLL_LIMIT: + if($value < 1) { + throw new Doctrine_Exception("Collection limit should be a value greater than or equal to 1."); + } + break; + case Doctrine::ATTR_COLL_KEY: + if( ! ($this instanceof Doctrine_Table)) + throw new Doctrine_Exception("This attribute can only be set at table level."); + + if( ! $this->hasColumn($value)) + throw new Doctrine_Exception("Couldn't set collection key attribute. No such column '$value'"); + + + break; + case Doctrine::ATTR_VLD: + case Doctrine::ATTR_AUTO_LENGTH_VLD: + case Doctrine::ATTR_AUTO_TYPE_VLD: + case Doctrine::ATTR_QUERY_LIMIT: + + break; + case Doctrine::ATTR_CACHE: + if($value != Doctrine::CACHE_SQLITE && $value != Doctrine::CACHE_NONE) + throw new Doctrine_Exception("Unknown cache container. See Doctrine::CACHE_* constants for availible containers."); + break; + default: + throw new Doctrine_Exception("Unknown attribute."); + endswitch; + + $this->attributes[$attribute] = $value; + + } + /** + * @param Doctrine_EventListener $listener + * @return void + */ + public function setEventListener($listener) { + return $this->setListener($listener); + } + /** + * addListener + * + * @param Doctrine_DB_EventListener_Interface|Doctrine_Overloadable $listener + * @return Doctrine_DB + */ + public function addListener($listener, $name = null) { + if( ! ($this->attributes[Doctrine::ATTR_LISTENER] instanceof Doctrine_EventListener_Chain)) + $this->attributes[Doctrine::ATTR_LISTENER] = new Doctrine_EventListener_Chain(); + + $this->attributes[Doctrine::ATTR_LISTENER]->add($listener, $name); + + return $this; + } + /** + * getListener + * + * @return Doctrine_DB_EventListener_Interface|Doctrine_Overloadable + */ + public function getListener() { + if( ! isset($this->attributes[Doctrine::ATTR_LISTENER])) { + if(isset($this->parent)) + return $this->parent->getListener(); + + return null; + } + return $this->attributes[Doctrine::ATTR_LISTENER]; + } + /** + * setListener + * + * @param Doctrine_DB_EventListener_Interface|Doctrine_Overloadable $listener + * @return Doctrine_DB + */ + public function setListener($listener) { + 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"); + + $this->attributes[Doctrine::ATTR_LISTENER] = $listener; + + return $this; + } + /** + * returns the value of an attribute + * + * @param integer $attribute + * @return mixed + */ + public function getAttribute($attribute) { + $attribute = (int) $attribute; + + if($attribute < 1 || $attribute > 20) + throw new InvalidKeyException(); + + if( ! isset($this->attributes[$attribute])) { + if(isset($this->parent)) + return $this->parent->getAttribute($attribute); + + return null; + } + return $this->attributes[$attribute]; + } + /** + * getAttributes + * returns all attributes as an array + * + * @return array + */ + public function getAttributes() { + return $this->attributes; + } + /** + * sets a parent for this configurable component + * the parent must be configurable component itself + * + * @param Doctrine_Configurable $component + * @return void + */ + public function setParent(Doctrine_Configurable $component) { + $this->parent = $component; + } + /** + * getParent + * returns the parent of this component + * + * @return Doctrine_Configurable + */ + public function getParent() { + return $this->parent; + } +} + diff --git a/lib/Doctrine/Manager.php b/lib/Doctrine/Manager.php index e60bfc6bc..7f15bcb07 100644 --- a/lib/Doctrine/Manager.php +++ b/lib/Doctrine/Manager.php @@ -1,297 +1,299 @@ -. - */ - -/** - * @package Doctrine ORM - * @url www.phpdoctrine.com - * @license LGPL - * - * Doctrine_Manager is the base component of all doctrine based projects. - * It opens and keeps track of all connections (database connections). - */ -class Doctrine_Manager extends Doctrine_Configurable implements Countable, IteratorAggregate { - /** - * @var array $connections an array containing all the opened connections - */ - private $connections = array(); - /** - * @var array $dataSourceNames an array containing all available data source names - */ - private $dataSourceNames = array(); - /** - * @var integer $index the incremented index - */ - private $index = 0; - /** - * @var integer $currIndex the current connection index - */ - private $currIndex = 0; - /** - * @var string $root root directory - */ - private $root; - /** - * @var Doctrine_Null $null Doctrine_Null object, used for extremely fast null value checking - */ - private $null; - - /** - * constructor - * - * this is private constructor (use getInstance to get an instance of this class) - */ - private function __construct() { - $this->root = dirname(__FILE__); - $this->null = new Doctrine_Null; - - Doctrine_Record::initNullObject($this->null); - Doctrine_Collection::initNullObject($this->null); - Doctrine_Record_Iterator::initNullObject($this->null); - Doctrine_Validator::initNullObject($this->null); - } - /** - * @return Doctrine_Null - */ - final public function getNullObject() { - return $this->null; - } - /** - * setDefaultAttributes - * sets default attributes - * - * @return boolean - */ - final public function setDefaultAttributes() { - static $init = false; - if( ! $init) { - $init = true; - $attributes = array( - Doctrine::ATTR_FETCHMODE => Doctrine::FETCH_IMMEDIATE, - Doctrine::ATTR_BATCH_SIZE => 5, - Doctrine::ATTR_COLL_LIMIT => 5, - Doctrine::ATTR_LISTENER => new Doctrine_EventListener(), - Doctrine::ATTR_LOCKMODE => 1, - Doctrine::ATTR_VLD => false, - Doctrine::ATTR_CREATE_TABLES => true, - Doctrine::ATTR_QUERY_LIMIT => Doctrine::LIMIT_RECORDS - ); - foreach($attributes as $attribute => $value) { - $old = $this->getAttribute($attribute); - if($old === null) - $this->setAttribute($attribute,$value); - } - return true; - } - return false; - } - /** - * returns the root directory of Doctrine - * - * @return string - */ - final public function getRoot() { - return $this->root; - } - /** - * getInstance - * returns an instance of this class - * (this class uses the singleton pattern) - * - * @return Doctrine_Manager - */ - public static function getInstance() { - static $instance; - if( ! isset($instance)) - $instance = new self(); - - return $instance; - } - /** - * connection - * a short cut for Doctrine_Manager::getInstance()->openConnection($dbh); - * - * @return Doctrine_Connection - */ - public static function connection(PDO $dbh) { - return Doctrine_Manager::getInstance()->openConnection($dbh); - } - /** - * openConnection - * opens a new connection and saves it to Doctrine_Manager->connections - * - * @param PDO $pdo PDO database driver - * @param string $name name of the connection, if empty numeric key is used - * @throws Doctrine_Manager_Exception if trying to bind a connection with an existing name - * @return Doctrine_Connection - */ - public function openConnection(PDO $pdo, $name = null) { - // initialize the default attributes - $this->setDefaultAttributes(); - - if($name !== null) { - $name = (string) $name; - if(isset($this->connections[$name])) - throw new Doctrine_Manager_Exception("Connection with $name already exists!"); - - } else { - $name = $this->index; - $this->index++; - } - switch($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)): - case "mysql": - $this->connections[$name] = new Doctrine_Connection_Mysql($this,$pdo); - break; - case "sqlite": - $this->connections[$name] = new Doctrine_Connection_Sqlite($this,$pdo); - break; - case "pgsql": - $this->connections[$name] = new Doctrine_Connection_Pgsql($this,$pdo); - break; - case "oci": - $this->connections[$name] = new Doctrine_Connection_Oracle($this,$pdo); - break; - case "mssql": - $this->connections[$name] = new Doctrine_Connection_Mssql($this,$pdo); - break; - case "firebird": - $this->connections[$name] = new Doctrine_Connection_Firebird($this,$pdo); - break; - case "informix": - $this->connections[$name] = new Doctrine_Connection_Informix($this,$pdo); - break; - endswitch; - - - $this->currIndex = $name; - return $this->connections[$name]; - } - public function openSession(PDO $pdo, $name = null) { - return $this->openConnection($pdo, $name); - } - /** - * getConnection - * @param integer $index - * @return object Doctrine_Connection - * @throws Doctrine_Manager_Exception if trying to get a non-existent connection - */ - public function getConnection($name) { - if (!isset($this->connections[$name])) { - if (isset($this->dataSourceNames[$name])) { - $conn = Doctrine_DB::getConnection($this->dataSourceNames[$name]); // Establishes the connection - $this->openConnection($conn, $name); - } else { - throw new Doctrine_Manager_Exception("Unknown connection: $name"); - } - } - $this->currIndex = $name; - return $this->connections[$name]; - } - - /** - * Adds the dsn of a connection to the list of available data source names. - * - * @param string $dsn - * @param string $name - */ - public function addDSN($dsn, $name) { - $this->dataSourceNames[$name] = $dsn; - } - /** - * closes the connection - * - * @param Doctrine_Connection $connection - * @return void - */ - public function closeConnection(Doctrine_Connection $connection) { - $connection->close(); - unset($connection); - } - /** - * getConnections - * returns all opened connections - * - * @return array - */ - public function getConnections() { - return $this->connections; - } - /** - * setCurrentConnection - * sets the current connection to $key - * - * @param mixed $key the connection key - * @throws InvalidKeyException - * @return void - */ - public function setCurrentConnection($key) { - $key = (string) $key; - if( ! isset($this->connections[$key])) - throw new InvalidKeyException(); - - $this->currIndex = $key; - } - /** - * count - * returns the number of opened connections - * - * @return integer - */ - public function count() { - return count($this->connections); - } - /** - * getIterator - * returns an ArrayIterator that iterates through all connections - * - * @return ArrayIterator - */ - public function getIterator() { - return new ArrayIterator($this->connections); - } - /** - * getCurrentConnection - * returns the current connection - * - * @throws Doctrine_Connection_Exception if there are no open connections - * @return Doctrine_Connection - */ - public function getCurrentConnection() { - $i = $this->currIndex; - if( ! isset($this->connections[$i])) - throw new Doctrine_Connection_Exception(); - - return $this->connections[$i]; - } - /** - * __toString - * returns a string representation of this object - * - * @return string - */ - public function __toString() { - $r[] = "
";
-        $r[] = "Doctrine_Manager";
-        $r[] = "Connections : ".count($this->connections);
-        $r[] = "
"; - return implode("\n",$r); - } -} - +. + */ + +/** + * @package Doctrine ORM + * @url www.phpdoctrine.com + * @license LGPL + * + * Doctrine_Manager is the base component of all doctrine based projects. + * It opens and keeps track of all connections (database connections). + */ +class Doctrine_Manager extends Doctrine_Configurable implements Countable, IteratorAggregate { + /** + * @var array $connections an array containing all the opened connections + */ + private $connections = array(); + /** + * @var array $dataSourceNames an array containing all available data source names + */ + private $dataSourceNames = array(); + /** + * @var integer $index the incremented index + */ + private $index = 0; + /** + * @var integer $currIndex the current connection index + */ + private $currIndex = 0; + /** + * @var string $root root directory + */ + private $root; + /** + * @var Doctrine_Null $null Doctrine_Null object, used for extremely fast null value checking + */ + private $null; + + /** + * constructor + * + * this is private constructor (use getInstance to get an instance of this class) + */ + private function __construct() { + $this->root = dirname(__FILE__); + $this->null = new Doctrine_Null; + + Doctrine_Record::initNullObject($this->null); + Doctrine_Collection::initNullObject($this->null); + Doctrine_Record_Iterator::initNullObject($this->null); + Doctrine_Validator::initNullObject($this->null); + } + /** + * @return Doctrine_Null + */ + final public function getNullObject() { + return $this->null; + } + /** + * setDefaultAttributes + * sets default attributes + * + * @return boolean + */ + final public function setDefaultAttributes() { + static $init = false; + if( ! $init) { + $init = true; + $attributes = array( + Doctrine::ATTR_FETCHMODE => Doctrine::FETCH_IMMEDIATE, + Doctrine::ATTR_BATCH_SIZE => 5, + Doctrine::ATTR_COLL_LIMIT => 5, + Doctrine::ATTR_LISTENER => new Doctrine_EventListener(), + Doctrine::ATTR_LOCKMODE => 1, + Doctrine::ATTR_VLD => false, + Doctrine::ATTR_AUTO_LENGTH_VLD => true, + Doctrine::ATTR_AUTO_TYPE_VLD => true, + Doctrine::ATTR_CREATE_TABLES => true, + Doctrine::ATTR_QUERY_LIMIT => Doctrine::LIMIT_RECORDS + ); + foreach($attributes as $attribute => $value) { + $old = $this->getAttribute($attribute); + if($old === null) + $this->setAttribute($attribute,$value); + } + return true; + } + return false; + } + /** + * returns the root directory of Doctrine + * + * @return string + */ + final public function getRoot() { + return $this->root; + } + /** + * getInstance + * returns an instance of this class + * (this class uses the singleton pattern) + * + * @return Doctrine_Manager + */ + public static function getInstance() { + static $instance; + if( ! isset($instance)) + $instance = new self(); + + return $instance; + } + /** + * connection + * a short cut for Doctrine_Manager::getInstance()->openConnection($dbh); + * + * @return Doctrine_Connection + */ + public static function connection(PDO $dbh) { + return Doctrine_Manager::getInstance()->openConnection($dbh); + } + /** + * openConnection + * opens a new connection and saves it to Doctrine_Manager->connections + * + * @param PDO $pdo PDO database driver + * @param string $name name of the connection, if empty numeric key is used + * @throws Doctrine_Manager_Exception if trying to bind a connection with an existing name + * @return Doctrine_Connection + */ + public function openConnection(PDO $pdo, $name = null) { + // initialize the default attributes + $this->setDefaultAttributes(); + + if($name !== null) { + $name = (string) $name; + if(isset($this->connections[$name])) + throw new Doctrine_Manager_Exception("Connection with $name already exists!"); + + } else { + $name = $this->index; + $this->index++; + } + switch($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)): + case "mysql": + $this->connections[$name] = new Doctrine_Connection_Mysql($this,$pdo); + break; + case "sqlite": + $this->connections[$name] = new Doctrine_Connection_Sqlite($this,$pdo); + break; + case "pgsql": + $this->connections[$name] = new Doctrine_Connection_Pgsql($this,$pdo); + break; + case "oci": + $this->connections[$name] = new Doctrine_Connection_Oracle($this,$pdo); + break; + case "mssql": + $this->connections[$name] = new Doctrine_Connection_Mssql($this,$pdo); + break; + case "firebird": + $this->connections[$name] = new Doctrine_Connection_Firebird($this,$pdo); + break; + case "informix": + $this->connections[$name] = new Doctrine_Connection_Informix($this,$pdo); + break; + endswitch; + + + $this->currIndex = $name; + return $this->connections[$name]; + } + public function openSession(PDO $pdo, $name = null) { + return $this->openConnection($pdo, $name); + } + /** + * getConnection + * @param integer $index + * @return object Doctrine_Connection + * @throws Doctrine_Manager_Exception if trying to get a non-existent connection + */ + public function getConnection($name) { + if (!isset($this->connections[$name])) { + if (isset($this->dataSourceNames[$name])) { + $conn = Doctrine_DB::getConnection($this->dataSourceNames[$name]); // Establishes the connection + $this->openConnection($conn, $name); + } else { + throw new Doctrine_Manager_Exception("Unknown connection: $name"); + } + } + $this->currIndex = $name; + return $this->connections[$name]; + } + + /** + * Adds the dsn of a connection to the list of available data source names. + * + * @param string $dsn + * @param string $name + */ + public function addDSN($dsn, $name) { + $this->dataSourceNames[$name] = $dsn; + } + /** + * closes the connection + * + * @param Doctrine_Connection $connection + * @return void + */ + public function closeConnection(Doctrine_Connection $connection) { + $connection->close(); + unset($connection); + } + /** + * getConnections + * returns all opened connections + * + * @return array + */ + public function getConnections() { + return $this->connections; + } + /** + * setCurrentConnection + * sets the current connection to $key + * + * @param mixed $key the connection key + * @throws InvalidKeyException + * @return void + */ + public function setCurrentConnection($key) { + $key = (string) $key; + if( ! isset($this->connections[$key])) + throw new InvalidKeyException(); + + $this->currIndex = $key; + } + /** + * count + * returns the number of opened connections + * + * @return integer + */ + public function count() { + return count($this->connections); + } + /** + * getIterator + * returns an ArrayIterator that iterates through all connections + * + * @return ArrayIterator + */ + public function getIterator() { + return new ArrayIterator($this->connections); + } + /** + * getCurrentConnection + * returns the current connection + * + * @throws Doctrine_Connection_Exception if there are no open connections + * @return Doctrine_Connection + */ + public function getCurrentConnection() { + $i = $this->currIndex; + if( ! isset($this->connections[$i])) + throw new Doctrine_Connection_Exception(); + + return $this->connections[$i]; + } + /** + * __toString + * returns a string representation of this object + * + * @return string + */ + public function __toString() { + $r[] = "
";
+        $r[] = "Doctrine_Manager";
+        $r[] = "Connections : ".count($this->connections);
+        $r[] = "
"; + return implode("\n",$r); + } +} + diff --git a/lib/Doctrine/Validator.php b/lib/Doctrine/Validator.php index 5b4c00f47..c0c42a81d 100644 --- a/lib/Doctrine/Validator.php +++ b/lib/Doctrine/Validator.php @@ -104,15 +104,12 @@ class Doctrine_Validator { continue; } } - - if($column[0] == "array" || $column[0] == "object") - $length = strlen(serialize($value)); - else - $length = strlen($value); - - if($length > $column[1]) { - $errorStack->add($key, 'length'); - continue; + + if($record->getTable()->getAttribute(Doctrine::ATTR_AUTO_LENGTH_VLD)) { + if(!$this->validateLength($column, $key, $value)) { + $errorStack->add($key, 'length'); + continue; + } } if( ! is_array($column[2])) @@ -137,7 +134,25 @@ class Doctrine_Validator { $name == 'autoincrement' || $name == 'default') continue; - + + if(strtolower($name) == 'length') { + if(!$record->getTable()->getAttribute(Doctrine::ATTR_AUTO_LENGTH_VLD)) { + if(!$this->validateLength($column, $key, $value)) { + $errorStack->add($key, 'length'); + } + } + continue; + } + + if(strtolower($name) == 'type') { + if(!$record->getTable()->getAttribute(Doctrine::ATTR_AUTO_TYPE_VLD)) { + if( ! self::isValidType($value, $column[0])) { + $errorStack->add($key, 'type'); + } + } + continue; + } + $validator = self::getValidator($name); if( ! $validator->validate($record, $key, $value, $args)) { @@ -147,15 +162,33 @@ class Doctrine_Validator { //$err[$key] = 'not valid'; // errors found quit validation looping for this column - break; + //break; } } - if( ! self::isValidType($value, $column[0])) { - $errorStack->add($key, 'type'); - continue; + + if($record->getTable()->getAttribute(Doctrine::ATTR_AUTO_TYPE_VLD)) { + if( ! self::isValidType($value, $column[0])) { + $errorStack->add($key, 'type'); + continue; + } } } } + /** + * Enter description here... + * + */ + private function validateLength($column, $key, $value) { + if($column[0] == "array" || $column[0] == "object") + $length = strlen(serialize($value)); + else + $length = strlen($value); + + if($length > $column[1]) { + return false; + } + return true; + } /** * whether or not this validator has errors *