diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..04f63f22d --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +build.properties +build/ +logs/ +reports/ +dist/ +download/ +lib/api/ +lib/Doctrine/Common +lib/Doctrine/DBAL diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..5621aa2e0 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "lib/vendor/doctrine-common"] + path = lib/vendor/doctrine-common + url = git://github.com/doctrine/common.git +[submodule "lib/vendor/doctrine-dbal"] + path = lib/vendor/doctrine-dbal + url = git://github.com/doctrine/dbal.git diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index 63fc8131d..000000000 --- a/CHANGELOG +++ /dev/null @@ -1 +0,0 @@ -xxxx diff --git a/COPYRIGHT b/COPYRIGHT deleted file mode 100644 index 5616eb8e9..000000000 --- a/COPYRIGHT +++ /dev/null @@ -1,39 +0,0 @@ -Copyrights ----------- - -Doctrine --------- - -Doctrine is a Object Relational Mapper built from scratch with PHP5. It contains a few ports of other popular PHP classes/libraries. - -Url: http://www.doctrine-project.org -Copyright: 2005-2009 Konsta Vesterinen -License: LGPL - see LICENSE file - -symfony -------- - -Doctrine contains ports of a few symfony classes/libraries - -Url: http://www.symfony-project.org -Copyright: Fabien Potencier -License: MIT - see LICENSE file - -Zend Framework --------------- - -Doctrine contains ports of a few Zend components and has borrowed concepts and ideas from the Zend Framework project. - -Url: http://framework.zend.com -Copyright: Copyright © 2006-2009 by Zend Technologies, All rights reserved. -License: New BSD License - -eZ Components ------------- - -Doctrine SchemaTool, Platforms and SchemaManagers borrow ideas and concepts -from ezcDatabaseSchema. - -Url: http://www.ezcomponents.org -License: New BSD License -Copyright: Copyright (C) 2005-2009 eZ Systems AS. All rights reserved. \ No newline at end of file diff --git a/README.markdown b/README.markdown new file mode 100644 index 000000000..e279f5f06 --- /dev/null +++ b/README.markdown @@ -0,0 +1,14 @@ +# Doctrine 2 ORM + +Doctrine 2 is an object-relational mapper (ORM) for PHP 5.3.0+ that provides transparent persistence +for PHP objects. It sits on top of a powerful database abstraction layer (DBAL). One of its key features +is the option to write database queries in a proprietary object oriented SQL dialect called Doctrine Query Language (DQL), +inspired by Hibernates HQL. This provides developers with a powerful alternative to SQL that maintains flexibility +without requiring unnecessary code duplication. + +More resources: + +* [Website](http://www.doctrine-project.org) +* [Documentation](http://www.doctrine-project.org/projects/orm/2.0/docs/reference/introduction/en) +* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DDC) +* [Downloads](http://github.com/doctrine/doctrine2/downloads) \ No newline at end of file diff --git a/UPGRADE_TO_2_0 b/UPGRADE_TO_2_0 index d1be43bf2..ebbdcb0b9 100644 --- a/UPGRADE_TO_2_0 +++ b/UPGRADE_TO_2_0 @@ -1,3 +1,13 @@ +# Update from 2.0-BETA2 to 2.0-BETA3 + +## Default Allocation Size for Sequences + +The default allocation size for sequences has been changed from 10 to 1. This step was made +to not cause confusion with users and also because it is partly some kind of premature optimization. + +# Update from 2.0-BETA1 to 2.0-BETA2 + +There are no backwards incompatible changes in this release. # Upgrade from 2.0-ALPHA4 to 2.0-BETA1 diff --git a/bin/doctrine.php b/bin/doctrine.php index c307cb800..905dd17d2 100644 --- a/bin/doctrine.php +++ b/bin/doctrine.php @@ -2,10 +2,10 @@ require_once 'Doctrine/Common/ClassLoader.php'; -$classLoader = new \Doctrine\Common\ClassLoader('Doctrine', __DIR__ . '/../lib'); +$classLoader = new \Doctrine\Common\ClassLoader('Doctrine'); $classLoader->register(); -$classLoader = new \Doctrine\Common\ClassLoader('Symfony', __DIR__ . '/../lib/vendor'); +$classLoader = new \Doctrine\Common\ClassLoader('Symfony', 'Doctrine'); $classLoader->register(); $configFile = getcwd() . DIRECTORY_SEPARATOR . 'cli-config.php'; @@ -30,7 +30,7 @@ if (file_exists($configFile)) { $helperSet = ($helperSet) ?: new \Symfony\Components\Console\Helper\HelperSet(); -$cli = new \Symfony\Components\Console\Application('Doctrine Command Line Interface', Doctrine\Common\Version::VERSION); +$cli = new \Symfony\Components\Console\Application('Doctrine Command Line Interface', Doctrine\ORM\Version::VERSION); $cli->setCatchExceptions(true); $cli->setHelperSet($helperSet); $cli->addCommands(array( diff --git a/build.properties.dev b/build.properties.dev index 4ad425aaa..e1ba8fb49 100644 --- a/build.properties.dev +++ b/build.properties.dev @@ -1,6 +1,5 @@ -version_name=2.0.0-ALPHA2 -version=2.0.0 -stability=alpha +version=2.0.0BETA2 +stability=beta build.dir=build dist.dir=dist report.dir=reports diff --git a/build.xml b/build.xml index 7665bdb63..024b63c89 100644 --- a/build.xml +++ b/build.xml @@ -5,18 +5,17 @@ --> + + - - - - - - + - - + - - - - - - - - - - - - - + + + @@ -71,6 +66,9 @@ + @@ -82,46 +80,31 @@ - - - - - - - - - - - - - - - - - - - - - + - - + - + + + + + + - + - - @@ -142,7 +125,6 @@ - @@ -156,51 +138,13 @@ - - - - DoctrineCommon - Common Doctrine code - pear.doctrine-project.org - The Doctrine Common package contains shared code between the other packages. - - - - LGPL - - - - - - - - - - - - - DoctrineDBAL - Doctrine Database Abstraction Layer - pear.doctrine-project.org - The Doctrine DBAL package is the database abstraction layer used to power the ORM package. - - - - LGPL - - - - - - - - - - - - + + DoctrineORM - Doctrine Object Relationl Mapper + Doctrine Object Relational Mapper pear.doctrine-project.org The Doctrine ORM package is the primary package containing the object relational mapper. @@ -223,6 +167,7 @@ - + + - + \ No newline at end of file diff --git a/doctrine-mapping.xsd b/doctrine-mapping.xsd index e74010a8e..9b6b7c629 100644 --- a/doctrine-mapping.xsd +++ b/doctrine-mapping.xsd @@ -124,6 +124,8 @@ + + @@ -135,7 +137,7 @@ - + diff --git a/jpgraph.php b/jpgraph.php deleted file mode 100644 index 1d877a4ae..000000000 --- a/jpgraph.php +++ /dev/null @@ -1,92 +0,0 @@ -testsuite as $suite) { - foreach ($suite->testcase as $test) { - if (stripos((string)$suite['name'], 'performance') !== false || stripos((string)$test['name'], 'performance') !== false) { - $name = (string)$suite['name'] . '#' . (string)$test['name']; - $graphs[$name][] = (double)$test['time']; - } - } - } -} - -if (isset($testsuite) && isset($testcase)) { - $graphName = $testsuite . '#' . $testcase; - $graphData = $graphs[$graphName]; - - // Create the graph. These two calls are always required - $graph = new Graph(650,250); - - //$graph->SetScale('intint'); - $graph->SetScale('textlin'); - $graph->yaxis->scale->SetAutoMin(0); - - $graph->title->Set($testsuite); - $graph->subtitle->Set($testcase); - - $graph->xaxis->title->Set('revision'); - $graph->yaxis->title->Set('seconds'); - $graph->SetMargin(100, 100, 50, 50); - - // Create the linear plot - $lineplot = new LinePlot($graphData); - $lineplot->SetColor('blue'); - - $graph->xaxis->SetTickLabels($revisions); - - // Add the plot to the graph - $graph->Add($lineplot); - - // Display the graph - $graph->Stroke(); -} else { - - echo ''; - echo 'Pick a test and click "show":
'; - echo '
'; - - echo ''; - - echo ''; - - echo '
'; - echo ''; - -} - - - diff --git a/lib/Doctrine/Common/Annotations/Annotation.php b/lib/Doctrine/Common/Annotations/Annotation.php deleted file mode 100644 index e2bf42bb5..000000000 --- a/lib/Doctrine/Common/Annotations/Annotation.php +++ /dev/null @@ -1,81 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Annotations class - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Annotation -{ - /** - * Value property. Common among all derived classes. - * - * @var string - */ - public $value; - - /** - * Constructor - * - * @param array $data Key-value for properties to be defined in this class - */ - public final function __construct(array $data) - { - foreach ($data as $key => $value) { - $this->$key = $value; - } - } - - /** - * Error handler for unknown property accessor in Annotation class. - * - * @param string $name Unknown property name - */ - public function __get($name) - { - throw new \BadMethodCallException( - sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) - ); - } - - /** - * Error handler for unknown property mutator in Annotation class. - * - * @param string $name Unkown property name - * @param mixed $value Property value - */ - public function __set($name, $value) - { - throw new \BadMethodCallException( - sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) - ); - } -} \ No newline at end of file diff --git a/lib/Doctrine/Common/Annotations/AnnotationException.php b/lib/Doctrine/Common/Annotations/AnnotationException.php deleted file mode 100644 index bdee49420..000000000 --- a/lib/Doctrine/Common/Annotations/AnnotationException.php +++ /dev/null @@ -1,59 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Description of AnnotationException - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class AnnotationException extends \Exception -{ - /** - * Creates a new AnnotationException describing a Syntax error. - * - * @param string $message Exception message - * @return AnnotationException - */ - public static function syntaxError($message) - { - return new self('[Syntax Error] ' . $message); - } - - /** - * Creates a new AnnotationException describing a Semantical error. - * - * @param string $message Exception message - * @return AnnotationException - */ - public static function semanticalError($message) - { - return new self('[Semantical Error] ' . $message); - } -} \ No newline at end of file diff --git a/lib/Doctrine/Common/Annotations/AnnotationReader.php b/lib/Doctrine/Common/Annotations/AnnotationReader.php deleted file mode 100644 index 5b58fb72f..000000000 --- a/lib/Doctrine/Common/Annotations/AnnotationReader.php +++ /dev/null @@ -1,204 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use \ReflectionClass, - \ReflectionMethod, - \ReflectionProperty, - Doctrine\Common\Cache\Cache; - -/** - * A reader for docblock annotations. - * - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class AnnotationReader -{ - /** - * Cache salt - * - * @var string - * @static - */ - private static $CACHE_SALT = '@'; - - /** - * Annotations Parser - * - * @var Doctrine\Common\Annotations\Parser - */ - private $_parser; - - /** - * Cache mechanism to store processed Annotations - * - * @var Doctrine\Common\Cache\Cache - */ - private $_cache; - - /** - * Constructor. Initializes a new AnnotationReader that uses the given Cache provider. - * - * @param Cache $cache The cache provider to use. If none is provided, ArrayCache is used. - */ - public function __construct(Cache $cache = null) - { - $this->_parser = new Parser; - $this->_cache = $cache ?: new \Doctrine\Common\Cache\ArrayCache; - } - - /** - * Sets the default namespace that the AnnotationReader should assume for annotations - * with not fully qualified names. - * - * @param string $defaultNamespace - */ - public function setDefaultAnnotationNamespace($defaultNamespace) - { - $this->_parser->setDefaultAnnotationNamespace($defaultNamespace); - } - - /** - * Sets an alias for an annotation namespace. - * - * @param $namespace - * @param $alias - */ - public function setAnnotationNamespaceAlias($namespace, $alias) - { - $this->_parser->setAnnotationNamespaceAlias($namespace, $alias); - } - - /** - * Gets the annotations applied to a class. - * - * @param string|ReflectionClass $class The name or ReflectionClass of the class from which - * the class annotations should be read. - * @return array An array of Annotations. - */ - public function getClassAnnotations(ReflectionClass $class) - { - $cacheKey = $class->getName() . self::$CACHE_SALT; - - // Attempt to grab data from cache - if (($data = $this->_cache->fetch($cacheKey)) !== false) { - return $data; - } - - $annotations = $this->_parser->parse($class->getDocComment(), 'class ' . $class->getName()); - $this->_cache->save($cacheKey, $annotations, null); - - return $annotations; - } - - /** - * Gets a class annotation. - * - * @param $class - * @param string $annotation The name of the annotation. - * @return The Annotation or NULL, if the requested annotation does not exist. - */ - public function getClassAnnotation(ReflectionClass $class, $annotation) - { - $annotations = $this->getClassAnnotations($class); - - return isset($annotations[$annotation]) ? $annotations[$annotation] : null; - } - - /** - * Gets the annotations applied to a property. - * - * @param string|ReflectionClass $class The name or ReflectionClass of the class that owns the property. - * @param string|ReflectionProperty $property The name or ReflectionProperty of the property - * from which the annotations should be read. - * @return array An array of Annotations. - */ - public function getPropertyAnnotations(ReflectionProperty $property) - { - $cacheKey = $property->getDeclaringClass()->getName() . '$' . $property->getName() . self::$CACHE_SALT; - - // Attempt to grab data from cache - if (($data = $this->_cache->fetch($cacheKey)) !== false) { - return $data; - } - - $context = 'property ' . $property->getDeclaringClass()->getName() . "::\$" . $property->getName(); - $annotations = $this->_parser->parse($property->getDocComment(), $context); - $this->_cache->save($cacheKey, $annotations, null); - - return $annotations; - } - - /** - * Gets a property annotation. - * - * @param ReflectionProperty $property - * @param string $annotation The name of the annotation. - * @return The Annotation or NULL, if the requested annotation does not exist. - */ - public function getPropertyAnnotation(ReflectionProperty $property, $annotation) - { - $annotations = $this->getPropertyAnnotations($property); - - return isset($annotations[$annotation]) ? $annotations[$annotation] : null; - } - - /** - * Gets the annotations applied to a method. - * - * @param string|ReflectionClass $class The name or ReflectionClass of the class that owns the method. - * @param string|ReflectionMethod $property The name or ReflectionMethod of the method from which - * the annotations should be read. - * @return array An array of Annotations. - */ - public function getMethodAnnotations(ReflectionMethod $method) - { - $cacheKey = $method->getDeclaringClass()->getName() . '#' . $method->getName() . self::$CACHE_SALT; - - // Attempt to grab data from cache - if (($data = $this->_cache->fetch($cacheKey)) !== false) { - return $data; - } - - $context = 'method ' . $method->getDeclaringClass()->getName() . '::' . $method->getName() . '()'; - $annotations = $this->_parser->parse($method->getDocComment(), $context); - $this->_cache->save($cacheKey, $annotations, null); - - return $annotations; - } - - /** - * Gets a method annotation. - * - * @param ReflectionMethod $method - * @param string $annotation The name of the annotation. - * @return The Annotation or NULL, if the requested annotation does not exist. - */ - public function getMethodAnnotation(ReflectionMethod $method, $annotation) - { - $annotations = $this->getMethodAnnotations($method); - - return isset($annotations[$annotation]) ? $annotations[$annotation] : null; - } -} \ No newline at end of file diff --git a/lib/Doctrine/Common/Annotations/Lexer.php b/lib/Doctrine/Common/Annotations/Lexer.php deleted file mode 100644 index a6b8c0675..000000000 --- a/lib/Doctrine/Common/Annotations/Lexer.php +++ /dev/null @@ -1,156 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Simple lexer for docblock annotations. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Lexer extends \Doctrine\Common\Lexer -{ - const T_NONE = 1; - const T_IDENTIFIER = 2; - const T_INTEGER = 3; - const T_STRING = 4; - const T_FLOAT = 5; - - const T_AT = 101; - const T_CLOSE_CURLY_BRACES = 102; - const T_CLOSE_PARENTHESIS = 103; - const T_COMMA = 104; - const T_EQUALS = 105; - const T_FALSE = 106; - const T_NAMESPACE_SEPARATOR = 107; - const T_OPEN_CURLY_BRACES = 108; - const T_OPEN_PARENTHESIS = 109; - const T_TRUE = 110; - - /** - * @inheritdoc - */ - protected function getCatchablePatterns() - { - return array( - '[a-z_][a-z0-9_:]*', - '(?:[0-9]+(?:[\.][0-9]+)*)(?:e[+-]?[0-9]+)?', - '"(?:[^"]|"")*"' - ); - } - - /** - * @inheritdoc - */ - protected function getNonCatchablePatterns() - { - return array('\s+', '\*+', '(.)'); - } - - /** - * @inheritdoc - */ - protected function _getType(&$value) - { - $type = self::T_NONE; - $newVal = $this->_getNumeric($value); - - // Checking numeric value - if ($newVal !== false) { - $value = $newVal; - - return (strpos($value, '.') !== false || stripos($value, 'e') !== false) - ? self::T_FLOAT : self::T_INTEGER; - } - - if ($value[0] === '"') { - $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); - - return self::T_STRING; - } else { - switch (strtolower($value)) { - case '@': - return self::T_AT; - - case ',': - return self::T_COMMA; - - case '(': - return self::T_OPEN_PARENTHESIS; - - case ')': - return self::T_CLOSE_PARENTHESIS; - - case '{': - return self::T_OPEN_CURLY_BRACES; - - case '}': return self::T_CLOSE_CURLY_BRACES; - case '=': - return self::T_EQUALS; - - case '\\': - return self::T_NAMESPACE_SEPARATOR; - - case 'true': - return self::T_TRUE; - - case 'false': - return self::T_FALSE; - - default: - if (ctype_alpha($value[0]) || $value[0] === '_') { - return self::T_IDENTIFIER; - } - - break; - } - } - - return $type; - } - - /** - * Checks if a value is numeric or not - * - * @param mixed $value Value to be inspected - * @return boolean|integer|float Processed value - */ - private function _getNumeric($value) - { - if ( ! is_scalar($value)) { - return false; - } - - // Checking for valid numeric numbers: 1.234, -1.234e-2 - if (is_numeric($value)) { - return $value; - } - - return false; - } -} \ No newline at end of file diff --git a/lib/Doctrine/Common/Annotations/Parser.php b/lib/Doctrine/Common/Annotations/Parser.php deleted file mode 100644 index c421a7cd7..000000000 --- a/lib/Doctrine/Common/Annotations/Parser.php +++ /dev/null @@ -1,445 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * A simple parser for docblock annotations. - * - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Parser -{ - /** - * Tags that are stripped prior to parsing in order to reduce parsing overhead. - * - * @var array - */ - private static $_strippedInlineTags = array( - "{@example", "{@id", "{@internal", "{@inheritdoc", - "{@link", "{@source", "{@toc", "{@tutorial", "*/" - ); - - /** - * The lexer. - * - * @var Doctrine\Common\Annotations\Lexer - */ - private $_lexer; - - /** - * Flag to control if the current Annotation is nested or not. - * - * @var boolean - */ - private $_isNestedAnnotation = false; - - /** - * Default namespace for Annotations. - * - * @var string - */ - private $_defaultAnnotationNamespace = ''; - - /** - * Hashmap to store namespace aliases. - * - * @var array - */ - private $_namespaceAliases = array(); - - /** - * @var string - */ - private $_context = ''; - - /** - * Constructs a new AnnotationParser. - * - */ - public function __construct() - { - $this->_lexer = new Lexer; - } - - /** - * Sets the default namespace that is assumed for an annotation that does not - * define a namespace prefix. - * - * @param $defaultNamespace - */ - public function setDefaultAnnotationNamespace($defaultNamespace) - { - $this->_defaultAnnotationNamespace = $defaultNamespace; - } - - /** - * Sets an alias for an annotation namespace. - * - * @param $namespace - * @param $alias - */ - public function setAnnotationNamespaceAlias($namespace, $alias) - { - $this->_namespaceAliases[$alias] = $namespace; - } - - /** - * Parses the given docblock string for annotations. - * - * @param string $docBlockString - * @param string $context - * @return array Array of Annotations. If no annotations are found, an empty array is returned. - */ - public function parse($docBlockString, $context='') - { - $this->_context = $context; - - // Strip out some known inline tags. - $input = str_replace(self::$_strippedInlineTags, '', $docBlockString); - - // Cut of the beginning of the input until the first '@'. - $input = substr($input, strpos($input, '@')); - - $this->_lexer->reset(); - $this->_lexer->setInput(trim($input, '* /')); - $this->_lexer->moveNext(); - - if ($this->_lexer->isNextToken(Lexer::T_AT)) { - return $this->Annotations(); - } - - return array(); - } - - /** - * Attempts to match the given token with the current lookahead token. - * If they match, updates the lookahead token; otherwise raises a syntax error. - * - * @param int|string token type or value - * @return bool True if tokens match; false otherwise. - */ - public function match($token) - { - if ( ! ($this->_lexer->lookahead['type'] === $token)) { - $this->syntaxError($this->_lexer->getLiteral($token)); - } - $this->_lexer->moveNext(); - } - - /** - * Generates a new syntax error. - * - * @param string $expected Expected string. - * @param array $token Optional token. - * @throws AnnotationException - */ - private function syntaxError($expected, $token = null) - { - if ($token === null) { - $token = $this->_lexer->lookahead; - } - - $message = "Expected {$expected}, got "; - - if ($this->_lexer->lookahead === null) { - $message .= 'end of string'; - } else { - $message .= "'{$token['value']}' at position {$token['position']}"; - } - - if (strlen($this->_context)) { - $message .= ' in ' . $this->_context; - } - - $message .= '.'; - - throw AnnotationException::syntaxError($message); - } - - /** - * Annotations ::= Annotation {[ "*" ]* [Annotation]}* - * - * @return array - */ - public function Annotations() - { - $this->_isNestedAnnotation = false; - - $annotations = array(); - $annot = $this->Annotation(); - - if ($annot !== false) { - $annotations[get_class($annot)] = $annot; - } - - while ($this->_lexer->lookahead !== null && $this->_lexer->isNextToken(Lexer::T_AT)) { - $this->_isNestedAnnotation = false; - - $annot = $this->Annotation(); - - if ($annot !== false) { - $annotations[get_class($annot)] = $annot; - } - } - - return $annotations; - } - - /** - * Annotation ::= "@" AnnotationName ["(" [Values] ")"] - * AnnotationName ::= QualifiedName | SimpleName | AliasedName - * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName - * AliasedName ::= Alias ":" SimpleName - * NameSpacePart ::= identifier - * SimpleName ::= identifier - * Alias ::= identifier - * - * @return mixed False if it is not a valid Annotation; instance of Annotation subclass otherwise. - */ - public function Annotation() - { - $values = array(); - $nameParts = array(); - - $this->match(Lexer::T_AT); - $this->match(Lexer::T_IDENTIFIER); - $nameParts[] = $this->_lexer->token['value']; - - while ($this->_lexer->isNextToken(Lexer::T_NAMESPACE_SEPARATOR)) { - $this->match(Lexer::T_NAMESPACE_SEPARATOR); - $this->match(Lexer::T_IDENTIFIER); - $nameParts[] = $this->_lexer->token['value']; - } - - // Effectively pick the name of the class (append default NS if none, grab from NS alias, etc) - if (count($nameParts) == 1) { - if (strpos($nameParts[0], ':')) { - list ($alias, $simpleName) = explode(':', $nameParts[0]); - $name = $this->_namespaceAliases[$alias] . $simpleName; - } else { - $name = $this->_defaultAnnotationNamespace . $nameParts[0]; - } - } else { - $name = implode('\\', $nameParts); - } - - // Is it really an annotation class? - if ( - ( ! $this->_isNestedAnnotation && $this->_lexer->lookahead != null && - ! $this->_lexer->isNextToken(Lexer::T_OPEN_PARENTHESIS) && - ! $this->_lexer->isNextToken(Lexer::T_AT)) || - ! class_exists($name, false) - ) { - $this->_lexer->skipUntil(Lexer::T_AT); - - return false; - } - - // Next will be nested - $this->_isNestedAnnotation = true; - - if ($this->_lexer->isNextToken(Lexer::T_OPEN_PARENTHESIS)) { - $this->match(Lexer::T_OPEN_PARENTHESIS); - - if ( ! $this->_lexer->isNextToken(Lexer::T_CLOSE_PARENTHESIS)) { - $values = $this->Values(); - } - - $this->match(Lexer::T_CLOSE_PARENTHESIS); - } - - return new $name($values); - } - - /** - * Values ::= Array | Value {"," Value}* - * - * @return array - */ - public function Values() - { - $values = array(); - - // Handle the case of a single array as value, i.e. @Foo({....}) - if ($this->_lexer->isNextToken(Lexer::T_OPEN_CURLY_BRACES)) { - $values['value'] = $this->Value(); - return $values; - } - - $values[] = $this->Value(); - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - $value = $this->Value(); - - if ( ! is_array($value)) { - $this->syntaxError('Value', $value); - } - - $values[] = $value; - } - - foreach ($values as $k => $value) { - if (is_array($value) && is_string(key($value))) { - $key = key($value); - $values[$key] = $value[$key]; - } else { - $values['value'] = $value; - } - - unset($values[$k]); - } - - return $values; - } - - /** - * Value ::= PlainValue | FieldAssignment - * - * @return mixed - */ - public function Value() - { - $peek = $this->_lexer->glimpse(); - - if ($peek['value'] === '=') { - return $this->FieldAssignment(); - } - - return $this->PlainValue(); - } - - /** - * PlainValue ::= integer | string | float | boolean | Array | Annotation - * - * @return mixed - */ - public function PlainValue() - { - if ($this->_lexer->isNextToken(Lexer::T_OPEN_CURLY_BRACES)) { - return $this->Arrayx(); - } - - if ($this->_lexer->isNextToken(Lexer::T_AT)) { - return $this->Annotation(); - } - - switch ($this->_lexer->lookahead['type']) { - case Lexer::T_STRING: - $this->match(Lexer::T_STRING); - return $this->_lexer->token['value']; - - case Lexer::T_INTEGER: - $this->match(Lexer::T_INTEGER); - return $this->_lexer->token['value']; - - case Lexer::T_FLOAT: - $this->match(Lexer::T_FLOAT); - return $this->_lexer->token['value']; - - case Lexer::T_TRUE: - $this->match(Lexer::T_TRUE); - return true; - - case Lexer::T_FALSE: - $this->match(Lexer::T_FALSE); - return false; - - default: - $this->syntaxError('PlainValue'); - } - } - - /** - * FieldAssignment ::= FieldName "=" PlainValue - * FieldName ::= identifier - * - * @return array - */ - public function FieldAssignment() - { - $this->match(Lexer::T_IDENTIFIER); - $fieldName = $this->_lexer->token['value']; - $this->match(Lexer::T_EQUALS); - - return array($fieldName => $this->PlainValue()); - } - - /** - * Array ::= "{" ArrayEntry {"," ArrayEntry}* "}" - * - * @return array - */ - public function Arrayx() - { - $array = $values = array(); - - $this->match(Lexer::T_OPEN_CURLY_BRACES); - $values[] = $this->ArrayEntry(); - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - $values[] = $this->ArrayEntry(); - } - - $this->match(Lexer::T_CLOSE_CURLY_BRACES); - - foreach ($values as $value) { - list ($key, $val) = $value; - - if ($key !== null) { - $array[$key] = $val; - } else { - $array[] = $val; - } - } - - return $array; - } - - /** - * ArrayEntry ::= Value | KeyValuePair - * KeyValuePair ::= Key "=" PlainValue - * Key ::= string | integer - * - * @return array - */ - public function ArrayEntry() - { - $peek = $this->_lexer->glimpse(); - - if ($peek['value'] == '=') { - $this->match( - $this->_lexer->isNextToken(Lexer::T_INTEGER) ? Lexer::T_INTEGER : Lexer::T_STRING - ); - - $key = $this->_lexer->token['value']; - $this->match(Lexer::T_EQUALS); - - return array($key, $this->PlainValue()); - } - - return array(null, $this->Value()); - } -} \ No newline at end of file diff --git a/lib/Doctrine/Common/Annotations/README.markdown b/lib/Doctrine/Common/Annotations/README.markdown deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/Doctrine/Common/Cache/AbstractCache.php b/lib/Doctrine/Common/Cache/AbstractCache.php deleted file mode 100644 index fa9e0a505..000000000 --- a/lib/Doctrine/Common/Cache/AbstractCache.php +++ /dev/null @@ -1,214 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Base class for cache driver implementations. - * - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -abstract class AbstractCache implements Cache -{ - /** @var string The cache id to store the index of cache ids under */ - private $_cacheIdsIndexId = 'doctrine_cache_ids'; - - /** @var string The namespace to prefix all cache ids with */ - private $_namespace = null; - - /** - * Set the namespace to prefix all cache ids with. - * - * @param string $namespace - * @return void - */ - public function setNamespace($namespace) - { - $this->_namespace = $namespace; - } - - /** - * {@inheritdoc} - */ - public function fetch($id) - { - return $this->_doFetch($this->_getNamespacedId($id)); - } - - /** - * {@inheritdoc} - */ - public function contains($id) - { - return $this->_doContains($this->_getNamespacedId($id)); - } - - /** - * {@inheritdoc} - */ - public function save($id, $data, $lifeTime = 0) - { - $id = $this->_getNamespacedId($id); - return $this->_doSave($id, $data, $lifeTime); - } - - /** - * {@inheritdoc} - */ - public function delete($id) - { - $id = $this->_getNamespacedId($id); - - if (strpos($id, '*') !== false) { - return $this->deleteByRegex('/' . str_replace('*', '.*', $id) . '/'); - } - - return $this->_doDelete($id); - } - - /** - * Delete all cache entries. - * - * @return array $deleted Array of the deleted cache ids - */ - public function deleteAll() - { - $ids = $this->getIds(); - foreach ($ids as $id) { - $this->delete($id); - } - return $ids; - } - - /** - * Delete cache entries where the id matches a PHP regular expressions - * - * @param string $regex - * @return array $deleted Array of the deleted cache ids - */ - public function deleteByRegex($regex) - { - $deleted = array(); - $ids = $this->getIds(); - foreach ($ids as $id) { - if (preg_match($regex, $id)) { - $this->delete($id); - $deleted[] = $id; - } - } - return $deleted; - } - - /** - * Delete cache entries where the id has the passed prefix - * - * @param string $prefix - * @return array $deleted Array of the deleted cache ids - */ - public function deleteByPrefix($prefix) - { - $deleted = array(); - $ids = $this->getIds(); - foreach ($ids as $id) { - if (strpos($id, $prefix) === 0) { - $this->delete($id); - $deleted[] = $id; - } - } - return $deleted; - } - - /** - * Delete cache entries where the id has the passed suffix - * - * @param string $suffix - * @return array $deleted Array of the deleted cache ids - */ - public function deleteBySuffix($suffix) - { - $deleted = array(); - $ids = $this->getIds(); - foreach ($ids as $id) { - if (substr($id, -1 * strlen($suffix)) === $suffix) { - $this->delete($id); - $deleted[] = $id; - } - } - return $deleted; - } - - /** - * Prefix the passed id with the configured namespace value - * - * @param string $id The id to namespace - * @return string $id The namespaced id - */ - private function _getNamespacedId($id) - { - if ( ! $this->_namespace || strpos($id, $this->_namespace) === 0) { - return $id; - } else { - return $this->_namespace . $id; - } - } - - /** - * Fetches an entry from the cache. - * - * @param string $id cache id The id of the cache entry to fetch. - * @return string The cached data or FALSE, if no cache entry exists for the given id. - */ - abstract protected function _doFetch($id); - - /** - * Test if an entry exists in the cache. - * - * @param string $id cache id The cache id of the entry to check for. - * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. - */ - abstract protected function _doContains($id); - - /** - * Puts data into the cache. - * - * @param string $id The cache id. - * @param string $data The cache entry/data. - * @param int $lifeTime The lifetime. If != false, sets a specific lifetime for this cache entry (null => infinite lifeTime). - * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. - */ - abstract protected function _doSave($id, $data, $lifeTime = false); - - /** - * Deletes a cache entry. - * - * @param string $id cache id - * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. - */ - abstract protected function _doDelete($id); - - /** - * Get an array of all the cache ids stored - * - * @return array $ids - */ - abstract public function getIds(); -} \ No newline at end of file diff --git a/lib/Doctrine/Common/Cache/ApcCache.php b/lib/Doctrine/Common/Cache/ApcCache.php deleted file mode 100644 index cf277a4fe..000000000 --- a/lib/Doctrine/Common/Cache/ApcCache.php +++ /dev/null @@ -1,87 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * APC cache driver. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - * @todo Rename: APCCache - */ -class ApcCache extends AbstractCache -{ - /** - * {@inheritdoc} - */ - public function getIds() - { - $ci = apc_cache_info('user'); - $keys = array(); - - foreach ($ci['cache_list'] as $entry) { - $keys[] = $entry['info']; - } - return $keys; - } - - /** - * {@inheritdoc} - */ - protected function _doFetch($id) - { - return apc_fetch($id); - } - - /** - * {@inheritdoc} - */ - protected function _doContains($id) - { - $found = false; - apc_fetch($id, $found); - return $found; - } - - /** - * {@inheritdoc} - */ - protected function _doSave($id, $data, $lifeTime = 0) - { - return (bool) apc_store($id, $data, (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function _doDelete($id) - { - return apc_delete($id); - } -} \ No newline at end of file diff --git a/lib/Doctrine/Common/Cache/ArrayCache.php b/lib/Doctrine/Common/Cache/ArrayCache.php deleted file mode 100644 index d3285f7d1..000000000 --- a/lib/Doctrine/Common/Cache/ArrayCache.php +++ /dev/null @@ -1,88 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Array cache driver. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 3938 $ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class ArrayCache extends AbstractCache -{ - /** - * @var array $data - */ - private $data = array(); - - /** - * {@inheritdoc} - */ - public function getIds() - { - return array_keys($this->data); - } - - /** - * {@inheritdoc} - */ - protected function _doFetch($id) - { - if (isset($this->data[$id])) { - return $this->data[$id]; - } - return false; - } - - /** - * {@inheritdoc} - */ - protected function _doContains($id) - { - return isset($this->data[$id]); - } - - /** - * {@inheritdoc} - */ - protected function _doSave($id, $data, $lifeTime = 0) - { - $this->data[$id] = $data; - return true; - } - - /** - * {@inheritdoc} - */ - protected function _doDelete($id) - { - unset($this->data[$id]); - return true; - } -} \ No newline at end of file diff --git a/lib/Doctrine/Common/Cache/Cache.php b/lib/Doctrine/Common/Cache/Cache.php deleted file mode 100644 index e4cb1c074..000000000 --- a/lib/Doctrine/Common/Cache/Cache.php +++ /dev/null @@ -1,71 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Interface for cache drivers. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 3938 $ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -interface Cache -{ - /** - * Fetches an entry from the cache. - * - * @param string $id cache id The id of the cache entry to fetch. - * @return string The cached data or FALSE, if no cache entry exists for the given id. - */ - function fetch($id); - - /** - * Test if an entry exists in the cache. - * - * @param string $id cache id The cache id of the entry to check for. - * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. - */ - function contains($id); - - /** - * Puts data into the cache. - * - * @param string $id The cache id. - * @param string $data The cache entry/data. - * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime). - * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. - */ - function save($id, $data, $lifeTime = 0); - - /** - * Deletes a cache entry. - * - * @param string $id cache id - * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. - */ - function delete($id); -} \ No newline at end of file diff --git a/lib/Doctrine/Common/Cache/MemcacheCache.php b/lib/Doctrine/Common/Cache/MemcacheCache.php deleted file mode 100644 index a76bd170e..000000000 --- a/lib/Doctrine/Common/Cache/MemcacheCache.php +++ /dev/null @@ -1,123 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -use \Memcache; - -/** - * Memcache cache driver. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 3938 $ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class MemcacheCache extends AbstractCache -{ - /** - * @var Memcache - */ - private $_memcache; - - /** - * Sets the memcache instance to use. - * - * @param Memcache $memcache - */ - public function setMemcache(Memcache $memcache) - { - $this->_memcache = $memcache; - } - - /** - * Gets the memcache instance used by the cache. - * - * @return Memcache - */ - public function getMemcache() - { - return $this->_memcache; - } - - /** - * {@inheritdoc} - */ - public function getIds() - { - $keys = array(); - $allSlabs = $this->_memcache->getExtendedStats('slabs'); - - foreach ($allSlabs as $server => $slabs) { - if (is_array($slabs)) { - foreach (array_keys($slabs) as $slabId) { - $dump = $this->_memcache->getExtendedStats('cachedump', (int) $slabId); - - if ($dump) { - foreach ($dump as $entries) { - if ($entries) { - $keys = array_merge($keys, array_keys($entries)); - } - } - } - } - } - } - return $keys; - } - - /** - * {@inheritdoc} - */ - protected function _doFetch($id) - { - return $this->_memcache->get($id); - } - - /** - * {@inheritdoc} - */ - protected function _doContains($id) - { - return (bool) $this->_memcache->get($id); - } - - /** - * {@inheritdoc} - */ - protected function _doSave($id, $data, $lifeTime = 0) - { - return $this->_memcache->set($id, $data, 0, (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function _doDelete($id) - { - return $this->_memcache->delete($id); - } -} \ No newline at end of file diff --git a/lib/Doctrine/Common/Cache/XcacheCache.php b/lib/Doctrine/Common/Cache/XcacheCache.php deleted file mode 100644 index fadf2c322..000000000 --- a/lib/Doctrine/Common/Cache/XcacheCache.php +++ /dev/null @@ -1,102 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Xcache cache driver. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 3938 $ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class XcacheCache extends AbstractCache -{ - /** - * {@inheritdoc} - */ - public function getIds() - { - $this->_checkAuth(); - $keys = array(); - for ($i = 0, $count = xcache_count(XC_TYPE_VAR); $i < $count; $i++) { - $entries = xcache_list(XC_TYPE_VAR, $i); - if (is_array($entries['cache_list'])) { - foreach ($entries['cache_list'] as $entry) { - $keys[] = $entry['name']; - } - } - } - return $keys; - } - - /** - * {@inheritdoc} - */ - protected function _doFetch($id) - { - return $this->_doContains($id) ? unserialize( xcache_get($id) ) : false; - } - - /** - * {@inheritdoc} - */ - protected function _doContains($id) - { - return xcache_isset($id); - } - - /** - * {@inheritdoc} - */ - protected function _doSave($id, $data, $lifeTime = 0) - { - return xcache_set($id, serialize($data), (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function _doDelete($id) - { - return xcache_unset($id); - } - - - /** - * Checks that xcache.admin.enable_auth is Off - * - * @throws \BadMethodCallException When xcache.admin.enable_auth is On - * @return void - */ - protected function _checkAuth() - { - if (ini_get('xcache.admin.enable_auth')) { - throw new \BadMethodCallException('To use all features of \Doctrine\Common\Cache\XcacheCache, you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'); - } - } -} \ No newline at end of file diff --git a/lib/Doctrine/Common/ClassLoader.php b/lib/Doctrine/Common/ClassLoader.php deleted file mode 100644 index d971fe9a6..000000000 --- a/lib/Doctrine/Common/ClassLoader.php +++ /dev/null @@ -1,147 +0,0 @@ -. - */ - -namespace Doctrine\Common; - -/** - * A ClassLoader is an autoloader for class files that can be - * installed on the SPL autoload stack. It is a class loader that loads only classes - * of a specific namespace or all namespaces and is suitable for working together - * with other autoloaders in the SPL autoload stack. - * - * If no include path is configured through {@link setIncludePath}, a ClassLoader - * relies on the PHP include_path. - * - * @author Roman Borschel - * @since 2.0 - */ -class ClassLoader -{ - private $_fileExtension = '.php'; - private $_namespace; - private $_includePath; - private $_namespaceSeparator = '\\'; - - /** - * Creates a new ClassLoader that loads classes of the - * specified namespace. - * - * @param string $ns The namespace to use. - */ - public function __construct($ns = null, $includePath = null) - { - $this->_namespace = $ns; - $this->_includePath = $includePath; - } - - /** - * Sets the namespace separator used by classes in the namespace of this class loader. - * - * @param string $sep The separator to use. - */ - public function setNamespaceSeparator($sep) - { - $this->_namespaceSeparator = $sep; - } - - /** - * Gets the namespace separator used by classes in the namespace of this class loader. - * - * @return string - */ - public function getNamespaceSeparator() - { - return $this->_namespaceSeparator; - } - - /** - * Sets the base include path for all class files in the namespace of this class loader. - * - * @param string $includePath - */ - public function setIncludePath($includePath) - { - $this->_includePath = $includePath; - } - - /** - * Gets the base include path for all class files in the namespace of this class loader. - * - * @return string - */ - public function getIncludePath() - { - return $this->_includePath; - } - - /** - * Sets the file extension of class files in the namespace of this class loader. - * - * @param string $fileExtension - */ - public function setFileExtension($fileExtension) - { - $this->_fileExtension = $fileExtension; - } - - /** - * Gets the file extension of class files in the namespace of this class loader. - * - * @return string - */ - public function getFileExtension() - { - return $this->_fileExtension; - } - - /** - * Installs this class loader on the SPL autoload stack. - */ - public function register() - { - spl_autoload_register(array($this, 'loadClass')); - } - - /** - * Uninstalls this class loader on the SPL autoload stack. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $classname The name of the class to load. - * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise. - */ - public function loadClass($className) - { - if ($this->_namespace !== null && strpos($className, $this->_namespace.$this->_namespaceSeparator) !== 0) { - return false; - } - - require ($this->_includePath !== null ? $this->_includePath . DIRECTORY_SEPARATOR : '') - . str_replace($this->_namespaceSeparator, DIRECTORY_SEPARATOR, $className) - . $this->_fileExtension; - - return true; - } -} \ No newline at end of file diff --git a/lib/Doctrine/Common/Collections/ArrayCollection.php b/lib/Doctrine/Common/Collections/ArrayCollection.php deleted file mode 100644 index 2db0714ca..000000000 --- a/lib/Doctrine/Common/Collections/ArrayCollection.php +++ /dev/null @@ -1,423 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections; - -use Closure, ArrayIterator; - -/** - * An ArrayCollection is a Collection implementation that wraps a regular PHP array. - * - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ArrayCollection implements Collection -{ - /** - * An array containing the entries of this collection. - * - * @var array - */ - private $_elements; - - /** - * Initializes a new ArrayCollection. - * - * @param array $elements - */ - public function __construct(array $elements = array()) - { - $this->_elements = $elements; - } - - /** - * Gets the PHP array representation of this collection. - * - * @return array The PHP array representation of this collection. - */ - public function toArray() - { - return $this->_elements; - } - - /** - * Sets the internal iterator to the first element in the collection and - * returns this element. - * - * @return mixed - */ - public function first() - { - return reset($this->_elements); - } - - /** - * Sets the internal iterator to the last element in the collection and - * returns this element. - * - * @return mixed - */ - public function last() - { - return end($this->_elements); - } - - /** - * Gets the current key/index at the current internal iterator position. - * - * @return mixed - */ - public function key() - { - return key($this->_elements); - } - - /** - * Moves the internal iterator position to the next element. - * - * @return mixed - */ - public function next() - { - next($this->_elements); - } - - /** - * Gets the element of the collection at the current internal iterator position. - * - * @return mixed - */ - public function current() - { - return current($this->_elements); - } - - /** - * Removes an element with a specific key/index from the collection. - * - * @param mixed $key - * @return mixed The removed element or NULL, if no element exists for the given key. - */ - public function remove($key) - { - if (isset($this->_elements[$key])) { - $removed = $this->_elements[$key]; - unset($this->_elements[$key]); - - return $removed; - } - - return null; - } - - /** - * Removes the specified element from the collection, if it is found. - * - * @param mixed $element - * @return boolean - */ - public function removeElement($element) - { - $key = array_search($element, $this->_elements, true); - - if ($key !== false) { - $removed = $this->_elements[$key]; - unset($this->_elements[$key]); - - return $removed; - } - - return null; - } - - /** - * ArrayAccess implementation of offsetExists() - * - * @see containsKey() - */ - public function offsetExists($offset) - { - return $this->containsKey($offset); - } - - /** - * ArrayAccess implementation of offsetGet() - * - * @see get() - */ - public function offsetGet($offset) - { - return $this->get($offset); - } - - /** - * ArrayAccess implementation of offsetGet() - * - * @see add() - * @see set() - */ - public function offsetSet($offset, $value) - { - if ( ! isset($offset)) { - return $this->add($value); - } - return $this->set($offset, $value); - } - - /** - * ArrayAccess implementation of offsetUnset() - * - * @see remove() - */ - public function offsetUnset($offset) - { - return $this->remove($offset); - } - - /** - * Checks whether the collection contains a specific key/index. - * - * @param mixed $key The key to check for. - * @return boolean TRUE if the given key/index exists, FALSE otherwise. - */ - public function containsKey($key) - { - return isset($this->_elements[$key]); - } - - /** - * Checks whether the given element is contained in the collection. - * Only element values are compared, not keys. The comparison of two elements - * is strict, that means not only the value but also the type must match. - * For objects this means reference equality. - * - * @param mixed $element - * @return boolean TRUE if the given element is contained in the collection, - * FALSE otherwise. - */ - public function contains($element) - { - return in_array($element, $this->_elements, true); - } - - /** - * Tests for the existance of an element that satisfies the given predicate. - * - * @param Closure $p The predicate. - * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. - */ - public function exists(Closure $p) - { - foreach ($this->_elements as $key => $element) - if ($p($key, $element)) return true; - return false; - } - - /** - * Searches for a given element and, if found, returns the corresponding key/index - * of that element. The comparison of two elements is strict, that means not - * only the value but also the type must match. - * For objects this means reference equality. - * - * @param mixed $element The element to search for. - * @return mixed The key/index of the element or FALSE if the element was not found. - */ - public function indexOf($element) - { - return array_search($element, $this->_elements, true); - } - - /** - * Gets the element with the given key/index. - * - * @param mixed $key The key. - * @return mixed The element or NULL, if no element exists for the given key. - */ - public function get($key) - { - if (isset($this->_elements[$key])) { - return $this->_elements[$key]; - } - return null; - } - - /** - * Gets all keys/indexes of the collection elements. - * - * @return array - */ - public function getKeys() - { - return array_keys($this->_elements); - } - - /** - * Gets all elements. - * - * @return array - */ - public function getValues() - { - return array_values($this->_elements); - } - - /** - * Returns the number of elements in the collection. - * - * Implementation of the Countable interface. - * - * @return integer The number of elements in the collection. - */ - public function count() - { - return count($this->_elements); - } - - /** - * Adds/sets an element in the collection at the index / with the specified key. - * - * When the collection is a Map this is like put(key,value)/add(key,value). - * When the collection is a List this is like add(position,value). - * - * @param mixed $key - * @param mixed $value - */ - public function set($key, $value) - { - $this->_elements[$key] = $value; - } - - /** - * Adds an element to the collection. - * - * @param mixed $value - * @return boolean Always TRUE. - */ - public function add($value) - { - $this->_elements[] = $value; - return true; - } - - /** - * Checks whether the collection is empty. - * - * Note: This is preferrable over count() == 0. - * - * @return boolean TRUE if the collection is empty, FALSE otherwise. - */ - public function isEmpty() - { - return ! $this->_elements; - } - - /** - * Gets an iterator for iterating over the elements in the collection. - * - * @return ArrayIterator - */ - public function getIterator() - { - return new ArrayIterator($this->_elements); - } - - /** - * Applies the given function to each element in the collection and returns - * a new collection with the elements returned by the function. - * - * @param Closure $func - * @return Collection - */ - public function map(Closure $func) - { - return new ArrayCollection(array_map($func, $this->_elements)); - } - - /** - * Returns all the elements of this collection that satisfy the predicate p. - * The order of the elements is preserved. - * - * @param Closure $p The predicate used for filtering. - * @return Collection A collection with the results of the filter operation. - */ - public function filter(Closure $p) - { - return new ArrayCollection(array_filter($this->_elements, $p)); - } - - /** - * Applies the given predicate p to all elements of this collection, - * returning true, if the predicate yields true for all elements. - * - * @param Closure $p The predicate. - * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. - */ - public function forAll(Closure $p) - { - foreach ($this->_elements as $key => $element) { - if ( ! $p($key, $element)) { - return false; - } - } - - return true; - } - - /** - * Partitions this collection in two collections according to a predicate. - * Keys are preserved in the resulting collections. - * - * @param Closure $p The predicate on which to partition. - * @return array An array with two elements. The first element contains the collection - * of elements where the predicate returned TRUE, the second element - * contains the collection of elements where the predicate returned FALSE. - */ - public function partition(Closure $p) - { - $coll1 = $coll2 = array(); - foreach ($this->_elements as $key => $element) { - if ($p($key, $element)) { - $coll1[$key] = $element; - } else { - $coll2[$key] = $element; - } - } - return array(new ArrayCollection($coll1), new ArrayCollection($coll2)); - } - - /** - * Returns a string representation of this object. - * - * @return string - */ - public function __toString() - { - return __CLASS__ . '@' . spl_object_hash($this); - } - - /** - * Clears the collection. - */ - public function clear() - { - $this->_elements = array(); - } -} diff --git a/lib/Doctrine/Common/Collections/Collection.php b/lib/Doctrine/Common/Collections/Collection.php deleted file mode 100644 index 41af440b5..000000000 --- a/lib/Doctrine/Common/Collections/Collection.php +++ /dev/null @@ -1,230 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections; - -use Closure, Countable, IteratorAggregate, ArrayAccess; - -/** - * The missing (SPL) Collection/Array/OrderedMap interface. - * - * A Collection resembles the nature of a regular PHP array. That is, - * it is essentially an ordered map that can also be used - * like a list. - * - * A Collection has an internal iterator just like a PHP array. In addition, - * a Collection can be iterated with external iterators, which is preferrable. - * To use an external iterator simply use the foreach language construct to - * iterate over the collection (which calls {@link getIterator()} internally) or - * explicitly retrieve an iterator though {@link getIterator()} which can then be - * used to iterate over the collection. - * You can not rely on the internal iterator of the collection being at a certain - * position unless you explicitly positioned it before. Prefer iteration with - * external iterators. - * - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -interface Collection extends Countable, IteratorAggregate, ArrayAccess -{ - /** - * Adds an element at the end of the collection. - * - * @param mixed $element The element to add. - * @return boolean Always TRUE. - */ - function add($element); - - /** - * Clears the collection, removing all elements. - */ - function clear(); - - /** - * Checks whether an element is contained in the collection. - * This is an O(n) operation, where n is the size of the collection. - * - * @param mixed $element The element to search for. - * @return boolean TRUE if the collection contains the element, FALSE otherwise. - */ - function contains($element); - - /** - * Checks whether the collection is empty (contains no elements). - * - * @return boolean TRUE if the collection is empty, FALSE otherwise. - */ - function isEmpty(); - - /** - * Removes the element at the specified index from the collection. - * - * @param string|integer $key The kex/index of the element to remove. - * @return mixed The removed element or NULL, if the collection did not contain the element. - */ - function remove($key); - - /** - * Removes an element from the collection. - * - * @param mixed $element The element to remove. - * @return mixed The removed element or NULL, if the collection did not contain the element. - */ - function removeElement($element); - - /** - * Checks whether the collection contains an element with the specified key/index. - * - * @param string|integer $key The key/index to check for. - * @return boolean TRUE if the collection contains an element with the specified key/index, - * FALSE otherwise. - */ - function containsKey($key); - - /** - * Gets the element at the specified key/index. - * - * @param string|integer $key The key/index of the element to retrieve. - * @return mixed - */ - function get($key); - - /** - * Gets all keys/indices of the collection. - * - * @return array The keys/indices of the collection, in the order of the corresponding - * elements in the collection. - */ - function getKeys(); - - /** - * Gets all values of the collection. - * - * @return array The values of all elements in the collection, in the order they - * appear in the collection. - */ - function getValues(); - - /** - * Sets an element in the collection at the specified key/index. - * - * @param string|integer $key The key/index of the element to set. - * @param mixed $value The element to set. - */ - function set($key, $value); - - /** - * Gets a native PHP array representation of the collection. - * - * @return array - */ - function toArray(); - - /** - * Sets the internal iterator to the first element in the collection and - * returns this element. - * - * @return mixed - */ - function first(); - - /** - * Sets the internal iterator to the last element in the collection and - * returns this element. - * - * @return mixed - */ - function last(); - - /** - * Gets the key/index of the element at the current iterator position. - * - */ - function key(); - - /** - * Gets the element of the collection at the current iterator position. - * - */ - function current(); - - /** - * Moves the internal iterator position to the next element. - * - */ - function next(); - - /** - * Tests for the existence of an element that satisfies the given predicate. - * - * @param Closure $p The predicate. - * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. - */ - function exists(Closure $p); - - /** - * Returns all the elements of this collection that satisfy the predicate p. - * The order of the elements is preserved. - * - * @param Closure $p The predicate used for filtering. - * @return Collection A collection with the results of the filter operation. - */ - function filter(Closure $p); - - /** - * Applies the given predicate p to all elements of this collection, - * returning true, if the predicate yields true for all elements. - * - * @param Closure $p The predicate. - * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. - */ - function forAll(Closure $p); - - /** - * Applies the given function to each element in the collection and returns - * a new collection with the elements returned by the function. - * - * @param Closure $func - * @return Collection - */ - function map(Closure $func); - - /** - * Partitions this collection in two collections according to a predicate. - * Keys are preserved in the resulting collections. - * - * @param Closure $p The predicate on which to partition. - * @return array An array with two elements. The first element contains the collection - * of elements where the predicate returned TRUE, the second element - * contains the collection of elements where the predicate returned FALSE. - */ - function partition(Closure $p); - - /** - * Gets the index/key of a given element. The comparison of two elements is strict, - * that means not only the value but also the type must match. - * For objects this means reference equality. - * - * @param mixed $element The element to search for. - * @return mixed The key/index of the element or FALSE if the element was not found. - */ - function indexOf($element); -} \ No newline at end of file diff --git a/lib/Doctrine/Common/CommonException.php b/lib/Doctrine/Common/CommonException.php deleted file mode 100644 index f3e2bcef6..000000000 --- a/lib/Doctrine/Common/CommonException.php +++ /dev/null @@ -1,11 +0,0 @@ -. - */ - -namespace Doctrine\Common; - -/** - * EventArgs is the base class for classes containing event data. - * - * This class contains no event data. It is used by events that do not pass state - * information to an event handler when an event is raised. The single empty EventArgs - * instance can be obtained through {@link getEmptyInstance}. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 3938 $ - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class EventArgs -{ - /** - * @var EventArgs Single instance of EventArgs - * @static - */ - private static $_emptyEventArgsInstance; - - /** - * Gets the single, empty and immutable EventArgs instance. - * - * This instance will be used when events are dispatched without any parameter, - * like this: EventManager::dispatchEvent('eventname'); - * - * The benefit from this is that only one empty instance is instantiated and shared - * (otherwise there would be instances for every dispatched in the abovementioned form) - * - * @see EventManager::dispatchEvent - * @link http://msdn.microsoft.com/en-us/library/system.eventargs.aspx - * @static - * @return EventArgs - */ - public static function getEmptyInstance() - { - if ( ! self::$_emptyEventArgsInstance) { - self::$_emptyEventArgsInstance = new EventArgs; - } - - return self::$_emptyEventArgsInstance; - } -} diff --git a/lib/Doctrine/Common/EventManager.php b/lib/Doctrine/Common/EventManager.php deleted file mode 100644 index fa98cf2d1..000000000 --- a/lib/Doctrine/Common/EventManager.php +++ /dev/null @@ -1,138 +0,0 @@ -. - */ - -namespace Doctrine\Common; - -use Doctrine\Common\Events\Event; - -/** - * The EventManager is the central point of Doctrine's event listener system. - * Listeners are registered on the manager and events are dispatched through the - * manager. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 3938 $ - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class EventManager -{ - /** - * Map of registered listeners. - * => - * - * @var array - */ - private $_listeners = array(); - - /** - * Dispatches an event to all registered listeners. - * - * @param string $eventName The name of the event to dispatch. The name of the event is - * the name of the method that is invoked on listeners. - * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners. - * If not supplied, the single empty EventArgs instance is used. - * @return boolean - */ - public function dispatchEvent($eventName, EventArgs $eventArgs = null) - { - if (isset($this->_listeners[$eventName])) { - $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs; - - foreach ($this->_listeners[$eventName] as $listener) { - $listener->$eventName($eventArgs); - } - } - } - - /** - * Gets the listeners of a specific event or all listeners. - * - * @param string $event The name of the event. - * @return array The event listeners for the specified event, or all event listeners. - */ - public function getListeners($event = null) - { - return $event ? $this->_listeners[$event] : $this->_listeners; - } - - /** - * Checks whether an event has any registered listeners. - * - * @param string $event - * @return boolean TRUE if the specified event has any listeners, FALSE otherwise. - */ - public function hasListeners($event) - { - return isset($this->_listeners[$event]) && $this->_listeners[$event]; - } - - /** - * Adds an event listener that listens on the specified events. - * - * @param string|array $events The event(s) to listen on. - * @param object $listener The listener object. - */ - public function addEventListener($events, $listener) - { - // Picks the hash code related to that listener - $hash = spl_object_hash($listener); - - foreach ((array) $events as $event) { - // Overrides listener if a previous one was associated already - // Prevents duplicate listeners on same event (same instance only) - $this->_listeners[$event][$hash] = $listener; - } - } - - /** - * Removes an event listener from the specified events. - * - * @param string|array $events - * @param object $listener - */ - public function removeEventListener($events, $listener) - { - // Picks the hash code related to that listener - $hash = spl_object_hash($listener); - - foreach ((array) $events as $event) { - // Check if actually have this listener associated - if (isset($this->_listeners[$event][$hash])) { - unset($this->_listeners[$event][$hash]); - } - } - } - - /** - * Adds an EventSubscriber. The subscriber is asked for all the events he is - * interested in and added as a listener for these events. - * - * @param Doctrine\Common\EventSubscriber $subscriber The subscriber. - */ - public function addEventSubscriber(EventSubscriber $subscriber) - { - $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber); - } -} \ No newline at end of file diff --git a/lib/Doctrine/Common/EventSubscriber.php b/lib/Doctrine/Common/EventSubscriber.php deleted file mode 100644 index 8e55973bd..000000000 --- a/lib/Doctrine/Common/EventSubscriber.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\Common; - -/** - * An EventSubscriber knows himself what events he is interested in. - * If an EventSubscriber is added to an EventManager, the manager invokes - * {@link getSubscribedEvents} and registers the subscriber as a listener for all - * returned events. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -interface EventSubscriber -{ - /** - * Returns an array of events this subscriber wants to listen to. - * - * @return array - */ - public function getSubscribedEvents(); -} diff --git a/lib/Doctrine/Common/Lexer.php b/lib/Doctrine/Common/Lexer.php deleted file mode 100644 index 3949e11aa..000000000 --- a/lib/Doctrine/Common/Lexer.php +++ /dev/null @@ -1,255 +0,0 @@ -. - */ - -namespace Doctrine\Common; - -/** - * Base class for writing simple lexers, i.e. for creating small DSLs. - * - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @todo Rename: AbstractLexer - */ -abstract class Lexer -{ - /** - * @var array Array of scanned tokens - */ - private $_tokens = array(); - - /** - * @var integer Current lexer position in input string - */ - private $_position = 0; - - /** - * @var integer Current peek of current lexer position - */ - private $_peek = 0; - - /** - * @var array The next token in the input. - */ - public $lookahead; - - /** - * @var array The last matched/seen token. - */ - public $token; - - /** - * Sets the input data to be tokenized. - * - * The Lexer is immediately reset and the new input tokenized. - * Any unprocessed tokens from any previous input are lost. - * - * @param string $input The input to be tokenized. - */ - public function setInput($input) - { - $this->_tokens = array(); - $this->reset(); - $this->_scan($input); - } - - /** - * Resets the lexer. - */ - public function reset() - { - $this->lookahead = null; - $this->token = null; - $this->_peek = 0; - $this->_position = 0; - } - - /** - * Resets the peek pointer to 0. - */ - public function resetPeek() - { - $this->_peek = 0; - } - - /** - * Resets the lexer position on the input to the given position. - * - * @param integer $position Position to place the lexical scanner - */ - public function resetPosition($position = 0) - { - $this->_position = $position; - } - - /** - * Checks whether a given token matches the current lookahead. - * - * @param integer|string $token - * @return boolean - */ - public function isNextToken($token) - { - return $this->lookahead['type'] === $token; - } - - /** - * Moves to the next token in the input string. - * - * A token is an associative array containing three items: - * - 'value' : the string value of the token in the input string - * - 'type' : the type of the token (identifier, numeric, string, input - * parameter, none) - * - 'position' : the position of the token in the input string - * - * @return array|null the next token; null if there is no more tokens left - */ - public function moveNext() - { - $this->_peek = 0; - $this->token = $this->lookahead; - $this->lookahead = (isset($this->_tokens[$this->_position])) - ? $this->_tokens[$this->_position++] : null; - - return $this->lookahead !== null; - } - - /** - * Tells the lexer to skip input tokens until it sees a token with the given value. - * - * @param $type The token type to skip until. - */ - public function skipUntil($type) - { - while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { - $this->moveNext(); - } - } - - /** - * Checks if given value is identical to the given token - * - * @param mixed $value - * @param integer $token - * @return boolean - */ - public function isA($value, $token) - { - return $this->_getType($value) === $token; - } - - /** - * Moves the lookahead token forward. - * - * @return array | null The next token or NULL if there are no more tokens ahead. - */ - public function peek() - { - if (isset($this->_tokens[$this->_position + $this->_peek])) { - return $this->_tokens[$this->_position + $this->_peek++]; - } else { - return null; - } - } - - /** - * Peeks at the next token, returns it and immediately resets the peek. - * - * @return array|null The next token or NULL if there are no more tokens ahead. - */ - public function glimpse() - { - $peek = $this->peek(); - $this->_peek = 0; - return $peek; - } - - /** - * Scans the input string for tokens. - * - * @param string $input a query string - */ - protected function _scan($input) - { - static $regex; - - if ( ! isset($regex)) { - $regex = '/(' . implode(')|(', $this->getCatchablePatterns()) . ')|' - . implode('|', $this->getNonCatchablePatterns()) . '/i'; - } - - $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; - $matches = preg_split($regex, $input, -1, $flags); - - foreach ($matches as $match) { - // Must remain before 'value' assignment since it can change content - $type = $this->_getType($match[0]); - - $this->_tokens[] = array( - 'value' => $match[0], - 'type' => $type, - 'position' => $match[1], - ); - } - } - - /** - * Gets the literal for a given token. - * - * @param integer $token - * @return string - */ - public function getLiteral($token) - { - $className = get_class($this); - $reflClass = new \ReflectionClass($className); - $constants = $reflClass->getConstants(); - - foreach ($constants as $name => $value) { - if ($value === $token) { - return $className . '::' . $name; - } - } - - return $token; - } - - /** - * Lexical catchable patterns. - * - * @return array - */ - abstract protected function getCatchablePatterns(); - - /** - * Lexical non-catchable patterns. - * - * @return array - */ - abstract protected function getNonCatchablePatterns(); - - /** - * Retrieve token type. Also processes the token value if necessary. - * - * @param string $value - * @return integer - */ - abstract protected function _getType(&$value); -} \ No newline at end of file diff --git a/lib/Doctrine/Common/NotifyPropertyChanged.php b/lib/Doctrine/Common/NotifyPropertyChanged.php deleted file mode 100644 index 93e504aec..000000000 --- a/lib/Doctrine/Common/NotifyPropertyChanged.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\Common; - -/** - * Contract for classes that provide the service of notifying listeners of - * changes to their properties. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 3938 $ - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -interface NotifyPropertyChanged -{ - /** - * Adds a listener that wants to be notified about property changes. - * - * @param PropertyChangedListener $listener - */ - function addPropertyChangedListener(PropertyChangedListener $listener); -} - diff --git a/lib/Doctrine/Common/PropertyChangedListener.php b/lib/Doctrine/Common/PropertyChangedListener.php deleted file mode 100644 index 87c5b413d..000000000 --- a/lib/Doctrine/Common/PropertyChangedListener.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ - -namespace Doctrine\Common; - -/** - * Contract for classes that are potential listeners of a NotifyPropertyChanged - * implementor. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 3938 $ - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -interface PropertyChangedListener -{ - /** - * Notifies the listener of a property change. - * - * @param object $sender The object on which the property changed. - * @param string $propertyName The name of the property that changed. - * @param mixed $oldValue The old value of the property that changed. - * @param mixed $newValue The new value of the property that changed. - */ - function propertyChanged($sender, $propertyName, $oldValue, $newValue); -} - diff --git a/lib/Doctrine/Common/Util/Debug.php b/lib/Doctrine/Common/Util/Debug.php deleted file mode 100644 index 9f3df2b29..000000000 --- a/lib/Doctrine/Common/Util/Debug.php +++ /dev/null @@ -1,131 +0,0 @@ -. - */ - -namespace Doctrine\Common\Util; - -/** - * Static class containing most used debug methods. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 3938 $ - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Giorgio Sironi - */ -final class Debug -{ - /** - * Private constructor (prevents from instantiation) - * - */ - private function __construct() {} - - /** - * Prints a dump of the public, protected and private properties of $var. - * - * @static - * @link http://xdebug.org/ - * @param mixed $var - * @param integer $maxDepth Maximum nesting level for object properties - */ - public static function dump($var, $maxDepth = 2) - { - ini_set('html_errors', 'On'); - - if (extension_loaded('xdebug')) { - ini_set('xdebug.var_display_max_depth', $maxDepth); - } - - $var = self::export($var, $maxDepth++); - - ob_start(); - var_dump($var); - $dump = ob_get_contents(); - ob_end_clean(); - - echo strip_tags(html_entity_decode($dump)); - - ini_set('html_errors', 'Off'); - } - - public static function export($var, $maxDepth) - { - $return = null; - $isObj = is_object($var); - - if ($isObj && in_array('Doctrine\Common\Collections\Collection', class_implements($var))) { - $var = $var->toArray(); - } - - if ($maxDepth) { - if (is_array($var)) { - $return = array(); - - foreach ($var as $k => $v) { - $return[$k] = self::export($v, $maxDepth - 1); - } - } else if ($isObj) { - if ($var instanceof \DateTime) { - $return = $var->format('c'); - } else { - $reflClass = new \ReflectionClass(get_class($var)); - $return = new \stdclass(); - $return->{'__CLASS__'} = get_class($var); - - if ($var instanceof \Doctrine\ORM\Proxy\Proxy && ! $var->__isInitialized__) { - $reflProperty = $reflClass->getProperty('_identifier'); - $reflProperty->setAccessible(true); - - foreach ($reflProperty->getValue($var) as $name => $value) { - $return->$name = self::export($value, $maxDepth - 1); - } - } else { - $excludeProperties = array(); - - if ($var instanceof \Doctrine\ORM\Proxy\Proxy) { - $excludeProperties = array('_entityPersister', '__isInitialized__', '_identifier'); - } - - foreach ($reflClass->getProperties() as $reflProperty) { - $name = $reflProperty->getName(); - - if ( ! in_array($name, $excludeProperties)) { - $reflProperty->setAccessible(true); - - $return->$name = self::export($reflProperty->getValue($var), $maxDepth - 1); - } - } - } - } - } else { - $return = $var; - } - } else { - $return = is_object($var) ? get_class($var) - : (is_array($var) ? 'Array(' . count($var) . ')' : $var); - } - - return $return; - } -} diff --git a/lib/Doctrine/Common/Util/Inflector.php b/lib/Doctrine/Common/Util/Inflector.php deleted file mode 100644 index 78e570968..000000000 --- a/lib/Doctrine/Common/Util/Inflector.php +++ /dev/null @@ -1,72 +0,0 @@ -. - */ - -namespace Doctrine\Common\Util; - -/** - * Doctrine inflector has static methods for inflecting text - * - * The methods in these classes are from several different sources collected - * across several different php projects and several different authors. The - * original author names and emails are not known - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 1.0 - * @version $Revision: 3189 $ - * @author Konsta Vesterinen - * @author Jonathan H. Wage - */ -class Inflector -{ - /** - * Convert word in to the format for a Doctrine table name. Converts 'ModelName' to 'model_name' - * - * @param string $word Word to tableize - * @return string $word Tableized word - */ - public static function tableize($word) - { - return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $word)); - } - - /** - * Convert a word in to the format for a Doctrine class name. Converts 'table_name' to 'TableName' - * - * @param string $word Word to classify - * @return string $word Classified word - */ - public static function classify($word) - { - return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); - } - - /** - * Camelize a word. This uses the classify() method and turns the first character to lowercase - * - * @param string $word - * @return string $word - */ - public static function camelize($word) - { - return lcfirst(self::classify($word)); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Configuration.php b/lib/Doctrine/DBAL/Configuration.php deleted file mode 100644 index 76ce1c4f0..000000000 --- a/lib/Doctrine/DBAL/Configuration.php +++ /dev/null @@ -1,64 +0,0 @@ -. - */ - -namespace Doctrine\DBAL; - -use Doctrine\DBAL\Logging\SQLLogger; - -/** - * Configuration container for the Doctrine DBAL. - * - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @internal When adding a new configuration option just write a getter/setter - * pair and add the option to the _attributes array with a proper default value. - */ -class Configuration -{ - /** - * The attributes that are contained in the configuration. - * Values are default values. - * - * @var array - */ - protected $_attributes = array(); - - /** - * Sets the SQL logger to use. Defaults to NULL which means SQL logging is disabled. - * - * @param SQLLogger $logger - */ - public function setSQLLogger(SQLLogger $logger) - { - $this->_attributes['sqlLogger'] = $logger; - } - - /** - * Gets the SQL logger that is used. - * - * @return SQLLogger - */ - public function getSQLLogger() - { - return isset($this->_attributes['sqlLogger']) ? - $this->_attributes['sqlLogger'] : null; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Connection.php b/lib/Doctrine/DBAL/Connection.php deleted file mode 100644 index 3a2c1b9f9..000000000 --- a/lib/Doctrine/DBAL/Connection.php +++ /dev/null @@ -1,935 +0,0 @@ -. - */ - -namespace Doctrine\DBAL; - -use PDO, Closure, Exception, - Doctrine\DBAL\Types\Type, - Doctrine\DBAL\Driver\Connection as DriverConnection, - Doctrine\Common\EventManager, - Doctrine\DBAL\DBALException; - -/** - * A wrapper around a Doctrine\DBAL\Driver\Connection that adds features like - * events, transaction isolation levels, configuration, emulated transaction nesting, - * lazy connecting and more. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 3938 $ - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Konsta Vesterinen - * @author Lukas Smith (MDB2 library) - */ -class Connection implements DriverConnection -{ - /** - * Constant for transaction isolation level READ UNCOMMITTED. - */ - const TRANSACTION_READ_UNCOMMITTED = 1; - - /** - * Constant for transaction isolation level READ COMMITTED. - */ - const TRANSACTION_READ_COMMITTED = 2; - - /** - * Constant for transaction isolation level REPEATABLE READ. - */ - const TRANSACTION_REPEATABLE_READ = 3; - - /** - * Constant for transaction isolation level SERIALIZABLE. - */ - const TRANSACTION_SERIALIZABLE = 4; - - /** - * The wrapped driver connection. - * - * @var Doctrine\DBAL\Driver\Connection - */ - protected $_conn; - - /** - * @var Doctrine\DBAL\Configuration - */ - protected $_config; - - /** - * @var Doctrine\Common\EventManager - */ - protected $_eventManager; - - /** - * Whether or not a connection has been established. - * - * @var boolean - */ - private $_isConnected = false; - - /** - * The transaction nesting level. - * - * @var integer - */ - private $_transactionNestingLevel = 0; - - /** - * The currently active transaction isolation level. - * - * @var integer - */ - private $_transactionIsolationLevel; - - /** - * The parameters used during creation of the Connection instance. - * - * @var array - */ - private $_params = array(); - - /** - * The DatabasePlatform object that provides information about the - * database platform used by the connection. - * - * @var Doctrine\DBAL\Platforms\AbstractPlatform - */ - protected $_platform; - - /** - * The schema manager. - * - * @var Doctrine\DBAL\Schema\SchemaManager - */ - protected $_schemaManager; - - /** - * The used DBAL driver. - * - * @var Doctrine\DBAL\Driver - */ - protected $_driver; - - /** - * Flag that indicates whether the current transaction is marked for rollback only. - * - * @var boolean - */ - private $_isRollbackOnly = false; - - /** - * Initializes a new instance of the Connection class. - * - * @param array $params The connection parameters. - * @param Driver $driver - * @param Configuration $config - * @param EventManager $eventManager - */ - public function __construct(array $params, Driver $driver, Configuration $config = null, - EventManager $eventManager = null) - { - $this->_driver = $driver; - $this->_params = $params; - - if (isset($params['pdo'])) { - $this->_conn = $params['pdo']; - $this->_isConnected = true; - } - - // Create default config and event manager if none given - if ( ! $config) { - $config = new Configuration(); - } - - if ( ! $eventManager) { - $eventManager = new EventManager(); - } - - $this->_config = $config; - $this->_eventManager = $eventManager; - if ( ! isset($params['platform'])) { - $this->_platform = $driver->getDatabasePlatform(); - } else if ($params['platform'] instanceof Platforms\AbstractPlatform) { - $this->_platform = $params['platform']; - } else { - throw DBALException::invalidPlatformSpecified(); - } - $this->_transactionIsolationLevel = $this->_platform->getDefaultTransactionIsolationLevel(); - } - - /** - * Gets the parameters used during instantiation. - * - * @return array $params - */ - public function getParams() - { - return $this->_params; - } - - /** - * Gets the name of the database this Connection is connected to. - * - * @return string $database - */ - public function getDatabase() - { - return $this->_driver->getDatabase($this); - } - - /** - * Gets the hostname of the currently connected database. - * - * @return string - */ - public function getHost() - { - return isset($this->_params['host']) ? $this->_params['host'] : null; - } - - /** - * Gets the port of the currently connected database. - * - * @return mixed - */ - public function getPort() - { - return isset($this->_params['port']) ? $this->_params['port'] : null; - } - - /** - * Gets the username used by this connection. - * - * @return string - */ - public function getUsername() - { - return isset($this->_params['user']) ? $this->_params['user'] : null; - } - - /** - * Gets the password used by this connection. - * - * @return string - */ - public function getPassword() - { - return isset($this->_params['password']) ? $this->_params['password'] : null; - } - - /** - * Gets the DBAL driver instance. - * - * @return Doctrine\DBAL\Driver - */ - public function getDriver() - { - return $this->_driver; - } - - /** - * Gets the Configuration used by the Connection. - * - * @return Doctrine\DBAL\Configuration - */ - public function getConfiguration() - { - return $this->_config; - } - - /** - * Gets the EventManager used by the Connection. - * - * @return Doctrine\Common\EventManager - */ - public function getEventManager() - { - return $this->_eventManager; - } - - /** - * Gets the DatabasePlatform for the connection. - * - * @return Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getDatabasePlatform() - { - return $this->_platform; - } - - /** - * Establishes the connection with the database. - * - * @return boolean TRUE if the connection was successfully established, FALSE if - * the connection is already open. - */ - public function connect() - { - if ($this->_isConnected) return false; - - $driverOptions = isset($this->_params['driverOptions']) ? - $this->_params['driverOptions'] : array(); - $user = isset($this->_params['user']) ? $this->_params['user'] : null; - $password = isset($this->_params['password']) ? - $this->_params['password'] : null; - - $this->_conn = $this->_driver->connect($this->_params, $user, $password, $driverOptions); - $this->_isConnected = true; - - if ($this->_eventManager->hasListeners(Events::postConnect)) { - $eventArgs = new Event\ConnectionEventArgs($this); - $this->_eventManager->dispatchEvent(Events::postConnect, $eventArgs); - } - - return true; - } - - /** - * Prepares and executes an SQL query and returns the first row of the result - * as an associative array. - * - * @param string $statement The SQL query. - * @param array $params The query parameters. - * @return array - */ - public function fetchAssoc($statement, array $params = array()) - { - return $this->executeQuery($statement, $params)->fetch(PDO::FETCH_ASSOC); - } - - /** - * Prepares and executes an SQL query and returns the first row of the result - * as a numerically indexed array. - * - * @param string $statement sql query to be executed - * @param array $params prepared statement params - * @return array - */ - public function fetchArray($statement, array $params = array()) - { - return $this->executeQuery($statement, $params)->fetch(PDO::FETCH_NUM); - } - - /** - * Prepares and executes an SQL query and returns the value of a single column - * of the first row of the result. - * - * @param string $statement sql query to be executed - * @param array $params prepared statement params - * @param int $colnum 0-indexed column number to retrieve - * @return mixed - */ - public function fetchColumn($statement, array $params = array(), $colnum = 0) - { - return $this->executeQuery($statement, $params)->fetchColumn($colnum); - } - - /** - * Whether an actual connection to the database is established. - * - * @return boolean - */ - public function isConnected() - { - return $this->_isConnected; - } - - /** - * Checks whether a transaction is currently active. - * - * @return boolean TRUE if a transaction is currently active, FALSE otherwise. - */ - public function isTransactionActive() - { - return $this->_transactionNestingLevel > 0; - } - - /** - * Executes an SQL DELETE statement on a table. - * - * @param string $table The name of the table on which to delete. - * @param array $identifier The deletion criteria. An associateve array containing column-value pairs. - * @return integer The number of affected rows. - */ - public function delete($tableName, array $identifier) - { - $this->connect(); - - $criteria = array(); - - foreach (array_keys($identifier) as $columnName) { - $criteria[] = $columnName . ' = ?'; - } - - $query = 'DELETE FROM ' . $tableName . ' WHERE ' . implode(' AND ', $criteria); - - return $this->executeUpdate($query, array_values($identifier)); - } - - /** - * Closes the connection. - * - * @return void - */ - public function close() - { - unset($this->_conn); - - $this->_isConnected = false; - } - - /** - * Sets the transaction isolation level. - * - * @param integer $level The level to set. - */ - public function setTransactionIsolation($level) - { - $this->_transactionIsolationLevel = $level; - - return $this->executeUpdate($this->_platform->getSetTransactionIsolationSQL($level)); - } - - /** - * Gets the currently active transaction isolation level. - * - * @return integer The current transaction isolation level. - */ - public function getTransactionIsolation() - { - return $this->_transactionIsolationLevel; - } - - /** - * Executes an SQL UPDATE statement on a table. - * - * @param string $table The name of the table to update. - * @param array $identifier The update criteria. An associative array containing column-value pairs. - * @return integer The number of affected rows. - */ - public function update($tableName, array $data, array $identifier) - { - $this->connect(); - $set = array(); - foreach ($data as $columnName => $value) { - $set[] = $columnName . ' = ?'; - } - - $params = array_merge(array_values($data), array_values($identifier)); - - $sql = 'UPDATE ' . $tableName . ' SET ' . implode(', ', $set) - . ' WHERE ' . implode(' = ? AND ', array_keys($identifier)) - . ' = ?'; - - return $this->executeUpdate($sql, $params); - } - - /** - * Inserts a table row with specified data. - * - * @param string $table The name of the table to insert data into. - * @param array $data An associative array containing column-value pairs. - * @return integer The number of affected rows. - */ - public function insert($tableName, array $data) - { - $this->connect(); - - // column names are specified as array keys - $cols = array(); - $placeholders = array(); - - foreach ($data as $columnName => $value) { - $cols[] = $columnName; - $placeholders[] = '?'; - } - - $query = 'INSERT INTO ' . $tableName - . ' (' . implode(', ', $cols) . ')' - . ' VALUES (' . implode(', ', $placeholders) . ')'; - - return $this->executeUpdate($query, array_values($data)); - } - - /** - * Sets the given charset on the current connection. - * - * @param string $charset The charset to set. - */ - public function setCharset($charset) - { - $this->executeUpdate($this->_platform->getSetCharsetSQL($charset)); - } - - /** - * Quote a string so it can be safely used as a table or column name, even if - * it is a reserved name. - * - * Delimiting style depends on the underlying database platform that is being used. - * - * NOTE: Just because you CAN use quoted identifiers does not mean - * you SHOULD use them. In general, they end up causing way more - * problems than they solve. - * - * @param string $str The name to be quoted. - * @return string The quoted name. - */ - public function quoteIdentifier($str) - { - return $this->_platform->quoteIdentifier($str); - } - - /** - * Quotes a given input parameter. - * - * @param mixed $input Parameter to be quoted. - * @param string $type Type of the parameter. - * @return string The quoted parameter. - */ - public function quote($input, $type = null) - { - $this->connect(); - - return $this->_conn->quote($input, $type); - } - - /** - * Prepares and executes an SQL query and returns the result as an associative array. - * - * @param string $sql The SQL query. - * @param array $params The query parameters. - * @return array - */ - public function fetchAll($sql, array $params = array()) - { - return $this->executeQuery($sql, $params)->fetchAll(PDO::FETCH_ASSOC); - } - - /** - * Prepares an SQL statement. - * - * @param string $statement The SQL statement to prepare. - * @return Doctrine\DBAL\Driver\Statement The prepared statement. - */ - public function prepare($statement) - { - $this->connect(); - - return new Statement($statement, $this); - } - - /** - * Executes an, optionally parameterized, SQL query. - * - * If the query is parameterized, a prepared statement is used. - * If an SQLLogger is configured, the execution is logged. - * - * @param string $query The SQL query to execute. - * @param array $params The parameters to bind to the query, if any. - * @return Doctrine\DBAL\Driver\Statement The executed statement. - * @internal PERF: Directly prepares a driver statement, not a wrapper. - */ - public function executeQuery($query, array $params = array(), $types = array()) - { - $this->connect(); - - if ($this->_config->getSQLLogger() !== null) { - $this->_config->getSQLLogger()->logSQL($query, $params); - } - - if ($params) { - $stmt = $this->_conn->prepare($query); - if ($types) { - $this->_bindTypedValues($stmt, $params, $types); - $stmt->execute(); - } else { - $stmt->execute($params); - } - } else { - $stmt = $this->_conn->query($query); - } - - return $stmt; - } - - /** - * Executes an, optionally parameterized, SQL query and returns the result, - * applying a given projection/transformation function on each row of the result. - * - * @param string $query The SQL query to execute. - * @param array $params The parameters, if any. - * @param Closure $mapper The transformation function that is applied on each row. - * The function receives a single paramater, an array, that - * represents a row of the result set. - * @return mixed The projected result of the query. - */ - public function project($query, array $params, Closure $function) - { - $result = array(); - $stmt = $this->executeQuery($query, $params ?: array()); - - while ($row = $stmt->fetch()) { - $result[] = $function($row); - } - - $stmt->closeCursor(); - - return $result; - } - - /** - * Executes an SQL statement, returning a result set as a Statement object. - * - * @param string $statement - * @param integer $fetchType - * @return Doctrine\DBAL\Driver\Statement - */ - public function query() - { - return call_user_func_array(array($this->_conn, 'query'), func_get_args()); - } - - /** - * Executes an SQL INSERT/UPDATE/DELETE query with the given parameters - * and returns the number of affected rows. - * - * This method supports PDO binding types as well as DBAL mapping types. - * - * @param string $query The SQL query. - * @param array $params The query parameters. - * @param array $types The parameter types. - * @return integer The number of affected rows. - * @internal PERF: Directly prepares a driver statement, not a wrapper. - */ - public function executeUpdate($query, array $params = array(), array $types = array()) - { - $this->connect(); - - if ($this->_config->getSQLLogger() !== null) { - $this->_config->getSQLLogger()->logSQL($query, $params); - } - - if ($params) { - $stmt = $this->_conn->prepare($query); - if ($types) { - $this->_bindTypedValues($stmt, $params, $types); - $stmt->execute(); - } else { - $stmt->execute($params); - } - $result = $stmt->rowCount(); - } else { - $result = $this->_conn->exec($query); - } - - return $result; - } - - /** - * Execute an SQL statement and return the number of affected rows. - * - * @param string $statement - * @return integer The number of affected rows. - */ - public function exec($statement) - { - $this->connect(); - return $this->_conn->exec($statement); - } - - /** - * Returns the current transaction nesting level. - * - * @return integer The nesting level. A value of 0 means there's no active transaction. - */ - public function getTransactionNestingLevel() - { - return $this->_transactionNestingLevel; - } - - /** - * Fetch the SQLSTATE associated with the last database operation. - * - * @return integer The last error code. - */ - public function errorCode() - { - $this->connect(); - return $this->_conn->errorCode(); - } - - /** - * Fetch extended error information associated with the last database operation. - * - * @return array The last error information. - */ - public function errorInfo() - { - $this->connect(); - return $this->_conn->errorInfo(); - } - - /** - * Returns the ID of the last inserted row, or the last value from a sequence object, - * depending on the underlying driver. - * - * Note: This method may not return a meaningful or consistent result across different drivers, - * because the underlying database may not even support the notion of AUTO_INCREMENT/IDENTITY - * columns or sequences. - * - * @param string $seqName Name of the sequence object from which the ID should be returned. - * @return string A string representation of the last inserted ID. - */ - public function lastInsertId($seqName = null) - { - $this->connect(); - return $this->_conn->lastInsertId($seqName); - } - - /** - * Executes a function in a transaction. - * - * The function gets passed this Connection instance as an (optional) parameter. - * - * If an exception occurs during execution of the function or transaction commit, - * the transaction is rolled back and the exception re-thrown. - * - * @param Closure $func The function to execute transactionally. - */ - public function transactional(Closure $func) - { - $this->beginTransaction(); - try { - $func($this); - $this->commit(); - } catch (Exception $e) { - $this->rollback(); - throw $e; - } - } - - /** - * Starts a transaction by suspending auto-commit mode. - * - * @return void - */ - public function beginTransaction() - { - $this->connect(); - - if ($this->_transactionNestingLevel == 0) { - $this->_conn->beginTransaction(); - } - - ++$this->_transactionNestingLevel; - } - - /** - * Commits the current transaction. - * - * @return void - * @throws ConnectionException If the commit failed due to no active transaction or - * because the transaction was marked for rollback only. - */ - public function commit() - { - if ($this->_transactionNestingLevel == 0) { - throw ConnectionException::noActiveTransaction(); - } - if ($this->_isRollbackOnly) { - throw ConnectionException::commitFailedRollbackOnly(); - } - - $this->connect(); - - if ($this->_transactionNestingLevel == 1) { - $this->_conn->commit(); - } - - --$this->_transactionNestingLevel; - } - - /** - * Cancel any database changes done during the current transaction. - * - * this method can be listened with onPreTransactionRollback and onTransactionRollback - * eventlistener methods - * - * @throws ConnectionException If the rollback operation failed. - */ - public function rollback() - { - if ($this->_transactionNestingLevel == 0) { - throw ConnectionException::noActiveTransaction(); - } - - $this->connect(); - - if ($this->_transactionNestingLevel == 1) { - $this->_transactionNestingLevel = 0; - $this->_conn->rollback(); - $this->_isRollbackOnly = false; - } else { - $this->_isRollbackOnly = true; - --$this->_transactionNestingLevel; - } - } - - /** - * Gets the wrapped driver connection. - * - * @return Doctrine\DBAL\Driver\Connection - */ - public function getWrappedConnection() - { - $this->connect(); - - return $this->_conn; - } - - /** - * Gets the SchemaManager that can be used to inspect or change the - * database schema through the connection. - * - * @return Doctrine\DBAL\Schema\SchemaManager - */ - public function getSchemaManager() - { - if ( ! $this->_schemaManager) { - $this->_schemaManager = $this->_driver->getSchemaManager($this); - } - - return $this->_schemaManager; - } - - /** - * Marks the current transaction so that the only possible - * outcome for the transaction to be rolled back. - * - * @throws ConnectionException If no transaction is active. - */ - public function setRollbackOnly() - { - if ($this->_transactionNestingLevel == 0) { - throw ConnectionException::noActiveTransaction(); - } - $this->_isRollbackOnly = true; - } - - /** - * Check whether the current transaction is marked for rollback only. - * - * @return boolean - * @throws ConnectionException If no transaction is active. - */ - public function isRollbackOnly() - { - if ($this->_transactionNestingLevel == 0) { - throw ConnectionException::noActiveTransaction(); - } - return $this->_isRollbackOnly; - } - - /** - * Converts a given value to its database representation according to the conversion - * rules of a specific DBAL mapping type. - * - * @param mixed $value The value to convert. - * @param string $type The name of the DBAL mapping type. - * @return mixed The converted value. - */ - public function convertToDatabaseValue($value, $type) - { - return Type::getType($type)->convertToDatabaseValue($value, $this->_platform); - } - - /** - * Converts a given value to its PHP representation according to the conversion - * rules of a specific DBAL mapping type. - * - * @param mixed $value The value to convert. - * @param string $type The name of the DBAL mapping type. - * @return mixed The converted type. - */ - public function convertToPHPValue($value, $type) - { - return Type::getType($type)->convertToPHPValue($value, $this->_platform); - } - - /** - * Binds a set of parameters, some or all of which are typed with a PDO binding type - * or DBAL mapping type, to a given statement. - * - * @param $stmt The statement to bind the values to. - * @param array $params The map/list of named/positional parameters. - * @param array $types The parameter types (PDO binding types or DBAL mapping types). - * @internal Duck-typing used on the $stmt parameter to support driver statements as well as - * raw PDOStatement instances. - */ - private function _bindTypedValues($stmt, array $params, array $types) - { - // Check whether parameters are positional or named. Mixing is not allowed, just like in PDO. - if (is_int(key($params))) { - // Positional parameters - $typeOffset = isset($types[0]) ? -1 : 0; - $bindIndex = 1; - foreach ($params as $position => $value) { - $typeIndex = $bindIndex + $typeOffset; - if (isset($types[$typeIndex])) { - $type = $types[$typeIndex]; - if (is_string($type)) { - $type = Type::getType($type); - } - if ($type instanceof Type) { - $value = $type->convertToDatabaseValue($value, $this->_platform); - $bindingType = $type->getBindingType(); - } else { - $bindingType = $type; // PDO::PARAM_* constants - } - $stmt->bindValue($bindIndex, $value, $bindingType); - } else { - $stmt->bindValue($bindIndex, $value); - } - ++$bindIndex; - } - } else { - // Named parameters - foreach ($params as $name => $value) { - if (isset($types[$name])) { - $type = $types[$name]; - if (is_string($type)) { - $type = Type::getType($type); - } - if ($type instanceof Type) { - $value = $type->convertToDatabaseValue($value, $this->_platform); - $bindingType = $type->getBindingType(); - } else { - $bindingType = $type; // PDO::PARAM_* constants - } - $stmt->bindValue($name, $value, $bindingType); - } else { - $stmt->bindValue($name, $value); - } - } - } - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/ConnectionException.php b/lib/Doctrine/DBAL/ConnectionException.php deleted file mode 100644 index 9ed596327..000000000 --- a/lib/Doctrine/DBAL/ConnectionException.php +++ /dev/null @@ -1,44 +0,0 @@ -. - */ - -namespace Doctrine\DBAL; - -/** - * Doctrine\DBAL\ConnectionException - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 4628 $ - * @author Jonathan H. Wage . - */ - -namespace Doctrine\DBAL; - -/** - * Driver interface. - * Interface that all DBAL drivers must implement. - * - * @since 2.0 - */ -interface Driver -{ - /** - * Attempts to create a connection with the database. - * - * @param array $params All connection parameters passed by the user. - * @param string $username The username to use when connecting. - * @param string $password The password to use when connecting. - * @param array $driverOptions The driver options to use when connecting. - * @return Doctrine\DBAL\Driver\Connection The database connection. - */ - public function connect(array $params, $username = null, $password = null, array $driverOptions = array()); - - /** - * Gets the DatabasePlatform instance that provides all the metadata about - * the platform this driver connects to. - * - * @return Doctrine\DBAL\Platforms\AbstractPlatform The database platform. - */ - public function getDatabasePlatform(); - - /** - * Gets the SchemaManager that can be used to inspect and change the underlying - * database schema of the platform this driver connects to. - * - * @param Doctrine\DBAL\Connection $conn - * @return Doctrine\DBAL\SchemaManager - */ - public function getSchemaManager(Connection $conn); - - /** - * Gets the name of the driver. - * - * @return string The name of the driver. - */ - public function getName(); - - /** - * Get the name of the database connected to for this driver. - * - * @param Doctrine\DBAL\Connection $conn - * @return string $database - */ - public function getDatabase(Connection $conn); -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/Connection.php b/lib/Doctrine/DBAL/Driver/Connection.php deleted file mode 100644 index 4cc5776a6..000000000 --- a/lib/Doctrine/DBAL/Driver/Connection.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver; - -/** - * Connection interface. - * Driver connections must implement this interface. - * - * This resembles (a subset of) the PDO interface. - * - * @since 2.0 - */ -interface Connection -{ - function prepare($prepareString); - function query(); - function quote($input, $type=\PDO::PARAM_STR); - function exec($statement); - function lastInsertId($name = null); - function beginTransaction(); - function commit(); - function rollBack(); - function errorCode(); - function errorInfo(); -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Connection.php b/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Connection.php deleted file mode 100644 index 5d706de7b..000000000 --- a/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Connection.php +++ /dev/null @@ -1,115 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Driver\IBMDB2; - -class DB2Connection implements \Doctrine\DBAL\Driver\Connection -{ - private $_conn = null; - - public function __construct(array $params, $username, $password, $driverOptions = array()) - { - $isPersistant = (isset($params['persistent']) && $params['persistent'] == true); - - if ($isPersistant) { - $this->_conn = db2_pconnect($params['dbname'], $username, $password, $driverOptions); - } else { - $this->_conn = db2_connect($params['dbname'], $username, $password, $driverOptions); - } - if (!$this->_conn) { - throw new DB2Exception(db2_conn_errormsg()); - } - } - - function prepare($sql) - { - $stmt = @db2_prepare($this->_conn, $sql); - if (!$stmt) { - throw new DB2Exception(db2_stmt_errormsg()); - } - return new DB2Statement($stmt); - } - - function query() - { - $args = func_get_args(); - $sql = $args[0]; - $stmt = $this->prepare($sql); - $stmt->execute(); - return $stmt; - } - - function quote($input, $type=\PDO::PARAM_STR) - { - $input = db2_escape_string($input); - if ($type == \PDO::PARAM_INT ) { - return $input; - } else { - return "'".$input."'"; - } - } - - function exec($statement) - { - $stmt = $this->prepare($statement); - $stmt->execute(); - return $stmt->rowCount(); - } - - function lastInsertId($name = null) - { - return db2_last_insert_id($this->_conn); - } - - function beginTransaction() - { - db2_autocommit($this->_conn, DB2_AUTOCOMMIT_OFF); - } - - function commit() - { - if (!db2_commit($this->_conn)) { - throw new DB2Exception(db2_conn_errormsg($this->_conn)); - } - db2_autocommit($this->_conn, DB2_AUTOCOMMIT_ON); - } - - function rollBack() - { - if (!db2_rollback($this->_conn)) { - throw new DB2Exception(db2_conn_errormsg($this->_conn)); - } - db2_autocommit($this->_conn, DB2_AUTOCOMMIT_ON); - } - - function errorCode() - { - return db2_conn_error($this->_conn); - } - - function errorInfo() - { - return array( - 0 => db2_conn_errormsg($this->_conn), - 1 => $this->errorCode(), - ); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Driver.php b/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Driver.php deleted file mode 100644 index b32dcbd47..000000000 --- a/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Driver.php +++ /dev/null @@ -1,108 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Driver\IBMDB2; - -use Doctrine\DBAL\Driver, - Doctrine\DBAL\Connection; - -/** - * IBM DB2 Driver - * - * @since 2.0 - * @author Benjamin Eberlei - */ -class DB2Driver implements Driver -{ - /** - * Attempts to create a connection with the database. - * - * @param array $params All connection parameters passed by the user. - * @param string $username The username to use when connecting. - * @param string $password The password to use when connecting. - * @param array $driverOptions The driver options to use when connecting. - * @return Doctrine\DBAL\Driver\Connection The database connection. - */ - public function connect(array $params, $username = null, $password = null, array $driverOptions = array()) - { - if ( !isset($params['schema']) ) { - - } - - if ($params['host'] !== 'localhost' && $params['host'] != '127.0.0.1') { - // if the host isn't localhost, use extended connection params - $params['dbname'] = 'DRIVER={IBM DB2 ODBC DRIVER}' . - ';DATABASE=' . $params['dbname'] . - ';HOSTNAME=' . $params['host'] . - ';PORT=' . $params['port'] . - ';PROTOCOL=' . $params['protocol'] . - ';UID=' . $username . - ';PWD=' . $password .';'; - $username = null; - $password = null; - } - - return new DB2Connection($params, $username, $password, $driverOptions); - } - - /** - * Gets the DatabasePlatform instance that provides all the metadata about - * the platform this driver connects to. - * - * @return Doctrine\DBAL\Platforms\AbstractPlatform The database platform. - */ - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\DB2Platform; - } - - /** - * Gets the SchemaManager that can be used to inspect and change the underlying - * database schema of the platform this driver connects to. - * - * @param Doctrine\DBAL\Connection $conn - * @return Doctrine\DBAL\SchemaManager - */ - public function getSchemaManager(Connection $conn) - { - return new \Doctrine\DBAL\Schema\DB2SchemaManager($conn); - } - - /** - * Gets the name of the driver. - * - * @return string The name of the driver. - */ - public function getName() - { - return 'ibm_db2'; - } - - /** - * Get the name of the database connected to for this driver. - * - * @param Doctrine\DBAL\Connection $conn - * @return string $database - */ - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return $params['dbname']; - } -} diff --git a/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Exception.php b/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Exception.php deleted file mode 100644 index b2a8de63a..000000000 --- a/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Exception.php +++ /dev/null @@ -1,27 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Driver\IBMDB2; - -class DB2Exception extends \Exception -{ - -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Statement.php b/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Statement.php deleted file mode 100644 index 41bff920e..000000000 --- a/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Statement.php +++ /dev/null @@ -1,297 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Driver\IBMDB2; - -class DB2Statement implements \Doctrine\DBAL\Driver\Statement -{ - private $_stmt = null; - - private $_bindParam = array(); - - /** - * DB2_BINARY, DB2_CHAR, DB2_DOUBLE, or DB2_LONG - * @var - */ - static private $_typeMap = array( - \PDO::PARAM_INT => DB2_LONG, - \PDO::PARAM_STR => DB2_CHAR, - ); - - public function __construct($stmt) - { - $this->_stmt = $stmt; - } - - /** - * Binds a value to a corresponding named or positional - * placeholder in the SQL statement that was used to prepare the statement. - * - * @param mixed $param Parameter identifier. For a prepared statement using named placeholders, - * this will be a parameter name of the form :name. For a prepared statement - * using question mark placeholders, this will be the 1-indexed position of the parameter - * - * @param mixed $value The value to bind to the parameter. - * @param integer $type Explicit data type for the parameter using the PDO::PARAM_* constants. - * - * @return boolean Returns TRUE on success or FALSE on failure. - */ - function bindValue($param, $value, $type = null) - { - return $this->bindParam($param, $value, $type); - } - - /** - * Binds a PHP variable to a corresponding named or question mark placeholder in the - * SQL statement that was use to prepare the statement. Unlike PDOStatement->bindValue(), - * the variable is bound as a reference and will only be evaluated at the time - * that PDOStatement->execute() is called. - * - * Most parameters are input parameters, that is, parameters that are - * used in a read-only fashion to build up the query. Some drivers support the invocation - * of stored procedures that return data as output parameters, and some also as input/output - * parameters that both send in data and are updated to receive it. - * - * @param mixed $param Parameter identifier. For a prepared statement using named placeholders, - * this will be a parameter name of the form :name. For a prepared statement - * using question mark placeholders, this will be the 1-indexed position of the parameter - * - * @param mixed $variable Name of the PHP variable to bind to the SQL statement parameter. - * - * @param integer $type Explicit data type for the parameter using the PDO::PARAM_* constants. To return - * an INOUT parameter from a stored procedure, use the bitwise OR operator to set the - * PDO::PARAM_INPUT_OUTPUT bits for the data_type parameter. - * @return boolean Returns TRUE on success or FALSE on failure. - */ - function bindParam($column, &$variable, $type = null) - { - $this->_bindParam[$column] =& $variable; - - if ($type && isset(self::$_typeMap[$type])) { - $type = self::$_typeMap[$type]; - } else { - $type = DB2_CHAR; - } - - if (!db2_bind_param($this->_stmt, $column, "variable", DB2_PARAM_IN, $type)) { - throw new DB2Exception(db2_stmt_errormsg()); - } - return true; - } - - /** - * Closes the cursor, enabling the statement to be executed again. - * - * @return boolean Returns TRUE on success or FALSE on failure. - */ - function closeCursor() - { - if (!$this->_stmt) { - return false; - } - - $this->_bindParam = array(); - db2_free_result($this->_stmt); - $ret = db2_free_stmt($this->_stmt); - $this->_stmt = false; - return $ret; - } - - /** - * columnCount - * Returns the number of columns in the result set - * - * @return integer Returns the number of columns in the result set represented - * by the PDOStatement object. If there is no result set, - * this method should return 0. - */ - function columnCount() - { - if (!$this->_stmt) { - return false; - } - return db2_num_fields($this->_stmt); - } - - /** - * errorCode - * Fetch the SQLSTATE associated with the last operation on the statement handle - * - * @see Doctrine_Adapter_Interface::errorCode() - * @return string error code string - */ - function errorCode() - { - return db2_stmt_error(); - } - - /** - * errorInfo - * Fetch extended error information associated with the last operation on the statement handle - * - * @see Doctrine_Adapter_Interface::errorInfo() - * @return array error info array - */ - function errorInfo() - { - return array( - 0 => db2_stmt_errormsg(), - 1 => db2_stmt_error(), - ); - } - - /** - * Executes a prepared statement - * - * If the prepared statement included parameter markers, you must either: - * call PDOStatement->bindParam() to bind PHP variables to the parameter markers: - * bound variables pass their value as input and receive the output value, - * if any, of their associated parameter markers or pass an array of input-only - * parameter values - * - * - * @param array $params An array of values with as many elements as there are - * bound parameters in the SQL statement being executed. - * @return boolean Returns TRUE on success or FALSE on failure. - */ - function execute($params = null) - { - if (!$this->_stmt) { - return false; - } - - /*$retval = true; - if ($params !== null) { - $retval = @db2_execute($this->_stmt, $params); - } else { - $retval = @db2_execute($this->_stmt); - }*/ - if ($params === null) { - ksort($this->_bindParam); - $params = array_values($this->_bindParam); - } - $retval = @db2_execute($this->_stmt, $params); - - if ($retval === false) { - throw new DB2Exception(db2_stmt_errormsg()); - } - return $retval; - } - - /** - * fetch - * - * @see Query::HYDRATE_* constants - * @param integer $fetchStyle Controls how the next row will be returned to the caller. - * This value must be one of the Query::HYDRATE_* constants, - * defaulting to Query::HYDRATE_BOTH - * - * @param integer $cursorOrientation For a PDOStatement object representing a scrollable cursor, - * this value determines which row will be returned to the caller. - * This value must be one of the Query::HYDRATE_ORI_* constants, defaulting to - * Query::HYDRATE_ORI_NEXT. To request a scrollable cursor for your - * PDOStatement object, - * you must set the PDO::ATTR_CURSOR attribute to Doctrine::CURSOR_SCROLL when you - * prepare the SQL statement with Doctrine_Adapter_Interface->prepare(). - * - * @param integer $cursorOffset For a PDOStatement object representing a scrollable cursor for which the - * $cursorOrientation parameter is set to Query::HYDRATE_ORI_ABS, this value specifies - * the absolute number of the row in the result set that shall be fetched. - * - * For a PDOStatement object representing a scrollable cursor for - * which the $cursorOrientation parameter is set to Query::HYDRATE_ORI_REL, this value - * specifies the row to fetch relative to the cursor position before - * PDOStatement->fetch() was called. - * - * @return mixed - */ - function fetch($fetchStyle = \PDO::FETCH_BOTH) - { - switch ($fetchStyle) { - case \PDO::FETCH_BOTH: - return db2_fetch_both($this->_stmt); - case \PDO::FETCH_ASSOC: - return db2_fetch_assoc($this->_stmt); - case \PDO::FETCH_NUM: - return db2_fetch_array($this->_stmt); - default: - throw new DB2Exception("Given Fetch-Style " . $fetchStyle . " is not supported."); - } - } - - /** - * Returns an array containing all of the result set rows - * - * @param integer $fetchStyle Controls how the next row will be returned to the caller. - * This value must be one of the Query::HYDRATE_* constants, - * defaulting to Query::HYDRATE_BOTH - * - * @param integer $columnIndex Returns the indicated 0-indexed column when the value of $fetchStyle is - * Query::HYDRATE_COLUMN. Defaults to 0. - * - * @return array - */ - function fetchAll($fetchStyle = \PDO::FETCH_BOTH) - { - $rows = array(); - while ($row = $this->fetch($fetchStyle)) { - $rows[] = $row; - } - return $rows; - } - - /** - * fetchColumn - * Returns a single column from the next row of a - * result set or FALSE if there are no more rows. - * - * @param integer $columnIndex 0-indexed number of the column you wish to retrieve from the row. If no - * value is supplied, PDOStatement->fetchColumn() - * fetches the first column. - * - * @return string returns a single column in the next row of a result set. - */ - function fetchColumn($columnIndex = 0) - { - $row = $this->fetch(\PDO::FETCH_NUM); - if ($row && isset($row[$columnIndex])) { - return $row[$columnIndex]; - } - return false; - } - - /** - * rowCount - * rowCount() returns the number of rows affected by the last DELETE, INSERT, or UPDATE statement - * executed by the corresponding object. - * - * If the last SQL statement executed by the associated Statement object was a SELECT statement, - * some databases may return the number of rows returned by that statement. However, - * this behaviour is not guaranteed for all databases and should not be - * relied on for portable applications. - * - * @return integer Returns the number of rows. - */ - function rowCount() - { - return (@db2_num_rows($this->_stmt))?:0; - } -} diff --git a/lib/Doctrine/DBAL/Driver/OCI8/Driver.php b/lib/Doctrine/DBAL/Driver/OCI8/Driver.php deleted file mode 100644 index c62020ba7..000000000 --- a/lib/Doctrine/DBAL/Driver/OCI8/Driver.php +++ /dev/null @@ -1,93 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\OCI8; - -use Doctrine\DBAL\Platforms; - -/** - * A Doctrine DBAL driver for the Oracle OCI8 PHP extensions. - * - * @author Roman Borschel - * @since 2.0 - */ -class Driver implements \Doctrine\DBAL\Driver -{ - public function connect(array $params, $username = null, $password = null, array $driverOptions = array()) - { - return new OCI8Connection( - $username, - $password, - $this->_constructDsn($params) - ); - } - - /** - * Constructs the Oracle DSN. - * - * @return string The DSN. - */ - private function _constructDsn(array $params) - { - $dsn = ''; - if (isset($params['host'])) { - $dsn .= '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)' . - '(HOST=' . $params['host'] . ')'; - - if (isset($params['port'])) { - $dsn .= '(PORT=' . $params['port'] . ')'; - } else { - $dsn .= '(PORT=1521)'; - } - - $dsn .= '))(CONNECT_DATA=(SID=' . $params['dbname'] . ')))'; - } else { - $dsn .= $params['dbname']; - } - - if (isset($params['charset'])) { - $dsn .= ';charset=' . $params['charset']; - } - - return $dsn; - } - - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\OraclePlatform(); - } - - public function getSchemaManager(\Doctrine\DBAL\Connection $conn) - { - return new \Doctrine\DBAL\Schema\OracleSchemaManager($conn); - } - - public function getName() - { - return 'oci8'; - } - - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return $params['user']; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/OCI8/OCI8Connection.php b/lib/Doctrine/DBAL/Driver/OCI8/OCI8Connection.php deleted file mode 100644 index 987bf6c0c..000000000 --- a/lib/Doctrine/DBAL/Driver/OCI8/OCI8Connection.php +++ /dev/null @@ -1,108 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\OCI8; - -/** - * OCI8 implementation of the Connection interface. - * - * @since 2.0 - */ -class OCI8Connection implements \Doctrine\DBAL\Driver\Connection -{ - private $_dbh; - - public function __construct($username, $password, $db) - { - $this->_dbh = @oci_connect($username, $password, $db); - if (!$this->_dbh) { - throw new OCI8Exception($this->errorInfo()); - } - } - - public function prepare($prepareString) - { - return new OCI8Statement($this->_dbh, $prepareString); - } - - public function query() - { - $args = func_get_args(); - $sql = $args[0]; - //$fetchMode = $args[1]; - $stmt = $this->prepare($sql); - $stmt->execute(); - return $stmt; - } - - public function quote($input, $type=\PDO::PARAM_STR) - { - return is_numeric($input) ? $input : "'$input'"; - } - - public function exec($statement) - { - $stmt = $this->prepare($statement); - $stmt->execute(); - return $stmt->rowCount(); - } - - public function lastInsertId($name = null) - { - //TODO: throw exception or support sequences? - } - - public function beginTransaction() - { - return true; - } - - public function commit() - { - if (!oci_commit($this->_dbh)) { - throw OCI8Exception::fromErrorInfo($this->errorInfo()); - } - return true; - } - - public function rollBack() - { - if (!oci_rollback($this->_dbh)) { - throw OCI8Exception::fromErrorInfo($this->errorInfo()); - } - return true; - } - - public function errorCode() - { - $error = oci_error($this->_dbh); - if ($error !== false) { - $error = $error['code']; - } - return $error; - } - - public function errorInfo() - { - return oci_error($this->_dbh); - } - -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/OCI8/OCI8Exception.php b/lib/Doctrine/DBAL/Driver/OCI8/OCI8Exception.php deleted file mode 100644 index 66fe615a1..000000000 --- a/lib/Doctrine/DBAL/Driver/OCI8/OCI8Exception.php +++ /dev/null @@ -1,30 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Driver\OCI8; - -class OCI8Exception extends \Exception -{ - static public function fromErrorInfo($error) - { - return new self($error['message'], $error['code']); - } -} diff --git a/lib/Doctrine/DBAL/Driver/OCI8/OCI8Statement.php b/lib/Doctrine/DBAL/Driver/OCI8/OCI8Statement.php deleted file mode 100644 index 1f1b0567c..000000000 --- a/lib/Doctrine/DBAL/Driver/OCI8/OCI8Statement.php +++ /dev/null @@ -1,200 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\OCI8; - -use \PDO; - -/** - * The OCI8 implementation of the Statement interface. - * - * @since 2.0 - * @author Roman Borschel - */ -class OCI8Statement implements \Doctrine\DBAL\Driver\Statement -{ - /** Statement handle. */ - private $_sth; - private $_paramCounter = 0; - private static $_PARAM = ':param'; - private static $fetchStyleMap = array( - PDO::FETCH_BOTH => OCI_BOTH, - PDO::FETCH_ASSOC => OCI_ASSOC, - PDO::FETCH_NUM => OCI_NUM - ); - private $_paramMap = array(); - - /** - * Creates a new OCI8Statement that uses the given connection handle and SQL statement. - * - * @param resource $dbh The connection handle. - * @param string $statement The SQL statement. - */ - public function __construct($dbh, $statement) - { - $this->_sth = oci_parse($dbh, $this->_convertPositionalToNamedPlaceholders($statement)); - } - - /** - * Oracle does not support positional parameters, hence this method converts all - * positional parameters into artificially named parameters. Note that this conversion - * is not perfect. All question marks (?) in the original statement are treated as - * placeholders and converted to a named parameter. - * - * @param string $statement The SQL statement to convert. - * @todo review and test for lost spaces. we experienced missing spaces with oci8 in some sql statements. - */ - private function _convertPositionalToNamedPlaceholders($statement) - { - $count = 1; - while (($pos = strpos($statement, '?')) !== false) { - $this->_paramMap[$count] = ":param$count"; - $statement = substr_replace($statement, ":param$count", $pos, 1); - ++$count; - } - - return $statement; - } - - /** - * {@inheritdoc} - */ - public function bindValue($param, $value, $type = null) - { - return $this->bindParam($param, $value, $type); - } - - /** - * {@inheritdoc} - */ - public function bindParam($column, &$variable, $type = null) - { - $column = isset($this->_paramMap[$column]) ? $this->_paramMap[$column] : $column; - - return oci_bind_by_name($this->_sth, $column, $variable); - } - - /** - * Closes the cursor, enabling the statement to be executed again. - * - * @return boolean Returns TRUE on success or FALSE on failure. - */ - public function closeCursor() - { - return oci_free_statement($this->_sth); - } - - /** - * {@inheritdoc} - */ - public function columnCount() - { - return oci_num_fields($this->_sth); - } - - /** - * {@inheritdoc} - */ - public function errorCode() - { - $error = oci_error($this->_sth); - if ($error !== false) { - $error = $error['code']; - } - return $error; - } - - /** - * {@inheritdoc} - */ - public function errorInfo() - { - return oci_error($this->_sth); - } - - /** - * {@inheritdoc} - */ - public function execute($params = null) - { - if ($params) { - $hasZeroIndex = isset($params[0]); - foreach ($params as $key => $val) { - if ($hasZeroIndex && is_numeric($key)) { - $this->bindValue($key + 1, $val); - } else { - $this->bindValue($key, $val); - } - } - } - - $ret = @oci_execute($this->_sth, OCI_DEFAULT); - if ( ! $ret) { - throw OCI8Exception::fromErrorInfo($this->errorInfo()); - } - return $ret; - } - - /** - * {@inheritdoc} - */ - public function fetch($fetchStyle = PDO::FETCH_BOTH) - { - if ( ! isset(self::$fetchStyleMap[$fetchStyle])) { - throw new \InvalidArgumentException("Invalid fetch style: " . $fetchStyle); - } - - return oci_fetch_array($this->_sth, self::$fetchStyleMap[$fetchStyle] | OCI_RETURN_NULLS | OCI_RETURN_LOBS); - } - - /** - * {@inheritdoc} - */ - public function fetchAll($fetchStyle = PDO::FETCH_BOTH) - { - if ( ! isset(self::$fetchStyleMap[$fetchStyle])) { - throw new \InvalidArgumentException("Invalid fetch style: " . $fetchStyle); - } - - $result = array(); - oci_fetch_all($this->_sth, $result, 0, -1, - self::$fetchStyleMap[$fetchStyle] | OCI_RETURN_NULLS | OCI_FETCHSTATEMENT_BY_ROW | OCI_RETURN_LOBS); - - return $result; - } - - /** - * {@inheritdoc} - */ - public function fetchColumn($columnIndex = 0) - { - $row = oci_fetch_row($this->_sth); - return $row[$columnIndex]; - } - - /** - * {@inheritdoc} - */ - public function rowCount() - { - return oci_num_rows($this->_sth); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/PDOConnection.php b/lib/Doctrine/DBAL/Driver/PDOConnection.php deleted file mode 100644 index f0068077e..000000000 --- a/lib/Doctrine/DBAL/Driver/PDOConnection.php +++ /dev/null @@ -1,40 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver; - -use \PDO; - -/** - * PDO implementation of the Connection interface. - * Used by all PDO-based drivers. - * - * @since 2.0 - */ -class PDOConnection extends PDO implements Connection -{ - public function __construct($dsn, $user = null, $password = null, array $options = null) - { - parent::__construct($dsn, $user, $password, $options); - $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Doctrine\DBAL\Driver\PDOStatement', array())); - $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/PDOIbm/Driver.php b/lib/Doctrine/DBAL/Driver/PDOIbm/Driver.php deleted file mode 100644 index 844f2ab3f..000000000 --- a/lib/Doctrine/DBAL/Driver/PDOIbm/Driver.php +++ /dev/null @@ -1,126 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Driver\PDOIbm; - -use Doctrine\DBAL\Connection; - -/** - * Driver for the PDO IBM extension - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Driver implements \Doctrine\DBAL\Driver -{ - /** - * Attempts to establish a connection with the underlying driver. - * - * @param array $params - * @param string $username - * @param string $password - * @param array $driverOptions - * @return Doctrine\DBAL\Driver\Connection - */ - public function connect(array $params, $username = null, $password = null, array $driverOptions = array()) - { - $conn = new \Doctrine\DBAL\Driver\PDOConnection( - $this->_constructPdoDsn($params), - $username, - $password, - $driverOptions - ); - return $conn; - } - - /** - * Constructs the MySql PDO DSN. - * - * @return string The DSN. - */ - private function _constructPdoDsn(array $params) - { - $dsn = 'ibm:'; - if (isset($params['host'])) { - $dsn .= 'HOSTNAME=' . $params['host'] . ';'; - } - if (isset($params['port'])) { - $dsn .= 'PORT=' . $params['port'] . ';'; - } - $dsn .= 'PROTOCOL=TCPIP;'; - if (isset($params['dbname'])) { - $dsn .= 'DATABASE=' . $params['dbname'] . ';'; - } - - return $dsn; - } - - /** - * Gets the DatabasePlatform instance that provides all the metadata about - * the platform this driver connects to. - * - * @return Doctrine\DBAL\Platforms\AbstractPlatform The database platform. - */ - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\DB2Platform; - } - - /** - * Gets the SchemaManager that can be used to inspect and change the underlying - * database schema of the platform this driver connects to. - * - * @param Doctrine\DBAL\Connection $conn - * @return Doctrine\DBAL\SchemaManager - */ - public function getSchemaManager(Connection $conn) - { - return new \Doctrine\DBAL\Schema\DB2SchemaManager($conn); - } - - /** - * Gets the name of the driver. - * - * @return string The name of the driver. - */ - public function getName() - { - return 'pdo_ibm'; - } - - /** - * Get the name of the database connected to for this driver. - * - * @param Doctrine\DBAL\Connection $conn - * @return string $database - */ - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return $params['dbname']; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/PDOMsSql/Connection.php b/lib/Doctrine/DBAL/Driver/PDOMsSql/Connection.php deleted file mode 100644 index b9ff38899..000000000 --- a/lib/Doctrine/DBAL/Driver/PDOMsSql/Connection.php +++ /dev/null @@ -1,65 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\PDOMsSql; - -use PDO, Doctrine\DBAL\Driver\Connection as DriverConnection; - -/** - * MsSql Connection implementation. - * - * @since 2.0 - */ -class Connection extends PDO implements DriverConnection -{ - /** - * {@inheritdoc} - */ - public function rollback() - { - $this->exec('ROLLBACK TRANSACTION'); - } - - /** - * {@inheritdoc} - */ - public function commit() - { - $this->exec('COMMIT TRANSACTION'); - } - - /** - * {@inheritdoc} - */ - public function beginTransaction() - { - $this->exec('BEGIN TRANSACTION'); - } - - /** - * {@inheritdoc} - */ - public function lastInsertId($name = null) - { - $stmt = $this->query('SELECT SCOPE_IDENTITY()'); - $id = $stmt->fetchColumn(); - $stmt->closeCursor(); - return $id; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/PDOMsSql/Driver.php b/lib/Doctrine/DBAL/Driver/PDOMsSql/Driver.php deleted file mode 100644 index 347a52e23..000000000 --- a/lib/Doctrine/DBAL/Driver/PDOMsSql/Driver.php +++ /dev/null @@ -1,84 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\PDOMsSql; - -/** - * The PDO-based MsSql driver. - * - * @since 2.0 - */ -class Driver implements \Doctrine\DBAL\Driver -{ - public function connect(array $params, $username = null, $password = null, array $driverOptions = array()) - { - return new Connection( - $this->_constructPdoDsn($params), - $username, - $password, - $driverOptions - ); - } - - /** - * Constructs the MsSql PDO DSN. - * - * @return string The DSN. - */ - private function _constructPdoDsn(array $params) - { - // TODO: This might need to be revisted once we have access to a mssql server - $dsn = 'mssql:'; - if (isset($params['host'])) { - $dsn .= 'host=' . $params['host'] . ';'; - } - if (isset($params['port'])) { - $dsn .= 'port=' . $params['port'] . ';'; - } - if (isset($params['dbname'])) { - $dsn .= 'dbname=' . $params['dbname'] . ';'; - } - - return $dsn; - } - - - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\MsSqlPlatform(); - } - - public function getSchemaManager(\Doctrine\DBAL\Connection $conn) - { - return new \Doctrine\DBAL\Schema\MsSqlSchemaManager($conn); - } - - public function getName() - { - return 'pdo_mssql'; - } - - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return $params['dbname']; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/PDOMySql/Driver.php b/lib/Doctrine/DBAL/Driver/PDOMySql/Driver.php deleted file mode 100644 index 71a7f9f27..000000000 --- a/lib/Doctrine/DBAL/Driver/PDOMySql/Driver.php +++ /dev/null @@ -1,95 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\PDOMySql; - -use Doctrine\DBAL\Connection; - -/** - * PDO MySql driver. - * - * @since 2.0 - */ -class Driver implements \Doctrine\DBAL\Driver -{ - /** - * Attempts to establish a connection with the underlying driver. - * - * @param array $params - * @param string $username - * @param string $password - * @param array $driverOptions - * @return Doctrine\DBAL\Driver\Connection - */ - public function connect(array $params, $username = null, $password = null, array $driverOptions = array()) - { - $conn = new \Doctrine\DBAL\Driver\PDOConnection( - $this->_constructPdoDsn($params), - $username, - $password, - $driverOptions - ); - return $conn; - } - - /** - * Constructs the MySql PDO DSN. - * - * @return string The DSN. - */ - private function _constructPdoDsn(array $params) - { - $dsn = 'mysql:'; - if (isset($params['host'])) { - $dsn .= 'host=' . $params['host'] . ';'; - } - if (isset($params['port'])) { - $dsn .= 'port=' . $params['port'] . ';'; - } - if (isset($params['dbname'])) { - $dsn .= 'dbname=' . $params['dbname'] . ';'; - } - if (isset($params['unix_socket'])) { - $dsn .= 'unix_socket=' . $params['unix_socket'] . ';'; - } - - return $dsn; - } - - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\MySqlPlatform(); - } - - public function getSchemaManager(\Doctrine\DBAL\Connection $conn) - { - return new \Doctrine\DBAL\Schema\MySqlSchemaManager($conn); - } - - public function getName() - { - return 'pdo_mysql'; - } - - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return $params['dbname']; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/PDOOracle/Driver.php b/lib/Doctrine/DBAL/Driver/PDOOracle/Driver.php deleted file mode 100644 index 61102ebeb..000000000 --- a/lib/Doctrine/DBAL/Driver/PDOOracle/Driver.php +++ /dev/null @@ -1,88 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\PDOOracle; - -use Doctrine\DBAL\Platforms; - -class Driver implements \Doctrine\DBAL\Driver -{ - public function connect(array $params, $username = null, $password = null, array $driverOptions = array()) - { - return new \Doctrine\DBAL\Driver\PDOConnection( - $this->_constructPdoDsn($params), - $username, - $password, - $driverOptions - ); - } - - /** - * Constructs the Oracle PDO DSN. - * - * @return string The DSN. - */ - private function _constructPdoDsn(array $params) - { - $dsn = 'oci:'; - if (isset($params['host'])) { - $dsn .= 'dbname=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)' . - '(HOST=' . $params['host'] . ')'; - - if (isset($params['port'])) { - $dsn .= '(PORT=' . $params['port'] . ')'; - } else { - $dsn .= '(PORT=1521)'; - } - - $dsn .= '))(CONNECT_DATA=(SID=' . $params['dbname'] . ')))'; - } else { - $dsn .= 'dbname=' . $params['dbname']; - } - - if (isset($params['charset'])) { - $dsn .= ';charset=' . $params['charset']; - } - - return $dsn; - } - - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\OraclePlatform(); - } - - public function getSchemaManager(\Doctrine\DBAL\Connection $conn) - { - return new \Doctrine\DBAL\Schema\OracleSchemaManager($conn); - } - - public function getName() - { - return 'pdo_oracle'; - } - - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return $params['user']; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/PDOPgSql/Driver.php b/lib/Doctrine/DBAL/Driver/PDOPgSql/Driver.php deleted file mode 100644 index 06c2a8987..000000000 --- a/lib/Doctrine/DBAL/Driver/PDOPgSql/Driver.php +++ /dev/null @@ -1,70 +0,0 @@ -_constructPdoDsn($params), - $username, - $password, - $driverOptions - ); - } - - /** - * Constructs the Postgres PDO DSN. - * - * @return string The DSN. - */ - private function _constructPdoDsn(array $params) - { - $dsn = 'pgsql:'; - if (isset($params['host'])) { - $dsn .= 'host=' . $params['host'] . ' '; - } - if (isset($params['port'])) { - $dsn .= 'port=' . $params['port'] . ' '; - } - if (isset($params['dbname'])) { - $dsn .= 'dbname=' . $params['dbname'] . ' '; - } - - return $dsn; - } - - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\PostgreSqlPlatform(); - } - - public function getSchemaManager(\Doctrine\DBAL\Connection $conn) - { - return new \Doctrine\DBAL\Schema\PostgreSqlSchemaManager($conn); - } - - public function getName() - { - return 'pdo_pgsql'; - } - - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return $params['dbname']; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/PDOSqlite/Driver.php b/lib/Doctrine/DBAL/Driver/PDOSqlite/Driver.php deleted file mode 100644 index 1721d5dc7..000000000 --- a/lib/Doctrine/DBAL/Driver/PDOSqlite/Driver.php +++ /dev/null @@ -1,116 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\PDOSqlite; - -/** - * The PDO Sqlite driver. - * - * @since 2.0 - */ -class Driver implements \Doctrine\DBAL\Driver -{ - /** - * @var array - */ - protected $_userDefinedFunctions = array( - 'sqrt' => array('callback' => array('Doctrine\DBAL\Platforms\SqlitePlatform', 'udfSqrt'), 'numArgs' => 1), - 'mod' => array('callback' => array('Doctrine\DBAL\Platforms\SqlitePlatform', 'udfMod'), 'numArgs' => 2), - 'locate' => array('callback' => array('Doctrine\DBAL\Platforms\SqlitePlatform', 'udfLocate'), 'numArgs' => -1), - ); - - /** - * Tries to establish a database connection to SQLite. - * - * @param array $params - * @param string $username - * @param string $password - * @param array $driverOptions - * @return Connection - */ - public function connect(array $params, $username = null, $password = null, array $driverOptions = array()) - { - if (isset($driverOptions['userDefinedFunctions'])) { - $this->_userDefinedFunctions = array_merge( - $this->_userDefinedFunctions, $driverOptions['userDefinedFunctions']); - unset($driverOptions['userDefinedFunctions']); - } - - $pdo = new \Doctrine\DBAL\Driver\PDOConnection( - $this->_constructPdoDsn($params), - $username, - $password, - $driverOptions - ); - - foreach ($this->_userDefinedFunctions AS $fn => $data) { - $pdo->sqliteCreateFunction($fn, $data['callback'], $data['numArgs']); - } - - return $pdo; - } - - /** - * Constructs the Sqlite PDO DSN. - * - * @return string The DSN. - * @override - */ - protected function _constructPdoDsn(array $params) - { - $dsn = 'sqlite:'; - if (isset($params['path'])) { - $dsn .= $params['path']; - } else if (isset($params['memory'])) { - $dsn .= ':memory:'; - } - - return $dsn; - } - - /** - * Gets the database platform that is relevant for this driver. - */ - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\SqlitePlatform(); - } - - /** - * Gets the schema manager that is relevant for this driver. - * - * @param Doctrine\DBAL\Connection $conn - * @return Doctrine\DBAL\Schema\SqliteSchemaManager - */ - public function getSchemaManager(\Doctrine\DBAL\Connection $conn) - { - return new \Doctrine\DBAL\Schema\SqliteSchemaManager($conn); - } - - public function getName() - { - return 'pdo_sqlite'; - } - - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return isset($params['path']) ? $params['path'] : null; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/PDOStatement.php b/lib/Doctrine/DBAL/Driver/PDOStatement.php deleted file mode 100644 index 50b1e211a..000000000 --- a/lib/Doctrine/DBAL/Driver/PDOStatement.php +++ /dev/null @@ -1,33 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver; - -/** - * The PDO implementation of the Statement interface. - * Used by all PDO-based drivers. - * - * @since 2.0 - */ -class PDOStatement extends \PDOStatement implements Statement -{ - private function __construct() {} -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Driver/Statement.php b/lib/Doctrine/DBAL/Driver/Statement.php deleted file mode 100644 index 6cb8b6402..000000000 --- a/lib/Doctrine/DBAL/Driver/Statement.php +++ /dev/null @@ -1,200 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver; - -use \PDO; - -/** - * Statement interface. - * Drivers must implement this interface. - * - * This resembles (a subset of) the PDOStatement interface. - * - * @author Konsta Vesterinen - * @author Roman Borschel - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - */ -interface Statement -{ - /** - * Binds a value to a corresponding named or positional - * placeholder in the SQL statement that was used to prepare the statement. - * - * @param mixed $param Parameter identifier. For a prepared statement using named placeholders, - * this will be a parameter name of the form :name. For a prepared statement - * using question mark placeholders, this will be the 1-indexed position of the parameter - * - * @param mixed $value The value to bind to the parameter. - * @param integer $type Explicit data type for the parameter using the PDO::PARAM_* constants. - * - * @return boolean Returns TRUE on success or FALSE on failure. - */ - function bindValue($param, $value, $type = null); - - /** - * Binds a PHP variable to a corresponding named or question mark placeholder in the - * SQL statement that was use to prepare the statement. Unlike PDOStatement->bindValue(), - * the variable is bound as a reference and will only be evaluated at the time - * that PDOStatement->execute() is called. - * - * Most parameters are input parameters, that is, parameters that are - * used in a read-only fashion to build up the query. Some drivers support the invocation - * of stored procedures that return data as output parameters, and some also as input/output - * parameters that both send in data and are updated to receive it. - * - * @param mixed $param Parameter identifier. For a prepared statement using named placeholders, - * this will be a parameter name of the form :name. For a prepared statement - * using question mark placeholders, this will be the 1-indexed position of the parameter - * - * @param mixed $variable Name of the PHP variable to bind to the SQL statement parameter. - * - * @param integer $type Explicit data type for the parameter using the PDO::PARAM_* constants. To return - * an INOUT parameter from a stored procedure, use the bitwise OR operator to set the - * PDO::PARAM_INPUT_OUTPUT bits for the data_type parameter. - * @return boolean Returns TRUE on success or FALSE on failure. - */ - function bindParam($column, &$variable, $type = null); - - /** - * Closes the cursor, enabling the statement to be executed again. - * - * @return boolean Returns TRUE on success or FALSE on failure. - */ - function closeCursor(); - - /** - * columnCount - * Returns the number of columns in the result set - * - * @return integer Returns the number of columns in the result set represented - * by the PDOStatement object. If there is no result set, - * this method should return 0. - */ - function columnCount(); - - /** - * errorCode - * Fetch the SQLSTATE associated with the last operation on the statement handle - * - * @see Doctrine_Adapter_Interface::errorCode() - * @return string error code string - */ - function errorCode(); - - /** - * errorInfo - * Fetch extended error information associated with the last operation on the statement handle - * - * @see Doctrine_Adapter_Interface::errorInfo() - * @return array error info array - */ - function errorInfo(); - - /** - * Executes a prepared statement - * - * If the prepared statement included parameter markers, you must either: - * call PDOStatement->bindParam() to bind PHP variables to the parameter markers: - * bound variables pass their value as input and receive the output value, - * if any, of their associated parameter markers or pass an array of input-only - * parameter values - * - * - * @param array $params An array of values with as many elements as there are - * bound parameters in the SQL statement being executed. - * @return boolean Returns TRUE on success or FALSE on failure. - */ - function execute($params = null); - - /** - * fetch - * - * @see Query::HYDRATE_* constants - * @param integer $fetchStyle Controls how the next row will be returned to the caller. - * This value must be one of the Query::HYDRATE_* constants, - * defaulting to Query::HYDRATE_BOTH - * - * @param integer $cursorOrientation For a PDOStatement object representing a scrollable cursor, - * this value determines which row will be returned to the caller. - * This value must be one of the Query::HYDRATE_ORI_* constants, defaulting to - * Query::HYDRATE_ORI_NEXT. To request a scrollable cursor for your - * PDOStatement object, - * you must set the PDO::ATTR_CURSOR attribute to Doctrine::CURSOR_SCROLL when you - * prepare the SQL statement with Doctrine_Adapter_Interface->prepare(). - * - * @param integer $cursorOffset For a PDOStatement object representing a scrollable cursor for which the - * $cursorOrientation parameter is set to Query::HYDRATE_ORI_ABS, this value specifies - * the absolute number of the row in the result set that shall be fetched. - * - * For a PDOStatement object representing a scrollable cursor for - * which the $cursorOrientation parameter is set to Query::HYDRATE_ORI_REL, this value - * specifies the row to fetch relative to the cursor position before - * PDOStatement->fetch() was called. - * - * @return mixed - */ - function fetch($fetchStyle = PDO::FETCH_BOTH); - - /** - * Returns an array containing all of the result set rows - * - * @param integer $fetchStyle Controls how the next row will be returned to the caller. - * This value must be one of the Query::HYDRATE_* constants, - * defaulting to Query::HYDRATE_BOTH - * - * @param integer $columnIndex Returns the indicated 0-indexed column when the value of $fetchStyle is - * Query::HYDRATE_COLUMN. Defaults to 0. - * - * @return array - */ - function fetchAll($fetchStyle = PDO::FETCH_BOTH); - - /** - * fetchColumn - * Returns a single column from the next row of a - * result set or FALSE if there are no more rows. - * - * @param integer $columnIndex 0-indexed number of the column you wish to retrieve from the row. If no - * value is supplied, PDOStatement->fetchColumn() - * fetches the first column. - * - * @return string returns a single column in the next row of a result set. - */ - function fetchColumn($columnIndex = 0); - - /** - * rowCount - * rowCount() returns the number of rows affected by the last DELETE, INSERT, or UPDATE statement - * executed by the corresponding object. - * - * If the last SQL statement executed by the associated Statement object was a SELECT statement, - * some databases may return the number of rows returned by that statement. However, - * this behaviour is not guaranteed for all databases and should not be - * relied on for portable applications. - * - * @return integer Returns the number of rows. - */ - function rowCount(); -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/DriverManager.php b/lib/Doctrine/DBAL/DriverManager.php deleted file mode 100644 index db91f1d37..000000000 --- a/lib/Doctrine/DBAL/DriverManager.php +++ /dev/null @@ -1,160 +0,0 @@ -. - */ - -namespace Doctrine\DBAL; - -use Doctrine\Common\EventManager; - -/** - * Factory for creating Doctrine\DBAL\Connection instances. - * - * @author Roman Borschel - * @since 2.0 - */ -final class DriverManager -{ - /** - * List of supported drivers and their mappings to the driver classes. - * - * @var array - * @todo REMOVE. Users should directly supply class names instead. - */ - private static $_driverMap = array( - 'pdo_mysql' => 'Doctrine\DBAL\Driver\PDOMySql\Driver', - 'pdo_sqlite' => 'Doctrine\DBAL\Driver\PDOSqlite\Driver', - 'pdo_pgsql' => 'Doctrine\DBAL\Driver\PDOPgSql\Driver', - 'pdo_oci' => 'Doctrine\DBAL\Driver\PDOOracle\Driver', - 'pdo_mssql' => 'Doctrine\DBAL\Driver\PDOMsSql\Driver', - 'oci8' => 'Doctrine\DBAL\Driver\OCI8\Driver', - 'ibm_db2' => 'Doctrine\DBAL\Driver\IBMDB2\DB2Driver', - 'pdo_ibm' => 'Doctrine\DBAL\Driver\PDOIbm\Driver', - ); - - /** Private constructor. This class cannot be instantiated. */ - private function __construct() { } - - /** - * Creates a connection object based on the specified parameters. - * This method returns a Doctrine\DBAL\Connection which wraps the underlying - * driver connection. - * - * $params must contain at least one of the following. - * - * Either 'driver' with one of the following values: - * pdo_mysql - * pdo_sqlite - * pdo_pgsql - * pdo_oracle - * pdo_mssql - * - * OR 'driverClass' that contains the full class name (with namespace) of the - * driver class to instantiate. - * - * Other (optional) parameters: - * - * user (string): - * The username to use when connecting. - * - * password (string): - * The password to use when connecting. - * - * driverOptions (array): - * Any additional driver-specific options for the driver. These are just passed - * through to the driver. - * - * pdo: - * You can pass an existing PDO instance through this parameter. The PDO - * instance will be wrapped in a Doctrine\DBAL\Connection. - * - * wrapperClass: - * You may specify a custom wrapper class through the 'wrapperClass' - * parameter but this class MUST inherit from Doctrine\DBAL\Connection. - * - * @param array $params The parameters. - * @param Doctrine\DBAL\Configuration The configuration to use. - * @param Doctrine\Common\EventManager The event manager to use. - * @return Doctrine\DBAL\Connection - */ - public static function getConnection( - array $params, - Configuration $config = null, - EventManager $eventManager = null) - { - // create default config and event manager, if not set - if ( ! $config) { - $config = new Configuration(); - } - if ( ! $eventManager) { - $eventManager = new EventManager(); - } - - // check for existing pdo object - if (isset($params['pdo']) && ! $params['pdo'] instanceof \PDO) { - throw DBALException::invalidPdoInstance(); - } else if (isset($params['pdo'])) { - $params['driver'] = 'pdo_' . $params['pdo']->getAttribute(\PDO::ATTR_DRIVER_NAME); - } else { - self::_checkParams($params); - } - if (isset($params['driverClass'])) { - $className = $params['driverClass']; - } else { - $className = self::$_driverMap[$params['driver']]; - } - - $driver = new $className(); - - $wrapperClass = 'Doctrine\DBAL\Connection'; - if (isset($params['wrapperClass'])) { - if (is_subclass_of($params['wrapperClass'], $wrapperClass)) { - $wrapperClass = $params['wrapperClass']; - } else { - throw DBALException::invalidWrapperClass($params['wrapperClass']); - } - } - - return new $wrapperClass($params, $driver, $config, $eventManager); - } - - /** - * Checks the list of parameters. - * - * @param array $params - */ - private static function _checkParams(array $params) - { - // check existance of mandatory parameters - - // driver - if ( ! isset($params['driver']) && ! isset($params['driverClass'])) { - throw DBALException::driverRequired(); - } - - // check validity of parameters - - // driver - if ( isset($params['driver']) && ! isset(self::$_driverMap[$params['driver']])) { - throw DBALException::unknownDriver($params['driver'], array_keys(self::$_driverMap)); - } - - if (isset($params['driverClass']) && ! in_array('Doctrine\DBAL\Driver', class_implements($params['driverClass'], true))) { - throw DBALException::invalidDriverClass($params['driverClass']); - } - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Event/ConnectionEventArgs.php b/lib/Doctrine/DBAL/Event/ConnectionEventArgs.php deleted file mode 100644 index ce80ecd4d..000000000 --- a/lib/Doctrine/DBAL/Event/ConnectionEventArgs.php +++ /dev/null @@ -1,79 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\Common\EventArgs, - Doctrine\DBAL\Connection; - -/** - * Event Arguments used when a Driver connection is established inside Doctrine\DBAL\Connection. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class ConnectionEventArgs extends EventArgs -{ - /** - * @var Connection - */ - private $_connection = null; - - public function __construct(Connection $connection) - { - $this->_connection = $connection; - } - - /** - * @return Doctrine\DBAL\Connection - */ - public function getConnection() - { - return $this->_connection; - } - - /** - * @return Doctrine\DBAL\Driver - */ - public function getDriver() - { - return $this->_connection->getDriver(); - } - - /** - * @return Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getDatabasePlatform() - { - return $this->_connection->getDatabasePlatform(); - } - - /** - * @return Doctrine\DBAL\Schema\AbstractSchemaManager - */ - public function getSchemaManager() - { - return $this->_connection->getSchemaManager(); - } -} diff --git a/lib/Doctrine/DBAL/Event/Listeners/MysqlSessionInit.php b/lib/Doctrine/DBAL/Event/Listeners/MysqlSessionInit.php deleted file mode 100644 index 9d0ff684e..000000000 --- a/lib/Doctrine/DBAL/Event/Listeners/MysqlSessionInit.php +++ /dev/null @@ -1,75 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event\Listeners; - -use Doctrine\DBAL\Event\ConnectionEventArgs; -use Doctrine\DBAL\Events; -use Doctrine\Common\EventSubscriber; - -/** - * MySQL Session Init Event Subscriber which allows to set the Client Encoding of the Connection - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class MysqlSessionInit implements EventSubscriber -{ - /** - * @var string - */ - private $_charset; - - /** - * @var string - */ - private $_collation; - - /** - * Configure Charset and Collation options of MySQL Client for each Connection - * - * @param string $charset - * @param string $collation - */ - public function __construct($charset = 'utf8', $collation = false) - { - $this->_charset = $charset; - $this->_collation = $collation; - } - - /** - * @param ConnectionEventArgs $args - * @return void - */ - public function postConnect(ConnectionEventArgs $args) - { - $collation = ($this->_collation) ? " COLLATE ".$this->_collation : ""; - $args->getConnection()->executeUpdate("SET NAMES ".$this->_charset . $collation); - } - - public function getSubscribedEvents() - { - return array(Events::postConnect); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Event/Listeners/OracleSessionInit.php b/lib/Doctrine/DBAL/Event/Listeners/OracleSessionInit.php deleted file mode 100644 index 1e39918cb..000000000 --- a/lib/Doctrine/DBAL/Event/Listeners/OracleSessionInit.php +++ /dev/null @@ -1,82 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event\Listeners; - -use Doctrine\DBAL\Event\ConnectionEventArgs; -use Doctrine\DBAL\Events; -use Doctrine\Common\EventSubscriber; - -/** - * Should be used when Oracle Server default enviroment does not match the Doctrine requirements. - * - * The following enviroment variables are required for the Doctrine default date format: - * - * NLS_TIME_FORMAT="HH24:MI:SS" - * NLS_DATE_FORMAT="YYYY-MM-DD" - * NLS_TIMESTAMP_FORMAT="YYYY-MM-DD HH24:MI:SS" - * NLS_TIMESTAMP_TZ_FORMAT="YYYY-MM-DD HH24:MI:SS TZH:TZM" - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class OracleSessionInit implements EventSubscriber -{ - protected $_defaultSessionVars = array( - 'NLS_TIME_FORMAT' => "HH24:MI:SS", - 'NLS_DATE_FORMAT' => "YYYY-MM-DD", - 'NLS_TIMESTAMP_FORMAT' => "YYYY-MM-DD HH24:MI:SS", - 'NLS_TIMESTAMP_TZ_FORMAT' => "YYYY-MM-DD HH24:MI:SS TZH:TZM", - ); - - /** - * @param array $oracleSessionVars - */ - public function __construct(array $oracleSessionVars = array()) - { - $this->_defaultSessionVars = array_merge($this->_defaultSessionVars, $oracleSessionVars); - } - - /** - * @param ConnectionEventArgs $args - * @return void - */ - public function postConnect(ConnectionEventArgs $args) - { - if (count($this->_defaultSessionVars)) { - array_change_key_case($this->_defaultSessionVars, \CASE_UPPER); - $vars = array(); - foreach ($this->_defaultSessionVars AS $option => $value) { - $vars[] = $option." = '".$value."'"; - } - $sql = "ALTER SESSION SET ".implode(" ", $vars); - $args->getConnection()->executeUpdate($sql); - } - } - - public function getSubscribedEvents() - { - return array(Events::postConnect); - } -} diff --git a/lib/Doctrine/DBAL/Events.php b/lib/Doctrine/DBAL/Events.php deleted file mode 100644 index e5f8e8ca3..000000000 --- a/lib/Doctrine/DBAL/Events.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace Doctrine\DBAL; - -/** - * Container for all DBAL events. - * - * This class cannot be instantiated. - * - * @author Roman Borschel - * @since 2.0 - */ -final class Events -{ - private function __construct() {} - - const preExec = 'preExec'; - const postExec = 'postExec'; - const preExecute = 'preExecute'; - const postExecute = 'postExecute'; - - const postConnect = 'postConnect'; -} - diff --git a/lib/Doctrine/DBAL/LockMode.php b/lib/Doctrine/DBAL/LockMode.php deleted file mode 100644 index 949072166..000000000 --- a/lib/Doctrine/DBAL/LockMode.php +++ /dev/null @@ -1,42 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL; - -/** - * Contains all ORM LockModes - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Roman Borschel - */ -class LockMode -{ - const NONE = 0; - const OPTIMISTIC = 1; - const PESSIMISTIC_READ = 2; - const PESSIMISTIC_WRITE = 4; - - final private function __construct() { } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Logging/DebugStack.php b/lib/Doctrine/DBAL/Logging/DebugStack.php deleted file mode 100644 index 5ed20db55..000000000 --- a/lib/Doctrine/DBAL/Logging/DebugStack.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Logging; - -/** - * Includes executed SQLs in a Debug Stack - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class DebugStack implements SQLLogger -{ - /** @var array $queries Executed SQL queries. */ - public $queries = array(); - - /** @var boolean $enabled If Debug Stack is enabled (log queries) or not. */ - public $enabled = true; - - /** - * {@inheritdoc} - */ - public function logSQL($sql, array $params = null) - { - if ($this->enabled) { - $this->queries[] = array('sql' => $sql, 'params' => $params); - } - } -} - diff --git a/lib/Doctrine/DBAL/Logging/EchoSQLLogger.php b/lib/Doctrine/DBAL/Logging/EchoSQLLogger.php deleted file mode 100644 index 9541547d9..000000000 --- a/lib/Doctrine/DBAL/Logging/EchoSQLLogger.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Logging; - -/** - * A SQL logger that logs to the standard output using echo/var_dump. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class EchoSQLLogger implements SQLLogger -{ - /** - * {@inheritdoc} - */ - public function logSQL($sql, array $params = null) - { - echo $sql . PHP_EOL; - - if ($params) { - var_dump($params); - } - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Logging/SQLLogger.php b/lib/Doctrine/DBAL/Logging/SQLLogger.php deleted file mode 100644 index a8b01a3bd..000000000 --- a/lib/Doctrine/DBAL/Logging/SQLLogger.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Logging; - -/** - * Interface for SQL loggers. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -interface SQLLogger -{ - /** - * Logs a SQL statement somewhere. - * - * @param string $sql The SQL to be executed. - * @param array $params The SQL parameters. - */ - function logSQL($sql, array $params = null); -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Platforms/AbstractPlatform.php b/lib/Doctrine/DBAL/Platforms/AbstractPlatform.php deleted file mode 100644 index 2bcb7d0ed..000000000 --- a/lib/Doctrine/DBAL/Platforms/AbstractPlatform.php +++ /dev/null @@ -1,1904 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\DBALException, - Doctrine\DBAL\Connection, - Doctrine\DBAL\Types, - Doctrine\DBAL\Schema\Table, - Doctrine\DBAL\Schema\Index, - Doctrine\DBAL\Schema\ForeignKeyConstraint, - Doctrine\DBAL\Schema\TableDiff; - -/** - * Base class for all DatabasePlatforms. The DatabasePlatforms are the central - * point of abstraction of platform-specific behaviors, features and SQL dialects. - * They are a passive source of information. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision: 3938 $ - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Lukas Smith (PEAR MDB2 library) - * @todo Remove any unnecessary methods. - */ -abstract class AbstractPlatform -{ - /** - * @var int - */ - const CREATE_INDEXES = 1; - - /** - * @var int - */ - const CREATE_FOREIGNKEYS = 2; - - /** - * @var int - */ - const TRIM_UNSPECIFIED = 0; - - /** - * @var int - */ - const TRIM_LEADING = 1; - - /** - * @var int - */ - const TRIM_TRAILING = 2; - - /** - * @var int - */ - const TRIM_BOTH = 3; - - /** - * Constructor. - */ - public function __construct() {} - - /** - * Gets the character used for identifier quoting. - * - * @return string - */ - public function getIdentifierQuoteCharacter() - { - return '"'; - } - - /** - * Gets the string portion that starts an SQL comment. - * - * @return string - */ - public function getSqlCommentStartString() - { - return "--"; - } - - /** - * Gets the string portion that ends an SQL comment. - * - * @return string - */ - public function getSqlCommentEndString() - { - return "\n"; - } - - /** - * Gets the maximum length of a varchar field. - * - * @return integer - */ - public function getVarcharMaxLength() - { - return 255; - } - - /** - * Gets all SQL wildcard characters of the platform. - * - * @return array - */ - public function getWildcards() - { - return array('%', '_'); - } - - /** - * Returns the regular expression operator. - * - * @return string - */ - public function getRegexpExpression() - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Returns the average value of a column - * - * @param string $column the column to use - * @return string generated sql including an AVG aggregate function - */ - public function getAvgExpression($column) - { - return 'AVG(' . $column . ')'; - } - - /** - * Returns the number of rows (without a NULL value) of a column - * - * If a '*' is used instead of a column the number of selected rows - * is returned. - * - * @param string|integer $column the column to use - * @return string generated sql including a COUNT aggregate function - */ - public function getCountExpression($column) - { - return 'COUNT(' . $column . ')'; - } - - /** - * Returns the highest value of a column - * - * @param string $column the column to use - * @return string generated sql including a MAX aggregate function - */ - public function getMaxExpression($column) - { - return 'MAX(' . $column . ')'; - } - - /** - * Returns the lowest value of a column - * - * @param string $column the column to use - * @return string - */ - public function getMinExpression($column) - { - return 'MIN(' . $column . ')'; - } - - /** - * Returns the total sum of a column - * - * @param string $column the column to use - * @return string - */ - public function getSumExpression($column) - { - return 'SUM(' . $column . ')'; - } - - // scalar functions - - /** - * Returns the md5 sum of a field. - * - * Note: Not SQL92, but common functionality - * - * @return string - */ - public function getMd5Expression($column) - { - return 'MD5(' . $column . ')'; - } - - /** - * Returns the length of a text field. - * - * @param string $expression1 - * @param string $expression2 - * @return string - */ - public function getLengthExpression($column) - { - return 'LENGTH(' . $column . ')'; - } - - /** - * Rounds a numeric field to the number of decimals specified. - * - * @param string $expression1 - * @param string $expression2 - * @return string - */ - public function getRoundExpression($column, $decimals = 0) - { - return 'ROUND(' . $column . ', ' . $decimals . ')'; - } - - /** - * Returns the remainder of the division operation - * $expression1 / $expression2. - * - * @param string $expression1 - * @param string $expression2 - * @return string - */ - public function getModExpression($expression1, $expression2) - { - return 'MOD(' . $expression1 . ', ' . $expression2 . ')'; - } - - /** - * Trim a string, leading/trailing/both and with a given char which defaults to space. - * - * @param string $str - * @param int $pos - * @param string $char has to be quoted already - * @return string - */ - public function getTrimExpression($str, $pos = self::TRIM_UNSPECIFIED, $char = false) - { - $posStr = ''; - $trimChar = ($char != false) ? $char . ' FROM ' : ''; - - if ($pos == self::TRIM_LEADING) { - $posStr = 'LEADING '.$trimChar; - } else if($pos == self::TRIM_TRAILING) { - $posStr = 'TRAILING '.$trimChar; - } else if($pos == self::TRIM_BOTH) { - $posStr = 'BOTH '.$trimChar; - } - - return 'TRIM(' . $posStr . $str . ')'; - } - - /** - * rtrim - * returns the string $str with proceeding space characters removed - * - * @param string $str literal string or column name - * @return string - */ - public function getRtrimExpression($str) - { - return 'RTRIM(' . $str . ')'; - } - - /** - * ltrim - * returns the string $str with leading space characters removed - * - * @param string $str literal string or column name - * @return string - */ - public function getLtrimExpression($str) - { - return 'LTRIM(' . $str . ')'; - } - - /** - * upper - * Returns the string $str with all characters changed to - * uppercase according to the current character set mapping. - * - * @param string $str literal string or column name - * @return string - */ - public function getUpperExpression($str) - { - return 'UPPER(' . $str . ')'; - } - - /** - * lower - * Returns the string $str with all characters changed to - * lowercase according to the current character set mapping. - * - * @param string $str literal string or column name - * @return string - */ - public function getLowerExpression($str) - { - return 'LOWER(' . $str . ')'; - } - - /** - * returns the position of the first occurrence of substring $substr in string $str - * - * @param string $substr literal string to find - * @param string $str literal string - * @param int $pos position to start at, beginning of string by default - * @return integer - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Returns the current system date. - * - * @return string - */ - public function getNowExpression() - { - return 'NOW()'; - } - - /** - * return string to call a function to get a substring inside an SQL statement - * - * Note: Not SQL92, but common functionality. - * - * SQLite only supports the 2 parameter variant of this function - * - * @param string $value an sql string literal or column name/alias - * @param integer $from where to start the substring portion - * @param integer $len the substring portion length - * @return string - */ - public function getSubstringExpression($value, $from, $len = null) - { - if ($len === null) - return 'SUBSTRING(' . $value . ' FROM ' . $from . ')'; - else { - return 'SUBSTRING(' . $value . ' FROM ' . $from . ' FOR ' . $len . ')'; - } - } - - /** - * Returns a series of strings concatinated - * - * concat() accepts an arbitrary number of parameters. Each parameter - * must contain an expression - * - * @param string $arg1, $arg2 ... $argN strings that will be concatinated. - * @return string - */ - public function getConcatExpression() - { - return join(' || ' , func_get_args()); - } - - /** - * Returns the SQL for a logical not. - * - * Example: - * - * $q = new Doctrine_Query(); - * $e = $q->expr; - * $q->select('*')->from('table') - * ->where($e->eq('id', $e->not('null')); - * - * - * @return string a logical expression - */ - public function getNotExpression($expression) - { - return 'NOT(' . $expression . ')'; - } - - /** - * Returns the SQL to check if a value is one in a set of - * given values. - * - * in() accepts an arbitrary number of parameters. The first parameter - * must always specify the value that should be matched against. Successive - * must contain a logical expression or an array with logical expressions. - * These expressions will be matched against the first parameter. - * - * @param string $column the value that should be matched against - * @param string|array(string) values that will be matched against $column - * @return string logical expression - */ - public function getInExpression($column, $values) - { - if ( ! is_array($values)) { - $values = array($values); - } - $values = $this->getIdentifiers($values); - - if (count($values) == 0) { - throw \InvalidArgumentException('Values must not be empty.'); - } - return $column . ' IN (' . implode(', ', $values) . ')'; - } - - /** - * Returns SQL that checks if a expression is null. - * - * @param string $expression the expression that should be compared to null - * @return string logical expression - */ - public function getIsNullExpression($expression) - { - return $expression . ' IS NULL'; - } - - /** - * Returns SQL that checks if a expression is not null. - * - * @param string $expression the expression that should be compared to null - * @return string logical expression - */ - public function getIsNotNullExpression($expression) - { - return $expression . ' IS NOT NULL'; - } - - /** - * Returns SQL that checks if an expression evaluates to a value between - * two values. - * - * The parameter $expression is checked if it is between $value1 and $value2. - * - * Note: There is a slight difference in the way BETWEEN works on some databases. - * http://www.w3schools.com/sql/sql_between.asp. If you want complete database - * independence you should avoid using between(). - * - * @param string $expression the value to compare to - * @param string $value1 the lower value to compare with - * @param string $value2 the higher value to compare with - * @return string logical expression - */ - public function getBetweenExpression($expression, $value1, $value2) - { - return $expression . ' BETWEEN ' .$value1 . ' AND ' . $value2; - } - - public function getAcosExpression($value) - { - return 'ACOS(' . $value . ')'; - } - - public function getSinExpression($value) - { - return 'SIN(' . $value . ')'; - } - - public function getPiExpression() - { - return 'PI()'; - } - - public function getCosExpression($value) - { - return 'COS(' . $value . ')'; - } - - public function getForUpdateSQL() - { - return 'FOR UPDATE'; - } - - /** - * Honors that some SQL vendors such as MsSql use table hints for locking instead of the ANSI SQL FOR UPDATE specification. - * - * @param string $fromClause - * @param int $lockMode - * @return string - */ - public function appendLockHint($fromClause, $lockMode) - { - return $fromClause; - } - - /** - * Get the sql snippet to append to any SELECT statement which locks rows in shared read lock. - * - * This defaults to the ASNI SQL "FOR UPDATE", which is an exclusive lock (Write). Some database - * vendors allow to lighten this constraint up to be a real read lock. - * - * @return string - */ - public function getReadLockSQL() - { - return $this->getForUpdateSQL(); - } - - /** - * Get the SQL snippet to append to any SELECT statement which obtains an exclusive lock on the rows. - * - * The semantics of this lock mode should equal the SELECT .. FOR UPDATE of the ASNI SQL standard. - * - * @return string - */ - public function getWriteLockSQL() - { - return $this->getForUpdateSQL(); - } - - public function getDropDatabaseSQL($database) - { - return 'DROP DATABASE ' . $database; - } - - /** - * Drop a Table - * - * @param Table|string $table - * @return string - */ - public function getDropTableSQL($table) - { - if ($table instanceof \Doctrine\DBAL\Schema\Table) { - $table = $table->getName(); - } - - return 'DROP TABLE ' . $table; - } - - /** - * Drop index from a table - * - * @param Index|string $name - * @param string|Table $table - * @return string - */ - public function getDropIndexSQL($index, $table=null) - { - if($index instanceof \Doctrine\DBAL\Schema\Index) { - $index = $index->getName(); - } else if(!is_string($index)) { - throw new \InvalidArgumentException('AbstractPlatform::getDropIndexSQL() expects $index parameter to be string or \Doctrine\DBAL\Schema\Index.'); - } - - return 'DROP INDEX ' . $index; - } - - /** - * Get drop constraint sql - * - * @param \Doctrine\DBAL\Schema\Constraint $constraint - * @param string|Table $table - * @return string - */ - public function getDropConstraintSQL($constraint, $table) - { - if ($constraint instanceof \Doctrine\DBAL\Schema\Constraint) { - $constraint = $constraint->getName(); - } - - if ($table instanceof \Doctrine\DBAL\Schema\Table) { - $table = $table->getName(); - } - - return 'ALTER TABLE ' . $table . ' DROP CONSTRAINT ' . $constraint; - } - - /** - * @param ForeignKeyConstraint|string $foreignKey - * @param Table|string $table - * @return string - */ - public function getDropForeignKeySQL($foreignKey, $table) - { - if ($foreignKey instanceof \Doctrine\DBAL\Schema\ForeignKeyConstraint) { - $foreignKey = $foreignKey->getName(); - } - - if ($table instanceof \Doctrine\DBAL\Schema\Table) { - $table = $table->getName(); - } - - return 'ALTER TABLE ' . $table . ' DROP FOREIGN KEY ' . $foreignKey; - } - - /** - * Gets the SQL statement(s) to create a table with the specified name, columns and constraints - * on this platform. - * - * @param string $table The name of the table. - * @param int $createFlags - * @return array The sequence of SQL statements. - */ - public function getCreateTableSQL(Table $table, $createFlags=self::CREATE_INDEXES) - { - if ( ! is_int($createFlags)) { - throw new \InvalidArgumentException("Second argument of AbstractPlatform::getCreateTableSQL() has to be integer."); - } - - if (count($table->getColumns()) == 0) { - throw DBALException::noColumnsSpecifiedForTable($table->getName()); - } - - $tableName = $table->getName(); - $options = $table->getOptions(); - $options['uniqueConstraints'] = array(); - $options['indexes'] = array(); - $options['primary'] = array(); - - if (($createFlags&self::CREATE_INDEXES) > 0) { - foreach ($table->getIndexes() AS $index) { - /* @var $index Index */ - if ($index->isPrimary()) { - $options['primary'] = $index->getColumns(); - } else { - $options['indexes'][$index->getName()] = $index; - } - } - } - - $columns = array(); - foreach ($table->getColumns() AS $column) { - /* @var \Doctrine\DBAL\Schema\Column $column */ - $columnData = array(); - $columnData['name'] = $column->getName(); - $columnData['type'] = $column->getType(); - $columnData['length'] = $column->getLength(); - $columnData['notnull'] = $column->getNotNull(); - $columnData['unique'] = ($column->hasPlatformOption("unique"))?$column->getPlatformOption('unique'):false; - $columnData['version'] = ($column->hasPlatformOption("version"))?$column->getPlatformOption('version'):false; - if(strtolower($columnData['type']) == "string" && $columnData['length'] === null) { - $columnData['length'] = 255; - } - $columnData['precision'] = $column->getPrecision(); - $columnData['scale'] = $column->getScale(); - $columnData['default'] = $column->getDefault(); - $columnData['columnDefinition'] = $column->getColumnDefinition(); - - if(in_array($column->getName(), $options['primary'])) { - $columnData['primary'] = true; - - if($table->isIdGeneratorIdentity()) { - $columnData['autoincrement'] = true; - } - } - - $columns[$columnData['name']] = $columnData; - } - - if (($createFlags&self::CREATE_FOREIGNKEYS) > 0) { - $options['foreignKeys'] = array(); - foreach ($table->getForeignKeys() AS $fkConstraint) { - $options['foreignKeys'][] = $fkConstraint; - } - } - - return $this->_getCreateTableSQL($tableName, $columns, $options); - } - - /** - * @param string $tableName - * @param array $columns - * @param array $options - * @return array - */ - protected function _getCreateTableSQL($tableName, array $columns, array $options = array()) - { - $columnListSql = $this->getColumnDeclarationListSQL($columns); - - if (isset($options['uniqueConstraints']) && ! empty($options['uniqueConstraints'])) { - foreach ($options['uniqueConstraints'] as $name => $definition) { - $columnListSql .= ', ' . $this->getUniqueConstraintDeclarationSQL($name, $definition); - } - } - - if (isset($options['primary']) && ! empty($options['primary'])) { - $columnListSql .= ', PRIMARY KEY(' . implode(', ', array_unique(array_values($options['primary']))) . ')'; - } - - if (isset($options['indexes']) && ! empty($options['indexes'])) { - foreach($options['indexes'] as $index => $definition) { - $columnListSql .= ', ' . $this->getIndexDeclarationSQL($index, $definition); - } - } - - $query = 'CREATE TABLE ' . $tableName . ' (' . $columnListSql; - - $check = $this->getCheckDeclarationSQL($columns); - if ( ! empty($check)) { - $query .= ', ' . $check; - } - $query .= ')'; - - $sql[] = $query; - - if (isset($options['foreignKeys'])) { - foreach ((array) $options['foreignKeys'] AS $definition) { - $sql[] = $this->getCreateForeignKeySQL($definition, $tableName); - } - } - - return $sql; - } - - public function getCreateTemporaryTableSnippetSQL() - { - return "CREATE TEMPORARY TABLE"; - } - - /** - * Gets the SQL to create a sequence on this platform. - * - * @param \Doctrine\DBAL\Schema\Sequence $sequence - * @throws DBALException - */ - public function getCreateSequenceSQL(\Doctrine\DBAL\Schema\Sequence $sequence) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Gets the SQL to create a constraint on a table on this platform. - * - * @param Constraint $constraint - * @param string|Table $table - * @return string - */ - public function getCreateConstraintSQL(\Doctrine\DBAL\Schema\Constraint $constraint, $table) - { - if ($table instanceof \Doctrine\DBAL\Schema\Table) { - $table = $table->getName(); - } - - $query = 'ALTER TABLE ' . $table . ' ADD CONSTRAINT ' . $constraint->getName(); - - $columns = array(); - foreach ($constraint->getColumns() as $column) { - $columns[] = $column; - } - $columnList = '('. implode(', ', $columns) . ')'; - - $referencesClause = ''; - if ($constraint instanceof \Doctrine\DBAL\Schema\Index) { - if($constraint->isPrimary()) { - $query .= ' PRIMARY KEY'; - } elseif ($constraint->isUnique()) { - $query .= ' UNIQUE'; - } else { - throw new \InvalidArgumentException( - 'Can only create primary or unique constraints, no common indexes with getCreateConstraintSQL().' - ); - } - } else if ($constraint instanceof \Doctrine\DBAL\Schema\ForeignKeyConstraint) { - $query .= ' FOREIGN KEY'; - - $foreignColumns = array(); - foreach ($constraint->getForeignColumns() AS $column) { - $foreignColumns[] = $column; - } - - $referencesClause = ' REFERENCES '.$constraint->getForeignTableName(). ' ('.implode(', ', $foreignColumns).')'; - } - $query .= ' '.$columnList.$referencesClause; - - return $query; - } - - /** - * Gets the SQL to create an index on a table on this platform. - * - * @param Index $index - * @param string|Table $table name of the table on which the index is to be created - * @return string - */ - public function getCreateIndexSQL(Index $index, $table) - { - if ($table instanceof Table) { - $table = $table->getName(); - } - $name = $index->getName(); - $columns = $index->getColumns(); - - if (count($columns) == 0) { - throw new \InvalidArgumentException("Incomplete definition. 'columns' required."); - } - - $type = ''; - if ($index->isUnique()) { - $type = 'UNIQUE '; - } - - $query = 'CREATE ' . $type . 'INDEX ' . $name . ' ON ' . $table; - - $query .= ' (' . $this->getIndexFieldDeclarationListSQL($columns) . ')'; - - return $query; - } - - /** - * Quotes a string so that it can be safely used as a table or column name, - * even if it is a reserved word of the platform. - * - * NOTE: Just because you CAN use quoted identifiers doesn't mean - * you SHOULD use them. In general, they end up causing way more - * problems than they solve. - * - * @param string $str identifier name to be quoted - * @return string quoted identifier string - */ - public function quoteIdentifier($str) - { - $c = $this->getIdentifierQuoteCharacter(); - - return $c . $str . $c; - } - - /** - * Create a new foreign key - * - * @param ForeignKeyConstraint $foreignKey ForeignKey instance - * @param string|Table $table name of the table on which the foreign key is to be created - * @return string - */ - public function getCreateForeignKeySQL(ForeignKeyConstraint $foreignKey, $table) - { - if ($table instanceof \Doctrine\DBAL\Schema\Table) { - $table = $table->getName(); - } - - $query = 'ALTER TABLE ' . $table . ' ADD ' . $this->getForeignKeyDeclarationSQL($foreignKey); - - return $query; - } - - /** - * Gets the sql statements for altering an existing table. - * - * The method returns an array of sql statements, since some platforms need several statements. - * - * @param TableDiff $diff - * @return array - */ - public function getAlterTableSQL(TableDiff $diff) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Common code for alter table statement generation that updates the changed Index and Foreign Key definitions. - * - * @param TableDiff $diff - * @return array - */ - protected function _getAlterTableIndexForeignKeySQL(TableDiff $diff) - { - if ($diff->newName !== false) { - $tableName = $diff->newName; - } else { - $tableName = $diff->name; - } - - $sql = array(); - if ($this->supportsForeignKeyConstraints()) { - foreach ($diff->removedForeignKeys AS $foreignKey) { - $sql[] = $this->getDropForeignKeySQL($foreignKey, $tableName); - } - foreach ($diff->addedForeignKeys AS $foreignKey) { - $sql[] = $this->getCreateForeignKeySQL($foreignKey, $tableName); - } - foreach ($diff->changedForeignKeys AS $foreignKey) { - $sql[] = $this->getDropForeignKeySQL($foreignKey, $tableName); - $sql[] = $this->getCreateForeignKeySQL($foreignKey, $tableName); - } - } - - foreach ($diff->addedIndexes AS $index) { - $sql[] = $this->getCreateIndexSQL($index, $tableName); - } - foreach ($diff->removedIndexes AS $index) { - $sql[] = $this->getDropIndexSQL($index, $tableName); - } - foreach ($diff->changedIndexes AS $index) { - $sql[] = $this->getDropIndexSQL($index, $tableName); - $sql[] = $this->getCreateIndexSQL($index, $tableName); - } - - return $sql; - } - - /** - * Get declaration of a number of fields in bulk - * - * @param array $fields a multidimensional associative array. - * The first dimension determines the field name, while the second - * dimension is keyed with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * length - * Integer value that determines the maximum length of the text - * field. If this argument is missing the field should be - * declared to have the longest length allowed by the DBMS. - * - * default - * Text value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * charset - * Text value with the default CHARACTER SET for this field. - * collation - * Text value with the default COLLATION for this field. - * unique - * unique constraint - * - * @return string - */ - public function getColumnDeclarationListSQL(array $fields) - { - $queryFields = array(); - foreach ($fields as $fieldName => $field) { - $query = $this->getColumnDeclarationSQL($fieldName, $field); - $queryFields[] = $query; - } - return implode(', ', $queryFields); - } - - /** - * Obtain DBMS specific SQL code portion needed to declare a generic type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * length - * Integer value that determines the maximum length of the text - * field. If this argument is missing the field should be - * declared to have the longest length allowed by the DBMS. - * - * default - * Text value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * charset - * Text value with the default CHARACTER SET for this field. - * collation - * Text value with the default COLLATION for this field. - * unique - * unique constraint - * check - * column check constraint - * columnDefinition - * a string that defines the complete column - * - * @return string DBMS specific SQL code portion that should be used to declare the column. - */ - public function getColumnDeclarationSQL($name, array $field) - { - if (isset($field['columnDefinition'])) { - $columnDef = $this->getCustomTypeDeclarationSQL($field); - } else { - $default = $this->getDefaultValueDeclarationSQL($field); - - $charset = (isset($field['charset']) && $field['charset']) ? - ' ' . $this->getColumnCharsetDeclarationSQL($field['charset']) : ''; - - $collation = (isset($field['collation']) && $field['collation']) ? - ' ' . $this->getColumnCollationDeclarationSQL($field['collation']) : ''; - - $notnull = (isset($field['notnull']) && $field['notnull']) ? ' NOT NULL' : ''; - - $unique = (isset($field['unique']) && $field['unique']) ? - ' ' . $this->getUniqueFieldDeclarationSQL() : ''; - - $check = (isset($field['check']) && $field['check']) ? - ' ' . $field['check'] : ''; - - $typeDecl = $field['type']->getSqlDeclaration($field, $this); - $columnDef = $typeDecl . $charset . $default . $notnull . $unique . $check . $collation; - } - - return $name . ' ' . $columnDef; - } - - /** - * Gets the SQL snippet that declares a floating point column of arbitrary precision. - * - * @param array $columnDef - * @return string - */ - public function getDecimalTypeDeclarationSQL(array $columnDef) - { - $columnDef['precision'] = ( ! isset($columnDef['precision']) || empty($columnDef['precision'])) - ? 10 : $columnDef['precision']; - $columnDef['scale'] = ( ! isset($columnDef['scale']) || empty($columnDef['scale'])) - ? 0 : $columnDef['scale']; - - return 'NUMERIC(' . $columnDef['precision'] . ', ' . $columnDef['scale'] . ')'; - } - - /** - * Gets the SQL snippet that declares a boolean column. - * - * @param array $columnDef - * @return string - */ - abstract public function getBooleanTypeDeclarationSQL(array $columnDef); - - /** - * Gets the SQL snippet that declares a 4 byte integer column. - * - * @param array $columnDef - * @return string - */ - abstract public function getIntegerTypeDeclarationSQL(array $columnDef); - - /** - * Gets the SQL snippet that declares an 8 byte integer column. - * - * @param array $columnDef - * @return string - */ - abstract public function getBigIntTypeDeclarationSQL(array $columnDef); - - /** - * Gets the SQL snippet that declares a 2 byte integer column. - * - * @param array $columnDef - * @return string - */ - abstract public function getSmallIntTypeDeclarationSQL(array $columnDef); - - /** - * Gets the SQL snippet that declares common properties of an integer column. - * - * @param array $columnDef - * @return string - */ - abstract protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef); - - /** - * Obtain DBMS specific SQL code portion needed to set a default value - * declaration to be used in statements like CREATE TABLE. - * - * @param array $field field definition array - * @return string DBMS specific SQL code portion needed to set a default value - */ - public function getDefaultValueDeclarationSQL($field) - { - $default = empty($field['notnull']) ? ' DEFAULT NULL' : ''; - - if (isset($field['default'])) { - $default = " DEFAULT '".$field['default']."'"; - if (isset($field['type'])) { - if (in_array((string)$field['type'], array("Integer", "BigInteger", "SmallInteger"))) { - $default = " DEFAULT ".$field['default']; - } else if ((string)$field['type'] == 'DateTime' && $field['default'] == $this->getCurrentTimestampSQL()) { - $default = " DEFAULT ".$this->getCurrentTimestampSQL(); - } - } - } - return $default; - } - - /** - * Obtain DBMS specific SQL code portion needed to set a CHECK constraint - * declaration to be used in statements like CREATE TABLE. - * - * @param array $definition check definition - * @return string DBMS specific SQL code portion needed to set a CHECK constraint - */ - public function getCheckDeclarationSQL(array $definition) - { - $constraints = array(); - foreach ($definition as $field => $def) { - if (is_string($def)) { - $constraints[] = 'CHECK (' . $def . ')'; - } else { - if (isset($def['min'])) { - $constraints[] = 'CHECK (' . $field . ' >= ' . $def['min'] . ')'; - } - - if (isset($def['max'])) { - $constraints[] = 'CHECK (' . $field . ' <= ' . $def['max'] . ')'; - } - } - } - - return implode(', ', $constraints); - } - - /** - * Obtain DBMS specific SQL code portion needed to set a unique - * constraint declaration to be used in statements like CREATE TABLE. - * - * @param string $name name of the unique constraint - * @param Index $index index definition - * @return string DBMS specific SQL code portion needed - * to set a constraint - */ - public function getUniqueConstraintDeclarationSQL($name, Index $index) - { - if (count($index->getColumns()) == 0) { - throw \InvalidArgumentException("Incomplete definition. 'columns' required."); - } - - return 'CONSTRAINT ' . $name . ' UNIQUE (' - . $this->getIndexFieldDeclarationListSQL($index->getColumns()) - . ')'; - } - - /** - * Obtain DBMS specific SQL code portion needed to set an index - * declaration to be used in statements like CREATE TABLE. - * - * @param string $name name of the index - * @param Index $index index definition - * @return string DBMS specific SQL code portion needed to set an index - */ - public function getIndexDeclarationSQL($name, Index $index) - { - $type = ''; - - if($index->isUnique()) { - $type = 'UNIQUE '; - } - - if (count($index->getColumns()) == 0) { - throw \InvalidArgumentException("Incomplete definition. 'columns' required."); - } - - return $type . 'INDEX ' . $name . ' (' - . $this->getIndexFieldDeclarationListSQL($index->getColumns()) - . ')'; - } - - /** - * getCustomTypeDeclarationSql - * Obtail SQL code portion needed to create a custom column, - * e.g. when a field has the "columnDefinition" keyword. - * Only "AUTOINCREMENT" and "PRIMARY KEY" are added if appropriate. - * - * @return string - */ - public function getCustomTypeDeclarationSQL(array $columnDef) - { - return $columnDef['columnDefinition']; - } - - /** - * getIndexFieldDeclarationList - * Obtain DBMS specific SQL code portion needed to set an index - * declaration to be used in statements like CREATE TABLE. - * - * @return string - */ - public function getIndexFieldDeclarationListSQL(array $fields) - { - $ret = array(); - foreach ($fields as $field => $definition) { - if (is_array($definition)) { - $ret[] = $field; - } else { - $ret[] = $definition; - } - } - return implode(', ', $ret); - } - - /** - * A method to return the required SQL string that fits between CREATE ... TABLE - * to create the table as a temporary table. - * - * Should be overridden in driver classes to return the correct string for the - * specific database type. - * - * The default is to return the string "TEMPORARY" - this will result in a - * SQL error for any database that does not support temporary tables, or that - * requires a different SQL command from "CREATE TEMPORARY TABLE". - * - * @return string The string required to be placed between "CREATE" and "TABLE" - * to generate a temporary table, if possible. - */ - public function getTemporaryTableSQL() - { - return 'TEMPORARY'; - } - - /** - * Some vendors require temporary table names to be qualified specially. - * - * @param string $tableName - * @return string - */ - public function getTemporaryTableName($tableName) - { - return $tableName; - } - - /** - * Get sql query to show a list of database. - * - * @return string - */ - public function getShowDatabasesSQL() - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Obtain DBMS specific SQL code portion needed to set the FOREIGN KEY constraint - * of a field declaration to be used in statements like CREATE TABLE. - * - * @param array $definition an associative array with the following structure: - * name optional constraint name - * - * local the local field(s) - * - * foreign the foreign reference field(s) - * - * foreignTable the name of the foreign table - * - * onDelete referential delete action - * - * onUpdate referential update action - * - * deferred deferred constraint checking - * - * The onDelete and onUpdate keys accept the following values: - * - * CASCADE: Delete or update the row from the parent table and automatically delete or - * update the matching rows in the child table. Both ON DELETE CASCADE and ON UPDATE CASCADE are supported. - * Between two tables, you should not define several ON UPDATE CASCADE clauses that act on the same column - * in the parent table or in the child table. - * - * SET NULL: Delete or update the row from the parent table and set the foreign key column or columns in the - * child table to NULL. This is valid only if the foreign key columns do not have the NOT NULL qualifier - * specified. Both ON DELETE SET NULL and ON UPDATE SET NULL clauses are supported. - * - * NO ACTION: In standard SQL, NO ACTION means no action in the sense that an attempt to delete or update a primary - * key value is not allowed to proceed if there is a related foreign key value in the referenced table. - * - * RESTRICT: Rejects the delete or update operation for the parent table. NO ACTION and RESTRICT are the same as - * omitting the ON DELETE or ON UPDATE clause. - * - * SET DEFAULT - * - * @return string DBMS specific SQL code portion needed to set the FOREIGN KEY constraint - * of a field declaration. - */ - public function getForeignKeyDeclarationSQL(ForeignKeyConstraint $foreignKey) - { - $sql = $this->getForeignKeyBaseDeclarationSQL($foreignKey); - $sql .= $this->getAdvancedForeignKeyOptionsSQL($foreignKey); - - return $sql; - } - - /** - * Return the FOREIGN KEY query section dealing with non-standard options - * as MATCH, INITIALLY DEFERRED, ON UPDATE, ... - * - * @param ForeignKeyConstraint $foreignKey foreign key definition - * @return string - */ - public function getAdvancedForeignKeyOptionsSQL(ForeignKeyConstraint $foreignKey) - { - $query = ''; - if ($this->supportsForeignKeyOnUpdate() && $foreignKey->hasOption('onUpdate')) { - $query .= ' ON UPDATE ' . $this->getForeignKeyReferentialActionSQL($foreignKey->getOption('onUpdate')); - } - if ($foreignKey->hasOption('onDelete')) { - $query .= ' ON DELETE ' . $this->getForeignKeyReferentialActionSQL($foreignKey->getOption('onDelete')); - } - return $query; - } - - /** - * returns given referential action in uppercase if valid, otherwise throws - * an exception - * - * @throws Doctrine_Exception_Exception if unknown referential action given - * @param string $action foreign key referential action - * @param string foreign key referential action in uppercase - */ - public function getForeignKeyReferentialActionSQL($action) - { - $upper = strtoupper($action); - switch ($upper) { - case 'CASCADE': - case 'SET NULL': - case 'NO ACTION': - case 'RESTRICT': - case 'SET DEFAULT': - return $upper; - break; - default: - throw \InvalidArgumentException('Invalid foreign key action: ' . $upper); - } - } - - /** - * Obtain DBMS specific SQL code portion needed to set the FOREIGN KEY constraint - * of a field declaration to be used in statements like CREATE TABLE. - * - * @param ForeignKeyConstraint $foreignKey - * @return string - */ - public function getForeignKeyBaseDeclarationSQL(ForeignKeyConstraint $foreignKey) - { - $sql = ''; - if (strlen($foreignKey->getName())) { - $sql .= 'CONSTRAINT ' . $foreignKey->getName() . ' '; - } - $sql .= 'FOREIGN KEY ('; - - if (count($foreignKey->getLocalColumns()) == 0) { - throw new \InvalidArgumentException("Incomplete definition. 'local' required."); - } - if (count($foreignKey->getForeignColumns()) == 0) { - throw new \InvalidArgumentException("Incomplete definition. 'foreign' required."); - } - if (strlen($foreignKey->getForeignTableName()) == 0) { - throw new \InvalidArgumentException("Incomplete definition. 'foreignTable' required."); - } - - $sql .= implode(', ', $foreignKey->getLocalColumns()) - . ') REFERENCES ' - . $foreignKey->getForeignTableName() . '(' - . implode(', ', $foreignKey->getForeignColumns()) . ')'; - - return $sql; - } - - /** - * Obtain DBMS specific SQL code portion needed to set the UNIQUE constraint - * of a field declaration to be used in statements like CREATE TABLE. - * - * @return string DBMS specific SQL code portion needed to set the UNIQUE constraint - * of a field declaration. - */ - public function getUniqueFieldDeclarationSQL() - { - return 'UNIQUE'; - } - - /** - * Obtain DBMS specific SQL code portion needed to set the CHARACTER SET - * of a field declaration to be used in statements like CREATE TABLE. - * - * @param string $charset name of the charset - * @return string DBMS specific SQL code portion needed to set the CHARACTER SET - * of a field declaration. - */ - public function getColumnCharsetDeclarationSQL($charset) - { - return ''; - } - - /** - * Obtain DBMS specific SQL code portion needed to set the COLLATION - * of a field declaration to be used in statements like CREATE TABLE. - * - * @param string $collation name of the collation - * @return string DBMS specific SQL code portion needed to set the COLLATION - * of a field declaration. - */ - public function getColumnCollationDeclarationSQL($collation) - { - return ''; - } - - /** - * Whether the platform prefers sequences for ID generation. - * Subclasses should override this method to return TRUE if they prefer sequences. - * - * @return boolean - */ - public function prefersSequences() - { - return false; - } - - /** - * Whether the platform prefers identity columns (eg. autoincrement) for ID generation. - * Subclasses should override this method to return TRUE if they prefer identity columns. - * - * @return boolean - */ - public function prefersIdentityColumns() - { - return false; - } - - /** - * Some platforms need the boolean values to be converted. - * - * The default conversion in this implementation converts to integers (false => 0, true => 1). - * - * @param mixed $item - */ - public function convertBooleans($item) - { - if (is_array($item)) { - foreach ($item as $k => $value) { - if (is_bool($value)) { - $item[$k] = (int) $value; - } - } - } else if (is_bool($item)) { - $item = (int) $item; - } - return $item; - } - - /** - * Gets the SQL statement specific for the platform to set the charset. - * - * This function is MySQL specific and required by - * {@see \Doctrine\DBAL\Connection::setCharset($charset)} - * - * @param string $charset - * @return string - */ - public function getSetCharsetSQL($charset) - { - return "SET NAMES '".$charset."'"; - } - - /** - * Gets the SQL specific for the platform to get the current date. - * - * @return string - */ - public function getCurrentDateSQL() - { - return 'CURRENT_DATE'; - } - - /** - * Gets the SQL specific for the platform to get the current time. - * - * @return string - */ - public function getCurrentTimeSQL() - { - return 'CURRENT_TIME'; - } - - /** - * Gets the SQL specific for the platform to get the current timestamp - * - * @return string - */ - public function getCurrentTimestampSQL() - { - return 'CURRENT_TIMESTAMP'; - } - - /** - * Get sql for transaction isolation level Connection constant - * - * @param integer $level - */ - protected function _getTransactionIsolationLevelSQL($level) - { - switch ($level) { - case Connection::TRANSACTION_READ_UNCOMMITTED: - return 'READ UNCOMMITTED'; - case Connection::TRANSACTION_READ_COMMITTED: - return 'READ COMMITTED'; - case Connection::TRANSACTION_REPEATABLE_READ: - return 'REPEATABLE READ'; - case Connection::TRANSACTION_SERIALIZABLE: - return 'SERIALIZABLE'; - default: - throw new \InvalidArgumentException('Invalid isolation level:' . $level); - } - } - - public function getListDatabasesSQL() - { - throw DBALException::notSupported(__METHOD__); - } - - public function getListSequencesSQL($database) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getListTableConstraintsSQL($table) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getListTableColumnsSQL($table) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getListTablesSQL() - { - throw DBALException::notSupported(__METHOD__); - } - - public function getListUsersSQL() - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Get the SQL to list all views of a database or user. - * - * @param string $database - * @return string - */ - public function getListViewsSQL($database) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getListTableIndexesSQL($table) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getListTableForeignKeysSQL($table) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getCreateViewSQL($name, $sql) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getDropViewSQL($name) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getDropSequenceSQL($sequence) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getSequenceNextValSQL($sequenceName) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getCreateDatabaseSQL($database) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Get sql to set the transaction isolation level - * - * @param integer $level - */ - public function getSetTransactionIsolationSQL($level) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Obtain DBMS specific SQL to be used to create datetime fields in - * statements like CREATE TABLE - * - * @param array $fieldDeclaration - * @return string - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Obtain DBMS specific SQL to be used to create date fields in statements - * like CREATE TABLE. - * - * @param array $fieldDeclaration - * @return string - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Obtain DBMS specific SQL to be used to create time fields in statements - * like CREATE TABLE. - * - * @param array $fieldDeclaration - * @return string - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Gets the default transaction isolation level of the platform. - * - * @return integer The default isolation level. - * @see Doctrine\DBAL\Connection\TRANSACTION_* constants. - */ - public function getDefaultTransactionIsolationLevel() - { - return Connection::TRANSACTION_READ_COMMITTED; - } - - /* supports*() metods */ - - /** - * Whether the platform supports sequences. - * - * @return boolean - */ - public function supportsSequences() - { - return false; - } - - /** - * Whether the platform supports identity columns. - * Identity columns are columns that recieve an auto-generated value from the - * database on insert of a row. - * - * @return boolean - */ - public function supportsIdentityColumns() - { - return false; - } - - /** - * Whether the platform supports indexes. - * - * @return boolean - */ - public function supportsIndexes() - { - return true; - } - - public function supportsAlterTable() - { - return true; - } - - /** - * Whether the platform supports transactions. - * - * @return boolean - */ - public function supportsTransactions() - { - return true; - } - - /** - * Whether the platform supports savepoints. - * - * @return boolean - */ - public function supportsSavepoints() - { - return true; - } - - /** - * Whether the platform supports primary key constraints. - * - * @return boolean - */ - public function supportsPrimaryConstraints() - { - return true; - } - - /** - * Does the platform supports foreign key constraints? - * - * @return boolean - */ - public function supportsForeignKeyConstraints() - { - return true; - } - - /** - * Does this platform supports onUpdate in foreign key constraints? - * - * @return bool - */ - public function supportsForeignKeyOnUpdate() - { - return ($this->supportsForeignKeyConstraints() && true); - } - - /** - * Whether the platform supports database schemas. - * - * @return boolean - */ - public function supportsSchemas() - { - return false; - } - - /** - * Some databases don't allow to create and drop databases at all or only with certain tools. - * - * @return bool - */ - public function supportsCreateDropDatabase() - { - return true; - } - - /** - * @return bool - */ - public function createsExplicitIndexForForeignKeys() - { - return false; - } - - /** - * Whether the platform supports getting the affected rows of a recent - * update/delete type query. - * - * @return boolean - */ - public function supportsGettingAffectedRows() - { - return true; - } - - public function getIdentityColumnNullInsertSQL() - { - return ""; - } - - /** - * Gets the format string, as accepted by the date() function, that describes - * the format of a stored datetime value of this platform. - * - * @return string The format string. - * - * @todo We need to get the specific format for each dbms and override this - * function for each platform - */ - public function getDateTimeFormatString() - { - return 'Y-m-d H:i:s'; - } - - /** - * Gets the format string, as accepted by the date() function, that describes - * the format of a stored date value of this platform. - * - * @return string The format string. - */ - public function getDateFormatString() - { - return 'Y-m-d'; - } - - /** - * Gets the format string, as accepted by the date() function, that describes - * the format of a stored time value of this platform. - * - * @return string The format string. - */ - public function getTimeFormatString() - { - return 'H:i:s'; - } - - public function modifyLimitQuery($query, $limit, $offset = null) - { - if ( ! is_null($limit)) { - $query .= ' LIMIT ' . $limit; - } - - if ( ! is_null($offset)) { - $query .= ' OFFSET ' . $offset; - } - - return $query; - } - - /** - * Gets the SQL snippet used to declare a VARCHAR column type. - * - * @param array $field - */ - abstract public function getVarcharTypeDeclarationSQL(array $field); - - /** - * Gets the SQL snippet used to declare a CLOB column type. - * - * @param array $field - */ - abstract public function getClobTypeDeclarationSQL(array $field); - - /** - * Gets the name of the platform. - * - * @return string - */ - abstract public function getName(); - - /** - * Gets the character casing of a column in an SQL result set of this platform. - * - * @param string $column The column name for which to get the correct character casing. - * @return string The column name in the character casing used in SQL result sets. - */ - public function getSQLResultCasing($column) - { - return $column; - } - - /** - * Makes any fixes to a name of a schema element (table, sequence, ...) that are required - * by restrictions of the platform, like a maximum length. - * - * @param string $schemaName - * @return string - */ - public function fixSchemaElementName($schemaElementName) - { - return $schemaElementName; - } - - /** - * Maximum length of any given databse identifier, like tables or column names. - * - * @return int - */ - public function getMaxIdentifierLength() - { - return 63; - } - - /** - * Get the insert sql for an empty insert statement - * - * @param string $tableName - * @param string $identifierColumnName - * @return string $sql - */ - public function getEmptyIdentityInsertSQL($tableName, $identifierColumnName) - { - return 'INSERT INTO ' . $tableName . ' (' . $identifierColumnName . ') VALUES (null)'; - } - - /** - * Generate a Truncate Table SQL statement for a given table. - * - * Cascade is not supported on many platforms but would optionally cascade the truncate by - * following the foreign keys. - * - * @param string $tableName - * @param bool $cascade - * @return string - */ - public function getTruncateTableSQL($tableName, $cascade = false) - { - return 'TRUNCATE '.$tableName; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Platforms/DB2Platform.php b/lib/Doctrine/DBAL/Platforms/DB2Platform.php deleted file mode 100644 index 6b5072f2a..000000000 --- a/lib/Doctrine/DBAL/Platforms/DB2Platform.php +++ /dev/null @@ -1,521 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\DBALException; -use Doctrine\DBAL\Schema\Index; -use Doctrine\DBAL\Schema\TableDiff; - -class DB2Platform extends AbstractPlatform -{ - /** - * Gets the SQL snippet used to declare a VARCHAR column type. - * - * @param array $field - */ - public function getVarcharTypeDeclarationSQL(array $field) - { - if ( ! isset($field['length'])) { - if (array_key_exists('default', $field)) { - $field['length'] = $this->getVarcharMaxLength(); - } else { - $field['length'] = false; - } - } - - $length = ($field['length'] <= $this->getVarcharMaxLength()) ? $field['length'] : false; - $fixed = (isset($field['fixed'])) ? $field['fixed'] : false; - - return $fixed ? ($length ? 'CHAR(' . $length . ')' : 'CHAR(255)') - : ($length ? 'VARCHAR(' . $length . ')' : 'VARCHAR(255)'); - } - - /** - * Gets the SQL snippet used to declare a CLOB column type. - * - * @param array $field - */ - public function getClobTypeDeclarationSQL(array $field) - { - // todo clob(n) with $field['length']; - return 'CLOB(1M)'; - } - - /** - * Gets the name of the platform. - * - * @return string - */ - public function getName() - { - return 'db2'; - } - - - /** - * Gets the SQL snippet that declares a boolean column. - * - * @param array $columnDef - * @return string - */ - public function getBooleanTypeDeclarationSQL(array $columnDef) - { - return 'SMALLINT'; - } - - /** - * Gets the SQL snippet that declares a 4 byte integer column. - * - * @param array $columnDef - * @return string - */ - public function getIntegerTypeDeclarationSQL(array $columnDef) - { - return 'INTEGER' . $this->_getCommonIntegerTypeDeclarationSQL($columnDef); - } - - /** - * Gets the SQL snippet that declares an 8 byte integer column. - * - * @param array $columnDef - * @return string - */ - public function getBigIntTypeDeclarationSQL(array $columnDef) - { - return 'BIGINT' . $this->_getCommonIntegerTypeDeclarationSQL($columnDef); - } - - /** - * Gets the SQL snippet that declares a 2 byte integer column. - * - * @param array $columnDef - * @return string - */ - public function getSmallIntTypeDeclarationSQL(array $columnDef) - { - return 'SMALLINT' . $this->_getCommonIntegerTypeDeclarationSQL($columnDef); - } - - /** - * Gets the SQL snippet that declares common properties of an integer column. - * - * @param array $columnDef - * @return string - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - $autoinc = ''; - if ( ! empty($columnDef['autoincrement'])) { - $autoinc = ' GENERATED BY DEFAULT AS IDENTITY'; - } - return $autoinc; - } - - /** - * Obtain DBMS specific SQL to be used to create datetime fields in - * statements like CREATE TABLE - * - * @param array $fieldDeclaration - * @return string - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - if (isset($fieldDeclaration['version']) && $fieldDeclaration['version'] == true) { - return "TIMESTAMP(0) WITH DEFAULT"; - } - - return 'TIMESTAMP(0)'; - } - - /** - * Obtain DBMS specific SQL to be used to create date fields in statements - * like CREATE TABLE. - * - * @param array $fieldDeclaration - * @return string - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * Obtain DBMS specific SQL to be used to create time fields in statements - * like CREATE TABLE. - * - * @param array $fieldDeclaration - * @return string - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIME'; - } - - public function getListDatabasesSQL() - { - throw DBALException::notSupported(__METHOD__); - } - - public function getListSequencesSQL($database) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getListTableConstraintsSQL($table) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * This code fragment is originally from the Zend_Db_Adapter_Db2 class. - * - * @license New BSD License - * @param string $table - * @return string - */ - public function getListTableColumnsSQL($table) - { - return "SELECT DISTINCT c.tabschema, c.tabname, c.colname, c.colno, - c.typename, c.default, c.nulls, c.length, c.scale, - c.identity, tc.type AS tabconsttype, k.colseq - FROM syscat.columns c - LEFT JOIN (syscat.keycoluse k JOIN syscat.tabconst tc - ON (k.tabschema = tc.tabschema - AND k.tabname = tc.tabname - AND tc.type = 'P')) - ON (c.tabschema = k.tabschema - AND c.tabname = k.tabname - AND c.colname = k.colname) - WHERE UPPER(c.tabname) = UPPER('" . $table . "') ORDER BY c.colno"; - } - - public function getListTablesSQL() - { - return "SELECT NAME FROM SYSIBM.SYSTABLES WHERE TYPE = 'T'"; - } - - public function getListUsersSQL() - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Get the SQL to list all views of a database or user. - * - * @param string $database - * @return string - */ - public function getListViewsSQL($database) - { - return "SELECT NAME, TEXT FROM SYSIBM.SYSVIEWS"; - } - - public function getListTableIndexesSQL($table) - { - return "SELECT NAME, COLNAMES, UNIQUERULE FROM SYSIBM.SYSINDEXES WHERE TBNAME = UPPER('" . $table . "')"; - } - - public function getListTableForeignKeysSQL($table) - { - return "SELECT TBNAME, RELNAME, REFTBNAME, DELETERULE, UPDATERULE, FKCOLNAMES, PKCOLNAMES ". - "FROM SYSIBM.SYSRELS WHERE TBNAME = UPPER('".$table."')"; - } - - public function getCreateViewSQL($name, $sql) - { - return "CREATE VIEW ".$name." AS ".$sql; - } - - public function getDropViewSQL($name) - { - return "DROP VIEW ".$name; - } - - public function getDropSequenceSQL($sequence) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getSequenceNextValSQL($sequenceName) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getCreateDatabaseSQL($database) - { - return "CREATE DATABASE ".$database; - } - - public function getDropDatabaseSQL($database) - { - return "DROP DATABASE ".$database.";"; - } - - public function supportsCreateDropDatabase() - { - return false; - } - - /** - * Gets the SQL specific for the platform to get the current date. - * - * @return string - */ - public function getCurrentDateSQL() - { - return 'VALUES CURRENT DATE'; - } - - /** - * Gets the SQL specific for the platform to get the current time. - * - * @return string - */ - public function getCurrentTimeSQL() - { - return 'VALUES CURRENT TIME'; - } - - /** - * Gets the SQL specific for the platform to get the current timestamp - * - * @return string - */ - - public function getCurrentTimestampSQL() - { - return "VALUES CURRENT TIMESTAMP"; - } - - /** - * Obtain DBMS specific SQL code portion needed to set an index - * declaration to be used in statements like CREATE TABLE. - * - * @param string $name name of the index - * @param Index $index index definition - * @return string DBMS specific SQL code portion needed to set an index - */ - public function getIndexDeclarationSQL($name, Index $index) - { - return $this->getUniqueConstraintDeclarationSQL($name, $index); - } - - /** - * @param string $tableName - * @param array $columns - * @param array $options - * @return array - */ - protected function _getCreateTableSQL($tableName, array $columns, array $options = array()) - { - $indexes = array(); - if (isset($options['indexes'])) { - $indexes = $options['indexes']; - } - $options['indexes'] = array(); - - $sqls = parent::_getCreateTableSQL($tableName, $columns, $options); - - foreach ($indexes as $index => $definition) { - $sqls[] = $this->getCreateIndexSQL($definition, $tableName); - } - return $sqls; - } - - /** - * Gets the SQL to alter an existing table. - * - * @param TableDiff $diff - * @return array - */ - public function getAlterTableSQL(TableDiff $diff) - { - $sql = array(); - - $queryParts = array(); - foreach ($diff->addedColumns AS $fieldName => $column) { - $queryParts[] = 'ADD COLUMN ' . $this->getColumnDeclarationSQL($column->getName(), $column->toArray()); - } - - foreach ($diff->removedColumns AS $column) { - $queryParts[] = 'DROP COLUMN ' . $column->getName(); - } - - foreach ($diff->changedColumns AS $columnDiff) { - /* @var $columnDiff Doctrine\DBAL\Schema\ColumnDiff */ - $column = $columnDiff->column; - $queryParts[] = 'ALTER ' . ($columnDiff->oldColumnName) . ' ' - . $this->getColumnDeclarationSQL($column->getName(), $column->toArray()); - } - - foreach ($diff->renamedColumns AS $oldColumnName => $column) { - $queryParts[] = 'RENAME ' . $oldColumnName . ' TO ' . $column->getName(); - } - - if (count($queryParts) > 0) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . implode(" ", $queryParts); - } - - $sql = array_merge($sql, $this->_getAlterTableIndexForeignKeySQL($diff)); - - if ($diff->newName !== false) { - $sql[] = 'RENAME TABLE TO ' . $diff->newName; - } - - return $sql; - } - - public function getDefaultValueDeclarationSQL($field) - { - if (isset($field['notnull']) && $field['notnull'] && !isset($field['default'])) { - if (in_array((string)$field['type'], array("Integer", "BigInteger", "SmallInteger"))) { - $field['default'] = 0; - } else if((string)$field['type'] == "DateTime") { - $field['default'] = "00-00-00 00:00:00"; - } else if ((string)$field['type'] == "Date") { - $field['default'] = "00-00-00"; - } else if((string)$field['type'] == "Time") { - $field['default'] = "00:00:00"; - } else { - $field['default'] = ''; - } - } - - unset($field['default']); // @todo this needs fixing - if (isset($field['version']) && $field['version']) { - if ((string)$field['type'] != "DateTime") { - $field['default'] = "1"; - } - } - - return parent::getDefaultValueDeclarationSQL($field); - } - - /** - * Get the insert sql for an empty insert statement - * - * @param string $tableName - * @param string $identifierColumnName - * @return string $sql - */ - public function getEmptyIdentityInsertSQL($tableName, $identifierColumnName) - { - return 'INSERT INTO ' . $tableName . ' (' . $identifierColumnName . ') VALUES (DEFAULT)'; - } - - public function getCreateTemporaryTableSnippetSQL() - { - return "DECLARE GLOBAL TEMPORARY TABLE"; - } - - /** - * DB2 automatically moves temporary tables into the SESSION. schema. - * - * @param string $tableName - * @return string - */ - public function getTemporaryTableName($tableName) - { - return "SESSION." . $tableName; - } - - public function modifyLimitQuery($query, $limit, $offset = null) - { - if ($limit === null && $offset === null) { - return $query; - } - - $limit = (int)$limit; - $offset = (int)(($offset)?:0); - - // Todo OVER() needs ORDER BY data! - $sql = 'SELECT db22.* FROM (SELECT ROW_NUMBER() OVER() AS DC_ROWNUM, db21.* '. - 'FROM (' . $query . ') db21) db22 WHERE db22.DC_ROWNUM BETWEEN ' . ($offset+1) .' AND ' . ($offset+$limit); - return $sql; - } - - /** - * returns the position of the first occurrence of substring $substr in string $str - * - * @param string $substr literal string to find - * @param string $str literal string - * @param int $pos position to start at, beginning of string by default - * @return integer - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - if ($startPos == false) { - return 'LOCATE(' . $substr . ', ' . $str . ')'; - } else { - return 'LOCATE(' . $substr . ', ' . $str . ', '.$startPos.')'; - } - } - - /** - * return string to call a function to get a substring inside an SQL statement - * - * Note: Not SQL92, but common functionality. - * - * SQLite only supports the 2 parameter variant of this function - * - * @param string $value an sql string literal or column name/alias - * @param integer $from where to start the substring portion - * @param integer $len the substring portion length - * @return string - */ - public function getSubstringExpression($value, $from, $len = null) - { - if ($len === null) - return 'SUBSTR(' . $value . ', ' . $from . ')'; - else { - return 'SUBSTR(' . $value . ', ' . $from . ', ' . $len . ')'; - } - } - - public function supportsIdentityColumns() - { - return true; - } - - public function prefersIdentityColumns() - { - return true; - } - - /** - * Gets the character casing of a column in an SQL result set of this platform. - * - * DB2 returns all column names in SQL result sets in uppercase. - * - * @param string $column The column name for which to get the correct character casing. - * @return string The column name in the character casing used in SQL result sets. - */ - public function getSQLResultCasing($column) - { - return strtoupper($column); - } - - public function getForUpdateSQL() - { - return ' WITH RR USE AND KEEP UPDATE LOCKS'; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Platforms/MsSqlPlatform.php b/lib/Doctrine/DBAL/Platforms/MsSqlPlatform.php deleted file mode 100644 index 4421c170c..000000000 --- a/lib/Doctrine/DBAL/Platforms/MsSqlPlatform.php +++ /dev/null @@ -1,514 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\Schema\TableDiff; -use Doctrine\DBAL\DBALException; - -/** - * The MsSqlPlatform provides the behavior, features and SQL dialect of the - * MySQL database platform. - * - * @since 2.0 - * @author Roman Borschel - * @author Jonathan H. Wage - * @author Benjamin Eberlei - * @todo Rename: MsSQLPlatform - */ -class MsSqlPlatform extends AbstractPlatform -{ - /** - * Adds an adapter-specific LIMIT clause to the SELECT statement. - * [ borrowed from Zend Framework ] - * - * @param string $query - * @param mixed $limit - * @param mixed $offset - * @link http://lists.bestpractical.com/pipermail/rt-devel/2005-June/007339.html - * @return string - * @override - */ - public function writeLimitClause($query, $limit = false, $offset = false) - { - if ($limit > 0) { - $count = intval($limit); - - $offset = intval($offset); - if ($offset < 0) { - throw DBALException::limitOffsetInvalid($offset); - } - - $orderby = stristr($query, 'ORDER BY'); - if ($orderby !== false) { - $sort = (stripos($orderby, 'desc') !== false) ? 'desc' : 'asc'; - $order = str_ireplace('ORDER BY', '', $orderby); - $order = trim(preg_replace('/ASC|DESC/i', '', $order)); - } - - $query = preg_replace('/^SELECT\s/i', 'SELECT TOP ' . ($count+$offset) . ' ', $query); - - $query = 'SELECT * FROM (SELECT TOP ' . $count . ' * FROM (' . $query . ') AS inner_tbl'; - if ($orderby !== false) { - $query .= ' ORDER BY ' . $order . ' '; - $query .= (stripos($sort, 'asc') !== false) ? 'DESC' : 'ASC'; - } - $query .= ') AS outer_tbl'; - if ($orderby !== false) { - $query .= ' ORDER BY ' . $order . ' ' . $sort; - } - - return $query; - - } - - return $query; - } - - /** - * Gets the sql statements for altering an existing table. - * - * The method returns an array of sql statements, since some platforms need several statements. - * - * @param TableDiff $diff - * @return array - */ - public function getAlterTableSQL(TableDiff $diff) - { - $queryParts = array(); - if ($diff->newName !== false) { - $queryParts[] = 'RENAME TO ' . $diff->newName; - } - - foreach ($diff->addedColumns AS $fieldName => $column) { - $queryParts[] = 'ADD ' . $this->getColumnDeclarationSQL($column->getName(), $column->toArray()); - } - - foreach ($diff->removedColumns AS $column) { - $queryParts[] = 'DROP ' . $column->getName(); - } - - foreach ($diff->changedColumns AS $columnDiff) { - /* @var $columnDiff Doctrine\DBAL\Schema\ColumnDiff */ - $column = $columnDiff->column; - $queryParts[] = 'CHANGE ' . ($columnDiff->oldColumnName) . ' ' - . $this->getColumnDeclarationSQL($column->getName(), $column->toArray()); - } - - foreach ($diff->renamedColumns AS $oldColumnName => $column) { - $queryParts[] = 'CHANGE ' . $oldColumnName . ' ' - . $this->getColumnDeclarationSQL($column->getName(), $column->toArray()); - } - - $sql = array(); - if (count($queryParts) > 0) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . implode(", ", $queryParts); - } - $sql = array_merge($sql, $this->_getAlterTableIndexForeignKeySQL($diff)); - return $sql; - } - - /** - * Returns the regular expression operator. - * - * @return string - * @override - */ - public function getRegexpExpression() - { - return 'RLIKE'; - } - - /** - * Return string to call a variable with the current timestamp inside an SQL statement - * There are three special variables for current date and time: - * - CURRENT_TIMESTAMP (date and time, TIMESTAMP type) - * - CURRENT_DATE (date, DATE type) - * - CURRENT_TIME (time, TIME type) - * - * @return string to call a variable with the current timestamp - * @override - */ - public function getNowExpression($type = 'timestamp') - { - switch ($type) { - case 'time': - case 'date': - case 'timestamp': - default: - return 'GETDATE()'; - } - } - - /** - * return string to call a function to get a substring inside an SQL statement - * - * @return string to call a function to get a substring - * @override - */ - public function getSubstringExpression($value, $position, $length = null) - { - if ( ! is_null($length)) { - return 'SUBSTRING(' . $value . ', ' . $position . ', ' . $length . ')'; - } - return 'SUBSTRING(' . $value . ', ' . $position . ', LEN(' . $value . ') - ' . $position . ' + 1)'; - } - - /** - * Returns string to concatenate two or more string parameters - * - * @param string $arg1 - * @param string $arg2 - * @param string $values... - * @return string to concatenate two strings - * @override - */ - public function getConcatExpression() - { - $args = func_get_args(); - return '(' . implode(' + ', $args) . ')'; - } - - /** - * Returns global unique identifier - * - * @return string to get global unique identifier - * @override - */ - public function getGuidExpression() - { - return 'NEWID()'; - } - - /** - * Whether the platform prefers identity columns for ID generation. - * MsSql prefers "autoincrement" identity columns since sequences can only - * be emulated with a table. - * - * @return boolean - * @override - */ - public function prefersIdentityColumns() - { - return true; - } - - /** - * Whether the platform supports identity columns. - * MsSql supports this through AUTO_INCREMENT columns. - * - * @return boolean - * @override - */ - public function supportsIdentityColumns() - { - return true; - } - - /** - * Whether the platform supports savepoints. MsSql does not. - * - * @return boolean - * @override - */ - public function supportsSavepoints() - { - return false; - } - - public function getShowDatabasesSQL() - { - return 'SHOW DATABASES'; - } - - public function getListTablesSQL() - { - return 'SHOW TABLES'; - } - - /** - * create a new database - * - * @param string $name name of the database that should be created - * @return string - * @override - */ - public function getCreateDatabaseSQL($name) - { - return 'CREATE DATABASE ' . $name; - } - - /** - * drop an existing database - * - * @param string $name name of the database that should be dropped - * @return string - * @override - */ - public function getDropDatabaseSQL($name) - { - return 'DROP DATABASE ' . $name; - } - - public function getSetTransactionIsolationSQL($level) - { - return 'SET TRANSACTION ISOLATION LEVEL ' . $this->_getTransactionIsolationLevelSQL($level); - } - - /** - * @override - */ - public function getIntegerTypeDeclarationSQL(array $field) - { - return 'INT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * @override - */ - public function getBigIntTypeDeclarationSQL(array $field) - { - return 'BIGINT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * @override - */ - public function getSmallIntTypeDeclarationSQL(array $field) - { - return 'SMALLINT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - public function getVarcharTypeDeclarationSQL(array $field) - { - if ( ! isset($field['length'])) { - if (array_key_exists('default', $field)) { - $field['length'] = $this->getVarcharMaxLength(); - } else { - $field['length'] = false; - } - } - - $length = ($field['length'] <= $this->getVarcharMaxLength()) ? $field['length'] : false; - $fixed = (isset($field['fixed'])) ? $field['fixed'] : false; - - return $fixed ? ($length ? 'CHAR(' . $length . ')' : 'CHAR(255)') - : ($length ? 'VARCHAR(' . $length . ')' : 'TEXT'); - } - - /** @override */ - public function getClobTypeDeclarationSQL(array $field) - { - return 'TEXT'; - } - - /** - * @override - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - $autoinc = ''; - if ( ! empty($columnDef['autoincrement'])) { - $autoinc = ' AUTO_INCREMENT'; - } - $unsigned = (isset($columnDef['unsigned']) && $columnDef['unsigned']) ? ' UNSIGNED' : ''; - - return $unsigned . $autoinc; - } - - /** - * @override - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'CHAR(' . strlen('YYYY-MM-DD HH:MM:SS') . ')'; - } - - /** - * @override - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'CHAR(' . strlen('YYYY-MM-DD') . ')'; - } - - /** - * @override - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'CHAR(' . strlen('HH:MM:SS') . ')'; - } - - /** - * @override - */ - public function getBooleanTypeDeclarationSQL(array $field) - { - return 'BIT'; - } - - /** - * Get the platform name for this instance - * - * @return string - */ - public function getName() - { - return 'mssql'; - } - - /** - * Adds an adapter-specific LIMIT clause to the SELECT statement. - * - * @param string $query - * @param mixed $limit - * @param mixed $offset - * @link http://lists.bestpractical.com/pipermail/rt-devel/2005-June/007339.html - * @return string - */ - public function modifyLimitQuery($query, $limit, $offset = null) - { - if ($limit > 0) { - $count = intval($limit); - $offset = intval($offset); - - if ($offset < 0) { - throw new Doctrine_Connection_Exception("LIMIT argument offset=$offset is not valid"); - } - - $orderby = stristr($query, 'ORDER BY'); - - if ($orderby !== false) { - // Ticket #1835: Fix for ORDER BY alias - // Ticket #2050: Fix for multiple ORDER BY clause - $order = str_ireplace('ORDER BY', '', $orderby); - $orders = explode(',', $order); - - for ($i = 0; $i < count($orders); $i++) { - $sorts[$i] = (stripos($orders[$i], ' DESC') !== false) ? 'DESC' : 'ASC'; - $orders[$i] = trim(preg_replace('/\s+(ASC|DESC)$/i', '', $orders[$i])); - - // find alias in query string - $helperString = stristr($query, $orders[$i]); - - $fromClausePos = strpos($helperString, ' FROM '); - $fieldsString = substr($helperString, 0, $fromClausePos + 1); - - $fieldArray = explode(',', $fieldsString); - $fieldArray = array_shift($fieldArray); - $aux2 = preg_split('/ as /i', $fieldArray); - - $aliases[$i] = trim(end($aux2)); - } - } - - // Ticket #1259: Fix for limit-subquery in MSSQL - $selectRegExp = 'SELECT\s+'; - $selectReplace = 'SELECT '; - - if (preg_match('/^SELECT(\s+)DISTINCT/i', $query)) { - $selectRegExp .= 'DISTINCT\s+'; - $selectReplace .= 'DISTINCT '; - } - - $query = preg_replace('/^'.$selectRegExp.'/i', $selectReplace . 'TOP ' . ($count + $offset) . ' ', $query); - $query = 'SELECT * FROM (SELECT TOP ' . $count . ' * FROM (' . $query . ') AS ' . 'inner_tbl'; - - if ($orderby !== false) { - $query .= ' ORDER BY '; - - for ($i = 0, $l = count($orders); $i < $l; $i++) { - if ($i > 0) { // not first order clause - $query .= ', '; - } - - $query .= 'inner_tbl' . '.' . $aliases[$i] . ' '; - $query .= (stripos($sorts[$i], 'ASC') !== false) ? 'DESC' : 'ASC'; - } - } - - $query .= ') AS ' . 'outer_tbl'; - - if ($orderby !== false) { - $query .= ' ORDER BY '; - - for ($i = 0, $l = count($orders); $i < $l; $i++) { - if ($i > 0) { // not first order clause - $query .= ', '; - } - - $query .= 'outer_tbl' . '.' . $aliases[$i] . ' ' . $sorts[$i]; - } - } - } - - return $query; - } - - /** - * Get the insert sql for an empty insert statement - * - * @param string $tableName - * @param string $identifierColumnName - * @return string $sql - */ - public function getEmptyIdentityInsertSQL($quotedTableName, $quotedIdentifierColumnName) - { - return 'INSERT INTO ' . $quotedTableName . ' DEFAULT VALUES'; - } - - /** - * @inheritdoc - */ - public function getTruncateTableSQL($tableName, $cascade = false) - { - return 'TRUNCATE TABLE '.$tableName; - } - - /** - * MsSql uses Table Hints for locking strategies instead of the ANSI SQL FOR UPDATE like hints. - * - * @return string - */ - public function getForUpdateSQL() - { - return ''; - } - - /** - * @license LGPL - * @author Hibernate - * @param string $fromClause - * @param int $lockMode - * @return string - */ - public function appendLockHint($fromClause, $lockMode) - { - if ($lockMode == \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE) { - return $fromClause . " WITH (UPDLOCK, ROWLOCK)"; - } else if ( $lockMode == \Doctrine\DBAL\LockMode::PESSIMISTIC_READ ) { - return $fromClause . " WITH (HOLDLOCK, ROWLOCK)"; - } else { - return $fromClause; - } - } -} diff --git a/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php b/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php deleted file mode 100644 index 358a3df70..000000000 --- a/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php +++ /dev/null @@ -1,591 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\DBALException, - Doctrine\DBAL\Schema\TableDiff; - -/** - * The MySqlPlatform provides the behavior, features and SQL dialect of the - * MySQL database platform. This platform represents a MySQL 5.0 or greater platform that - * uses the InnoDB storage engine. - * - * @since 2.0 - * @author Roman Borschel - * @author Benjamin Eberlei - * @todo Rename: MySQLPlatform - */ -class MySqlPlatform extends AbstractPlatform -{ - /** - * Gets the character used for identifier quoting. - * - * @return string - * @override - */ - public function getIdentifierQuoteCharacter() - { - return '`'; - } - - /** - * Returns the regular expression operator. - * - * @return string - * @override - */ - public function getRegexpExpression() - { - return 'RLIKE'; - } - - /** - * Returns global unique identifier - * - * @return string to get global unique identifier - * @override - */ - public function getGuidExpression() - { - return 'UUID()'; - } - - /** - * returns the position of the first occurrence of substring $substr in string $str - * - * @param string $substr literal string to find - * @param string $str literal string - * @param int $pos position to start at, beginning of string by default - * @return integer - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - if ($startPos == false) { - return 'LOCATE(' . $substr . ', ' . $str . ')'; - } else { - return 'LOCATE(' . $substr . ', ' . $str . ', '.$startPos.')'; - } - } - - /** - * Returns a series of strings concatinated - * - * concat() accepts an arbitrary number of parameters. Each parameter - * must contain an expression or an array with expressions. - * - * @param string|array(string) strings that will be concatinated. - * @override - */ - public function getConcatExpression() - { - $args = func_get_args(); - return 'CONCAT(' . join(', ', (array) $args) . ')'; - } - - public function getListDatabasesSQL() - { - return 'SHOW DATABASES'; - } - - public function getListTableConstraintsSQL($table) - { - return 'SHOW INDEX FROM ' . $table; - } - - public function getListTableIndexesSQL($table) - { - return 'SHOW INDEX FROM ' . $table; - } - - public function getListViewsSQL($database) - { - return "SELECT * FROM information_schema.VIEWS WHERE TABLE_SCHEMA = '".$database."'"; - } - - public function getListTableForeignKeysSQL($table, $database = null) - { - $sql = "SELECT DISTINCT k.`CONSTRAINT_NAME`, k.`COLUMN_NAME`, k.`REFERENCED_TABLE_NAME`, ". - "k.`REFERENCED_COLUMN_NAME` /*!50116 , c.update_rule, c.delete_rule */ ". - "FROM information_schema.key_column_usage k /*!50116 ". - "INNER JOIN information_schema.referential_constraints c ON k.`CONSTRAINT_NAME` = c.constraint_name AND ". - " c.constraint_name = k.constraint_name AND ". - " c.table_name = '$table' */ WHERE k.table_name = '$table'"; - - if ( ! is_null($database)) { - $sql .= " AND table_schema = '$database'"; - } - - $sql .= " AND `REFERENCED_COLUMN_NAME` is not NULL"; - - return $sql; - } - - public function getCreateViewSQL($name, $sql) - { - return 'CREATE VIEW ' . $name . ' AS ' . $sql; - } - - public function getDropViewSQL($name) - { - return 'DROP VIEW '. $name; - } - - /** - * Gets the SQL snippet used to declare a VARCHAR column on the MySql platform. - * - * @params array $field - */ - public function getVarcharTypeDeclarationSQL(array $field) - { - if ( ! isset($field['length'])) { - if (array_key_exists('default', $field)) { - $field['length'] = $this->getVarcharMaxLength(); - } else { - $field['length'] = false; - } - } - - $length = ($field['length'] <= $this->getVarcharMaxLength()) ? $field['length'] : false; - $fixed = (isset($field['fixed'])) ? $field['fixed'] : false; - - return $fixed ? ($length ? 'CHAR(' . $length . ')' : 'CHAR(255)') - : ($length ? 'VARCHAR(' . $length . ')' : 'VARCHAR(255)'); - } - - /** @override */ - public function getClobTypeDeclarationSQL(array $field) - { - if ( ! empty($field['length'])) { - $length = $field['length']; - if ($length <= 255) { - return 'TINYTEXT'; - } else if ($length <= 65532) { - return 'TEXT'; - } else if ($length <= 16777215) { - return 'MEDIUMTEXT'; - } - } - return 'LONGTEXT'; - } - - /** - * @override - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - if (isset($fieldDeclaration['version']) && $fieldDeclaration['version'] == true) { - return 'TIMESTAMP'; - } else { - return 'DATETIME'; - } - } - - /** - * @override - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * @override - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIME'; - } - - /** - * @override - */ - public function getBooleanTypeDeclarationSQL(array $field) - { - return 'TINYINT(1)'; - } - - /** - * Obtain DBMS specific SQL code portion needed to set the COLLATION - * of a field declaration to be used in statements like CREATE TABLE. - * - * @param string $collation name of the collation - * @return string DBMS specific SQL code portion needed to set the COLLATION - * of a field declaration. - */ - public function getCollationFieldDeclaration($collation) - { - return 'COLLATE ' . $collation; - } - - /** - * Whether the platform prefers identity columns for ID generation. - * MySql prefers "autoincrement" identity columns since sequences can only - * be emulated with a table. - * - * @return boolean - * @override - */ - public function prefersIdentityColumns() - { - return true; - } - - /** - * Whether the platform supports identity columns. - * MySql supports this through AUTO_INCREMENT columns. - * - * @return boolean - * @override - */ - public function supportsIdentityColumns() - { - return true; - } - - /** - * Whether the platform supports savepoints. MySql does not. - * - * @return boolean - * @override - */ - public function supportsSavepoints() - { - return false; - } - - public function getShowDatabasesSQL() - { - return 'SHOW DATABASES'; - } - - public function getListTablesSQL() - { - return 'SHOW FULL TABLES WHERE Table_type = "BASE TABLE"'; - } - - public function getListTableColumnsSQL($table) - { - return 'DESCRIBE ' . $table; - } - - /** - * create a new database - * - * @param string $name name of the database that should be created - * @return string - * @override - */ - public function getCreateDatabaseSQL($name) - { - return 'CREATE DATABASE ' . $name; - } - - /** - * drop an existing database - * - * @param string $name name of the database that should be dropped - * @return string - * @override - */ - public function getDropDatabaseSQL($name) - { - return 'DROP DATABASE ' . $name; - } - - /** - * create a new table - * - * @param string $tableName Name of the database that should be created - * @param array $columns Associative array that contains the definition of each field of the new table - * The indexes of the array entries are the names of the fields of the table an - * the array entry values are associative arrays like those that are meant to be - * passed with the field definitions to get[Type]Declaration() functions. - * array( - * 'id' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * 'notnull' => 1 - * 'default' => 0 - * ), - * 'name' => array( - * 'type' => 'text', - * 'length' => 12 - * ), - * 'password' => array( - * 'type' => 'text', - * 'length' => 12 - * ) - * ); - * @param array $options An associative array of table options: - * array( - * 'comment' => 'Foo', - * 'charset' => 'utf8', - * 'collate' => 'utf8_unicode_ci', - * 'type' => 'innodb', - * ); - * - * @return void - * @override - */ - protected function _getCreateTableSQL($tableName, array $columns, array $options = array()) - { - $queryFields = $this->getColumnDeclarationListSQL($columns); - - if (isset($options['uniqueConstraints']) && ! empty($options['uniqueConstraints'])) { - foreach ($options['uniqueConstraints'] as $index => $definition) { - $queryFields .= ', ' . $this->getUniqueConstraintDeclarationSQL($index, $definition); - } - } - - // add all indexes - if (isset($options['indexes']) && ! empty($options['indexes'])) { - foreach($options['indexes'] as $index => $definition) { - $queryFields .= ', ' . $this->getIndexDeclarationSQL($index, $definition); - } - } - - // attach all primary keys - if (isset($options['primary']) && ! empty($options['primary'])) { - $keyColumns = array_unique(array_values($options['primary'])); - $queryFields .= ', PRIMARY KEY(' . implode(', ', $keyColumns) . ')'; - } - - $query = 'CREATE '; - if (!empty($options['temporary'])) { - $query .= 'TEMPORARY '; - } - $query.= 'TABLE ' . $tableName . ' (' . $queryFields . ')'; - - $optionStrings = array(); - - if (isset($options['comment'])) { - $optionStrings['comment'] = 'COMMENT = ' . $this->quote($options['comment'], 'text'); - } - if (isset($options['charset'])) { - $optionStrings['charset'] = 'DEFAULT CHARACTER SET ' . $options['charset']; - if (isset($options['collate'])) { - $optionStrings['charset'] .= ' COLLATE ' . $options['collate']; - } - } - - // get the type of the table - if (isset($options['engine'])) { - $optionStrings[] = 'ENGINE = ' . $engine; - } else { - // default to innodb - $optionStrings[] = 'ENGINE = InnoDB'; - } - - if ( ! empty($optionStrings)) { - $query.= ' '.implode(' ', $optionStrings); - } - $sql[] = $query; - - if (isset($options['foreignKeys'])) { - foreach ((array) $options['foreignKeys'] as $definition) { - $sql[] = $this->getCreateForeignKeySQL($definition, $tableName); - } - } - - return $sql; - } - - /** - * Gets the SQL to alter an existing table. - * - * @param TableDiff $diff - * @return array - */ - public function getAlterTableSQL(TableDiff $diff) - { - $queryParts = array(); - if ($diff->newName !== false) { - $queryParts[] = 'RENAME TO ' . $diff->newName; - } - - foreach ($diff->addedColumns AS $fieldName => $column) { - $queryParts[] = 'ADD ' . $this->getColumnDeclarationSQL($column->getName(), $column->toArray()); - } - - foreach ($diff->removedColumns AS $column) { - $queryParts[] = 'DROP ' . $column->getName(); - } - - foreach ($diff->changedColumns AS $columnDiff) { - /* @var $columnDiff Doctrine\DBAL\Schema\ColumnDiff */ - $column = $columnDiff->column; - $queryParts[] = 'CHANGE ' . ($columnDiff->oldColumnName) . ' ' - . $this->getColumnDeclarationSQL($column->getName(), $column->toArray()); - } - - foreach ($diff->renamedColumns AS $oldColumnName => $column) { - $queryParts[] = 'CHANGE ' . $oldColumnName . ' ' - . $this->getColumnDeclarationSQL($column->getName(), $column->toArray()); - } - - $sql = array(); - if (count($queryParts) > 0) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . implode(", ", $queryParts); - } - $sql = array_merge($sql, $this->_getAlterTableIndexForeignKeySQL($diff)); - return $sql; - } - - /** - * Obtain DBMS specific SQL code portion needed to declare an integer type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param string $field associative array with the name of the properties - * of the field being declared as array indexes. - * Currently, the types of supported field - * properties are as follows: - * - * unsigned - * Boolean flag that indicates whether the field - * should be declared as unsigned integer if - * possible. - * - * default - * Integer value to be used as default for this - * field. - * - * notnull - * Boolean flag that indicates whether this field is - * constrained to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @override - */ - public function getIntegerTypeDeclarationSQL(array $field) - { - return 'INT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** @override */ - public function getBigIntTypeDeclarationSQL(array $field) - { - return 'BIGINT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** @override */ - public function getSmallIntTypeDeclarationSQL(array $field) - { - return 'SMALLINT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** @override */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - $autoinc = ''; - if ( ! empty($columnDef['autoincrement'])) { - $autoinc = ' AUTO_INCREMENT'; - } - $unsigned = (isset($columnDef['unsigned']) && $columnDef['unsigned']) ? ' UNSIGNED' : ''; - - return $unsigned . $autoinc; - } - - /** - * Return the FOREIGN KEY query section dealing with non-standard options - * as MATCH, INITIALLY DEFERRED, ON UPDATE, ... - * - * @param ForeignKeyConstraint $foreignKey - * @return string - * @override - */ - public function getAdvancedForeignKeyOptionsSQL(\Doctrine\DBAL\Schema\ForeignKeyConstraint $foreignKey) - { - $query = ''; - if ($foreignKey->hasOption('match')) { - $query .= ' MATCH ' . $foreignKey->getOption('match'); - } - $query .= parent::getAdvancedForeignKeyOptionsSQL($foreignKey); - return $query; - } - - /** - * Gets the SQL to drop an index of a table. - * - * @param Index $index name of the index to be dropped - * @param string|Table $table name of table that should be used in method - * @override - */ - public function getDropIndexSQL($index, $table=null) - { - if($index instanceof \Doctrine\DBAL\Schema\Index) { - $index = $index->getName(); - } else if(!is_string($index)) { - throw new \InvalidArgumentException('MysqlPlatform::getDropIndexSQL() expects $index parameter to be string or \Doctrine\DBAL\Schema\Index.'); - } - - if($table instanceof \Doctrine\DBAL\Schema\Table) { - $table = $table->getName(); - } else if(!is_string($table)) { - throw new \InvalidArgumentException('MysqlPlatform::getDropIndexSQL() expects $table parameter to be string or \Doctrine\DBAL\Schema\Table.'); - } - - return 'DROP INDEX ' . $index . ' ON ' . $table; - } - - /** - * Gets the SQL to drop a table. - * - * @param string $table The name of table to drop. - * @override - */ - public function getDropTableSQL($table) - { - if ($table instanceof \Doctrine\DBAL\Schema\Table) { - $table = $table->getName(); - } else if(!is_string($table)) { - throw new \InvalidArgumentException('MysqlPlatform::getDropTableSQL() expects $table parameter to be string or \Doctrine\DBAL\Schema\Table.'); - } - - return 'DROP TABLE ' . $table; - } - - public function getSetTransactionIsolationSQL($level) - { - return 'SET SESSION TRANSACTION ISOLATION LEVEL ' . $this->_getTransactionIsolationLevelSQL($level); - } - - /** - * Get the platform name for this instance. - * - * @return string - */ - public function getName() - { - return 'mysql'; - } - - public function createsExplicitIndexForForeignKeys() - { - return true; - } - - public function getReadLockSQL() - { - return 'LOCK IN SHARE MODE'; - } -} diff --git a/lib/Doctrine/DBAL/Platforms/OraclePlatform.php b/lib/Doctrine/DBAL/Platforms/OraclePlatform.php deleted file mode 100644 index b391045c8..000000000 --- a/lib/Doctrine/DBAL/Platforms/OraclePlatform.php +++ /dev/null @@ -1,653 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\Schema\TableDiff; - -/** - * OraclePlatform. - * - * @since 2.0 - * @author Roman Borschel - * @author Lukas Smith (PEAR MDB2 library) - * @author Benjamin Eberlei - */ -class OraclePlatform extends AbstractPlatform -{ - /** - * return string to call a function to get a substring inside an SQL statement - * - * Note: Not SQL92, but common functionality. - * - * @param string $value an sql string literal or column name/alias - * @param integer $position where to start the substring portion - * @param integer $length the substring portion length - * @return string SQL substring function with given parameters - * @override - */ - public function getSubstringExpression($value, $position, $length = null) - { - if ($length !== null) { - return "SUBSTR($value, $position, $length)"; - } - - return "SUBSTR($value, $position)"; - } - - /** - * Return string to call a variable with the current timestamp inside an SQL statement - * There are three special variables for current date and time: - * - CURRENT_TIMESTAMP (date and time, TIMESTAMP type) - * - CURRENT_DATE (date, DATE type) - * - CURRENT_TIME (time, TIME type) - * - * @return string to call a variable with the current timestamp - * @override - */ - public function getNowExpression($type = 'timestamp') - { - switch ($type) { - case 'date': - case 'time': - case 'timestamp': - default: - return 'TO_CHAR(CURRENT_TIMESTAMP, \'YYYY-MM-DD HH24:MI:SS\')'; - } - } - - /** - * returns the position of the first occurrence of substring $substr in string $str - * - * @param string $substr literal string to find - * @param string $str literal string - * @param int $pos position to start at, beginning of string by default - * @return integer - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - if ($startPos == false) { - return 'INSTR('.$str.', '.$substr.')'; - } else { - return 'INSTR('.$str.', '.$substr.', '.$startPos.')'; - } - } - - /** - * Returns global unique identifier - * - * @return string to get global unique identifier - * @override - */ - public function getGuidExpression() - { - return 'SYS_GUID()'; - } - - /** - * Gets the SQL used to create a sequence that starts with a given value - * and increments by the given allocation size. - * - * Need to specifiy minvalue, since start with is hidden in the system and MINVALUE <= START WITH. - * Therefore we can use MINVALUE to be able to get a hint what START WITH was for later introspection - * in {@see listSequences()} - * - * @param \Doctrine\DBAL\Schema\Sequence $sequence - * @return string - */ - public function getCreateSequenceSQL(\Doctrine\DBAL\Schema\Sequence $sequence) - { - return 'CREATE SEQUENCE ' . $sequence->getName() . - ' START WITH ' . $sequence->getInitialValue() . - ' MINVALUE ' . $sequence->getInitialValue() . - ' INCREMENT BY ' . $sequence->getAllocationSize(); - } - - /** - * {@inheritdoc} - * - * @param string $sequenceName - * @override - */ - public function getSequenceNextValSQL($sequenceName) - { - return 'SELECT ' . $sequenceName . '.nextval FROM DUAL'; - } - - /** - * {@inheritdoc} - * - * @param integer $level - * @override - */ - public function getSetTransactionIsolationSQL($level) - { - return 'SET TRANSACTION ISOLATION LEVEL ' . $this->_getTransactionIsolationLevelSQL($level); - } - - protected function _getTransactionIsolationLevelSQL($level) - { - switch ($level) { - case \Doctrine\DBAL\Connection::TRANSACTION_READ_UNCOMMITTED: - return 'READ UNCOMMITTED'; - case \Doctrine\DBAL\Connection::TRANSACTION_READ_COMMITTED: - return 'READ COMMITTED'; - case \Doctrine\DBAL\Connection::TRANSACTION_REPEATABLE_READ: - case \Doctrine\DBAL\Connection::TRANSACTION_SERIALIZABLE: - return 'SERIALIZABLE'; - default: - return parent::_getTransactionIsolationLevelSQL($level); - } - } - - /** - * @override - */ - public function getBooleanTypeDeclarationSQL(array $field) - { - return 'NUMBER(1)'; - } - - /** - * @override - */ - public function getIntegerTypeDeclarationSQL(array $field) - { - return 'NUMBER(10)'; - } - - /** - * @override - */ - public function getBigIntTypeDeclarationSQL(array $field) - { - return 'NUMBER(20)'; - } - - /** - * @override - */ - public function getSmallIntTypeDeclarationSQL(array $field) - { - return 'NUMBER(5)'; - } - - /** - * @override - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIMESTAMP(0) WITH TIME ZONE'; - } - - /** - * @override - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * @override - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * @override - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - return ''; - } - - /** - * Gets the SQL snippet used to declare a VARCHAR column on the Oracle platform. - * - * @params array $field - * @override - */ - public function getVarcharTypeDeclarationSQL(array $field) - { - if ( ! isset($field['length'])) { - if (array_key_exists('default', $field)) { - $field['length'] = $this->getVarcharMaxLength(); - } else { - $field['length'] = false; - } - } - - $length = ($field['length'] <= $this->getVarcharMaxLength()) ? $field['length'] : false; - $fixed = (isset($field['fixed'])) ? $field['fixed'] : false; - - return $fixed ? ($length ? 'CHAR(' . $length . ')' : 'CHAR(2000)') - : ($length ? 'VARCHAR2(' . $length . ')' : 'VARCHAR2(4000)'); - } - - /** @override */ - public function getClobTypeDeclarationSQL(array $field) - { - return 'CLOB'; - } - - public function getListDatabasesSQL() - { - return 'SELECT username FROM all_users'; - } - - public function getListSequencesSQL($database) - { - return "SELECT sequence_name, min_value, increment_by FROM sys.all_sequences ". - "WHERE SEQUENCE_OWNER = '".strtoupper($database)."'"; - } - - /** - * - * @param string $table - * @param array $columns - * @param array $options - * @return array - */ - protected function _getCreateTableSQL($table, array $columns, array $options = array()) - { - $indexes = isset($options['indexes']) ? $options['indexes'] : array(); - $options['indexes'] = array(); - $sql = parent::_getCreateTableSQL($table, $columns, $options); - - foreach ($columns as $name => $column) { - if (isset($column['sequence'])) { - $sql[] = $this->getCreateSequenceSQL($column['sequence'], 1); - } - - if (isset($column['autoincrement']) && $column['autoincrement'] || - (isset($column['autoinc']) && $column['autoinc'])) { - $sql = array_merge($sql, $this->getCreateAutoincrementSql($name, $table)); - } - } - - if (isset($indexes) && ! empty($indexes)) { - foreach ($indexes as $indexName => $index) { - $sql[] = $this->getCreateIndexSQL($index, $table); - } - } - - return $sql; - } - - /** - * @license New BSD License - * @link http://ezcomponents.org/docs/api/trunk/DatabaseSchema/ezcDbSchemaOracleReader.html - * @param string $table - * @return string - */ - public function getListTableIndexesSQL($table) - { - $table = strtoupper($table); - - return "SELECT uind.index_name AS name, " . - " uind.index_type AS type, " . - " decode( uind.uniqueness, 'NONUNIQUE', 0, 'UNIQUE', 1 ) AS is_unique, " . - " uind_col.column_name AS column_name, " . - " uind_col.column_position AS column_pos, " . - " (SELECT ucon.constraint_type FROM user_constraints ucon WHERE ucon.constraint_name = uind.index_name) AS is_primary ". - "FROM user_indexes uind, user_ind_columns uind_col " . - "WHERE uind.index_name = uind_col.index_name AND uind_col.table_name = '$table' ORDER BY uind_col.column_position ASC"; - } - - public function getListTablesSQL() - { - return 'SELECT * FROM sys.user_tables'; - } - - public function getListViewsSQL($database) - { - return 'SELECT view_name, text FROM sys.user_views'; - } - - public function getCreateViewSQL($name, $sql) - { - return 'CREATE VIEW ' . $name . ' AS ' . $sql; - } - - public function getDropViewSQL($name) - { - return 'DROP VIEW '. $name; - } - - public function getCreateAutoincrementSql($name, $table, $start = 1) - { - $table = strtoupper($table); - $sql = array(); - - $indexName = $table . '_AI_PK'; - $definition = array( - 'primary' => true, - 'columns' => array($name => true), - ); - - $idx = new \Doctrine\DBAL\Schema\Index($indexName, array($name), true, true); - - $sql[] = 'DECLARE - constraints_Count NUMBER; -BEGIN - SELECT COUNT(CONSTRAINT_NAME) INTO constraints_Count FROM USER_CONSTRAINTS WHERE TABLE_NAME = \''.$table.'\' AND CONSTRAINT_TYPE = \'P\'; - IF constraints_Count = 0 OR constraints_Count = \'\' THEN - EXECUTE IMMEDIATE \''.$this->getCreateConstraintSQL($idx, $table).'\'; - END IF; -END;'; - - $sequenceName = $table . '_SEQ'; - $sequence = new \Doctrine\DBAL\Schema\Sequence($sequenceName, $start); - $sql[] = $this->getCreateSequenceSQL($sequence); - - $triggerName = $table . '_AI_PK'; - $sql[] = 'CREATE TRIGGER ' . $triggerName . ' - BEFORE INSERT - ON ' . $table . ' - FOR EACH ROW -DECLARE - last_Sequence NUMBER; - last_InsertID NUMBER; -BEGIN - SELECT ' . $sequenceName . '.NEXTVAL INTO :NEW.' . $name . ' FROM DUAL; - IF (:NEW.' . $name . ' IS NULL OR :NEW.'.$name.' = 0) THEN - SELECT ' . $sequenceName . '.NEXTVAL INTO :NEW.' . $name . ' FROM DUAL; - ELSE - SELECT NVL(Last_Number, 0) INTO last_Sequence - FROM User_Sequences - WHERE Sequence_Name = \'' . $sequenceName . '\'; - SELECT :NEW.' . $name . ' INTO last_InsertID FROM DUAL; - WHILE (last_InsertID > last_Sequence) LOOP - SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; - END LOOP; - END IF; -END;'; - return $sql; - } - - public function getDropAutoincrementSql($table) - { - $table = strtoupper($table); - $trigger = $table . '_AI_PK'; - - if ($trigger) { - $sql[] = 'DROP TRIGGER ' . $trigger; - $sql[] = $this->getDropSequenceSQL($table.'_SEQ'); - - $indexName = $table . '_AI_PK'; - $sql[] = $this->getDropConstraintSQL($indexName, $table); - } - - return $sql; - } - - public function getListTableForeignKeysSQL($table) - { - $table = strtoupper($table); - - return "SELECT alc.constraint_name, - alc.DELETE_RULE, - alc.search_condition, - cols.column_name \"local_column\", - cols.position, - r_alc.table_name \"references_table\", - r_cols.column_name \"foreign_column\" - FROM all_cons_columns cols -LEFT JOIN all_constraints alc - ON alc.constraint_name = cols.constraint_name - AND alc.owner = cols.owner -LEFT JOIN all_constraints r_alc - ON alc.r_constraint_name = r_alc.constraint_name - AND alc.r_owner = r_alc.owner -LEFT JOIN all_cons_columns r_cols - ON r_alc.constraint_name = r_cols.constraint_name - AND r_alc.owner = r_cols.owner - AND cols.position = r_cols.position - WHERE alc.constraint_name = cols.constraint_name - AND alc.constraint_type = 'R' - AND alc.table_name = '".$table."'"; - } - - public function getListTableConstraintsSQL($table) - { - $table = strtoupper($table); - return 'SELECT * FROM user_constraints WHERE table_name = \'' . $table . '\''; - } - - public function getListTableColumnsSQL($table) - { - $table = strtoupper($table); - return "SELECT * FROM all_tab_columns WHERE table_name = '" . $table . "' ORDER BY column_name"; - } - - /** - * - * @param \Doctrine\DBAL\Schema\Sequence $sequence - * @return string - */ - public function getDropSequenceSQL($sequence) - { - if ($sequence instanceof \Doctrine\DBAL\Schema\Sequence) { - $sequence = $sequence->getName(); - } - - return 'DROP SEQUENCE ' . $sequence; - } - - /** - * @param ForeignKeyConstraint|string $foreignKey - * @param Table|string $table - * @return string - */ - public function getDropForeignKeySQL($foreignKey, $table) - { - if ($foreignKey instanceof \Doctrine\DBAL\Schema\ForeignKeyConstraint) { - $foreignKey = $foreignKey->getName(); - } - - if ($table instanceof \Doctrine\DBAL\Schema\Table) { - $table = $table->getName(); - } - - return 'ALTER TABLE ' . $table . ' DROP CONSTRAINT ' . $foreignKey; - } - - public function getDropDatabaseSQL($database) - { - return 'DROP USER ' . $database . ' CASCADE'; - } - - /** - * Gets the sql statements for altering an existing table. - * - * The method returns an array of sql statements, since some platforms need several statements. - * - * @param string $diff->name name of the table that is intended to be changed. - * @param array $changes associative array that contains the details of each type * - * @param boolean $check indicates whether the function should just check if the DBMS driver - * can perform the requested table alterations if the value is true or - * actually perform them otherwise. - * @return array - */ - public function getAlterTableSQL(TableDiff $diff) - { - $sql = array(); - - $fields = array(); - foreach ($diff->addedColumns AS $column) { - $fields[] = $this->getColumnDeclarationSQL($column->getName(), $column->toArray()); - } - if (count($fields)) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' ADD (' . implode(', ', $fields) . ')'; - } - - $fields = array(); - foreach ($diff->changedColumns AS $columnDiff) { - $column = $columnDiff->column; - $fields[] = $column->getName(). ' ' . $this->getColumnDeclarationSQL('', $column->toArray()); - } - if (count($fields)) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' MODIFY (' . implode(', ', $fields) . ')'; - } - - foreach ($diff->renamedColumns AS $oldColumnName => $column) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME COLUMN ' . $oldColumnName .' TO ' . $column->getName(); - } - - $fields = array(); - foreach ($diff->removedColumns AS $column) { - $fields[] = $column->getName(); - } - if (count($fields)) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' DROP COLUMN ' . implode(', ', $fields); - } - - if ($diff->newName !== false) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME TO ' . $diff->newName; - } - - $sql = array_merge($sql, $this->_getAlterTableIndexForeignKeySQL($diff)); - - return $sql; - } - - /** - * Whether the platform prefers sequences for ID generation. - * - * @return boolean - */ - public function prefersSequences() - { - return true; - } - - /** - * Get the platform name for this instance - * - * @return string - */ - public function getName() - { - return 'oracle'; - } - - /** - * Adds an driver-specific LIMIT clause to the query - * - * @param string $query query to modify - * @param integer $limit limit the number of rows - * @param integer $offset start reading from given offset - * @return string the modified query - */ - public function modifyLimitQuery($query, $limit, $offset = null) - { - $limit = (int) $limit; - $offset = (int) $offset; - if (preg_match('/^\s*SELECT/i', $query)) { - if ( ! preg_match('/\sFROM\s/i', $query)) { - $query .= " FROM dual"; - } - if ($limit > 0) { - $max = $offset + $limit; - $column = '*'; - if ($offset > 0) { - $min = $offset + 1; - $query = 'SELECT b.'.$column.' FROM ('. - 'SELECT a.*, ROWNUM AS doctrine_rownum FROM (' - . $query . ') a '. - ') b '. - 'WHERE doctrine_rownum BETWEEN ' . $min . ' AND ' . $max; - } else { - $query = 'SELECT a.'.$column.' FROM (' . $query .') a WHERE ROWNUM <= ' . $max; - } - } - } - return $query; - } - - /** - * Gets the character casing of a column in an SQL result set of this platform. - * - * Oracle returns all column names in SQL result sets in uppercase. - * - * @param string $column The column name for which to get the correct character casing. - * @return string The column name in the character casing used in SQL result sets. - */ - public function getSQLResultCasing($column) - { - return strtoupper($column); - } - - public function getCreateTemporaryTableSnippetSQL() - { - return "CREATE GLOBAL TEMPORARY TABLE"; - } - - public function getDateTimeFormatString() - { - return 'Y-m-d H:i:sP'; - } - - public function fixSchemaElementName($schemaElementName) - { - if (strlen($schemaElementName) > 30) { - // Trim it - return substr($schemaElementName, 0, 30); - } - return $schemaElementName; - } - - /** - * Maximum length of any given databse identifier, like tables or column names. - * - * @return int - */ - public function getMaxIdentifierLength() - { - return 30; - } - - /** - * Whether the platform supports sequences. - * - * @return boolean - */ - public function supportsSequences() - { - return true; - } - - public function supportsForeignKeyOnUpdate() - { - return false; - } - - /** - * @inheritdoc - */ - public function getTruncateTableSQL($tableName, $cascade = false) - { - return 'TRUNCATE TABLE '.$tableName; - } -} diff --git a/lib/Doctrine/DBAL/Platforms/PostgreSqlPlatform.php b/lib/Doctrine/DBAL/Platforms/PostgreSqlPlatform.php deleted file mode 100644 index f57c8e85a..000000000 --- a/lib/Doctrine/DBAL/Platforms/PostgreSqlPlatform.php +++ /dev/null @@ -1,645 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\Schema\TableDiff, - Doctrine\DBAL\Schema\Table; - -/** - * PostgreSqlPlatform. - * - * @since 2.0 - * @author Roman Borschel - * @author Lukas Smith (PEAR MDB2 library) - * @author Benjamin Eberlei - * @todo Rename: PostgreSQLPlatform - */ -class PostgreSqlPlatform extends AbstractPlatform -{ - /** - * Returns part of a string. - * - * Note: Not SQL92, but common functionality. - * - * @param string $value the target $value the string or the string column. - * @param int $from extract from this characeter. - * @param int $len extract this amount of characters. - * @return string sql that extracts part of a string. - * @override - */ - public function getSubstringExpression($value, $from, $len = null) - { - if ($len === null) { - return 'SUBSTR(' . $value . ', ' . $from . ')'; - } else { - return 'SUBSTR(' . $value . ', ' . $from . ', ' . $len . ')'; - } - } - - /** - * Returns the SQL string to return the current system date and time. - * - * @return string - */ - public function getNowExpression() - { - return 'LOCALTIMESTAMP(0)'; - } - - /** - * regexp - * - * @return string the regular expression operator - * @override - */ - public function getRegexpExpression() - { - return 'SIMILAR TO'; - } - - /** - * returns the position of the first occurrence of substring $substr in string $str - * - * @param string $substr literal string to find - * @param string $str literal string - * @param int $pos position to start at, beginning of string by default - * @return integer - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - if ($startPos !== false) { - $str = $this->getSubstringExpression($str, $startPos); - return 'CASE WHEN (POSITION('.$substr.' IN '.$str.') = 0) THEN 0 ELSE (POSITION('.$substr.' IN '.$str.') + '.($startPos-1).') END'; - } else { - return 'POSITION('.$substr.' IN '.$str.')'; - } - } - - /** - * parses a literal boolean value and returns - * proper sql equivalent - * - * @param string $value boolean value to be parsed - * @return string parsed boolean value - */ - /*public function parseBoolean($value) - { - return $value; - }*/ - - /** - * Whether the platform supports sequences. - * Postgres has native support for sequences. - * - * @return boolean - */ - public function supportsSequences() - { - return true; - } - - /** - * Whether the platform supports database schemas. - * - * @return boolean - */ - public function supportsSchemas() - { - return true; - } - - /** - * Whether the platform supports identity columns. - * Postgres supports these through the SERIAL keyword. - * - * @return boolean - */ - public function supportsIdentityColumns() - { - return true; - } - - /** - * Whether the platform prefers sequences for ID generation. - * - * @return boolean - */ - public function prefersSequences() - { - return true; - } - - public function getListDatabasesSQL() - { - return 'SELECT datname FROM pg_database'; - } - - public function getListSequencesSQL($database) - { - return "SELECT - relname - FROM - pg_class - WHERE relkind = 'S' AND relnamespace IN - (SELECT oid FROM pg_namespace - WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema')"; - } - - public function getListTablesSQL() - { - return "SELECT - c.relname AS table_name - FROM pg_class c, pg_user u - WHERE c.relowner = u.usesysid - AND c.relkind = 'r' - AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) - AND c.relname !~ '^(pg_|sql_)' - UNION - SELECT c.relname AS table_name - FROM pg_class c - WHERE c.relkind = 'r' - AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) - AND NOT EXISTS (SELECT 1 FROM pg_user WHERE usesysid = c.relowner) - AND c.relname !~ '^pg_'"; - } - - public function getListViewsSQL($database) - { - return 'SELECT viewname, definition FROM pg_views'; - } - - public function getListTableForeignKeysSQL($table, $database = null) - { - return "SELECT r.conname, pg_catalog.pg_get_constraintdef(r.oid, true) as condef - FROM pg_catalog.pg_constraint r - WHERE r.conrelid = - ( - SELECT c.oid - FROM pg_catalog.pg_class c - LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace - WHERE c.relname = '" . $table . "' AND pg_catalog.pg_table_is_visible(c.oid) - ) - AND r.contype = 'f'"; - } - - public function getCreateViewSQL($name, $sql) - { - return 'CREATE VIEW ' . $name . ' AS ' . $sql; - } - - public function getDropViewSQL($name) - { - return 'DROP VIEW '. $name; - } - - public function getListTableConstraintsSQL($table) - { - return "SELECT - relname - FROM - pg_class - WHERE oid IN ( - SELECT indexrelid - FROM pg_index, pg_class - WHERE pg_class.relname = '$table' - AND pg_class.oid = pg_index.indrelid - AND (indisunique = 't' OR indisprimary = 't') - )"; - } - - /** - * @license New BSD License - * @link http://ezcomponents.org/docs/api/trunk/DatabaseSchema/ezcDbSchemaPgsqlReader.html - * @param string $table - * @return string - */ - public function getListTableIndexesSQL($table) - { - return "SELECT relname, pg_index.indisunique, pg_index.indisprimary, - pg_index.indkey, pg_index.indrelid - FROM pg_class, pg_index - WHERE oid IN ( - SELECT indexrelid - FROM pg_index, pg_class - WHERE pg_class.relname='$table' AND pg_class.oid=pg_index.indrelid - ) AND pg_index.indexrelid = oid"; - } - - public function getListTableColumnsSQL($table) - { - return "SELECT - a.attnum, - a.attname AS field, - t.typname AS type, - format_type(a.atttypid, a.atttypmod) AS complete_type, - a.attnotnull AS isnotnull, - (SELECT 't' - FROM pg_index - WHERE c.oid = pg_index.indrelid - AND pg_index.indkey[0] = a.attnum - AND pg_index.indisprimary = 't' - ) AS pri, - (SELECT pg_attrdef.adsrc - FROM pg_attrdef - WHERE c.oid = pg_attrdef.adrelid - AND pg_attrdef.adnum=a.attnum - ) AS default - FROM pg_attribute a, pg_class c, pg_type t - WHERE c.relname = '$table' - AND a.attnum > 0 - AND a.attrelid = c.oid - AND a.atttypid = t.oid - ORDER BY a.attnum"; - } - - /** - * create a new database - * - * @param string $name name of the database that should be created - * @throws PDOException - * @return void - * @override - */ - public function getCreateDatabaseSQL($name) - { - return 'CREATE DATABASE ' . $name; - } - - /** - * drop an existing database - * - * @param string $name name of the database that should be dropped - * @throws PDOException - * @access public - */ - public function getDropDatabaseSQL($name) - { - return 'DROP DATABASE ' . $name; - } - - /** - * Return the FOREIGN KEY query section dealing with non-standard options - * as MATCH, INITIALLY DEFERRED, ON UPDATE, ... - * - * @param \Doctrine\DBAL\Schema\ForeignKeyConstraint $foreignKey foreign key definition - * @return string - * @override - */ - public function getAdvancedForeignKeyOptionsSQL(\Doctrine\DBAL\Schema\ForeignKeyConstraint $foreignKey) - { - $query = ''; - if ($foreignKey->hasOption('match')) { - $query .= ' MATCH ' . $foreignKey->getOption('match'); - } - $query .= parent::getAdvancedForeignKeyOptionsSQL($foreignKey); - if ($foreignKey->hasOption('deferrable') && $foreignKey->getOption('deferrable') !== false) { - $query .= ' DEFERRABLE'; - } else { - $query .= ' NOT DEFERRABLE'; - } - if ($foreignKey->hasOption('feferred') && $foreignKey->getOption('feferred') !== false) { - $query .= ' INITIALLY DEFERRED'; - } else { - $query .= ' INITIALLY IMMEDIATE'; - } - return $query; - } - - /** - * generates the sql for altering an existing table on postgresql - * - * @param string $name name of the table that is intended to be changed. - * @param array $changes associative array that contains the details of each type * - * @param boolean $check indicates whether the function should just check if the DBMS driver - * can perform the requested table alterations if the value is true or - * actually perform them otherwise. - * @see Doctrine_Export::alterTable() - * @return array - * @override - */ - public function getAlterTableSQL(TableDiff $diff) - { - $sql = array(); - - foreach ($diff->addedColumns as $column) { - $query = 'ADD ' . $this->getColumnDeclarationSQL($column->getName(), $column->toArray()); - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query; - } - - foreach ($diff->removedColumns as $column) { - $query = 'DROP ' . $column->getName(); - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query; - } - - foreach ($diff->changedColumns AS $columnDiff) { - $oldColumnName = $columnDiff->oldColumnName; - $column = $columnDiff->column; - - if ($columnDiff->hasChanged('type')) { - $type = $column->getType(); - - // here was a server version check before, but DBAL API does not support this anymore. - $query = 'ALTER ' . $oldColumnName . ' TYPE ' . $type->getSqlDeclaration($column->toArray(), $this); - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query; - } - if ($columnDiff->hasChanged('default')) { - $query = 'ALTER ' . $oldColumnName . ' SET ' . $this->getDefaultValueDeclarationSQL($column->toArray()); - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query; - } - if ($columnDiff->hasChanged('notnull')) { - $query = 'ALTER ' . $oldColumnName . ' ' . ($column->getNotNull() ? 'SET' : 'DROP') . ' NOT NULL'; - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query; - } - } - - foreach ($diff->renamedColumns as $oldColumnName => $column) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME COLUMN ' . $oldColumnName . ' TO ' . $column->getName(); - } - - if ($diff->newName !== false) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME TO ' . $diff->newName; - } - - $sql = array_merge($sql, $this->_getAlterTableIndexForeignKeySQL($diff)); - - return $sql; - } - - /** - * Gets the SQL to create a sequence on this platform. - * - * @param \Doctrine\DBAL\Schema\Sequence $sequence - * @return string - */ - public function getCreateSequenceSQL(\Doctrine\DBAL\Schema\Sequence $sequence) - { - return 'CREATE SEQUENCE ' . $sequence->getName() . - ' INCREMENT BY ' . $sequence->getAllocationSize() . - ' MINVALUE ' . $sequence->getInitialValue() . - ' START ' . $sequence->getInitialValue(); - } - - /** - * Drop existing sequence - * @param \Doctrine\DBAL\Schema\Sequence $sequence - * @return string - */ - public function getDropSequenceSQL($sequence) - { - if ($sequence instanceof \Doctrine\DBAL\Schema\Sequence) { - $sequence = $sequence->getName(); - } - return 'DROP SEQUENCE ' . $sequence; - } - - /** - * @param ForeignKeyConstraint|string $foreignKey - * @param Table|string $table - * @return string - */ - public function getDropForeignKeySQL($foreignKey, $table) - { - return $this->getDropConstraintSQL($foreignKey, $table); - } - - /** - * Gets the SQL used to create a table. - * - * @param unknown_type $tableName - * @param array $columns - * @param array $options - * @return unknown - */ - protected function _getCreateTableSQL($tableName, array $columns, array $options = array()) - { - $queryFields = $this->getColumnDeclarationListSQL($columns); - - if (isset($options['primary']) && ! empty($options['primary'])) { - $keyColumns = array_unique(array_values($options['primary'])); - $queryFields .= ', PRIMARY KEY(' . implode(', ', $keyColumns) . ')'; - } - - $query = 'CREATE TABLE ' . $tableName . ' (' . $queryFields . ')'; - - $sql[] = $query; - - if (isset($options['indexes']) && ! empty($options['indexes'])) { - foreach ($options['indexes'] AS $index) { - $sql[] = $this->getCreateIndexSQL($index, $tableName); - } - } - - if (isset($options['foreignKeys'])) { - foreach ((array) $options['foreignKeys'] as $definition) { - $sql[] = $this->getCreateForeignKeySQL($definition, $tableName); - } - } - - return $sql; - } - - /** - * Postgres wants boolean values converted to the strings 'true'/'false'. - * - * @param array $item - * @override - */ - public function convertBooleans($item) - { - if (is_array($item)) { - foreach ($item as $key => $value) { - if (is_bool($value) || is_numeric($item)) { - $item[$key] = ($value) ? 'true' : 'false'; - } - } - } else { - if (is_bool($item) || is_numeric($item)) { - $item = ($item) ? 'true' : 'false'; - } - } - return $item; - } - - public function getSequenceNextValSQL($sequenceName) - { - return "SELECT NEXTVAL('" . $sequenceName . "')"; - } - - public function getSetTransactionIsolationSQL($level) - { - return 'SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL ' - . $this->_getTransactionIsolationLevelSQL($level); - } - - /** - * @override - */ - public function getBooleanTypeDeclarationSQL(array $field) - { - return 'BOOLEAN'; - } - - /** - * @override - */ - public function getIntegerTypeDeclarationSQL(array $field) - { - if ( ! empty($field['autoincrement'])) { - return 'SERIAL'; - } - - return 'INT'; - } - - /** - * @override - */ - public function getBigIntTypeDeclarationSQL(array $field) - { - if ( ! empty($field['autoincrement'])) { - return 'BIGSERIAL'; - } - return 'BIGINT'; - } - - /** - * @override - */ - public function getSmallIntTypeDeclarationSQL(array $field) - { - return 'SMALLINT'; - } - - /** - * @override - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIMESTAMP(0) WITH TIME ZONE'; - } - - /** - * @override - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * @override - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIME'; - } - - /** - * @override - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - return ''; - } - - /** - * Gets the SQL snippet used to declare a VARCHAR column on the MySql platform. - * - * @params array $field - * @override - */ - public function getVarcharTypeDeclarationSQL(array $field) - { - if ( ! isset($field['length'])) { - if (array_key_exists('default', $field)) { - $field['length'] = $this->getVarcharMaxLength(); - } else { - $field['length'] = false; - } - } - - $length = ($field['length'] <= $this->getVarcharMaxLength()) ? $field['length'] : false; - $fixed = (isset($field['fixed'])) ? $field['fixed'] : false; - - return $fixed ? ($length ? 'CHAR(' . $length . ')' : 'CHAR(255)') - : ($length ? 'VARCHAR(' . $length . ')' : 'TEXT'); - } - - /** @override */ - public function getClobTypeDeclarationSQL(array $field) - { - return 'TEXT'; - } - - /** - * Get the platform name for this instance - * - * @return string - */ - public function getName() - { - return 'postgresql'; - } - - /** - * Gets the character casing of a column in an SQL result set. - * - * PostgreSQL returns all column names in SQL result sets in lowercase. - * - * @param string $column The column name for which to get the correct character casing. - * @return string The column name in the character casing used in SQL result sets. - */ - public function getSQLResultCasing($column) - { - return strtolower($column); - } - - public function getDateTimeFormatString() - { - return 'Y-m-d H:i:sO'; - } - - /** - * Get the insert sql for an empty insert statement - * - * @param string $tableName - * @param string $identifierColumnName - * @return string $sql - */ - public function getEmptyIdentityInsertSQL($quotedTableName, $quotedIdentifierColumnName) - { - return 'INSERT INTO ' . $quotedTableName . ' (' . $quotedIdentifierColumnName . ') VALUES (DEFAULT)'; - } - - /** - * @inheritdoc - */ - public function getTruncateTableSQL($tableName, $cascade = false) - { - return 'TRUNCATE '.$tableName.' '.($cascade)?'CASCADE':''; - } - - public function getReadLockSQL() - { - return 'FOR SHARE'; - } -} diff --git a/lib/Doctrine/DBAL/Platforms/SqlitePlatform.php b/lib/Doctrine/DBAL/Platforms/SqlitePlatform.php deleted file mode 100644 index 8b209fa60..000000000 --- a/lib/Doctrine/DBAL/Platforms/SqlitePlatform.php +++ /dev/null @@ -1,436 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\DBALException; - -/** - * The SqlitePlatform class describes the specifics and dialects of the SQLite - * database platform. - * - * @since 2.0 - * @author Roman Borschel - * @author Benjamin Eberlei - * @todo Rename: SQLitePlatform - */ -class SqlitePlatform extends AbstractPlatform -{ - /** - * returns the regular expression operator - * - * @return string - * @override - */ - public function getRegexpExpression() - { - return 'RLIKE'; - } - - /** - * Return string to call a variable with the current timestamp inside an SQL statement - * There are three special variables for current date and time. - * - * @return string sqlite function as string - * @override - */ - public function getNowExpression($type = 'timestamp') - { - switch ($type) { - case 'time': - return 'time(\'now\')'; - case 'date': - return 'date(\'now\')'; - case 'timestamp': - default: - return 'datetime(\'now\')'; - } - } - - /** - * Trim a string, leading/trailing/both and with a given char which defaults to space. - * - * @param string $str - * @param int $pos - * @param string $char - * @return string - */ - public function getTrimExpression($str, $pos = self::TRIM_UNSPECIFIED, $char = false) - { - $trimFn = ''; - $trimChar = ($char != false) ? (', ' . $char) : ''; - - if ($pos == self::TRIM_LEADING) { - $trimFn = 'LTRIM'; - } else if($pos == self::TRIM_TRAILING) { - $trimFn = 'RTRIM'; - } else { - $trimFn = 'TRIM'; - } - - return $trimFn . '(' . $str . $trimChar . ')'; - } - - /** - * return string to call a function to get a substring inside an SQL statement - * - * Note: Not SQL92, but common functionality. - * - * SQLite only supports the 2 parameter variant of this function - * - * @param string $value an sql string literal or column name/alias - * @param integer $position where to start the substring portion - * @param integer $length the substring portion length - * @return string SQL substring function with given parameters - * @override - */ - public function getSubstringExpression($value, $position, $length = null) - { - if ($length !== null) { - return 'SUBSTR(' . $value . ', ' . $position . ', ' . $length . ')'; - } - return 'SUBSTR(' . $value . ', ' . $position . ', LENGTH(' . $value . '))'; - } - - /** - * returns the position of the first occurrence of substring $substr in string $str - * - * @param string $substr literal string to find - * @param string $str literal string - * @param int $pos position to start at, beginning of string by default - * @return integer - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - if ($startPos == false) { - return 'LOCATE('.$str.', '.$substr.')'; - } else { - return 'LOCATE('.$str.', '.$substr.', '.$startPos.')'; - } - } - - protected function _getTransactionIsolationLevelSQL($level) - { - switch ($level) { - case \Doctrine\DBAL\Connection::TRANSACTION_READ_UNCOMMITTED: - return 0; - case \Doctrine\DBAL\Connection::TRANSACTION_READ_COMMITTED: - case \Doctrine\DBAL\Connection::TRANSACTION_REPEATABLE_READ: - case \Doctrine\DBAL\Connection::TRANSACTION_SERIALIZABLE: - return 1; - default: - return parent::_getTransactionIsolationLevelSQL($level); - } - } - - public function getSetTransactionIsolationSQL($level) - { - return 'PRAGMA read_uncommitted = ' . $this->_getTransactionIsolationLevelSQL($level); - } - - /** - * @override - */ - public function prefersIdentityColumns() - { - return true; - } - - /** - * @override - */ - public function getBooleanTypeDeclarationSQL(array $field) - { - return 'BOOLEAN'; - } - - /** - * @override - */ - public function getIntegerTypeDeclarationSQL(array $field) - { - return $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * @override - */ - public function getBigIntTypeDeclarationSQL(array $field) - { - return $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * @override - */ - public function getTinyIntTypeDeclarationSql(array $field) - { - return $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * @override - */ - public function getSmallIntTypeDeclarationSQL(array $field) - { - return $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * @override - */ - public function getMediumIntTypeDeclarationSql(array $field) - { - return $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * @override - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATETIME'; - } - - /** - * @override - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * @override - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIME'; - } - - /** - * @override - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - $autoinc = ! empty($columnDef['autoincrement']) ? ' AUTOINCREMENT' : ''; - $pk = ! empty($columnDef['primary']) && ! empty($autoinc) ? ' PRIMARY KEY' : ''; - - return 'INTEGER' . $pk . $autoinc; - } - - /** - * create a new table - * - * @param string $name Name of the database that should be created - * @param array $fields Associative array that contains the definition of each field of the new table - * The indexes of the array entries are the names of the fields of the table an - * the array entry values are associative arrays like those that are meant to be - * passed with the field definitions to get[Type]Declaration() functions. - * array( - * 'id' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * 'notnull' => 1 - * 'default' => 0 - * ), - * 'name' => array( - * 'type' => 'text', - * 'length' => 12 - * ), - * 'password' => array( - * 'type' => 'text', - * 'length' => 12 - * ) - * ); - * @param array $options An associative array of table options: - * - * @return void - * @override - */ - protected function _getCreateTableSQL($name, array $columns, array $options = array()) - { - $queryFields = $this->getColumnDeclarationListSQL($columns); - - $autoinc = false; - foreach($columns as $field) { - if (isset($field['autoincrement']) && $field['autoincrement']) { - $autoinc = true; - break; - } - } - - if ( ! $autoinc && isset($options['primary']) && ! empty($options['primary'])) { - $keyColumns = array_unique(array_values($options['primary'])); - $keyColumns = array_map(array($this, 'quoteIdentifier'), $keyColumns); - $queryFields.= ', PRIMARY KEY('.implode(', ', $keyColumns).')'; - } - - $query[] = 'CREATE TABLE ' . $name . ' (' . $queryFields . ')'; - - if (isset($options['indexes']) && ! empty($options['indexes'])) { - foreach ($options['indexes'] as $index => $indexDef) { - $query[] = $this->getCreateIndexSQL($indexDef, $name); - } - } - if (isset($options['unique']) && ! empty($options['unique'])) { - foreach ($options['unique'] as $index => $indexDef) { - $query[] = $this->getCreateIndexSQL($indexDef, $name); - } - } - return $query; - } - - /** - * {@inheritdoc} - */ - public function getVarcharTypeDeclarationSQL(array $field) - { - if ( ! isset($field['length'])) { - if (array_key_exists('default', $field)) { - $field['length'] = $this->getVarcharMaxLength(); - } else { - $field['length'] = false; - } - } - $length = ($field['length'] <= $this->getVarcharMaxLength()) ? $field['length'] : false; - $fixed = (isset($field['fixed'])) ? $field['fixed'] : false; - - return $fixed ? ($length ? 'CHAR(' . $length . ')' : 'CHAR(255)') - : ($length ? 'VARCHAR(' . $length . ')' : 'TEXT'); - } - - public function getClobTypeDeclarationSQL(array $field) - { - return 'CLOB'; - } - - public function getListTableConstraintsSQL($table) - { - return "SELECT sql FROM sqlite_master WHERE type='index' AND tbl_name = '$table' AND sql NOT NULL ORDER BY name"; - } - - public function getListTableColumnsSQL($table) - { - return "PRAGMA table_info($table)"; - } - - public function getListTableIndexesSQL($table) - { - return "PRAGMA index_list($table)"; - } - - public function getListTablesSQL() - { - return "SELECT name FROM sqlite_master WHERE type = 'table' AND name != 'sqlite_sequence' " - . "UNION ALL SELECT name FROM sqlite_temp_master " - . "WHERE type = 'table' ORDER BY name"; - } - - public function getListViewsSQL($database) - { - return "SELECT name, sql FROM sqlite_master WHERE type='view' AND sql NOT NULL"; - } - - public function getCreateViewSQL($name, $sql) - { - return 'CREATE VIEW ' . $name . ' AS ' . $sql; - } - - public function getDropViewSQL($name) - { - return 'DROP VIEW '. $name; - } - - /** - * SQLite does support foreign key constraints, but only in CREATE TABLE statements... - * This really limits their usefulness and requires SQLite specific handling, so - * we simply say that SQLite does NOT support foreign keys for now... - * - * @return boolean FALSE - * @override - */ - public function supportsForeignKeyConstraints() - { - return false; - } - - public function supportsAlterTable() - { - return false; - } - - /** - * Get the platform name for this instance - * - * @return string - */ - public function getName() - { - return 'sqlite'; - } - - /** - * @inheritdoc - */ - public function getTruncateTableSQL($tableName, $cascade = false) - { - return 'DELETE FROM '.$tableName; - } - - /** - * User-defined function for Sqlite that is used with PDO::sqliteCreateFunction() - * - * @param int|float $value - * @return float - */ - static public function udfSqrt($value) - { - return sqrt($value); - } - - /** - * User-defined function for Sqlite that implements MOD(a, b) - */ - static public function udfMod($a, $b) - { - return ($a % $b); - } - - /** - * @param string $str - * @param string $substr - * @param int $offset - */ - static public function udfLocate($str, $substr, $offset = 0) - { - $pos = strpos($str, $substr, $offset); - if ($pos !== false) { - return $pos+1; - } - return 0; - } - - public function getForUpdateSql() - { - return ''; - } -} diff --git a/lib/Doctrine/DBAL/README.markdown b/lib/Doctrine/DBAL/README.markdown deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/Doctrine/DBAL/Schema/AbstractAsset.php b/lib/Doctrine/DBAL/Schema/AbstractAsset.php deleted file mode 100644 index ae79014a0..000000000 --- a/lib/Doctrine/DBAL/Schema/AbstractAsset.php +++ /dev/null @@ -1,86 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * The abstract asset allows to reset the name of all assets without publishing this to the public userland. - * - * This encapsulation hack is necessary to keep a consistent state of the database schema. Say we have a list of tables - * array($tableName => Table($tableName)); if you want to rename the table, you have to make sure - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -abstract class AbstractAsset -{ - /** - * @var string - */ - protected $_name; - - /** - * Set name of this asset - * - * @param string $name - */ - protected function _setName($name) - { - $this->_name = $name; - } - - /** - * Return name of this schema asset. - * - * @return string - */ - public function getName() - { - return $this->_name; - } - - /** - * Generate an identifier from a list of column names obeying a certain string length. - * - * This is especially important for Oracle, since it does not allow identifiers larger than 30 chars, - * however building idents automatically for foreign keys, composite keys or such can easily create - * very long names. - * - * @param array $columnNames - * @param string $postfix - * @param int $maxSize - * @return string - */ - protected function _generateIdentifierName($columnNames, $postfix='', $maxSize=30) - { - $columnCount = count($columnNames); - $postfixLen = strlen($postfix); - $parts = array_map(function($columnName) use($columnCount, $postfixLen, $maxSize) { - return substr($columnName, -floor(($maxSize-$postfixLen)/$columnCount - 1)); - }, $columnNames); - $parts[] = $postfix; - - return trim(implode("_", $parts), '_'); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/AbstractSchemaManager.php b/lib/Doctrine/DBAL/Schema/AbstractSchemaManager.php deleted file mode 100644 index 7a5cea0a7..000000000 --- a/lib/Doctrine/DBAL/Schema/AbstractSchemaManager.php +++ /dev/null @@ -1,774 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Types; -use Doctrine\DBAL\DBALException; -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Base class for schema managers. Schema managers are used to inspect and/or - * modify the database schema/structure. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @author Konsta Vesterinen - * @author Lukas Smith (PEAR MDB2 library) - * @author Roman Borschel - * @author Jonathan H. Wage - * @author Benjamin Eberlei - * @version $Revision$ - * @since 2.0 - */ -abstract class AbstractSchemaManager -{ - /** - * Holds instance of the Doctrine connection for this schema manager - * - * @var \Doctrine\DBAL\Connection - */ - protected $_conn; - - /** - * Holds instance of the database platform used for this schema manager - * - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - protected $_platform; - - /** - * Constructor. Accepts the Connection instance to manage the schema for - * - * @param \Doctrine\DBAL\Connection $conn - */ - public function __construct(\Doctrine\DBAL\Connection $conn) - { - $this->_conn = $conn; - $this->_platform = $this->_conn->getDatabasePlatform(); - } - - /** - * Return associated platform. - * - * @return \Doctrine\DBAL\Platform\AbstractPlatform - */ - public function getDatabasePlatform() - { - return $this->_platform; - } - - /** - * Try any method on the schema manager. Normally a method throws an - * exception when your DBMS doesn't support it or if an error occurs. - * This method allows you to try and method on your SchemaManager - * instance and will return false if it does not work or is not supported. - * - * - * $result = $sm->tryMethod('dropView', 'view_name'); - * - * - * @return mixed - */ - public function tryMethod() - { - $args = func_get_args(); - $method = $args[0]; - unset($args[0]); - $args = array_values($args); - - try { - return call_user_func_array(array($this, $method), $args); - } catch (\Exception $e) { - return false; - } - } - - /** - * List the available databases for this connection - * - * @return array $databases - */ - public function listDatabases() - { - $sql = $this->_platform->getListDatabasesSQL(); - - $databases = $this->_conn->fetchAll($sql); - - return $this->_getPortableDatabasesList($databases); - } - - /** - * List the available sequences for this connection - * - * @return Sequence[] - */ - public function listSequences($database = null) - { - if (is_null($database)) { - $database = $this->_conn->getDatabase(); - } - $sql = $this->_platform->getListSequencesSQL($database); - - $sequences = $this->_conn->fetchAll($sql); - - return $this->_getPortableSequencesList($sequences); - } - - /** - * List the columns for a given table. - * - * In contrast to other libraries and to the old version of Doctrine, - * this column definition does try to contain the 'primary' field for - * the reason that it is not portable accross different RDBMS. Use - * {@see listTableIndexes($tableName)} to retrieve the primary key - * of a table. We're a RDBMS specifies more details these are held - * in the platformDetails array. - * - * @param string $table The name of the table. - * @return Column[] - */ - public function listTableColumns($table) - { - $sql = $this->_platform->getListTableColumnsSQL($table); - - $tableColumns = $this->_conn->fetchAll($sql); - - return $this->_getPortableTableColumnList($tableColumns); - } - - /** - * List the indexes for a given table returning an array of Index instances. - * - * Keys of the portable indexes list are all lower-cased. - * - * @param string $table The name of the table - * @return Index[] $tableIndexes - */ - public function listTableIndexes($table) - { - $sql = $this->_platform->getListTableIndexesSQL($table); - - $tableIndexes = $this->_conn->fetchAll($sql); - - return $this->_getPortableTableIndexesList($tableIndexes, $table); - } - - /** - * Return a list of all tables in the current database - * - * @return array - */ - public function listTableNames() - { - $sql = $this->_platform->getListTablesSQL(); - - $tables = $this->_conn->fetchAll($sql); - - return $this->_getPortableTablesList($tables); - } - - /** - * List the tables for this connection - * - * @return Table[] - */ - public function listTables() - { - $tableNames = $this->listTableNames(); - - $tables = array(); - foreach ($tableNames AS $tableName) { - $tables[] = $this->listTableDetails($tableName); - } - - return $tables; - } - - /** - * @param string $tableName - * @return Table - */ - public function listTableDetails($tableName) - { - $columns = $this->listTableColumns($tableName); - $foreignKeys = array(); - if ($this->_platform->supportsForeignKeyConstraints()) { - $foreignKeys = $this->listTableForeignKeys($tableName); - } - $indexes = $this->listTableIndexes($tableName); - - $idGeneratorType = Table::ID_NONE; - foreach ($columns AS $column) { - if ($column->hasPlatformOption('autoincrement') && $column->getPlatformOption('autoincrement')) { - $idGeneratorType = Table::ID_IDENTITY; - } - } - - return new Table($tableName, $columns, $indexes, $foreignKeys, $idGeneratorType, array()); - } - - /** - * List the views this connection has - * - * @return View[] - */ - public function listViews() - { - $database = $this->_conn->getDatabase(); - $sql = $this->_platform->getListViewsSQL($database); - $views = $this->_conn->fetchAll($sql); - - return $this->_getPortableViewsList($views); - } - - /** - * List the foreign keys for the given table - * - * @param string $table The name of the table - * @return ForeignKeyConstraint[] - */ - public function listTableForeignKeys($table, $database = null) - { - if (is_null($database)) { - $database = $this->_conn->getDatabase(); - } - $sql = $this->_platform->getListTableForeignKeysSQL($table, $database); - $tableForeignKeys = $this->_conn->fetchAll($sql); - - return $this->_getPortableTableForeignKeysList($tableForeignKeys); - } - - /* drop*() Methods */ - - /** - * Drops a database. - * - * NOTE: You can not drop the database this SchemaManager is currently connected to. - * - * @param string $database The name of the database to drop - */ - public function dropDatabase($database) - { - $this->_execSql($this->_platform->getDropDatabaseSQL($database)); - } - - /** - * Drop the given table - * - * @param string $table The name of the table to drop - */ - public function dropTable($table) - { - $this->_execSql($this->_platform->getDropTableSQL($table)); - } - - /** - * Drop the index from the given table - * - * @param Index|string $index The name of the index - * @param string|Table $table The name of the table - */ - public function dropIndex($index, $table) - { - if($index instanceof Index) { - $index = $index->getName(); - } - - $this->_execSql($this->_platform->getDropIndexSQL($index, $table)); - } - - /** - * Drop the constraint from the given table - * - * @param Constraint $constraint - * @param string $table The name of the table - */ - public function dropConstraint(Constraint $constraint, $table) - { - $this->_execSql($this->_platform->getDropConstraintSQL($constraint, $table)); - } - - /** - * Drops a foreign key from a table. - * - * @param ForeignKeyConstraint|string $table The name of the table with the foreign key. - * @param Table|string $name The name of the foreign key. - * @return boolean $result - */ - public function dropForeignKey($foreignKey, $table) - { - $this->_execSql($this->_platform->getDropForeignKeySQL($foreignKey, $table)); - } - - /** - * Drops a sequence with a given name. - * - * @param string $name The name of the sequence to drop. - */ - public function dropSequence($name) - { - $this->_execSql($this->_platform->getDropSequenceSQL($name)); - } - - /** - * Drop a view - * - * @param string $name The name of the view - * @return boolean $result - */ - public function dropView($name) - { - $this->_execSql($this->_platform->getDropViewSQL($name)); - } - - /* create*() Methods */ - - /** - * Creates a new database. - * - * @param string $database The name of the database to create. - */ - public function createDatabase($database) - { - $this->_execSql($this->_platform->getCreateDatabaseSQL($database)); - } - - /** - * Create a new table. - * - * @param Table $table - * @param int $createFlags - */ - public function createTable(Table $table) - { - $createFlags = AbstractPlatform::CREATE_INDEXES|AbstractPlatform::CREATE_FOREIGNKEYS; - $this->_execSql($this->_platform->getCreateTableSQL($table, $createFlags)); - } - - /** - * Create a new sequence - * - * @param Sequence $sequence - * @throws Doctrine\DBAL\ConnectionException if something fails at database level - */ - public function createSequence($sequence) - { - $this->_execSql($this->_platform->getCreateSequenceSQL($sequence)); - } - - /** - * Create a constraint on a table - * - * @param Constraint $constraint - * @param string|Table $table - */ - public function createConstraint(Constraint $constraint, $table) - { - $this->_execSql($this->_platform->getCreateConstraintSQL($constraint, $table)); - } - - /** - * Create a new index on a table - * - * @param Index $index - * @param string $table name of the table on which the index is to be created - */ - public function createIndex(Index $index, $table) - { - $this->_execSql($this->_platform->getCreateIndexSQL($index, $table)); - } - - /** - * Create a new foreign key - * - * @param ForeignKeyConstraint $foreignKey ForeignKey instance - * @param string|Table $table name of the table on which the foreign key is to be created - */ - public function createForeignKey(ForeignKeyConstraint $foreignKey, $table) - { - $this->_execSql($this->_platform->getCreateForeignKeySQL($foreignKey, $table)); - } - - /** - * Create a new view - * - * @param View $view - */ - public function createView(View $view) - { - $this->_execSql($this->_platform->getCreateViewSQL($view->getName(), $view->getSql())); - } - - /* dropAndCreate*() Methods */ - - /** - * Drop and create a constraint - * - * @param Constraint $constraint - * @param string $table - * @see dropConstraint() - * @see createConstraint() - */ - public function dropAndCreateConstraint(Constraint $constraint, $table) - { - $this->tryMethod('dropConstraint', $constraint, $table); - $this->createConstraint($constraint, $table); - } - - /** - * Drop and create a new index on a table - * - * @param string|Table $table name of the table on which the index is to be created - * @param Index $index - */ - public function dropAndCreateIndex(Index $index, $table) - { - $this->tryMethod('dropIndex', $index->getName(), $table); - $this->createIndex($index, $table); - } - - /** - * Drop and create a new foreign key - * - * @param ForeignKeyConstraint $foreignKey associative array that defines properties of the foreign key to be created. - * @param string|Table $table name of the table on which the foreign key is to be created - */ - public function dropAndCreateForeignKey(ForeignKeyConstraint $foreignKey, $table) - { - $this->tryMethod('dropForeignKey', $foreignKey, $table); - $this->createForeignKey($foreignKey, $table); - } - - /** - * Drop and create a new sequence - * - * @param Sequence $sequence - * @throws Doctrine\DBAL\ConnectionException if something fails at database level - */ - public function dropAndCreateSequence(Sequence $sequence) - { - $this->tryMethod('createSequence', $seqName, $start, $allocationSize); - $this->createSequence($seqName, $start, $allocationSize); - } - - /** - * Drop and create a new table. - * - * @param Table $table - */ - public function dropAndCreateTable(Table $table) - { - $this->tryMethod('dropTable', $table->getName()); - $this->createTable($table); - } - - /** - * Drop and creates a new database. - * - * @param string $database The name of the database to create. - */ - public function dropAndCreateDatabase($database) - { - $this->tryMethod('dropDatabase', $database); - $this->createDatabase($database); - } - - /** - * Drop and create a new view - * - * @param View $view - */ - public function dropAndCreateView(View $view) - { - $this->tryMethod('dropView', $view->getName()); - $this->createView($view); - } - - /* alterTable() Methods */ - - /** - * Alter an existing tables schema - * - * @param TableDiff $tableDiff - */ - public function alterTable(TableDiff $tableDiff) - { - $queries = $this->_platform->getAlterTableSQL($tableDiff); - if (is_array($queries) && count($queries)) { - foreach ($queries AS $ddlQuery) { - $this->_execSql($ddlQuery); - } - } - } - - /** - * Rename a given table to another name - * - * @param string $name The current name of the table - * @param string $newName The new name of the table - */ - public function renameTable($name, $newName) - { - $tableDiff = new TableDiff($name); - $tableDiff->newName = $newName; - $this->alterTable($tableDiff); - } - - /** - * Methods for filtering return values of list*() methods to convert - * the native DBMS data definition to a portable Doctrine definition - */ - - protected function _getPortableDatabasesList($databases) - { - $list = array(); - foreach ($databases as $key => $value) { - if ($value = $this->_getPortableDatabaseDefinition($value)) { - $list[] = $value; - } - } - return $list; - } - - protected function _getPortableDatabaseDefinition($database) - { - return $database; - } - - protected function _getPortableFunctionsList($functions) - { - $list = array(); - foreach ($functions as $key => $value) { - if ($value = $this->_getPortableFunctionDefinition($value)) { - $list[] = $value; - } - } - return $list; - } - - protected function _getPortableFunctionDefinition($function) - { - return $function; - } - - protected function _getPortableTriggersList($triggers) - { - $list = array(); - foreach ($triggers as $key => $value) { - if ($value = $this->_getPortableTriggerDefinition($value)) { - $list[] = $value; - } - } - return $list; - } - - protected function _getPortableTriggerDefinition($trigger) - { - return $trigger; - } - - protected function _getPortableSequencesList($sequences) - { - $list = array(); - foreach ($sequences as $key => $value) { - if ($value = $this->_getPortableSequenceDefinition($value)) { - $list[] = $value; - } - } - return $list; - } - - /** - * @param array $sequence - * @return Sequence - */ - protected function _getPortableSequenceDefinition($sequence) - { - throw DBALException::notSupported('Sequences'); - } - - /** - * Independent of the database the keys of the column list result are lowercased. - * - * The name of the created column instance however is kept in its case. - * - * @param array $tableColumns - * @return array - */ - protected function _getPortableTableColumnList($tableColumns) - { - $list = array(); - foreach ($tableColumns as $key => $column) { - if ($column = $this->_getPortableTableColumnDefinition($column)) { - $name = strtolower($column->getName()); - $list[$name] = $column; - } - } - return $list; - } - - /** - * Get Table Column Definition - * - * @param array $tableColumn - * @return Column - */ - abstract protected function _getPortableTableColumnDefinition($tableColumn); - - /** - * Aggregate and group the index results according to the required data result. - * - * @param array $tableIndexRows - * @param string $tableName - * @return array - */ - protected function _getPortableTableIndexesList($tableIndexRows, $tableName=null) - { - $result = array(); - foreach($tableIndexRows AS $tableIndex) { - $indexName = $keyName = $tableIndex['key_name']; - if($tableIndex['primary']) { - $keyName = 'primary'; - } - $keyName = strtolower($keyName); - - if(!isset($result[$keyName])) { - $result[$keyName] = array( - 'name' => $indexName, - 'columns' => array($tableIndex['column_name']), - 'unique' => $tableIndex['non_unique'] ? false : true, - 'primary' => $tableIndex['primary'], - ); - } else { - $result[$keyName]['columns'][] = $tableIndex['column_name']; - } - } - - $indexes = array(); - foreach($result AS $indexKey => $data) { - $indexes[$indexKey] = new Index($data['name'], $data['columns'], $data['unique'], $data['primary']); - } - - return $indexes; - } - - protected function _getPortableTablesList($tables) - { - $list = array(); - foreach ($tables as $key => $value) { - if ($value = $this->_getPortableTableDefinition($value)) { - $list[] = $value; - } - } - return $list; - } - - protected function _getPortableTableDefinition($table) - { - return $table; - } - - protected function _getPortableUsersList($users) - { - $list = array(); - foreach ($users as $key => $value) { - if ($value = $this->_getPortableUserDefinition($value)) { - $list[] = $value; - } - } - return $list; - } - - protected function _getPortableUserDefinition($user) - { - return $user; - } - - protected function _getPortableViewsList($views) - { - $list = array(); - foreach ($views as $key => $value) { - if ($view = $this->_getPortableViewDefinition($value)) { - $viewName = strtolower($view->getName()); - $list[$viewName] = $view; - } - } - return $list; - } - - protected function _getPortableViewDefinition($view) - { - return false; - } - - protected function _getPortableTableForeignKeysList($tableForeignKeys) - { - $list = array(); - foreach ($tableForeignKeys as $key => $value) { - if ($value = $this->_getPortableTableForeignKeyDefinition($value)) { - $list[] = $value; - } - } - return $list; - } - - protected function _getPortableTableForeignKeyDefinition($tableForeignKey) - { - return $tableForeignKey; - } - - protected function _execSql($sql) - { - foreach ((array) $sql as $query) { - $this->_conn->executeUpdate($query); - } - } - - /** - * Create a schema instance for the current database. - * - * @return Schema - */ - public function createSchema() - { - $sequences = array(); - if($this->_platform->supportsSequences()) { - $sequences = $this->listSequences(); - } - $tables = $this->listTables(); - - return new Schema($tables, $sequences, $this->createSchemaConfig()); - } - - /** - * Create the configuration for this schema. - * - * @return SchemaConfig - */ - public function createSchemaConfig() - { - $schemaConfig = new SchemaConfig(); - $schemaConfig->setExplicitForeignKeyIndexes($this->_platform->createsExplicitIndexForForeignKeys()); - $schemaConfig->setMaxIdentifierLength($this->_platform->getMaxIdentifierLength()); - - return $schemaConfig; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/Column.php b/lib/Doctrine/DBAL/Schema/Column.php deleted file mode 100644 index 3b446880e..000000000 --- a/lib/Doctrine/DBAL/Schema/Column.php +++ /dev/null @@ -1,331 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use \Doctrine\DBAL\Types\Type; -use Doctrine\DBAL\Schema\Visitor\Visitor; - -/** - * Object representation of a database column - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class Column extends AbstractAsset -{ - /** - * @var \Doctrine\DBAL\Types\Type - */ - protected $_type; - - /** - * @var int - */ - protected $_length = 255; - - /** - * @var int - */ - protected $_precision = 0; - - /** - * @var int - */ - protected $_scale = 0; - - /** - * @var bool - */ - protected $_unsigned = false; - - /** - * @var bool - */ - protected $_fixed = false; - - /** - * @var bool - */ - protected $_notnull = true; - - /** - * @var string - */ - protected $_default = null; - - /** - * @var array - */ - protected $_platformOptions = array(); - - /** - * @var string - */ - protected $_columnDefinition = null; - - /** - * Create a new Column - * - * @param string $columnName - * @param Doctrine\DBAL\Types\Type $type - * @param int $length - * @param bool $notNull - * @param mixed $default - * @param bool $unsigned - * @param bool $fixed - * @param int $precision - * @param int $scale - * @param array $platformOptions - */ - public function __construct($columnName, Type $type, array $options=array()) - { - $this->_setName($columnName); - $this->setType($type); - $this->setOptions($options); - } - - /** - * @param array $options - * @return Column - */ - public function setOptions(array $options) - { - foreach ($options AS $name => $value) { - $method = "set".$name; - if (method_exists($this, $method)) { - $this->$method($value); - } - } - return $this; - } - - /** - * @param Type $type - * @return Column - */ - public function setType(Type $type) - { - $this->_type = $type; - return $this; - } - - /** - * @param int $length - * @return Column - */ - public function setLength($length) - { - if($length !== null) { - $this->_length = (int)$length; - } else { - $this->_length = null; - } - return $this; - } - - /** - * @param int $precision - * @return Column - */ - public function setPrecision($precision) - { - $this->_precision = (int)$precision; - return $this; - } - - /** - * @param int $scale - * @return Column - */ - public function setScale($scale) - { - $this->_scale = $scale; - return $this; - } - - /** - * - * @param bool $unsigned - * @return Column - */ - public function setUnsigned($unsigned) - { - $this->_unsigned = (bool)$unsigned; - return $this; - } - - /** - * - * @param bool $fixed - * @return Column - */ - public function setFixed($fixed) - { - $this->_fixed = (bool)$fixed; - return $this; - } - - /** - * @param bool $notnull - * @return Column - */ - public function setNotnull($notnull) - { - $this->_notnull = (bool)$notnull; - return $this; - } - - /** - * - * @param mixed $default - * @return Column - */ - public function setDefault($default) - { - $this->_default = $default; - return $this; - } - - /** - * - * @param array $platformOptions - * @return Column - */ - public function setPlatformOptions(array $platformOptions) - { - $this->_platformOptions = $platformOptions; - return $this; - } - - /** - * - * @param string $name - * @param mixed $value - * @return Column - */ - public function setPlatformOption($name, $value) - { - $this->_platformOptions[$name] = $value; - return $this; - } - - /** - * - * @param string - * @return Column - */ - public function setColumnDefinition($value) - { - $this->_columnDefinition = $value; - return $this; - } - - public function getType() - { - return $this->_type; - } - - public function getLength() - { - return $this->_length; - } - - public function getPrecision() - { - return $this->_precision; - } - - public function getScale() - { - return $this->_scale; - } - - public function getUnsigned() - { - return $this->_unsigned; - } - - public function getFixed() - { - return $this->_fixed; - } - - public function getNotnull() - { - return $this->_notnull; - } - - public function getDefault() - { - return $this->_default; - } - - public function getPlatformOptions() - { - return $this->_platformOptions; - } - - public function hasPlatformOption($name) - { - return isset($this->_platformOptions[$name]); - } - - public function getPlatformOption($name) - { - return $this->_platformOptions[$name]; - } - - public function getColumnDefinition() - { - return $this->_columnDefinition; - } - - /** - * @param Visitor $visitor - */ - public function visit(\Doctrine\DBAL\Schema\Visitor $visitor) - { - $visitor->accept($this); - } - - /** - * @return array - */ - public function toArray() - { - return array_merge(array( - 'name' => $this->_name, - 'type' => $this->_type, - 'default' => $this->_default, - 'notnull' => $this->_notnull, - 'length' => $this->_length, - 'precision' => $this->_precision, - 'scale' => $this->_scale, - 'fixed' => $this->_fixed, - 'unsigned' => $this->_unsigned, - 'columnDefinition' => $this->_columnDefinition, - ), $this->_platformOptions); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/ColumnDiff.php b/lib/Doctrine/DBAL/Schema/ColumnDiff.php deleted file mode 100644 index 4cf896901..000000000 --- a/lib/Doctrine/DBAL/Schema/ColumnDiff.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * Represent the change of a column - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class ColumnDiff -{ - public $oldColumnName; - - /** - * @var Column - */ - public $column; - - /** - * @var array - */ - public $changedProperties = array(); - - public function __construct($oldColumnName, Column $column, array $changedProperties = array()) - { - $this->oldColumnName = $oldColumnName; - $this->column = $column; - $this->changedProperties = $changedProperties; - } - - public function hasChanged($propertyName) - { - return in_array($propertyName, $this->changedProperties); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/Comparator.php b/lib/Doctrine/DBAL/Schema/Comparator.php deleted file mode 100644 index b3d493f52..000000000 --- a/lib/Doctrine/DBAL/Schema/Comparator.php +++ /dev/null @@ -1,395 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * Compare to Schemas and return an instance of SchemaDiff - * - * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved. - * @license http://ez.no/licenses/new_bsd New BSD License - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class Comparator -{ - /** - * @var array - */ - private $_checkColumnPlatformOptions = array(); - - /** - * @param string $optionName - */ - public function addColumnPlatformOptionCheck($optionName) - { - $this->_checkColumnPlatformOptions[] = $optionName; - } - - /** - * @param Schema $fromSchema - * @param Schema $toSchema - * @return SchemaDiff - */ - static public function compareSchemas( Schema $fromSchema, Schema $toSchema ) - { - $c = new self(); - return $c->compare($fromSchema, $toSchema); - } - - /** - * Returns a SchemaDiff object containing the differences between the schemas $fromSchema and $toSchema. - * - * The returned diferences are returned in such a way that they contain the - * operations to change the schema stored in $fromSchema to the schema that is - * stored in $toSchema. - * - * @param Schema $fromSchema - * @param Schema $toSchema - * - * @return SchemaDiff - */ - public function compare(Schema $fromSchema, Schema $toSchema) - { - if ($fromSchema->hasExplicitForeignKeyIndexes() && !$toSchema->hasExplicitForeignKeyIndexes()) { - $toSchema->visit(new \Doctrine\DBAL\Schema\Visitor\FixSchema(true)); - } - - $diff = new SchemaDiff(); - - $foreignKeysToTable = array(); - - foreach ( $toSchema->getTables() AS $tableName => $table ) { - if ( !$fromSchema->hasTable($tableName) ) { - $diff->newTables[$tableName] = $table; - } else { - $tableDifferences = $this->diffTable( $fromSchema->getTable($tableName), $table ); - if ( $tableDifferences !== false ) { - $diff->changedTables[$tableName] = $tableDifferences; - } - } - } - - /* Check if there are tables removed */ - foreach ( $fromSchema->getTables() AS $tableName => $table ) { - if ( !$toSchema->hasTable($tableName) ) { - $diff->removedTables[$tableName] = $table; - } - - // also remember all foreign keys that point to a specific table - foreach ($table->getForeignKeys() AS $foreignKey) { - $foreignTable = strtolower($foreignKey->getForeignTableName()); - if (!isset($foreignKeysToTable[$foreignTable])) { - $foreignKeysToTable[$foreignTable] = array(); - } - $foreignKeysToTable[$foreignTable][] = $foreignKey; - } - } - - foreach ($diff->removedTables AS $tableName => $table) { - if (isset($foreignKeysToTable[$tableName])) { - $diff->orphanedForeignKeys = array_merge($diff->orphanedForeignKeys, $foreignKeysToTable[$tableName]); - } - } - - foreach ( $toSchema->getSequences() AS $sequenceName => $sequence) { - if (!$fromSchema->hasSequence($sequenceName)) { - $diff->newSequences[] = $sequence; - } else { - if ($this->diffSequence($sequence, $fromSchema->getSequence($sequenceName))) { - $diff->changedSequences[] = $fromSchema->getSequence($sequenceName); - } - } - } - - foreach ($fromSchema->getSequences() AS $sequenceName => $sequence) { - if (!$toSchema->hasSequence($sequenceName)) { - $diff->removedSequences[] = $sequence; - } - } - - return $diff; - } - - /** - * - * @param Sequence $sequence1 - * @param Sequence $sequence2 - */ - public function diffSequence(Sequence $sequence1, Sequence $sequence2) - { - if($sequence1->getAllocationSize() != $sequence2->getAllocationSize()) { - return true; - } - - if($sequence1->getInitialValue() != $sequence2->getInitialValue()) { - return true; - } - - return false; - } - - /** - * Returns the difference between the tables $table1 and $table2. - * - * If there are no differences this method returns the boolean false. - * - * @param Table $table1 - * @param Table $table2 - * - * @return bool|TableDiff - */ - public function diffTable(Table $table1, Table $table2) - { - $changes = 0; - $tableDifferences = new TableDiff($table1->getName()); - - $table1Columns = $table1->getColumns(); - $table2Columns = $table2->getColumns(); - - /* See if all the fields in table 1 exist in table 2 */ - foreach ( $table2Columns as $columnName => $column ) { - if ( !$table1->hasColumn($columnName) ) { - $tableDifferences->addedColumns[$columnName] = $column; - $changes++; - } - } - /* See if there are any removed fields in table 2 */ - foreach ( $table1Columns as $columnName => $column ) { - if ( !$table2->hasColumn($columnName) ) { - $tableDifferences->removedColumns[$columnName] = $column; - $changes++; - } - } - foreach ( $table1Columns as $columnName => $column ) { - if ( $table2->hasColumn($columnName) ) { - $changedProperties = $this->diffColumn( $column, $table2->getColumn($columnName) ); - if (count($changedProperties) ) { - $columnDiff = new ColumnDiff($column->getName(), $table2->getColumn($columnName), $changedProperties); - $tableDifferences->changedColumns[$column->getName()] = $columnDiff; - $changes++; - } - } - } - - // Try to find columns that only changed their name, rename operations maybe cheaper than add/drop - foreach ($tableDifferences->addedColumns AS $addedColumnName => $addedColumn) { - foreach ($tableDifferences->removedColumns AS $removedColumnName => $removedColumn) { - if (count($this->diffColumn($addedColumn, $removedColumn)) == 0) { - $tableDifferences->renamedColumns[$removedColumn->getName()] = $addedColumn; - unset($tableDifferences->addedColumns[$addedColumnName]); - unset($tableDifferences->removedColumns[$removedColumnName]); - } - } - } - - $table1Indexes = $table1->getIndexes(); - $table2Indexes = $table2->getIndexes(); - - foreach ($table2Indexes AS $index2Name => $index2Definition) { - foreach ($table1Indexes AS $index1Name => $index1Definition) { - if ($this->diffIndex($index1Definition, $index2Definition) === false) { - unset($table1Indexes[$index1Name]); - unset($table2Indexes[$index2Name]); - } else { - if ($index1Name == $index2Name) { - $tableDifferences->changedIndexes[$index2Name] = $table2Indexes[$index2Name]; - unset($table1Indexes[$index1Name]); - unset($table2Indexes[$index2Name]); - $changes++; - } - } - } - } - - foreach ($table1Indexes AS $index1Name => $index1Definition) { - $tableDifferences->removedIndexes[$index1Name] = $index1Definition; - $changes++; - } - - foreach ($table2Indexes AS $index2Name => $index2Definition) { - $tableDifferences->addedIndexes[$index2Name] = $index2Definition; - $changes++; - } - - $fromFkeys = $table1->getForeignKeys(); - $toFkeys = $table2->getForeignKeys(); - - foreach ($fromFkeys AS $key1 => $constraint1) { - foreach ($toFkeys AS $key2 => $constraint2) { - if($this->diffForeignKey($constraint1, $constraint2) === false) { - unset($fromFkeys[$key1]); - unset($toFkeys[$key2]); - } else { - if (strtolower($constraint1->getName()) == strtolower($constraint2->getName())) { - $tableDifferences->changedForeignKeys[] = $constraint2; - $changes++; - unset($fromFkeys[$key1]); - unset($toFkeys[$key2]); - } - } - } - } - - foreach ($fromFkeys AS $key1 => $constraint1) { - $tableDifferences->removedForeignKeys[] = $constraint1; - $changes++; - } - - foreach ($toFkeys AS $key2 => $constraint2) { - $tableDifferences->addedForeignKeys[] = $constraint2; - $changes++; - } - - return $changes ? $tableDifferences : false; - } - - /** - * @param ForeignKeyConstraint $key1 - * @param ForeignKeyConstraint $key2 - * @return bool - */ - public function diffForeignKey(ForeignKeyConstraint $key1, ForeignKeyConstraint $key2) - { - if (array_map('strtolower', $key1->getLocalColumns()) != array_map('strtolower', $key2->getLocalColumns())) { - return true; - } - - if (array_map('strtolower', $key1->getForeignColumns()) != array_map('strtolower', $key2->getForeignColumns())) { - return true; - } - - if ($key1->onUpdate() != $key2->onUpdate()) { - return true; - } - - if ($key1->onDelete() != $key2->onDelete()) { - return true; - } - - return false; - } - - /** - * Returns the difference between the fields $field1 and $field2. - * - * If there are differences this method returns $field2, otherwise the - * boolean false. - * - * @param Column $column1 - * @param Column $column2 - * - * @return array - */ - public function diffColumn(Column $column1, Column $column2) - { - $changedProperties = array(); - if ( $column1->getType() != $column2->getType() ) { - $changedProperties[] = 'type'; - } - - if ($column1->getNotnull() != $column2->getNotnull()) { - $changedProperties[] = 'notnull'; - } - - if ($column1->getDefault() != $column2->getDefault()) { - $changedProperties[] = 'default'; - } - - if ($column1->getUnsigned() != $column2->getUnsigned()) { - $changedProperties[] = 'unsigned'; - } - - if ($column1->getType() instanceof \Doctrine\DBAL\Types\StringType) { - if ($column1->getLength() != $column2->getLength()) { - $changedProperties[] = 'length'; - } - - if ($column1->getFixed() != $column2->getFixed()) { - $changedProperties[] = 'fixed'; - } - } - - if ($column1->getType() instanceof \Doctrine\DBAL\Types\DecimalType) { - if ($column1->getPrecision() != $column2->getPrecision()) { - $changedProperties[] = 'precision'; - } - if ($column1->getScale() != $column2->getScale()) { - $changedProperties[] = 'scale'; - } - } - - foreach ($this->_checkColumnPlatformOptions AS $optionName) { - if($column1->hasPlatformOption($optionName) && $column2->hasPlatformOption($optionName)) { - if ($column1->getPlatformOption($optionName) != $column2->getPlatformOption($optionName)) { - $changedProperties[] = $optionName; - } - } else if ($column1->hasPlatformOption($optionName) != $column2->hasPlatformOption($optionName)) { - $changedProperties[] = $optionName; - } - } - - return $changedProperties; - } - - /** - * Finds the difference between the indexes $index1 and $index2. - * - * Compares $index1 with $index2 and returns $index2 if there are any - * differences or false in case there are no differences. - * - * @param Index $index1 - * @param Index $index2 - * @return bool - */ - public function diffIndex(Index $index1, Index $index2) - { - if($index1->isPrimary() != $index2->isPrimary()) { - return true; - } - if($index1->isUnique() != $index2->isUnique()) { - return true; - } - - // Check for removed index fields in $index2 - $index1Columns = $index1->getColumns(); - for($i = 0; $i < count($index1Columns); $i++) { - $indexColumn = $index1Columns[$i]; - if (!$index2->hasColumnAtPosition($indexColumn, $i)) { - return true; - } - } - - // Check for new index fields in $index2 - $index2Columns = $index2->getColumns(); - for($i = 0; $i < count($index2Columns); $i++) { - $indexColumn = $index2Columns[$i]; - if (!$index1->hasColumnAtPosition($indexColumn, $i)) { - return true; - } - } - - return false; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/Constraint.php b/lib/Doctrine/DBAL/Schema/Constraint.php deleted file mode 100644 index 9e760ffab..000000000 --- a/lib/Doctrine/DBAL/Schema/Constraint.php +++ /dev/null @@ -1,38 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * Marker interface for contraints - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -interface Constraint -{ - public function getName(); - - public function getColumns(); -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/DB2SchemaManager.php b/lib/Doctrine/DBAL/Schema/DB2SchemaManager.php deleted file mode 100644 index e5d87148b..000000000 --- a/lib/Doctrine/DBAL/Schema/DB2SchemaManager.php +++ /dev/null @@ -1,200 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Schema; - -/** - * IBM Db2 Schema Manager - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class DB2SchemaManager extends AbstractSchemaManager -{ - /** - * Return a list of all tables in the current database - * - * Apparently creator is the schema not the user who created it: - * {@link http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.sqlref/db2z_sysibmsystablestable.htm} - * - * @return array - */ - public function listTableNames() - { - $sql = $this->_platform->getListTablesSQL(); - $sql .= " AND CREATOR = UPPER('".$this->_conn->getUsername()."')"; - - $tables = $this->_conn->fetchAll($sql); - - return $this->_getPortableTablesList($tables); - } - - - /** - * Get Table Column Definition - * - * @param array $tableColumn - * @return Column - */ - protected function _getPortableTableColumnDefinition($tableColumn) - { - $tableColumn = array_change_key_case($tableColumn, \CASE_LOWER); - - $length = null; - $fixed = null; - $unsigned = false; - $scale = false; - $precision = false; - - switch (strtolower($tableColumn['typename'])) { - case 'smallint': - case 'bigint': - case 'integer': - case 'time': - case 'date': - $type = strtolower($tableColumn['typename']); - break; - case 'varchar': - $type = 'string'; - $length = $tableColumn['length']; - $fixed = false; - break; - case 'character': - $type = 'string'; - $length = $tableColumn['length']; - $fixed = true; - break; - case 'clob': - $type = 'text'; - $length = $tableColumn['length']; - break; - case 'decimal': - case 'double': - case 'real': - $type = 'decimal'; - $scale = $tableColumn['scale']; - $precision = $tableColumn['length']; - break; - case 'timestamp': - $type = 'datetime'; - break; - default: - throw new \Doctrine\DBAL\DBALException("Unknown Type: ".$tableColumn['typename']); - } - - $options = array( - 'length' => $length, - 'unsigned' => (bool)$unsigned, - 'fixed' => (bool)$fixed, - 'default' => ($tableColumn['default'] == "NULL") ? null : $tableColumn['default'], - 'notnull' => (bool) ($tableColumn['nulls'] == 'N'), - 'scale' => null, - 'precision' => null, - 'platformOptions' => array(), - ); - - if ($scale !== null && $precision !== null) { - $options['scale'] = $scale; - $options['precision'] = $precision; - } - - return new Column($tableColumn['colname'], \Doctrine\DBAL\Types\Type::getType($type), $options); - } - - protected function _getPortableTablesList($tables) - { - $tableNames = array(); - foreach ($tables AS $tableRow) { - $tableRow = array_change_key_case($tableRow, \CASE_LOWER); - $tableNames[] = $tableRow['name']; - } - return $tableNames; - } - - protected function _getPortableTableIndexesList($tableIndexes, $tableName=null) - { - $tableIndexRows = array(); - $indexes = array(); - foreach($tableIndexes AS $indexKey => $data) { - $data = array_change_key_case($data, \CASE_LOWER); - $unique = ($data['uniquerule'] == "D") ? false : true; - $primary = ($data['uniquerule'] == "P"); - - $indexName = strtolower($data['name']); - if ($primary) { - $keyName = 'primary'; - } else { - $keyName = $indexName; - } - - $indexes[$keyName] = new Index($indexName, explode("+", ltrim($data['colnames'], '+')), $unique, $primary); - } - - return $indexes; - } - - protected function _getPortableTableForeignKeyDefinition($tableForeignKey) - { - $tableForeignKey = array_change_key_case($tableForeignKey, CASE_LOWER); - - $tableForeignKey['deleterule'] = $this->_getPortableForeignKeyRuleDef($tableForeignKey['deleterule']); - $tableForeignKey['updaterule'] = $this->_getPortableForeignKeyRuleDef($tableForeignKey['updaterule']); - - return new ForeignKeyConstraint( - array_map('trim', (array)$tableForeignKey['fkcolnames']), - $tableForeignKey['reftbname'], - array_map('trim', (array)$tableForeignKey['pkcolnames']), - $tableForeignKey['relname'], - array( - 'onUpdate' => $tableForeignKey['updaterule'], - 'onDelete' => $tableForeignKey['deleterule'], - ) - ); - } - - protected function _getPortableForeignKeyRuleDef($def) - { - if ($def == "C") { - return "CASCADE"; - } else if ($def == "N") { - return "SET NULL"; - } - return null; - } - - protected function _getPortableViewDefinition($view) - { - $view = array_change_key_case($view, \CASE_LOWER); - // sadly this still segfaults on PDO_IBM, see http://pecl.php.net/bugs/bug.php?id=17199 - //$view['text'] = (is_resource($view['text']) ? stream_get_contents($view['text']) : $view['text']); - if (!is_resource($view['text'])) { - $pos = strpos($view['text'], ' AS '); - $sql = substr($view['text'], $pos+4); - } else { - $sql = ''; - } - - return new View($view['name'], $sql); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/ForeignKeyConstraint.php b/lib/Doctrine/DBAL/Schema/ForeignKeyConstraint.php deleted file mode 100644 index 398c72787..000000000 --- a/lib/Doctrine/DBAL/Schema/ForeignKeyConstraint.php +++ /dev/null @@ -1,164 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Schema\Visitor\Visitor; - -class ForeignKeyConstraint extends AbstractAsset implements Constraint -{ - /** - * @var Table - */ - protected $_localTable; - - /** - * @var array - */ - protected $_localColumnNames; - - /** - * @var string - */ - protected $_foreignTableName; - - /** - * @var array - */ - protected $_foreignColumnNames; - - /** - * @var string - */ - protected $_cascade = ''; - - /** - * @var array - */ - protected $_options; - - /** - * - * @param array $localColumnNames - * @param string $foreignTableName - * @param array $foreignColumnNames - * @param string $cascade - * @param string|null $name - */ - public function __construct(array $localColumnNames, $foreignTableName, array $foreignColumnNames, $name=null, array $options=array()) - { - $this->_setName($name); - $this->_localColumnNames = $localColumnNames; - $this->_foreignTableName = $foreignTableName; - $this->_foreignColumnNames = $foreignColumnNames; - $this->_options = $options; - } - - /** - * @return string - */ - public function getLocalTableName() - { - return $this->_localTable->getName(); - } - - /** - * @param Table $table - */ - public function setLocalTable(Table $table) - { - $this->_localTable = $table; - } - - /** - * @return array - */ - public function getLocalColumns() - { - return $this->_localColumnNames; - } - - public function getColumns() - { - return $this->_localColumnNames; - } - - /** - * @return string - */ - public function getForeignTableName() - { - return $this->_foreignTableName; - } - - /** - * @return array - */ - public function getForeignColumns() - { - return $this->_foreignColumnNames; - } - - public function hasOption($name) - { - return isset($this->_options[$name]); - } - - public function getOption($name) - { - return $this->_options[$name]; - } - - /** - * Foreign Key onUpdate status - * - * @return string|null - */ - public function onUpdate() - { - return $this->_onEvent('onUpdate'); - } - - /** - * Foreign Key onDelete status - * - * @return string|null - */ - public function onDelete() - { - return $this->_onEvent('onDelete'); - } - - /** - * @param string $event - * @return string|null - */ - private function _onEvent($event) - { - if (isset($this->_options[$event])) { - $onEvent = strtoupper($this->_options[$event]); - if (!in_array($onEvent, array('NO ACTION', 'RESTRICT'))) { - return $onEvent; - } - } - return false; - } -} diff --git a/lib/Doctrine/DBAL/Schema/Index.php b/lib/Doctrine/DBAL/Schema/Index.php deleted file mode 100644 index 574ae099a..000000000 --- a/lib/Doctrine/DBAL/Schema/Index.php +++ /dev/null @@ -1,109 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Schema\Visitor\Visitor; - -class Index extends AbstractAsset implements Constraint -{ - /** - * @var array - */ - protected $_columns; - - /** - * @var bool - */ - protected $_isUnique = false; - - /** - * @var bool - */ - protected $_isPrimary = false; - - /** - * @param string $indexName - * @param array $column - * @param bool $isUnique - * @param bool $isPrimary - */ - public function __construct($indexName, array $columns, $isUnique=false, $isPrimary=false) - { - $isUnique = ($isPrimary)?true:$isUnique; - - $this->_setName($indexName); - $this->_isUnique = $isUnique; - $this->_isPrimary = $isPrimary; - - foreach($columns AS $column) { - $this->_addColumn($column); - } - } - - /** - * @param string $column - */ - protected function _addColumn($column) - { - if(is_string($column)) { - $this->_columns[] = $column; - } else { - throw new \InvalidArgumentException("Expecting a string as Index Column"); - } - } - - /** - * @return array - */ - public function getColumns() - { - return $this->_columns; - } - - /** - * @return bool - */ - public function isUnique() - { - return $this->_isUnique; - } - - /** - * @return bool - */ - public function isPrimary() - { - return $this->_isPrimary; - } - - /** - * @param string $columnName - * @param int $pos - * @return bool - */ - public function hasColumnAtPosition($columnName, $pos=0) - { - $columnName = strtolower($columnName); - $indexColumns = \array_map('strtolower', $this->getColumns()); - return \array_search($columnName, $indexColumns) === $pos; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/MsSqlSchemaManager.php b/lib/Doctrine/DBAL/Schema/MsSqlSchemaManager.php deleted file mode 100644 index 953f8caa5..000000000 --- a/lib/Doctrine/DBAL/Schema/MsSqlSchemaManager.php +++ /dev/null @@ -1,399 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * xxx - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @author Konsta Vesterinen - * @author Lukas Smith (PEAR MDB2 library) - * @version $Revision$ - * @since 2.0 - */ -class MsSqlSchemaManager extends AbstractSchemaManager -{ - /** - * create a new database - * - * @param string $name name of the database that should be created - * @return void - */ - public function createDatabase($name) - { - $query = "CREATE DATABASE $name"; - if ($this->conn->options['database_device']) { - $query.= ' ON '.$this->conn->options['database_device']; - $query.= $this->conn->options['database_size'] ? '=' . - $this->conn->options['database_size'] : ''; - } - return $this->conn->standaloneQuery($query, null, true); - } - - /** - * drop an existing database - * - * @param string $name name of the database that should be dropped - * @return void - */ - public function dropDatabase($name) - { - return $this->conn->standaloneQuery('DROP DATABASE ' . $name, null, true); - } - - /** - * alter an existing table - * - * @param string $name name of the table that is intended to be changed. - * @param array $changes associative array that contains the details of each type - * of change that is intended to be performed. The types of - * changes that are currently supported are defined as follows: - * - * name - * - * New name for the table. - * - * add - * - * Associative array with the names of fields to be added as - * indexes of the array. The value of each entry of the array - * should be set to another associative array with the properties - * of the fields to be added. The properties of the fields should - * be the same as defined by the Metabase parser. - * - * - * remove - * - * Associative array with the names of fields to be removed as indexes - * of the array. Currently the values assigned to each entry are ignored. - * An empty array should be used for future compatibility. - * - * rename - * - * Associative array with the names of fields to be renamed as indexes - * of the array. The value of each entry of the array should be set to - * another associative array with the entry named name with the new - * field name and the entry named Declaration that is expected to contain - * the portion of the field declaration already in DBMS specific SQL code - * as it is used in the CREATE TABLE statement. - * - * change - * - * Associative array with the names of the fields to be changed as indexes - * of the array. Keep in mind that if it is intended to change either the - * name of a field and any other properties, the change array entries - * should have the new names of the fields as array indexes. - * - * The value of each entry of the array should be set to another associative - * array with the properties of the fields to that are meant to be changed as - * array entries. These entries should be assigned to the new values of the - * respective properties. The properties of the fields should be the same - * as defined by the Metabase parser. - * - * Example - * array( - * 'name' => 'userlist', - * 'add' => array( - * 'quota' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * ) - * ), - * 'remove' => array( - * 'file_limit' => array(), - * 'time_limit' => array() - * ), - * 'change' => array( - * 'name' => array( - * 'length' => '20', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 20, - * ), - * ) - * ), - * 'rename' => array( - * 'sex' => array( - * 'name' => 'gender', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 1, - * 'default' => 'M', - * ), - * ) - * ) - * ) - * - * @param boolean $check indicates whether the function should just check if the DBMS driver - * can perform the requested table alterations if the value is true or - * actually perform them otherwise. - * @return void - */ - public function alterTable($name, array $changes, $check = false) - { - foreach ($changes as $changeName => $change) { - switch ($changeName) { - case 'add': - break; - case 'remove': - break; - case 'name': - case 'rename': - case 'change': - default: - throw SchemaException::alterTableChangeNotSupported($changeName); - } - } - - $query = ''; - if ( ! empty($changes['add']) && is_array($changes['add'])) { - foreach ($changes['add'] as $fieldName => $field) { - if ($query) { - $query .= ', '; - } - $query .= 'ADD ' . $this->getDeclaration($fieldName, $field); - } - } - - if ( ! empty($changes['remove']) && is_array($changes['remove'])) { - foreach ($changes['remove'] as $fieldName => $field) { - if ($query) { - $query .= ', '; - } - $query .= 'DROP COLUMN ' . $fieldName; - } - } - - if ( ! $query) { - return false; - } - - return $this->conn->exec('ALTER TABLE ' . $name . ' ' . $query); - } - - /** - * {@inheritdoc} - */ - public function createSequence($seqName, $start = 1, $allocationSize = 1) - { - $seqcolName = 'seq_col'; - $query = 'CREATE TABLE ' . $seqName . ' (' . $seqcolName . - ' INT PRIMARY KEY CLUSTERED IDENTITY(' . $start . ', 1) NOT NULL)'; - - $res = $this->conn->exec($query); - - if ($start == 1) { - return true; - } - - try { - $query = 'SET IDENTITY_INSERT ' . $sequenceName . ' ON ' . - 'INSERT INTO ' . $sequenceName . ' (' . $seqcolName . ') VALUES ( ' . $start . ')'; - $res = $this->conn->exec($query); - } catch (Exception $e) { - $result = $this->conn->exec('DROP TABLE ' . $sequenceName); - } - return true; - } - - /** - * This function drops an existing sequence - * - * @param string $seqName name of the sequence to be dropped - * @return void - */ - public function dropSequenceSql($seqName) - { - return 'DROP TABLE ' . $seqName; - } - - /** - * lists all database sequences - * - * @param string|null $database - * @return array - */ - public function listSequences($database = null) - { - $query = "SELECT name FROM sysobjects WHERE xtype = 'U'"; - $tableNames = $this->conn->fetchColumn($query); - - return array_map(array($this->conn->formatter, 'fixSequenceName'), $tableNames); - } - - /** - * lists table constraints - * - * @param string $table database table name - * @return array - */ - public function listTableColumns($table) - { - $sql = 'EXEC sp_columns @table_name = ' . $table; - $result = $this->conn->fetchAssoc($sql); - $columns = array(); - - foreach ($result as $key => $val) { - $val = array_change_key_case($val, CASE_LOWER); - - if (strstr($val['type_name'], ' ')) { - list($type, $identity) = explode(' ', $val['type_name']); - } else { - $type = $val['type_name']; - $identity = ''; - } - - if ($type == 'varchar') { - $type .= '(' . $val['length'] . ')'; - } - - $val['type'] = $type; - $val['identity'] = $identity; - $decl = $this->conn->getDatabasePlatform()->getPortableDeclaration($val); - - $description = array( - 'name' => $val['column_name'], - 'ntype' => $type, - 'type' => $decl['type'][0], - 'alltypes' => $decl['type'], - 'length' => $decl['length'], - 'fixed' => $decl['fixed'], - 'unsigned' => $decl['unsigned'], - 'notnull' => (bool) (trim($val['is_nullable']) === 'NO'), - 'default' => $val['column_def'], - 'primary' => (strtolower($identity) == 'identity'), - ); - $columns[$val['column_name']] = $description; - } - - return $columns; - } - - /** - * lists table constraints - * - * @param string $table database table name - * @return array - */ - public function listTableIndexes($table) - { - - } - - /** - * lists tables - * - * @param string|null $database - * @return array - */ - public function listTables($database = null) - { - $sql = "SELECT name FROM sysobjects WHERE type = 'U' AND name <> 'dtproperties' ORDER BY name"; - - return $this->conn->fetchColumn($sql); - } - - /** - * lists all triggers - * - * @return array - */ - public function listTriggers($database = null) - { - $query = "SELECT name FROM sysobjects WHERE xtype = 'TR'"; - - $result = $this->conn->fetchColumn($query); - - return $result; - } - - /** - * lists table triggers - * - * @param string $table database table name - * @return array - */ - public function listTableTriggers($table) - { - $table = $this->conn->quote($table, 'text'); - $query = "SELECT name FROM sysobjects WHERE xtype = 'TR' AND object_name(parent_obj) = " . $table; - - $result = $this->conn->fetchColumn($query); - - return $result; - } - - /** - * lists table views - * - * @param string $table database table name - * @return array - */ - public function listTableViews($table) - { - $keyName = 'INDEX_NAME'; - $pkName = 'PK_NAME'; - if ($this->conn->getAttribute(Doctrine::ATTR_PORTABILITY) & Doctrine::PORTABILITY_FIX_CASE) { - if ($this->conn->getAttribute(Doctrine::ATTR_FIELD_CASE) == CASE_LOWER) { - $keyName = strtolower($keyName); - $pkName = strtolower($pkName); - } else { - $keyName = strtoupper($keyName); - $pkName = strtoupper($pkName); - } - } - $table = $this->conn->quote($table, 'text'); - $query = 'EXEC sp_statistics @table_name = ' . $table; - $indexes = $this->conn->fetchColumn($query, $keyName); - - $query = 'EXEC sp_pkeys @table_name = ' . $table; - $pkAll = $this->conn->fetchColumn($query, $pkName); - - $result = array(); - - foreach ($indexes as $index) { - if ( ! in_array($index, $pkAll) && $index != null) { - $result[] = $this->conn->formatter->fixIndexName($index); - } - } - - return $result; - } - - /** - * lists database views - * - * @param string|null $database - * @return array - */ - public function listViews($database = null) - { - $query = "SELECT name FROM sysobjects WHERE xtype = 'V'"; - - return $this->conn->fetchColumn($query); - } - - protected function _getPortableTableColumnDefinition($tableColumn) - { - return $column; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/MySqlSchemaManager.php b/lib/Doctrine/DBAL/Schema/MySqlSchemaManager.php deleted file mode 100644 index f383cf458..000000000 --- a/lib/Doctrine/DBAL/Schema/MySqlSchemaManager.php +++ /dev/null @@ -1,272 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * Schema manager for the MySql RDBMS. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @author Konsta Vesterinen - * @author Lukas Smith (PEAR MDB2 library) - * @author Roman Borschel - * @author Benjamin Eberlei - * @version $Revision$ - * @since 2.0 - */ -class MySqlSchemaManager extends AbstractSchemaManager -{ - protected function _getPortableViewDefinition($view) - { - return new View($view['TABLE_NAME'], $view['VIEW_DEFINITION']); - } - - protected function _getPortableTableDefinition($table) - { - return array_shift($table); - } - - protected function _getPortableUserDefinition($user) - { - return array( - 'user' => $user['User'], - 'password' => $user['Password'], - ); - } - - protected function _getPortableTableIndexesList($tableIndexes, $tableName=null) - { - foreach($tableIndexes AS $k => $v) { - $v = array_change_key_case($v, CASE_LOWER); - if($v['key_name'] == 'PRIMARY') { - $v['primary'] = true; - } else { - $v['primary'] = false; - } - $tableIndexes[$k] = $v; - } - - return parent::_getPortableTableIndexesList($tableIndexes, $tableName); - } - - protected function _getPortableSequenceDefinition($sequence) - { - return end($sequence); - } - - protected function _getPortableDatabaseDefinition($database) - { - return $database['Database']; - } - - /** - * Gets a portable column definition. - * - * The database type is mapped to a corresponding Doctrine mapping type. - * - * @param $tableColumn - * @return array - */ - protected function _getPortableTableColumnDefinition($tableColumn) - { - $dbType = strtolower($tableColumn['Type']); - $dbType = strtok($dbType, '(), '); - if ($dbType == 'national') { - $dbType = strtok('(), '); - } - if (isset($tableColumn['length'])) { - $length = $tableColumn['length']; - $decimal = ''; - } else { - $length = strtok('(), '); - $decimal = strtok('(), ') ? strtok('(), '):null; - } - $type = array(); - $unsigned = $fixed = null; - - if ( ! isset($tableColumn['name'])) { - $tableColumn['name'] = ''; - } - - $scale = null; - $precision = null; - - // Map db type to Doctrine mapping type - switch ($dbType) { - case 'tinyint': - $type = 'boolean'; - $length = null; - break; - case 'smallint': - $type = 'smallint'; - $length = null; - break; - case 'mediumint': - $type = 'integer'; - $length = null; - break; - case 'int': - case 'integer': - $type = 'integer'; - $length = null; - break; - case 'bigint': - $type = 'bigint'; - $length = null; - break; - case 'tinytext': - case 'mediumtext': - case 'longtext': - case 'text': - $type = 'text'; - $fixed = false; - break; - case 'varchar': - $fixed = false; - case 'string': - case 'char': - $type = 'string'; - if ($length == '1') { - $type = 'boolean'; - if (preg_match('/^(is|has)/', $tableColumn['name'])) { - $type = array_reverse($type); - } - } else if (strstr($dbType, 'text')) { - $type = 'text'; - if ($decimal == 'binary') { - $type = 'blob'; - } - } - if ($fixed !== false) { - $fixed = true; - } - break; - case 'set': - $fixed = false; - $type = 'text'; - $type = 'integer'; //FIXME:??? - break; - case 'date': - $type = 'date'; - break; - case 'datetime': - case 'timestamp': - $type = 'datetime'; - break; - case 'time': - $type = 'time'; - break; - case 'float': - case 'double': - case 'real': - case 'numeric': - case 'decimal': - if(preg_match('([A-Za-z]+\(([0-9]+)\,([0-9]+)\))', $tableColumn['Type'], $match)) { - $precision = $match[1]; - $scale = $match[2]; - $length = null; - } - $type = 'decimal'; - break; - case 'tinyblob': - case 'mediumblob': - case 'longblob': - case 'blob': - case 'binary': - case 'varbinary': - $type = 'blob'; - $length = null; - break; - case 'year': - $type = 'integer'; - $type = 'date'; - $length = null; - break; - case 'geometry': - case 'geometrycollection': - case 'point': - case 'multipoint': - case 'linestring': - case 'multilinestring': - case 'polygon': - case 'multipolygon': - $type = 'blob'; - $length = null; - break; - default: - $type = 'string'; - $length = null; - } - - $length = ((int) $length == 0) ? null : (int) $length; - $def = array( - 'type' => $type, - 'length' => $length, - 'unsigned' => (bool) $unsigned, - 'fixed' => (bool) $fixed - ); - - $options = array( - 'length' => $length, - 'unsigned' => (bool)$unsigned, - 'fixed' => (bool)$fixed, - 'default' => $tableColumn['Default'], - 'notnull' => (bool) ($tableColumn['Null'] != 'YES'), - 'scale' => null, - 'precision' => null, - 'platformOptions' => array( - 'primary' => (strtolower($tableColumn['Key']) == 'pri') ? true : false, - 'unique' => (strtolower($tableColumn['Key']) == 'uni') ? true :false, - 'autoincrement' => (bool) (strpos($tableColumn['Extra'], 'auto_increment') !== false), - ), - ); - - if ($scale !== null && $precision !== null) { - $options['scale'] = $scale; - $options['precision'] = $precision; - } - - return new Column($tableColumn['Field'], \Doctrine\DBAL\Types\Type::getType($type), $options); - } - - public function _getPortableTableForeignKeyDefinition($tableForeignKey) - { - $tableForeignKey = array_change_key_case($tableForeignKey, CASE_LOWER); - - if (!isset($tableForeignKey['delete_rule']) || $tableForeignKey['delete_rule'] == "RESTRICT") { - $tableForeignKey['delete_rule'] = null; - } - if (!isset($tableForeignKey['update_rule']) || $tableForeignKey['update_rule'] == "RESTRICT") { - $tableForeignKey['update_rule'] = null; - } - - return new ForeignKeyConstraint( - (array)$tableForeignKey['column_name'], - $tableForeignKey['referenced_table_name'], - (array)$tableForeignKey['referenced_column_name'], - $tableForeignKey['constraint_name'], - array( - 'onUpdate' => $tableForeignKey['update_rule'], - 'onDelete' => $tableForeignKey['delete_rule'], - ) - ); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/OracleSchemaManager.php b/lib/Doctrine/DBAL/Schema/OracleSchemaManager.php deleted file mode 100644 index 0f15a3294..000000000 --- a/lib/Doctrine/DBAL/Schema/OracleSchemaManager.php +++ /dev/null @@ -1,280 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * Oracle Schema Manager - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @author Konsta Vesterinen - * @author Lukas Smith (PEAR MDB2 library) - * @author Benjamin Eberlei - * @version $Revision$ - * @since 2.0 - */ -class OracleSchemaManager extends AbstractSchemaManager -{ - protected function _getPortableViewDefinition($view) - { - $view = \array_change_key_case($view, CASE_LOWER); - - return new View($view['view_name'], $view['text']); - } - - protected function _getPortableUserDefinition($user) - { - $user = \array_change_key_case($user, CASE_LOWER); - - return array( - 'user' => $user['username'], - ); - } - - protected function _getPortableTableDefinition($table) - { - $table = \array_change_key_case($table, CASE_LOWER); - - return $table['table_name']; - } - - /** - * @license New BSD License - * @link http://ezcomponents.org/docs/api/trunk/DatabaseSchema/ezcDbSchemaPgsqlReader.html - * @param array $tableIndexes - * @param string $tableName - * @return array - */ - protected function _getPortableTableIndexesList($tableIndexes, $tableName=null) - { - $indexBuffer = array(); - foreach ( $tableIndexes as $tableIndex ) { - $tableIndex = \array_change_key_case($tableIndex, CASE_LOWER); - - $keyName = strtolower($tableIndex['name']); - - if ( strtolower($tableIndex['is_primary']) == "p" ) { - $keyName = 'primary'; - $buffer['primary'] = true; - $buffer['non_unique'] = false; - } else { - $buffer['primary'] = false; - $buffer['non_unique'] = ( $tableIndex['is_unique'] == 0 ) ? true : false; - } - $buffer['key_name'] = $keyName; - $buffer['column_name'] = $tableIndex['column_name']; - $indexBuffer[] = $buffer; - } - return parent::_getPortableTableIndexesList($indexBuffer, $tableName); - } - - protected function _getPortableTableColumnDefinition($tableColumn) - { - $tableColumn = \array_change_key_case($tableColumn, CASE_LOWER); - - $dbType = strtolower($tableColumn['data_type']); - if(strpos($dbType, "timestamp(") === 0) { - $dbType = "timestamp"; - } - - $type = array(); - $length = $unsigned = $fixed = null; - if ( ! empty($tableColumn['data_length'])) { - $length = $tableColumn['data_length']; - } - - if ( ! isset($tableColumn['column_name'])) { - $tableColumn['column_name'] = ''; - } - - if (stripos($tableColumn['data_default'], 'NULL') !== null) { - $tableColumn['data_default'] = null; - } - - $precision = null; - $scale = null; - - switch ($dbType) { - case 'integer': - case 'number': - if($tableColumn['data_scale'] > 0) { - $type = 'decimal'; - $precision = $tableColumn['data_precision']; - $scale = $tableColumn['data_scale']; - } else { - $type = 'integer'; - } - $length = null; - break; - case 'pls_integer': - case 'binary_integer': - $type = 'boolean'; - $length = null; - break; - case 'varchar': - case 'varchar2': - case 'nvarchar2': - $fixed = false; - case 'char': - case 'nchar': - if ($length == '1' && preg_match('/^(is|has)/', $tableColumn['column_name'])) { - $type = 'boolean'; - } else { - $type = 'string'; - } - if ($fixed !== false) { - $fixed = true; - } - break; - case 'date': - case 'timestamp': - $type = 'datetime'; - $length = null; - break; - case 'float': - $precision = $tableColumn['data_precision']; - $scale = $tableColumn['data_scale']; - $type = 'decimal'; - $length = null; - break; - case 'long': - $type = 'string'; - case 'clob': - case 'nclob': - $length = null; - $type = 'text'; - break; - case 'blob': - case 'raw': - case 'long raw': - case 'bfile': - $type = 'blob'; - $length = null; - break; - case 'rowid': - case 'urowid': - default: - $type = 'string'; - $length = null; - } - - $options = array( - 'notnull' => (bool) ($tableColumn['nullable'] === 'N'), - 'fixed' => (bool) $fixed, - 'unsigned' => (bool) $unsigned, - 'default' => $tableColumn['data_default'], - 'length' => $length, - 'precision' => $precision, - 'scale' => $scale, - 'platformDetails' => array(), - ); - - return new Column($tableColumn['column_name'], \Doctrine\DBAL\Types\Type::getType($type), $options); - } - - protected function _getPortableTableForeignKeysList($tableForeignKeys) - { - $list = array(); - foreach ($tableForeignKeys as $key => $value) { - $value = \array_change_key_case($value, CASE_LOWER); - if (!isset($list[$value['constraint_name']])) { - if ($value['delete_rule'] == "NO ACTION") { - $value['delete_rule'] = null; - } - - $list[$value['constraint_name']] = array( - 'name' => $value['constraint_name'], - 'local' => array(), - 'foreign' => array(), - 'foreignTable' => $value['references_table'], - 'onDelete' => $value['delete_rule'], - ); - } - $list[$value['constraint_name']]['local'][$value['position']] = $value['local_column']; - $list[$value['constraint_name']]['foreign'][$value['position']] = $value['foreign_column']; - } - - $result = array(); - foreach($list AS $constraint) { - $result[] = new ForeignKeyConstraint( - array_values($constraint['local']), $constraint['foreignTable'], - array_values($constraint['foreign']), $constraint['name'], - array('onDelete' => $constraint['onDelete']) - ); - } - - return $result; - } - - protected function _getPortableSequenceDefinition($sequence) - { - $sequence = \array_change_key_case($sequence, CASE_LOWER); - return new Sequence($sequence['sequence_name'], $sequence['increment_by'], $sequence['min_value']); - } - - protected function _getPortableFunctionDefinition($function) - { - $function = \array_change_key_case($function, CASE_LOWER); - return $function['name']; - } - - protected function _getPortableDatabaseDefinition($database) - { - $database = \array_change_key_case($database, CASE_LOWER); - return $database['username']; - } - - public function createDatabase($database = null) - { - if (is_null($database)) { - $database = $this->_conn->getDatabase(); - } - - $params = $this->_conn->getParams(); - $username = $database; - $password = $params['password']; - - $query = 'CREATE USER ' . $username . ' IDENTIFIED BY ' . $password; - $result = $this->_conn->executeUpdate($query); - - $query = 'GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, CREATE SEQUENCE, CREATE TRIGGER TO ' . $username; - $result = $this->_conn->executeUpdate($query); - - return true; - } - - public function dropAutoincrement($table) - { - $sql = $this->_platform->getDropAutoincrementSql($table); - foreach ($sql as $query) { - $this->_conn->executeUpdate($query); - } - - return true; - } - - public function dropTable($name) - { - $this->dropAutoincrement($name); - - return parent::dropTable($name); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php b/lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php deleted file mode 100644 index 70e6a6051..000000000 --- a/lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php +++ /dev/null @@ -1,332 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * xxx - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @author Konsta Vesterinen - * @author Lukas Smith (PEAR MDB2 library) - * @author Benjamin Eberlei - * @version $Revision$ - * @since 2.0 - */ -class PostgreSqlSchemaManager extends AbstractSchemaManager -{ - protected function _getPortableTableForeignKeyDefinition($tableForeignKey) - { - $onUpdate = null; - $onDelete = null; - - if(preg_match('(ON UPDATE ([a-zA-Z0-9]+))', $tableForeignKey['condef'], $match)) { - $onUpdate = $match[1]; - } - if(preg_match('(ON DELETE ([a-zA-Z0-9]+))', $tableForeignKey['condef'], $match)) { - $onDelete = $match[1]; - } - - if(preg_match('/FOREIGN KEY \((.+)\) REFERENCES (.+)\((.+)\)/', $tableForeignKey['condef'], $values)) { - $localColumns = explode(",", $values[1]); - $foreignColumns = explode(",", $values[3]); - $foreignTable = $values[2]; - } - - return new ForeignKeyConstraint( - $localColumns, $foreignTable, $foreignColumns, $tableForeignKey['conname'], - array('onUpdate' => $onUpdate, 'onDelete' => $onDelete) - ); - } - - public function dropDatabase($database) - { - $params = $this->_conn->getParams(); - $params["dbname"] = "postgres"; - $tmpPlatform = $this->_platform; - $tmpConn = $this->_conn; - - $this->_conn = \Doctrine\DBAL\DriverManager::getConnection($params); - $this->_platform = $this->_conn->getDatabasePlatform(); - - parent::dropDatabase($database); - - $this->_platform = $tmpPlatform; - $this->_conn = $tmpConn; - } - - public function createDatabase($database) - { - $params = $this->_conn->getParams(); - $params["dbname"] = "postgres"; - $tmpPlatform = $this->_platform; - $tmpConn = $this->_conn; - - $this->_conn = \Doctrine\DBAL\DriverManager::getConnection($params); - $this->_platform = $this->_conn->getDatabasePlatform(); - - parent::createDatabase($database); - - $this->_platform = $tmpPlatform; - $this->_conn = $tmpConn; - } - - protected function _getPortableTriggerDefinition($trigger) - { - return $trigger['trigger_name']; - } - - protected function _getPortableViewDefinition($view) - { - return new View($view['viewname'], $view['definition']); - } - - protected function _getPortableUserDefinition($user) - { - return array( - 'user' => $user['usename'], - 'password' => $user['passwd'] - ); - } - - protected function _getPortableTableDefinition($table) - { - return $table['table_name']; - } - - /** - * @license New BSD License - * @link http://ezcomponents.org/docs/api/trunk/DatabaseSchema/ezcDbSchemaPgsqlReader.html - * @param array $tableIndexes - * @param string $tableName - * @return array - */ - protected function _getPortableTableIndexesList($tableIndexes, $tableName=null) - { - $buffer = array(); - foreach($tableIndexes AS $row) { - $colNumbers = explode( ' ', $row['indkey'] ); - $colNumbersSql = 'IN (' . join( ' ,', $colNumbers ) . ' )'; - $columnNameSql = "SELECT attnum, attname FROM pg_attribute - WHERE attrelid={$row['indrelid']} AND attnum $colNumbersSql ORDER BY attnum ASC;"; - - $stmt = $this->_conn->executeQuery($columnNameSql); - $indexColumns = $stmt->fetchAll(); - - // required for getting the order of the columns right. - foreach ($colNumbers AS $colNum) { - foreach ( $indexColumns as $colRow ) { - if ($colNum == $colRow['attnum']) { - $buffer[] = array( - 'key_name' => $row['relname'], - 'column_name' => $colRow['attname'], - 'non_unique' => !$row['indisunique'], - 'primary' => $row['indisprimary'] - ); - } - } - } - } - return parent::_getPortableTableIndexesList($buffer); - } - - protected function _getPortableDatabaseDefinition($database) - { - return $database['datname']; - } - - protected function _getPortableSequenceDefinition($sequence) - { - $data = $this->_conn->fetchAll('SELECT min_value, increment_by FROM '.$sequence['relname']); - return new Sequence($sequence['relname'], $data[0]['increment_by'], $data[0]['min_value']); - } - - protected function _getPortableTableColumnDefinition($tableColumn) - { - $tableColumn = array_change_key_case($tableColumn, CASE_LOWER); - - if (strtolower($tableColumn['type']) === 'varchar') { - // get length from varchar definition - $length = preg_replace('~.*\(([0-9]*)\).*~', '$1', $tableColumn['complete_type']); - $tableColumn['length'] = $length; - } - - $matches = array(); - - if (preg_match("/^nextval\('(.*)'(::.*)?\)$/", $tableColumn['default'], $matches)) { - $tableColumn['sequence'] = $matches[1]; - $tableColumn['default'] = null; - } - - if (stripos($tableColumn['default'], 'NULL') !== null) { - $tableColumn['default'] = null; - } - - $length = (isset($tableColumn['length'])) ? $tableColumn['length'] : null; - if ($length == '-1' && isset($tableColumn['atttypmod'])) { - $length = $tableColumn['atttypmod'] - 4; - } - if ((int)$length <= 0) { - $length = null; - } - $type = array(); - $fixed = null; - - if ( ! isset($tableColumn['name'])) { - $tableColumn['name'] = ''; - } - - $precision = null; - $scale = null; - - $dbType = strtolower($tableColumn['type']); - - $autoincrement = false; - switch ($dbType) { - case 'smallint': - case 'int2': - $type = 'smallint'; - $length = null; - break; - case 'serial': - case 'serial4': - $autoincrement = true; - // break missing intentionally - case 'int': - case 'int4': - case 'integer': - $type = 'integer'; - $length = null; - break; - case 'bigserial': - case 'serial8': - $autoincrement = true; - // break missing intentionally - case 'bigint': - case 'int8': - $type = 'bigint'; - $length = null; - break; - case 'bool': - case 'boolean': - $type = 'boolean'; - $length = null; - break; - case 'text': - $fixed = false; - $type = 'text'; - break; - case 'varchar': - case 'interval': - case '_varchar': - $fixed = false; - case 'tsvector': - case 'unknown': - case 'char': - case 'bpchar': - $type = 'string'; - if ($length == '1') { - if (preg_match('/^(is|has)/', $tableColumn['name'])) { - $type = 'boolean'; - } - } elseif (strstr($dbType, 'text')) { - $type = 'text'; - } - if ($fixed !== false) { - $fixed = true; - } - break; - case 'date': - $type = 'date'; - $length = null; - break; - case 'datetime': - case 'timestamp': - case 'timetz': - case 'timestamptz': - $type = 'datetime'; - $length = null; - break; - case 'time': - $type = 'time'; - $length = null; - break; - case 'float': - case 'float4': - case 'float8': - case 'double': - case 'double precision': - case 'real': - case 'decimal': - case 'money': - case 'numeric': - if(preg_match('([A-Za-z]+\(([0-9]+)\,([0-9]+)\))', $tableColumn['complete_type'], $match)) { - $precision = $match[1]; - $scale = $match[2]; - $length = null; - } - $type = 'decimal'; - break; - case 'tinyblob': - case 'mediumblob': - case 'longblob': - case 'blob': - case 'bytea': - case 'geometry': - case 'geometrycollection': - case 'point': - case 'multipoint': - case 'linestring': - case 'multilinestring': - case 'polygon': - case 'multipolygon': - $type = 'blob'; - $length = null; - break; - case 'oid': - $type = 'blob'; - $length = null; - break; - case 'year': - $type = 'date'; - $length = null; - break; - default: - $type = 'string'; - } - - $options = array( - 'length' => $length, - 'notnull' => (bool) $tableColumn['isnotnull'], - 'default' => $tableColumn['default'], - 'primary' => (bool) ($tableColumn['pri'] == 't'), - 'precision' => $precision, - 'scale' => $scale, - 'fixed' => $fixed, - 'unsigned' => false, - 'platformDetails' => array( - 'autoincrement' => $autoincrement, - ), - ); - - return new Column($tableColumn['field'], \Doctrine\DBAL\Types\Type::getType($type), $options); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/Schema.php b/lib/Doctrine/DBAL/Schema/Schema.php deleted file mode 100644 index 89243f817..000000000 --- a/lib/Doctrine/DBAL/Schema/Schema.php +++ /dev/null @@ -1,327 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Schema\Visitor\CreateSchemaSqlCollector; -use Doctrine\DBAL\Schema\Visitor\DropSchemaSqlCollector; -use Doctrine\DBAL\Schema\Visitor\Visitor; - -/** - * Object representation of a database schema - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class Schema extends AbstractAsset -{ - /** - * @var array - */ - protected $_tables = array(); - - /** - * @var array - */ - protected $_sequences = array(); - - /** - * @var SchemaConfig - */ - protected $_schemaConfig = false; - - /** - * @param array $tables - * @param array $sequences - * @param array $views - * @param array $triggers - * @param SchemaConfig $schemaConfig - */ - public function __construct(array $tables=array(), array $sequences=array(), SchemaConfig $schemaConfig=null) - { - if ($schemaConfig == null) { - $schemaConfig = new SchemaConfig(); - } - $this->_schemaConfig = $schemaConfig; - - foreach ($tables AS $table) { - $this->_addTable($table); - } - foreach ($sequences AS $sequence) { - $this->_addSequence($sequence); - } - } - - /** - * @return bool - */ - public function hasExplicitForeignKeyIndexes() - { - return $this->_schemaConfig->hasExplicitForeignKeyIndexes(); - } - - /** - * @param Table $table - */ - protected function _addTable(Table $table) - { - $tableName = strtolower($table->getName()); - if(isset($this->_tables[$tableName])) { - throw SchemaException::tableAlreadyExists($tableName); - } - - $this->_tables[$tableName] = $table; - $table->setSchemaConfig($this->_schemaConfig); - } - - /** - * @param Sequence $sequence - */ - protected function _addSequence(Sequence $sequence) - { - $seqName = strtolower($sequence->getName()); - if (isset($this->_sequences[$seqName])) { - throw SchemaException::sequenceAlreadyExists($seqName); - } - $this->_sequences[$seqName] = $sequence; - } - - /** - * Get all tables of this schema. - * - * @return array - */ - public function getTables() - { - return $this->_tables; - } - - /** - * @param string $tableName - * @return Table - */ - public function getTable($tableName) - { - $tableName = strtolower($tableName); - if (!isset($this->_tables[$tableName])) { - throw SchemaException::tableDoesNotExist($tableName); - } - - return $this->_tables[$tableName]; - } - - /** - * Does this schema have a table with the given name? - * - * @param string $tableName - * @return Schema - */ - public function hasTable($tableName) - { - $tableName = strtolower($tableName); - return isset($this->_tables[$tableName]); - } - - /** - * @param string $sequenceName - * @return bool - */ - public function hasSequence($sequenceName) - { - $sequenceName = strtolower($sequenceName); - return isset($this->_sequences[$sequenceName]); - } - - /** - * @throws SchemaException - * @param string $sequenceName - * @return Doctrine\DBAL\Schema\Sequence - */ - public function getSequence($sequenceName) - { - $sequenceName = strtolower($sequenceName); - if(!$this->hasSequence($sequenceName)) { - throw SchemaException::sequenceDoesNotExist($sequenceName); - } - return $this->_sequences[$sequenceName]; - } - - /** - * @return Doctrine\DBAL\Schema\Sequence[] - */ - public function getSequences() - { - return $this->_sequences; - } - - /** - * Create a new table - * - * @param string $tableName - * @return Table - */ - public function createTable($tableName) - { - $table = new Table($tableName); - $this->_addTable($table); - return $table; - } - - /** - * Rename a table - * - * @param string $oldTableName - * @param string $newTableName - * @return Schema - */ - public function renameTable($oldTableName, $newTableName) - { - $table = $this->getTable($oldTableName); - $table->_setName($newTableName); - - $this->dropTable($oldTableName); - $this->_addTable($table); - return $this; - } - - /** - * Drop a table from the schema. - * - * @param string $tableName - * @return Schema - */ - public function dropTable($tableName) - { - $tableName = strtolower($tableName); - $table = $this->getTable($tableName); - unset($this->_tables[$tableName]); - return $this; - } - - /** - * Create a new sequence - * - * @param string $sequenceName - * @param int $allocationSize - * @param int $initialValue - * @return Sequence - */ - public function createSequence($sequenceName, $allocationSize=1, $initialValue=1) - { - $seq = new Sequence($sequenceName, $allocationSize, $initialValue); - $this->_addSequence($seq); - return $seq; - } - - /** - * @param string $sequenceName - * @return Schema - */ - public function dropSequence($sequenceName) - { - $sequenceName = strtolower($sequenceName); - unset($this->_sequences[$sequenceName]); - return $this; - } - - /** - * Return an array of necessary sql queries to create the schema on the given platform. - * - * @param AbstractPlatform $platform - * @return array - */ - public function toSql(\Doctrine\DBAL\Platforms\AbstractPlatform $platform) - { - $sqlCollector = new CreateSchemaSqlCollector($platform); - $this->visit($sqlCollector); - - return $sqlCollector->getQueries(); - } - - /** - * Return an array of necessary sql queries to drop the schema on the given platform. - * - * @param AbstractPlatform $platform - * @return array - */ - public function toDropSql(\Doctrine\DBAL\Platforms\AbstractPlatform $platform) - { - $dropSqlCollector = new DropSchemaSqlCollector($platform); - $this->visit($dropSqlCollector); - - return $dropSqlCollector->getQueries(); - } - - /** - * @param Schema $toSchema - * @param AbstractPlatform $platform - */ - public function getMigrateToSql(Schema $toSchema, \Doctrine\DBAL\Platforms\AbstractPlatform $platform) - { - $comparator = new Comparator(); - $schemaDiff = $comparator->compare($this, $toSchema); - return $schemaDiff->toSql($platform); - } - - /** - * @param Schema $fromSchema - * @param AbstractPlatform $platform - */ - public function getMigrateFromSql(Schema $fromSchema, \Doctrine\DBAL\Platforms\AbstractPlatform $platform) - { - $comparator = new Comparator(); - $schemaDiff = $comparator->compare($fromSchema, $this); - return $schemaDiff->toSql($platform); - } - - /** - * @param Visitor $visitor - */ - public function visit(Visitor $visitor) - { - $visitor->acceptSchema($this); - - foreach ($this->_tables AS $table) { - $table->visit($visitor); - } - foreach ($this->_sequences AS $sequence) { - $sequence->visit($visitor); - } - } - - /** - * Cloning a Schema triggers a deep clone of all related assets. - * - * @return void - */ - public function __clone() - { - foreach ($this->_tables AS $k => $table) { - $this->_tables[$k] = clone $table; - } - foreach ($this->_sequences AS $k => $sequence) { - $this->_sequences[$k] = clone $sequence; - } - } -} diff --git a/lib/Doctrine/DBAL/Schema/SchemaConfig.php b/lib/Doctrine/DBAL/Schema/SchemaConfig.php deleted file mode 100644 index 291babb4a..000000000 --- a/lib/Doctrine/DBAL/Schema/SchemaConfig.php +++ /dev/null @@ -1,76 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * Configuration for a Schema - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class SchemaConfig -{ - /** - * @var bool - */ - protected $_hasExplicitForeignKeyIndexes = false; - - /** - * @var int - */ - protected $_maxIdentifierLength = 63; - - /** - * @return bool - */ - public function hasExplicitForeignKeyIndexes() - { - return $this->_hasExplicitForeignKeyIndexes; - } - - /** - * @param bool $flag - */ - public function setExplicitForeignKeyIndexes($flag) - { - $this->_hasExplicitForeignKeyIndexes = (bool)$flag; - } - - /** - * @param int $length - */ - public function setMaxIdentifierLength($length) - { - $this->_maxIdentifierLength = (int)$length; - } - - /** - * @return int - */ - public function getMaxIdentifierLength() - { - return $this->_maxIdentifierLength; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/SchemaDiff.php b/lib/Doctrine/DBAL/Schema/SchemaDiff.php deleted file mode 100644 index c02775589..000000000 --- a/lib/Doctrine/DBAL/Schema/SchemaDiff.php +++ /dev/null @@ -1,176 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use \Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Schema Diff - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved. - * @license http://ez.no/licenses/new_bsd New BSD License - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class SchemaDiff -{ - /** - * All added tables - * - * @var array(string=>ezcDbSchemaTable) - */ - public $newTables = array(); - - /** - * All changed tables - * - * @var array(string=>ezcDbSchemaTableDiff) - */ - public $changedTables = array(); - - /** - * All removed tables - * - * @var array(string=>Table) - */ - public $removedTables = array(); - - /** - * @var array - */ - public $newSequences = array(); - - /** - * @var array - */ - public $changedSequences = array(); - - /** - * @var array - */ - public $removedSequences = array(); - - /** - * @var array - */ - public $orphanedForeignKeys = array(); - - /** - * Constructs an SchemaDiff object. - * - * @param array(string=>Table) $newTables - * @param array(string=>TableDiff) $changedTables - * @param array(string=>bool) $removedTables - */ - public function __construct( $newTables = array(), $changedTables = array(), $removedTables = array() ) - { - $this->newTables = $newTables; - $this->changedTables = $changedTables; - $this->removedTables = $removedTables; - } - - /** - * The to save sql mode ensures that the following things don't happen: - * - * 1. Tables are deleted - * 2. Sequences are deleted - * 3. Foreign Keys which reference tables that would otherwise be deleted. - * - * This way it is ensured that assets are deleted which might not be relevant to the metadata schema at all. - * - * @param AbstractPlatform $platform - * @return array - */ - public function toSaveSql(AbstractPlatform $platform) - { - return $this->_toSql($platform, true); - } - - /** - * @param AbstractPlatform $platform - * @return array - */ - public function toSql(AbstractPlatform $platform) - { - return $this->_toSql($platform, false); - } - - /** - * @param AbstractPlatform $platform - * @param bool $saveMode - * @return array - */ - protected function _toSql(AbstractPlatform $platform, $saveMode = false) - { - $sql = array(); - - if ($platform->supportsForeignKeyConstraints() && $saveMode == false) { - foreach ($this->orphanedForeignKeys AS $orphanedForeignKey) { - $sql[] = $platform->getDropForeignKeySQL($orphanedForeignKey, $orphanedForeignKey->getLocalTableName()); - } - } - - if ($platform->supportsSequences() == true) { - foreach ($this->changedSequences AS $sequence) { - $sql[] = $platform->getDropSequenceSQL($sequence); - $sql[] = $platform->getCreateSequenceSQL($sequence); - } - - if ($saveMode === false) { - foreach ($this->removedSequences AS $sequence) { - $sql[] = $platform->getDropSequenceSQL($sequence); - } - } - - foreach ($this->newSequences AS $sequence) { - $sql[] = $platform->getCreateSequenceSQL($sequence); - } - } - - $foreignKeySql = array(); - foreach ($this->newTables AS $table) { - $sql = array_merge( - $sql, - $platform->getCreateTableSQL($table, AbstractPlatform::CREATE_INDEXES) - ); - foreach ($table->getForeignKeys() AS $foreignKey) { - $foreignKeySql[] = $platform->getCreateForeignKeySQL($foreignKey, $table); - } - } - $sql = array_merge($sql, $foreignKeySql); - - if ($saveMode === false) { - foreach ($this->removedTables AS $table) { - $sql[] = $platform->getDropTableSQL($table); - } - } - - foreach ($this->changedTables AS $tableDiff) { - $sql = array_merge($sql, $platform->getAlterTableSQL($tableDiff)); - } - - return $sql; - } -} diff --git a/lib/Doctrine/DBAL/Schema/SchemaException.php b/lib/Doctrine/DBAL/Schema/SchemaException.php deleted file mode 100644 index e116f4c85..000000000 --- a/lib/Doctrine/DBAL/Schema/SchemaException.php +++ /dev/null @@ -1,126 +0,0 @@ -getName()." requires a named foreign key, ". - "but the given foreign key from (".implode(", ", $foreignKey->getColumns()).") onto foreign table ". - "'".$foreignKey->getForeignTableName()."' (".implode(", ", $foreignKey->getForeignColumns()).") is currently ". - "unnamed." - ); - } - - static public function alterTableChangeNotSupported($changeName) { - return new self ("Alter table change not supported, given '$changeName'"); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/Sequence.php b/lib/Doctrine/DBAL/Schema/Sequence.php deleted file mode 100644 index 369f0e834..000000000 --- a/lib/Doctrine/DBAL/Schema/Sequence.php +++ /dev/null @@ -1,77 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Schema\Visitor\Visitor; - -/** - * Sequence Structure - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class Sequence extends AbstractAsset -{ - /** - * @var int - */ - protected $_allocationSize = 1; - - /** - * @var int - */ - protected $_initialValue = 1; - - /** - * - * @param string $name - * @param int $allocationSize - * @param int $initialValue - */ - public function __construct($name, $allocationSize=1, $initialValue=1) - { - $this->_setName($name); - $this->_allocationSize = (is_numeric($allocationSize))?$allocationSize:1; - $this->_initialValue = (is_numeric($initialValue))?$initialValue:1; - } - - public function getAllocationSize() - { - return $this->_allocationSize; - } - - public function getInitialValue() - { - return $this->_initialValue; - } - - /** - * @param Visitor $visitor - */ - public function visit(Visitor $visitor) - { - $visitor->acceptSequence($this); - } -} diff --git a/lib/Doctrine/DBAL/Schema/SqliteSchemaManager.php b/lib/Doctrine/DBAL/Schema/SqliteSchemaManager.php deleted file mode 100644 index e9953097d..000000000 --- a/lib/Doctrine/DBAL/Schema/SqliteSchemaManager.php +++ /dev/null @@ -1,265 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * SqliteSchemaManager - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @author Konsta Vesterinen - * @author Lukas Smith (PEAR MDB2 library) - * @author Jonathan H. Wage - * @version $Revision$ - * @since 2.0 - */ -class SqliteSchemaManager extends AbstractSchemaManager -{ - /** - * {@inheritdoc} - * - * @override - */ - public function dropDatabase($database) - { - if (file_exists($database)) { - unlink($database); - } - } - - /** - * {@inheritdoc} - * - * @override - */ - public function createDatabase($database) - { - $params = $this->_conn->getParams(); - $driver = $params['driver']; - $options = array( - 'driver' => $driver, - 'path' => $database - ); - $conn = \Doctrine\DBAL\DriverManager::getConnection($options); - $conn->connect(); - $conn->close(); - } - - protected function _getPortableTableDefinition($table) - { - return $table['name']; - } - - /** - * @license New BSD License - * @link http://ezcomponents.org/docs/api/trunk/DatabaseSchema/ezcDbSchemaPgsqlReader.html - * @param array $tableIndexes - * @param string $tableName - * @return array - */ - protected function _getPortableTableIndexesList($tableIndexes, $tableName=null) - { - $indexBuffer = array(); - - // fetch primary - $stmt = $this->_conn->executeQuery( "PRAGMA TABLE_INFO ('$tableName')" ); - $indexArray = $stmt->fetchAll(\PDO::FETCH_ASSOC); - foreach($indexArray AS $indexColumnRow) { - if($indexColumnRow['pk'] == "1") { - $indexBuffer[] = array( - 'key_name' => 'primary', - 'primary' => true, - 'non_unique' => false, - 'column_name' => $indexColumnRow['name'] - ); - } - } - - // fetch regular indexes - foreach($tableIndexes AS $tableIndex) { - $keyName = $tableIndex['name']; - $idx = array(); - $idx['key_name'] = $keyName; - $idx['primary'] = false; - $idx['non_unique'] = $tableIndex['unique']?false:true; - - $stmt = $this->_conn->executeQuery( "PRAGMA INDEX_INFO ( '{$keyName}' )" ); - $indexArray = $stmt->fetchAll(\PDO::FETCH_ASSOC); - - foreach ( $indexArray as $indexColumnRow ) { - $idx['column_name'] = $indexColumnRow['name']; - $indexBuffer[] = $idx; - } - } - - return parent::_getPortableTableIndexesList($indexBuffer, $tableName); - } - - protected function _getPortableTableIndexDefinition($tableIndex) - { - return array( - 'name' => $tableIndex['name'], - 'unique' => (bool) $tableIndex['unique'] - ); - } - - protected function _getPortableTableColumnDefinition($tableColumn) - { - $e = explode('(', $tableColumn['type']); - $tableColumn['type'] = $e[0]; - if (isset($e[1])) { - $length = trim($e[1], ')'); - $tableColumn['length'] = $length; - } - - $dbType = strtolower($tableColumn['type']); - - $length = isset($tableColumn['length']) ? $tableColumn['length'] : null; - $unsigned = (boolean) isset($tableColumn['unsigned']) ? $tableColumn['unsigned'] : false; - $fixed = false; - $type = null; - $default = $tableColumn['dflt_value']; - if ($default == 'NULL') { - $default = null; - } - $notnull = (bool) $tableColumn['notnull']; - - if ( ! isset($tableColumn['name'])) { - $tableColumn['name'] = ''; - } - - $precision = null; - $scale = null; - - switch ($dbType) { - case 'boolean': - $type = 'boolean'; - break; - case 'tinyint': - $type = 'boolean'; - $length = null; - break; - case 'smallint': - $type = 'smallint'; - $length = null; - break; - case 'mediumint': - case 'int': - case 'integer': - case 'serial': - $type = 'integer'; - $length = null; - break; - case 'bigint': - case 'bigserial': - $type = 'bigint'; - $length = null; - break; - case 'clob': - $fixed = false; - $type = 'text'; - break; - case 'tinytext': - case 'mediumtext': - case 'longtext': - case 'text': - $type = 'text'; - break; - case 'varchar': - case 'varchar2': - case 'nvarchar': - case 'ntext': - case 'image': - case 'nchar': - $fixed = false; - case 'char': - $type = 'string'; - if ($length == '1') { - $type = 'boolean'; - if (preg_match('/^(is|has)/', $tableColumn['name'])) { - $type = array_reverse($type); - } - } elseif (strstr($dbType, 'text')) { - $type = 'clob'; - } - if ($fixed !== false) { - $fixed = true; - } - break; - case 'date': - $type = 'date'; - $length = null; - break; - case 'datetime': - case 'timestamp': - $type = 'datetime'; - $length = null; - break; - case 'time': - $type = 'time'; - $length = null; - break; - case 'float': - case 'double': - case 'real': - case 'decimal': - case 'numeric': - list($precision, $scale) = array_map('trim', explode(', ', $tableColumn['length'])); - $type = 'decimal'; - $length = null; - break; - case 'tinyblob': - case 'mediumblob': - case 'longblob': - case 'blob': - $type = 'blob'; - $length = null; - break; - case 'year': - $type = 'date'; - $length = null; - break; - default: - $type = 'string'; - $length = null; - } - - $options = array( - 'length' => $length, - 'unsigned' => (bool) $unsigned, - 'fixed' => $fixed, - 'notnull' => $notnull, - 'default' => $default, - 'precision' => $precision, - 'scale' => $scale, - 'platformDetails' => array( - 'autoincrement' => (bool) $tableColumn['pk'], - ), - ); - - return new Column($tableColumn['name'], \Doctrine\DBAL\Types\Type::getType($type), $options); - } - - protected function _getPortableViewDefinition($view) - { - return new View($view['name'], $view['sql']); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/Table.php b/lib/Doctrine/DBAL/Schema/Table.php deleted file mode 100644 index 7cf31fa8e..000000000 --- a/lib/Doctrine/DBAL/Schema/Table.php +++ /dev/null @@ -1,662 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Types\Type; -use Doctrine\DBAL\Schema\Visitor\Visitor; -use Doctrine\DBAL\DBALException; - -/** - * Object Representation of a table - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class Table extends AbstractAsset -{ - /** - * @var int - */ - const ID_NONE = 0; - - /** - * @var int - */ - const ID_SEQUENCE = 1; - - /** - * @var int - */ - const ID_IDENTITY = 2; - - /** - * @var string - */ - protected $_name = null; - - /** - * @var array - */ - protected $_columns = array(); - - /** - * @var array - */ - protected $_indexes = array(); - - /** - * @var string - */ - protected $_primaryKeyName = false; - - /** - * @var array - */ - protected $_fkConstraints = array(); - - /** - * @var array - */ - protected $_options = array(); - - /** - * @var bool - */ - protected $_idGeneratorType = self::ID_NONE; - - /** - * @var SchemaConfig - */ - protected $_schemaConfig = null; - - /** - * - * @param string $tableName - * @param array $columns - * @param array $indexes - * @param array $fkConstraints - * @param int $idGeneratorType - * @param array $options - */ - public function __construct($tableName, array $columns=array(), array $indexes=array(), array $fkConstraints=array(), $idGeneratorType=self::ID_NONE, array $options=array()) - { - if (strlen($tableName) == 0) { - throw DBALException::invalidTableName($tableName); - } - - $this->_setName($tableName); - $this->_idGeneratorType = $idGeneratorType; - - foreach ($columns AS $column) { - $this->_addColumn($column); - } - - foreach ($indexes AS $idx) { - $this->_addIndex($idx); - } - - foreach ($fkConstraints AS $constraint) { - $this->_addForeignKeyConstraint($constraint); - } - - $this->_options = $options; - } - - /** - * @param SchemaConfig $schemaConfig - */ - public function setSchemaConfig(SchemaConfig $schemaConfig) - { - $this->_schemaConfig = $schemaConfig; - } - - /** - * @return int - */ - protected function _getMaxIdentifierLength() - { - if ($this->_schemaConfig instanceof SchemaConfig) { - return $this->_schemaConfig->getMaxIdentifierLength(); - } else { - return 63; - } - } - - /** - * Set Primary Key - * - * @param array $columns - * @param string $indexName - * @return Table - */ - public function setPrimaryKey(array $columns, $indexName = false) - { - $primaryKey = $this->_createIndex($columns, $indexName ?: "primary", true, true); - - foreach ($columns AS $columnName) { - $column = $this->getColumn($columnName); - $column->setNotnull(true); - } - - return $primaryKey; - } - - /** - * @param string $type - * @return Table - */ - public function setIdGeneratorType($type) - { - $this->_idGeneratorType = $type; - return $this; - } - - /** - * @param array $columnNames - * @param string $indexName - * @return Table - */ - public function addIndex(array $columnNames, $indexName = null) - { - if($indexName == null) { - $indexName = $this->_generateIdentifierName( - array_merge(array($this->getName()), $columnNames), "idx", $this->_getMaxIdentifierLength() - ); - } - - return $this->_createIndex($columnNames, $indexName, false, false); - } - - /** - * - * @param array $columnNames - * @param string $indexName - * @return Table - */ - public function addUniqueIndex(array $columnNames, $indexName = null) - { - if ($indexName == null) { - $indexName = $this->_generateIdentifierName( - array_merge(array($this->getName()), $columnNames), "uniq", $this->_getMaxIdentifierLength() - ); - } - - return $this->_createIndex($columnNames, $indexName, true, false); - } - - /** - * Check if an index begins in the order of the given columns. - * - * @param array $columnsNames - * @return bool - */ - public function columnsAreIndexed(array $columnsNames) - { - foreach ($this->getIndexes() AS $index) { - $indexColumns = $index->getColumns(); - $areIndexed = true; - for ($i = 0; $i < count($columnsNames); $i++) { - if ($columnsNames[$i] != $indexColumns[$i]) { - $areIndexed = false; - } - } - - if ($areIndexed) { - return true; - } - } - return false; - } - - /** - * - * @param array $columnNames - * @param string $indexName - * @param bool $isUnique - * @param bool $isPrimary - * @return Table - */ - private function _createIndex(array $columnNames, $indexName, $isUnique, $isPrimary) - { - if (preg_match('(([^a-zA-Z0-9_]+))', $indexName)) { - throw SchemaException::indexNameInvalid($indexName); - } - - foreach ($columnNames AS $columnName => $indexColOptions) { - if (is_numeric($columnName) && is_string($indexColOptions)) { - $columnName = $indexColOptions; - } - - if ( ! $this->hasColumn($columnName)) { - throw SchemaException::columnDoesNotExist($columnName); - } - } - $this->_addIndex(new Index($indexName, $columnNames, $isUnique, $isPrimary)); - return $this; - } - - /** - * @param string $columnName - * @param string $columnType - * @param array $options - * @return Column - */ - public function addColumn($columnName, $typeName, array $options=array()) - { - $column = new Column($columnName, Type::getType($typeName), $options); - - $this->_addColumn($column); - return $column; - } - - /** - * Rename Column - * - * @param string $oldColumnName - * @param string $newColumnName - * @return Table - */ - public function renameColumn($oldColumnName, $newColumnName) - { - $column = $this->getColumn($oldColumnName); - $this->dropColumn($oldColumnName); - - $column->_setName($newColumnName); - return $this; - } - - /** - * Change Column Details - * - * @param string $columnName - * @param array $options - * @return Table - */ - public function changeColumn($columnName, array $options) - { - $column = $this->getColumn($columnName); - $column->setOptions($options); - return $this; - } - - /** - * Drop Column from Table - * - * @param string $columnName - * @return Table - */ - public function dropColumn($columnName) - { - $columnName = strtolower($columnName); - $column = $this->getColumn($columnName); - unset($this->_columns[$columnName]); - return $this; - } - - - /** - * Add a foreign key constraint - * - * Name is inferred from the local columns - * - * @param Table $foreignTable - * @param array $localColumns - * @param array $foreignColumns - * @param array $options - * @return Table - */ - public function addForeignKeyConstraint($foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array()) - { - $name = $this->_generateIdentifierName(array_merge((array)$this->getName(), $localColumnNames), "fk", $this->_getMaxIdentifierLength()); - return $this->addNamedForeignKeyConstraint($name, $foreignTable, $localColumnNames, $foreignColumnNames, $options); - } - - /** - * Add a foreign key constraint - * - * Name is to be generated by the database itsself. - * - * @param Table $foreignTable - * @param array $localColumns - * @param array $foreignColumns - * @param array $options - * @return Table - */ - public function addUnnamedForeignKeyConstraint($foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array()) - { - return $this->addNamedForeignKeyConstraint(null, $foreignTable, $localColumnNames, $foreignColumnNames, $options); - } - - /** - * Add a foreign key constraint with a given name - * - * @param string $name - * @param Table $foreignTable - * @param array $localColumns - * @param array $foreignColumns - * @param array $options - * @return Table - */ - public function addNamedForeignKeyConstraint($name, $foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array()) - { - if ($foreignTable instanceof Table) { - $foreignTableName = $foreignTable->getName(); - - foreach ($foreignColumnNames AS $columnName) { - if ( ! $foreignTable->hasColumn($columnName)) { - throw SchemaException::columnDoesNotExist($columnName); - } - } - } else { - $foreignTableName = $foreignTable; - } - - foreach ($localColumnNames AS $columnName) { - if ( ! $this->hasColumn($columnName)) { - throw SchemaException::columnDoesNotExist($columnName); - } - } - - $constraint = new ForeignKeyConstraint( - $localColumnNames, $foreignTableName, $foreignColumnNames, $name, $options - ); - $this->_addForeignKeyConstraint($constraint); - - return $this; - } - - /** - * @param string $name - * @param string $value - * @return Table - */ - public function addOption($name, $value) - { - $this->_options[$name] = $value; - return $this; - } - - /** - * @param Column $column - */ - protected function _addColumn(Column $column) - { - $columnName = $column->getName(); - $columnName = strtolower($columnName); - - if (isset($this->_columns[$columnName])) { - throw SchemaException::columnAlreadyExists($this->getName(), $columnName); - } - - $this->_columns[$columnName] = $column; - } - - /** - * Add index to table - * - * @param Index $index - * @return Table - */ - protected function _addIndex(Index $index) - { - // check for duplicates - $c = new Comparator(); - foreach ($this->_indexes AS $existingIndex) { - if ($c->diffIndex($index, $existingIndex) == false) { - return $this; - } - } - - $indexName = $index->getName(); - $indexName = strtolower($indexName); - - if (isset($this->_indexes[$indexName]) || ($this->_primaryKeyName != false && $index->isPrimary())) { - throw SchemaException::indexAlreadyExists($indexName); - } - - if ($index->isPrimary()) { - $this->_primaryKeyName = $indexName; - } - - $this->_indexes[$indexName] = $index; - return $this; - } - - /** - * @param ForeignKeyConstraint $constraint - */ - protected function _addForeignKeyConstraint(ForeignKeyConstraint $constraint) - { - $constraint->setLocalTable($this); - - if(strlen($constraint->getName())) { - $name = $constraint->getName(); - } else { - $name = $this->_generateIdentifierName( - array_merge((array)$this->getName(), $constraint->getLocalColumns()), "fk", $this->_getMaxIdentifierLength() - ); - } - $name = strtolower($name); - - $this->_fkConstraints[$name] = $constraint; - } - - /** - * Does Table have a foreign key constraint with the given name? - * * - * @param string $constraintName - * @return bool - */ - public function hasForeignKey($constraintName) - { - $constraintName = strtolower($constraintName); - return isset($this->_fkConstraints[$constraintName]); - } - - /** - * @param string $constraintName - * @return ForeignKeyConstraint - */ - public function getForeignKey($constraintName) - { - $constraintName = strtolower($constraintName); - if(!$this->hasForeignKey($constraintName)) { - throw SchemaException::foreignKeyDoesNotExist($constraintName); - } - - return $this->_fkConstraints[$constraintName]; - } - - /** - * @return bool - */ - public function isIdGeneratorIdentity() - { - return ($this->_idGeneratorType==self::ID_IDENTITY); - } - - /** - * @return array - */ - public function isIdGeneratorSequence() - { - return ($this->_idGeneratorType==self::ID_SEQUENCE); - } - - /** - * @return Column[] - */ - public function getColumns() - { - $columns = $this->_columns; - - $pkCols = array(); - $fkCols = array(); - - if ($this->hasIndex($this->_primaryKeyName)) { - $pkCols = $this->getPrimaryKey()->getColumns(); - } - foreach ($this->getForeignKeys() AS $fk) { - /* @var $fk ForeignKeyConstraint */ - $fkCols = array_merge($fkCols, $fk->getColumns()); - } - $colNames = array_unique(array_merge($pkCols, $fkCols, array_keys($columns))); - - uksort($columns, function($a, $b) use($colNames) { - return (array_search($a, $colNames) >= array_search($b, $colNames)); - }); - return $columns; - } - - - /** - * Does this table have a column with the given name? - * - * @param string $columnName - * @return bool - */ - public function hasColumn($columnName) - { - $columnName = strtolower($columnName); - return isset($this->_columns[$columnName]); - } - - /** - * Get a column instance - * - * @param string $columnName - * @return Column - */ - public function getColumn($columnName) - { - $columnName = strtolower($columnName); - if (!$this->hasColumn($columnName)) { - throw SchemaException::columnDoesNotExist($columnName); - } - - return $this->_columns[$columnName]; - } - - /** - * @return Index - */ - public function getPrimaryKey() - { - return $this->getIndex($this->_primaryKeyName); - } - - /** - * @param string $indexName - * @return bool - */ - public function hasIndex($indexName) - { - $indexName = strtolower($indexName); - return (isset($this->_indexes[$indexName])); - } - - /** - * @param string $indexName - * @return Index - */ - public function getIndex($indexName) - { - $indexName = strtolower($indexName); - if (!$this->hasIndex($indexName)) { - throw SchemaException::indexDoesNotExist($indexName); - } - return $this->_indexes[$indexName]; - } - - /** - * @return array - */ - public function getIndexes() - { - return $this->_indexes; - } - - /** - * Get Constraints - * - * @return array - */ - public function getForeignKeys() - { - return $this->_fkConstraints; - } - - public function hasOption($name) - { - return isset($this->_options[$name]); - } - - public function getOption($name) - { - return $this->_options[$name]; - } - - public function getOptions() - { - return $this->_options; - } - - /** - * @param Visitor $visitor - */ - public function visit(Visitor $visitor) - { - $visitor->acceptTable($this); - - foreach ($this->getColumns() AS $column) { - $visitor->acceptColumn($this, $column); - } - - foreach ($this->getIndexes() AS $index) { - $visitor->acceptIndex($this, $index); - } - - foreach ($this->getForeignKeys() AS $constraint) { - $visitor->acceptForeignKey($this, $constraint); - } - } - - /** - * Clone of a Table triggers a deep clone of all affected assets - */ - public function __clone() - { - foreach ($this->_columns AS $k => $column) { - $this->_columns[$k] = clone $column; - } - foreach ($this->_indexes AS $k => $index) { - $this->_indexes[$k] = clone $index; - } - foreach ($this->_fkConstraints AS $k => $fk) { - $this->_fkConstraints[$k] = clone $fk; - $this->_fkConstraints[$k]->setLocalTable($this); - } - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/TableDiff.php b/lib/Doctrine/DBAL/Schema/TableDiff.php deleted file mode 100644 index 3351a2393..000000000 --- a/lib/Doctrine/DBAL/Schema/TableDiff.php +++ /dev/null @@ -1,139 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * Table Diff - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved. - * @license http://ez.no/licenses/new_bsd New BSD License - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class TableDiff -{ - /** - * @var string - */ - public $name = null; - - /** - * @var string - */ - public $newName = false; - - /** - * All added fields - * - * @var array(string=>Column) - */ - public $addedColumns; - - /** - * All changed fields - * - * @var array(string=>Column) - */ - public $changedColumns = array(); - - /** - * All removed fields - * - * @var array(string=>bool) - */ - public $removedColumns = array(); - - /** - * Columns that are only renamed from key to column instance name. - * - * @var array(string=>Column) - */ - public $renamedColumns = array(); - - /** - * All added indexes - * - * @var array(string=>Index) - */ - public $addedIndexes = array(); - - /** - * All changed indexes - * - * @var array(string=>Index) - */ - public $changedIndexes = array(); - - /** - * All removed indexes - * - * @var array(string=>bool) - */ - public $removedIndexes = array(); - - /** - * All added foreign key definitions - * - * @var array - */ - public $addedForeignKeys = array(); - - /** - * All changed foreign keys - * - * @var array - */ - public $changedForeignKeys = array(); - - /** - * All removed foreign keys - * - * @var array - */ - public $removedForeignKeys = array(); - - /** - * Constructs an TableDiff object. - * - * @param array(string=>Column) $addedColumns - * @param array(string=>Column) $changedColumns - * @param array(string=>bool) $removedColumns - * @param array(string=>Index) $addedIndexes - * @param array(string=>Index) $changedIndexes - * @param array(string=>bool) $removedIndexes - */ - public function __construct($tableName, $addedColumns = array(), - $changedColumns = array(), $removedColumns = array(), $addedIndexes = array(), - $changedIndexes = array(), $removedIndexes = array()) - { - $this->name = $tableName; - $this->addedColumns = $addedColumns; - $this->changedColumns = $changedColumns; - $this->removedColumns = $removedColumns; - $this->addedIndexes = $addedIndexes; - $this->changedIndexes = $changedIndexes; - $this->removedIndexes = $removedIndexes; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/View.php b/lib/Doctrine/DBAL/Schema/View.php deleted file mode 100644 index 4a8329de6..000000000 --- a/lib/Doctrine/DBAL/Schema/View.php +++ /dev/null @@ -1,53 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Schema; - -/** - * Representation of a Database View - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class View extends AbstractAsset -{ - /** - * @var string - */ - private $_sql; - - public function __construct($name, $sql) - { - $this->_setName($name); - $this->_sql = $sql; - } - - /** - * @return string - */ - public function getSql() - { - return $this->_sql; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/Visitor/CreateSchemaSqlCollector.php b/lib/Doctrine/DBAL/Schema/Visitor/CreateSchemaSqlCollector.php deleted file mode 100644 index e94753f93..000000000 --- a/lib/Doctrine/DBAL/Schema/Visitor/CreateSchemaSqlCollector.php +++ /dev/null @@ -1,145 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema\Visitor; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\Schema\Table, - Doctrine\DBAL\Schema\Schema, - Doctrine\DBAL\Schema\Column, - Doctrine\DBAL\Schema\ForeignKeyConstraint, - Doctrine\DBAL\Schema\Constraint, - Doctrine\DBAL\Schema\Sequence, - Doctrine\DBAL\Schema\Index; - -class CreateSchemaSqlCollector implements Visitor -{ - /** - * @var array - */ - private $_createTableQueries = array(); - - /** - * @var array - */ - private $_createSequenceQueries = array(); - - /** - * @var array - */ - private $_createFkConstraintQueries = array(); - - /** - * - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $_platform = null; - - /** - * @param AbstractPlatform $platform - */ - public function __construct(AbstractPlatform $platform) - { - $this->_platform = $platform; - } - - /** - * @param Schema $schema - */ - public function acceptSchema(Schema $schema) - { - - } - - /** - * Generate DDL Statements to create the accepted table with all its dependencies. - * - * @param Table $table - */ - public function acceptTable(Table $table) - { - $this->_createTableQueries = array_merge($this->_createTableQueries, - $this->_platform->getCreateTableSQL($table) - ); - } - - public function acceptColumn(Table $table, Column $column) - { - - } - - /** - * @param Table $localTable - * @param ForeignKeyConstraint $fkConstraint - */ - public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) - { - // Append the foreign key constraints SQL - if ($this->_platform->supportsForeignKeyConstraints()) { - $this->_createFkConstraintQueries = array_merge($this->_createFkConstraintQueries, - (array) $this->_platform->getCreateForeignKeySQL($fkConstraint, $localTable->getName()) - ); - } - } - - /** - * @param Table $table - * @param Index $index - */ - public function acceptIndex(Table $table, Index $index) - { - - } - - /** - * @param Sequence $sequence - */ - public function acceptSequence(Sequence $sequence) - { - $this->_createSequenceQueries = array_merge( - $this->_createSequenceQueries, (array)$this->_platform->getCreateSequenceSQL($sequence) - ); - } - - /** - * @return array - */ - public function resetQueries() - { - $this->_createTableQueries = array(); - $this->_createSequenceQueries = array(); - $this->_createFkConstraintQueries = array(); - } - - /** - * Get all queries collected so far. - * - * @return array - */ - public function getQueries() - { - return array_merge( - $this->_createTableQueries, - $this->_createSequenceQueries, - $this->_createFkConstraintQueries - ); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/Visitor/DropSchemaSqlCollector.php b/lib/Doctrine/DBAL/Schema/Visitor/DropSchemaSqlCollector.php deleted file mode 100644 index 76090ffe5..000000000 --- a/lib/Doctrine/DBAL/Schema/Visitor/DropSchemaSqlCollector.php +++ /dev/null @@ -1,146 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema\Visitor; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\Schema\Table, - Doctrine\DBAL\Schema\Schema, - Doctrine\DBAL\Schema\Column, - Doctrine\DBAL\Schema\ForeignKeyConstraint, - Doctrine\DBAL\Schema\Constraint, - Doctrine\DBAL\Schema\Sequence, - Doctrine\DBAL\Schema\Index; - -/** - * Gather SQL statements that allow to completly drop the current schema. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class DropSchemaSqlCollector implements Visitor -{ - /** - * @var array - */ - private $_constraints = array(); - - /** - * @var array - */ - private $_sequences = array(); - - /** - * @var array - */ - private $_tables = array(); - - /** - * - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $_platform = null; - - /** - * @param AbstractPlatform $platform - */ - public function __construct(AbstractPlatform $platform) - { - $this->_platform = $platform; - } - - /** - * @param Schema $schema - */ - public function acceptSchema(Schema $schema) - { - - } - - /** - * @param Table $table - */ - public function acceptTable(Table $table) - { - $this->_tables[] = $this->_platform->getDropTableSQL($table->getName()); - } - - /** - * @param Column $column - */ - public function acceptColumn(Table $table, Column $column) - { - - } - - /** - * @param Table $localTable - * @param ForeignKeyConstraint $fkConstraint - */ - public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) - { - if (strlen($fkConstraint->getName()) == 0) { - throw SchemaException::namedForeignKeyRequired($localTable, $fkConstraint); - } - - $this->_constraints[] = $this->_platform->getDropForeignKeySQL($fkConstraint->getName(), $localTable->getName()); - } - - /** - * @param Table $table - * @param Index $index - */ - public function acceptIndex(Table $table, Index $index) - { - - } - - /** - * @param Sequence $sequence - */ - public function acceptSequence(Sequence $sequence) - { - $this->_sequences[] = $this->_platform->getDropSequenceSQL($sequence->getName()); - } - - /** - * @return array - */ - public function clearQueries() - { - $this->_constraints = $this->_sequences = $this->_tables = array(); - } - - /** - * @return array - */ - public function getQueries() - { - return array_merge( - $this->_constraints, - $this->_sequences, - $this->_tables - ); - } -} diff --git a/lib/Doctrine/DBAL/Schema/Visitor/FixSchema.php b/lib/Doctrine/DBAL/Schema/Visitor/FixSchema.php deleted file mode 100644 index 1a13a6e27..000000000 --- a/lib/Doctrine/DBAL/Schema/Visitor/FixSchema.php +++ /dev/null @@ -1,82 +0,0 @@ -_addExplicitIndexForForeignKey = $addExplicitIndexForForeignKey; - } - - /** - * @param Schema $schema - */ - public function acceptSchema(Schema $schema) - { - - } - - /** - * @param Table $table - */ - public function acceptTable(Table $table) - { - - } - - /** - * @param Column $column - */ - public function acceptColumn(Table $table, Column $column) - { - - } - - /** - * @param Table $localTable - * @param ForeignKeyConstraint $fkConstraint - */ - public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) - { - if ($this->_addExplicitIndexForForeignKey) { - $columns = $fkConstraint->getColumns(); - if ($localTable->columnsAreIndexed($columns)) { - return; - } - - $localTable->addIndex($columns); - } - } - - /** - * @param Table $table - * @param Index $index - */ - public function acceptIndex(Table $table, Index $index) - { - - } - - /** - * @param Sequence $sequence - */ - public function acceptSequence(Sequence $sequence) - { - - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Schema/Visitor/Visitor.php b/lib/Doctrine/DBAL/Schema/Visitor/Visitor.php deleted file mode 100644 index 2dad80deb..000000000 --- a/lib/Doctrine/DBAL/Schema/Visitor/Visitor.php +++ /dev/null @@ -1,75 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema\Visitor; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\Schema\Table, - Doctrine\DBAL\Schema\Schema, - Doctrine\DBAL\Schema\Column, - Doctrine\DBAL\Schema\ForeignKeyConstraint, - Doctrine\DBAL\Schema\Constraint, - Doctrine\DBAL\Schema\Sequence, - Doctrine\DBAL\Schema\Index; - -/** - * Schema Visitor used for Validation or Generation purposes. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -interface Visitor -{ - /** - * @param Schema $schema - */ - public function acceptSchema(Schema $schema); - - /** - * @param Table $table - */ - public function acceptTable(Table $table); - - /** - * @param Column $column - */ - public function acceptColumn(Table $table, Column $column); - - /** - * @param Table $localTable - * @param ForeignKeyConstraint $fkConstraint - */ - public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint); - - /** - * @param Table $table - * @param Index $index - */ - public function acceptIndex(Table $table, Index $index); - - /** - * @param Sequence $sequence - */ - public function acceptSequence(Sequence $sequence); -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Statement.php b/lib/Doctrine/DBAL/Statement.php deleted file mode 100644 index 2cfd8071a..000000000 --- a/lib/Doctrine/DBAL/Statement.php +++ /dev/null @@ -1,230 +0,0 @@ -. - */ - -namespace Doctrine\DBAL; - -use PDO, - Doctrine\DBAL\Types\Type, - Doctrine\DBAL\Driver\Statement as DriverStatement; - -/** - * A thin wrapper around a Doctrine\DBAL\Driver\Statement that adds support - * for logging, DBAL mapping types, etc. - * - * @author Roman Borschel - * @since 2.0 - */ -class Statement implements DriverStatement -{ - /** - * @var string The SQL statement. - */ - private $_sql; - /** - * @var array The bound parameters. - */ - private $_params = array(); - /** - * @var Doctrine\DBAL\Driver\Statement The underlying driver statement. - */ - private $_stmt; - /** - * @var Doctrine\DBAL\Platforms\AbstractPlatform The underlying database platform. - */ - private $_platform; - /** - * @var Doctrine\DBAL\Connection The connection this statement is bound to and executed on. - */ - private $_conn; - - /** - * Creates a new Statement for the given SQL and Connection. - * - * @param string $sql The SQL of the statement. - * @param Doctrine\DBAL\Connection The connection on which the statement should be executed. - */ - public function __construct($sql, Connection $conn) - { - $this->_sql = $sql; - $this->_stmt = $conn->getWrappedConnection()->prepare($sql); - $this->_conn = $conn; - $this->_platform = $conn->getDatabasePlatform(); - } - - /** - * Binds a parameter value to the statement. - * - * The value can optionally be bound with a PDO binding type or a DBAL mapping type. - * If bound with a DBAL mapping type, the binding type is derived from the mapping - * type and the value undergoes the conversion routines of the mapping type before - * being bound. - * - * @param $name The name or position of the parameter. - * @param $value The value of the parameter. - * @param mixed $type Either a PDO binding type or a DBAL mapping type name or instance. - * @return boolean TRUE on success, FALSE on failure. - */ - public function bindValue($name, $value, $type = null) - { - $this->_params[$name] = $value; - if ($type !== null) { - if (is_string($type)) { - $type = Type::getType($type); - } - if ($type instanceof Type) { - $value = $type->convertToDatabaseValue($value, $this->_platform); - $bindingType = $type->getBindingType(); - } else { - $bindingType = $type; // PDO::PARAM_* constants - } - return $this->_stmt->bindValue($name, $value, $bindingType); - } else { - return $this->_stmt->bindValue($name, $value); - } - } - - /** - * Binds a parameter to a value by reference. - * - * Binding a parameter by reference does not support DBAL mapping types. - * - * @param string $name The name or position of the parameter. - * @param mixed $value The reference to the variable to bind - * @param integer $type The PDO binding type. - * @return boolean TRUE on success, FALSE on failure. - */ - public function bindParam($name, &$var, $type = PDO::PARAM_STR) - { - return $this->_stmt->bindParam($name, $var, $type); - } - - /** - * Executes the statement with the currently bound parameters. - * - * @return boolean TRUE on success, FALSE on failure. - */ - public function execute($params = null) - { - if ($this->_conn->getConfiguration()->getSQLLogger()) { - $this->_conn->getConfiguration()->getSQLLogger()->logSQL($this->_sql, $this->_params); - } - $this->_params = array(); - return $this->_stmt->execute($params); - } - - /** - * Closes the cursor, freeing the database resources used by this statement. - * - * @return boolean TRUE on success, FALSE on failure. - */ - public function closeCursor() - { - return $this->_stmt->closeCursor(); - } - - /** - * Returns the number of columns in the result set. - * - * @return integer - */ - public function columnCount() - { - return $this->_stmt->columnCount(); - } - - /** - * Fetches the SQLSTATE associated with the last operation on the statement. - * - * @return string - */ - public function errorCode() - { - return $this->_stmt->errorCode(); - } - - /** - * Fetches extended error information associated with the last operation on the statement. - * - * @return array - */ - public function errorInfo() - { - return $this->_stmt->errorInfo(); - } - - /** - * Fetches the next row from a result set. - * - * @param integer $fetchStyle - * @return mixed The return value of this function on success depends on the fetch type. - * In all cases, FALSE is returned on failure. - */ - public function fetch($fetchStyle = PDO::FETCH_BOTH) - { - return $this->_stmt->fetch($fetchStyle); - } - - /** - * Returns an array containing all of the result set rows. - * - * @param integer $fetchStyle - * @param integer $columnIndex - * @return array An array containing all of the remaining rows in the result set. - */ - public function fetchAll($fetchStyle = PDO::FETCH_BOTH, $columnIndex = 0) - { - if ($columnIndex != 0) { - return $this->_stmt->fetchAll($fetchStyle, $columnIndex); - } - return $this->_stmt->fetchAll($fetchStyle); - } - - /** - * Returns a single column from the next row of a result set. - * - * @param integer $columnIndex - * @return mixed A single column from the next row of a result set or FALSE if there are no more rows. - */ - public function fetchColumn($columnIndex = 0) - { - return $this->_stmt->fetchColumn($columnIndex); - } - - /** - * Returns the number of rows affected by the last execution of this statement. - * - * @return integer The number of affected rows. - */ - public function rowCount() - { - return $this->_stmt->rowCount(); - } - - /** - * Gets the wrapped driver statement. - * - * @return Doctrine\DBAL\Driver\Statement - */ - public function getWrappedStatement() - { - return $this->_stmt; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Tools/Console/Command/ImportCommand.php b/lib/Doctrine/DBAL/Tools/Console/Command/ImportCommand.php deleted file mode 100644 index 8c3dd2b76..000000000 --- a/lib/Doctrine/DBAL/Tools/Console/Command/ImportCommand.php +++ /dev/null @@ -1,127 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Tools\Console\Command; - -use Symfony\Components\Console\Input\InputArgument, - Symfony\Components\Console; - -/** - * Task for executing arbitrary SQL that can come from a file or directly from - * the command line. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ImportCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('dbal:import') - ->setDescription('Import SQL file(s) directly to Database.') - ->setDefinition(array( - new InputArgument( - 'file', InputArgument::REQUIRED | InputArgument::IS_ARRAY, 'File path(s) of SQL to be executed.' - ) - )) - ->setHelp(<<getHelper('db')->getConnection(); - - if (($fileNames = $input->getArgument('file')) !== null) { - foreach ((array) $fileNames as $fileName) { - $fileName = realpath($fileName); - - if ( ! file_exists($fileName)) { - throw new \InvalidArgumentException( - sprintf("SQL file '%s' does not exist.", $fileName) - ); - } else if ( ! is_readable($fileName)) { - throw new \InvalidArgumentException( - sprintf("SQL file '%s' does not have read permissions.", $fileName) - ); - } - - $output->write(sprintf("Processing file '%s'... ", $fileName)); - $sql = file_get_contents($fileName); - - if ($conn instanceof \Doctrine\DBAL\Driver\PDOConnection) { - // PDO Drivers - try { - $lines = 0; - - $stmt = $conn->prepare($sql); - $stmt->execute(); - - do { - // Required due to "MySQL has gone away!" issue - $stmt->fetch(); - $stmt->closeCursor(); - - $lines++; - } while ($stmt->nextRowset()); - - $output->write(sprintf('%d statements executed!', $lines) . PHP_EOL); - } catch (\PDOException $e) { - $output->write('error!' . PHP_EOL); - - throw new \RuntimeException($e->getMessage(), $e->getCode(), $e); - } - } else { - // Non-PDO Drivers (ie. OCI8 driver) - $stmt = $conn->prepare($sql); - $rs = $stmt->execute(); - - if ($rs) { - $printer->writeln('OK!'); - } else { - $error = $stmt->errorInfo(); - - $output->write('error!' . PHP_EOL); - - throw new \RuntimeException($error[2], $error[0]); - } - - $stmt->closeCursor(); - } - } - } - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Tools/Console/Command/RunSqlCommand.php b/lib/Doctrine/DBAL/Tools/Console/Command/RunSqlCommand.php deleted file mode 100644 index a4fdaccd0..000000000 --- a/lib/Doctrine/DBAL/Tools/Console/Command/RunSqlCommand.php +++ /dev/null @@ -1,86 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Tools\Console\Command; - -use Symfony\Components\Console\Input\InputArgument, - Symfony\Components\Console\Input\InputOption, - Symfony\Components\Console; - -/** - * Task for executing arbitrary SQL that can come from a file or directly from - * the command line. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class RunSqlCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('dbal:run-sql') - ->setDescription('Executes arbitrary SQL directly from the command line.') - ->setDefinition(array( - new InputArgument('sql', InputArgument::REQUIRED, 'The SQL statement to execute.'), - new InputOption('depth', null, InputOption::PARAMETER_REQUIRED, 'Dumping depth of result set.', 7) - )) - ->setHelp(<<getHelper('db')->getConnection(); - - if (($sql = $input->getArgument('sql')) === null) { - throw new \RuntimeException("Argument 'SQL' is required in order to execute this command correctly."); - } - - $depth = $input->getOption('depth'); - - if ( ! is_numeric($depth)) { - throw new \LogicException("Option 'depth' must contains an integer value"); - } - - if (preg_match('/^select/i', $sql)) { - $resultSet = $conn->fetchAll($sql); - } else { - $resultSet = $conn->executeUpdate($sql); - } - - \Doctrine\Common\Util\Debug::dump($resultSet, (int) $depth); - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Tools/Console/Helper/ConnectionHelper.php b/lib/Doctrine/DBAL/Tools/Console/Helper/ConnectionHelper.php deleted file mode 100644 index bcf6f8d97..000000000 --- a/lib/Doctrine/DBAL/Tools/Console/Helper/ConnectionHelper.php +++ /dev/null @@ -1,74 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Tools\Console\Helper; - -use Symfony\Components\Console\Helper\Helper, - Doctrine\DBAL\Connection; - -/** - * Doctrine CLI Connection Helper. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ConnectionHelper extends Helper -{ - /** - * Doctrine Database Connection - * @var Connection - */ - protected $_connection; - - /** - * Constructor - * - * @param Connection $connection Doctrine Database Connection - */ - public function __construct(Connection $connection) - { - $this->_connection = $connection; - } - - /** - * Retrieves Doctrine Database Connection - * - * @return Connection - */ - public function getConnection() - { - return $this->_connection; - } - - /** - * @see Helper - */ - public function getName() - { - return 'connection'; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/ArrayType.php b/lib/Doctrine/DBAL/Types/ArrayType.php deleted file mode 100644 index 672710365..000000000 --- a/lib/Doctrine/DBAL/Types/ArrayType.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -/** - * Type that maps a PHP array to a clob SQL type. - * - * @since 2.0 - */ -class ArrayType extends Type -{ - public function getSqlDeclaration(array $fieldDeclaration, \Doctrine\DBAL\Platforms\AbstractPlatform $platform) - { - return $platform->getClobTypeDeclarationSQL($fieldDeclaration); - } - - public function convertToDatabaseValue($value, \Doctrine\DBAL\Platforms\AbstractPlatform $platform) - { - return serialize($value); - } - - public function convertToPHPValue($value, \Doctrine\DBAL\Platforms\AbstractPlatform $platform) - { - $value = (is_resource($value)) ? stream_get_contents($value) : $value; - return unserialize($value); - } - - public function getName() - { - return Type::TARRAY; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/BigIntType.php b/lib/Doctrine/DBAL/Types/BigIntType.php deleted file mode 100644 index 99c1948db..000000000 --- a/lib/Doctrine/DBAL/Types/BigIntType.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps a database BIGINT to a PHP string. - * - * @author robo - * @since 2.0 - */ -class BigIntType extends Type -{ - public function getName() - { - return Type::BIGINT; - } - - public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getBigIntTypeDeclarationSQL($fieldDeclaration); - } - - public function getBindingType() - { - return \PDO::PARAM_INT; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/BooleanType.php b/lib/Doctrine/DBAL/Types/BooleanType.php deleted file mode 100644 index da2694ebf..000000000 --- a/lib/Doctrine/DBAL/Types/BooleanType.php +++ /dev/null @@ -1,57 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps an SQL boolean to a PHP boolean. - * - * @since 2.0 - */ -class BooleanType extends Type -{ - public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getBooleanTypeDeclarationSQL($fieldDeclaration); - } - - public function convertToDatabaseValue($value, AbstractPlatform $platform) - { - return $platform->convertBooleans($value); - } - - public function convertToPHPValue($value, AbstractPlatform $platform) - { - return (bool) $value; - } - - public function getName() - { - return Type::BOOLEAN; - } - - public function getBindingType() - { - return \PDO::PARAM_BOOL; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/DateTimeType.php b/lib/Doctrine/DBAL/Types/DateTimeType.php deleted file mode 100644 index 91bc9905d..000000000 --- a/lib/Doctrine/DBAL/Types/DateTimeType.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps an SQL DATETIME/TIMESTAMP to a PHP DateTime object. - * - * @since 2.0 - */ -class DateTimeType extends Type -{ - public function getName() - { - return Type::DATETIME; - } - - public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getDateTimeTypeDeclarationSQL($fieldDeclaration); - } - - public function convertToDatabaseValue($value, AbstractPlatform $platform) - { - return ($value !== null) - ? $value->format($platform->getDateTimeFormatString()) : null; - } - - public function convertToPHPValue($value, AbstractPlatform $platform) - { - return ($value !== null) - ? \DateTime::createFromFormat($platform->getDateTimeFormatString(), $value) : null; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/DateType.php b/lib/Doctrine/DBAL/Types/DateType.php deleted file mode 100644 index 5db2ec0f6..000000000 --- a/lib/Doctrine/DBAL/Types/DateType.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps an SQL DATE to a PHP Date object. - * - * @since 2.0 - */ -class DateType extends Type -{ - public function getName() - { - return Type::DATE; - } - - public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getDateTypeDeclarationSQL($fieldDeclaration); - } - - public function convertToDatabaseValue($value, AbstractPlatform $platform) - { - return ($value !== null) - ? $value->format($platform->getDateFormatString()) : null; - } - - public function convertToPHPValue($value, AbstractPlatform $platform) - { - return ($value !== null) - ? \DateTime::createFromFormat('!'.$platform->getDateFormatString(), $value) : null; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/DecimalType.php b/lib/Doctrine/DBAL/Types/DecimalType.php deleted file mode 100644 index 44e97c865..000000000 --- a/lib/Doctrine/DBAL/Types/DecimalType.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps an SQL DECIMAL to a PHP double. - * - * @since 2.0 - */ -class DecimalType extends Type -{ - public function getName() - { - return Type::DECIMAL; - } - - public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getDecimalTypeDeclarationSQL($fieldDeclaration); - } - - public function convertToPHPValue($value, AbstractPlatform $platform) - { - return (double) $value; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/IntegerType.php b/lib/Doctrine/DBAL/Types/IntegerType.php deleted file mode 100644 index c790ab130..000000000 --- a/lib/Doctrine/DBAL/Types/IntegerType.php +++ /dev/null @@ -1,53 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps an SQL INT to a PHP integer. - * - * @author Roman Borschel - * @since 2.0 - */ -class IntegerType extends Type -{ - public function getName() - { - return Type::INTEGER; - } - - public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getIntegerTypeDeclarationSQL($fieldDeclaration); - } - - public function convertToPHPValue($value, AbstractPlatform $platform) - { - return (null === $value) ? null : (int) $value; - } - - public function getBindingType() - { - return \PDO::PARAM_INT; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/ObjectType.php b/lib/Doctrine/DBAL/Types/ObjectType.php deleted file mode 100644 index 668746f36..000000000 --- a/lib/Doctrine/DBAL/Types/ObjectType.php +++ /dev/null @@ -1,32 +0,0 @@ -getClobTypeDeclarationSQL($fieldDeclaration); - } - - public function convertToDatabaseValue($value, \Doctrine\DBAL\Platforms\AbstractPlatform $platform) - { - return serialize($value); - } - - public function convertToPHPValue($value, \Doctrine\DBAL\Platforms\AbstractPlatform $platform) - { - $value = (is_resource($value)) ? stream_get_contents($value) : $value; - return unserialize($value); - } - - public function getName() - { - return Type::OBJECT; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/SmallIntType.php b/lib/Doctrine/DBAL/Types/SmallIntType.php deleted file mode 100644 index 0647687ce..000000000 --- a/lib/Doctrine/DBAL/Types/SmallIntType.php +++ /dev/null @@ -1,52 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps a database SMALLINT to a PHP integer. - * - * @author robo - */ -class SmallIntType extends Type -{ - public function getName() - { - return Type::SMALLINT; - } - - public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getSmallIntTypeDeclarationSQL($fieldDeclaration); - } - - public function convertToPHPValue($value, AbstractPlatform $platform) - { - return (int) $value; - } - - public function getBindingType() - { - return \PDO::PARAM_INT; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/StringType.php b/lib/Doctrine/DBAL/Types/StringType.php deleted file mode 100644 index 5702cb18d..000000000 --- a/lib/Doctrine/DBAL/Types/StringType.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps an SQL VARCHAR to a PHP string. - * - * @since 2.0 - */ -class StringType extends Type -{ - /** @override */ - public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getVarcharTypeDeclarationSQL($fieldDeclaration); - } - - /** @override */ - public function getDefaultLength(AbstractPlatform $platform) - { - return $platform->getVarcharDefaultLength(); - } - - /** @override */ - public function getName() - { - return Type::STRING; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/TextType.php b/lib/Doctrine/DBAL/Types/TextType.php deleted file mode 100644 index 4fcd87270..000000000 --- a/lib/Doctrine/DBAL/Types/TextType.php +++ /dev/null @@ -1,56 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps an SQL CLOB to a PHP string. - * - * @since 2.0 - */ -class TextType extends Type -{ - /** @override */ - public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getClobTypeDeclarationSQL($fieldDeclaration); - } - - /** - * Converts a value from its database representation to its PHP representation - * of this type. - * - * @param mixed $value The value to convert. - * @param AbstractPlatform $platform The currently used database platform. - * @return mixed The PHP representation of the value. - */ - public function convertToPHPValue($value, AbstractPlatform $platform) - { - return (is_resource($value)) ? stream_get_contents($value) : $value; - } - - public function getName() - { - return Type::TEXT; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/TimeType.php b/lib/Doctrine/DBAL/Types/TimeType.php deleted file mode 100644 index 920578db7..000000000 --- a/lib/Doctrine/DBAL/Types/TimeType.php +++ /dev/null @@ -1,63 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps an SQL TIME to a PHP DateTime object. - * - * @since 2.0 - */ -class TimeType extends Type -{ - public function getName() - { - return Type::TIME; - } - - /** - * {@inheritdoc} - */ - public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getTimeTypeDeclarationSQL($fieldDeclaration); - } - - /** - * {@inheritdoc} - */ - public function convertToDatabaseValue($value, AbstractPlatform $platform) - { - return ($value !== null) - ? $value->format($platform->getTimeFormatString()) : null; - } - - /** - * {@inheritdoc} - */ - public function convertToPHPValue($value, AbstractPlatform $platform) - { - return ($value !== null) - ? \DateTime::createFromFormat($platform->getTimeFormatString(), $value) : null; - } -} \ No newline at end of file diff --git a/lib/Doctrine/DBAL/Types/Type.php b/lib/Doctrine/DBAL/Types/Type.php deleted file mode 100644 index be110132d..000000000 --- a/lib/Doctrine/DBAL/Types/Type.php +++ /dev/null @@ -1,226 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\DBALException; - -/** - * The base class for so-called Doctrine mapping types. - * - * A Type object is obtained by calling the static {@link getType()} method. - * - * @author Roman Borschel - * @since 2.0 - */ -abstract class Type -{ - const TARRAY = 'array'; - const BIGINT = 'bigint'; - const BOOLEAN = 'boolean'; - const DATETIME = 'datetime'; - const DATE = 'date'; - const TIME = 'time'; - const DECIMAL = 'decimal'; - const INTEGER = 'integer'; - const OBJECT = 'object'; - const SMALLINT = 'smallint'; - const STRING = 'string'; - const TEXT = 'text'; - - /** Map of already instantiated type objects. One instance per type (flyweight). */ - private static $_typeObjects = array(); - - /** The map of supported doctrine mapping types. */ - private static $_typesMap = array( - self::TARRAY => 'Doctrine\DBAL\Types\ArrayType', - self::OBJECT => 'Doctrine\DBAL\Types\ObjectType', - self::BOOLEAN => 'Doctrine\DBAL\Types\BooleanType', - self::INTEGER => 'Doctrine\DBAL\Types\IntegerType', - self::SMALLINT => 'Doctrine\DBAL\Types\SmallIntType', - self::BIGINT => 'Doctrine\DBAL\Types\BigIntType', - self::STRING => 'Doctrine\DBAL\Types\StringType', - self::TEXT => 'Doctrine\DBAL\Types\TextType', - self::DATETIME => 'Doctrine\DBAL\Types\DateTimeType', - self::DATE => 'Doctrine\DBAL\Types\DateType', - self::TIME => 'Doctrine\DBAL\Types\TimeType', - self::DECIMAL => 'Doctrine\DBAL\Types\DecimalType' - ); - - /* Prevent instantiation and force use of the factory method. */ - final private function __construct() {} - - /** - * Converts a value from its PHP representation to its database representation - * of this type. - * - * @param mixed $value The value to convert. - * @param AbstractPlatform $platform The currently used database platform. - * @return mixed The database representation of the value. - */ - public function convertToDatabaseValue($value, AbstractPlatform $platform) - { - return $value; - } - - /** - * Converts a value from its database representation to its PHP representation - * of this type. - * - * @param mixed $value The value to convert. - * @param AbstractPlatform $platform The currently used database platform. - * @return mixed The PHP representation of the value. - */ - public function convertToPHPValue($value, AbstractPlatform $platform) - { - return $value; - } - - /** - * Gets the default length of this type. - * - * @todo Needed? - */ - public function getDefaultLength(AbstractPlatform $platform) - { - return null; - } - - /** - * Gets the SQL declaration snippet for a field of this type. - * - * @param array $fieldDeclaration The field declaration. - * @param AbstractPlatform $platform The currently used database platform. - */ - abstract public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform); - - /** - * Gets the name of this type. - * - * @return string - * @todo Needed? - */ - abstract public function getName(); - - /** - * Factory method to create type instances. - * Type instances are implemented as flyweights. - * - * @static - * @throws DBALException - * @param string $name The name of the type (as returned by getName()). - * @return Doctrine\DBAL\Types\Type - */ - public static function getType($name) - { - if ( ! isset(self::$_typeObjects[$name])) { - if ( ! isset(self::$_typesMap[$name])) { - throw DBALException::unknownColumnType($name); - } - self::$_typeObjects[$name] = new self::$_typesMap[$name](); - } - - return self::$_typeObjects[$name]; - } - - /** - * Adds a custom type to the type map. - * - * @static - * @param string $name Name of the type. This should correspond to what getName() returns. - * @param string $className The class name of the custom type. - * @throws DBALException - */ - public static function addType($name, $className) - { - if (isset(self::$_typesMap[$name])) { - throw DBALException::typeExists($name); - } - - self::$_typesMap[$name] = $className; - } - - /** - * Checks if exists support for a type. - * - * @static - * @param string $name Name of the type - * @return boolean TRUE if type is supported; FALSE otherwise - */ - public static function hasType($name) - { - return isset(self::$_typesMap[$name]); - } - - /** - * Overrides an already defined type to use a different implementation. - * - * @static - * @param string $name - * @param string $className - * @throws DBALException - */ - public static function overrideType($name, $className) - { - if ( ! isset(self::$_typesMap[$name])) { - throw DBALException::typeNotFound($name); - } - - self::$_typesMap[$name] = $className; - } - - /** - * Gets the (preferred) binding type for values of this type that - * can be used when binding parameters to prepared statements. - * - * This method should return one of the PDO::PARAM_* constants, that is, one of: - * - * PDO::PARAM_BOOL - * PDO::PARAM_NULL - * PDO::PARAM_INT - * PDO::PARAM_STR - * PDO::PARAM_LOB - * - * @return integer - */ - public function getBindingType() - { - return \PDO::PARAM_STR; - } - - /** - * Get the types array map which holds all registered types and the corresponding - * type class - * - * @return array $typesMap - */ - public static function getTypesMap() - { - return self::$_typesMap; - } - - public function __toString() - { - $e = explode('\\', get_class($this)); - return str_replace('Type', '', end($e)); - } -} \ No newline at end of file diff --git a/lib/Doctrine/ORM/Configuration.php b/lib/Doctrine/ORM/Configuration.php index b6fa3a99e..75b66453e 100644 --- a/lib/Doctrine/ORM/Configuration.php +++ b/lib/Doctrine/ORM/Configuration.php @@ -462,4 +462,27 @@ class Configuration extends \Doctrine\DBAL\Configuration { $this->_attributes['customDatetimeFunctions'] = array_change_key_case($functions); } + + /** + * Get the hydrator class for the given hydration mode name. + * + * @param string $modeName The hydration mode name. + * @return string $hydrator The hydrator class name. + */ + public function getCustomHydrationMode($modeName) + { + return isset($this->_attributes['customHydrationModes'][$modeName]) ? + $this->_attributes['customHydrationModes'][$modeName] : null; + } + + /** + * Add a custom hydration mode. + * + * @param string $modeName The hydration mode name. + * @param string $hydrator The hydrator class name. + */ + public function addCustomHydrationMode($modeName, $hydrator) + { + $this->_attributes['customHydrationModes'][$modeName] = $hydrator; + } } \ No newline at end of file diff --git a/lib/Doctrine/ORM/EntityManager.php b/lib/Doctrine/ORM/EntityManager.php index 0ff16f640..566c353c2 100644 --- a/lib/Doctrine/ORM/EntityManager.php +++ b/lib/Doctrine/ORM/EntityManager.php @@ -616,6 +616,10 @@ class EntityManager $hydrator = new Internal\Hydration\SingleScalarHydrator($this); break; default: + if ($class = $this->_config->getCustomHydrationMode($hydrationMode)) { + $hydrator = new $class($this); + break; + } throw ORMException::invalidHydrationMode($hydrationMode); } diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadata.php b/lib/Doctrine/ORM/Mapping/ClassMetadata.php index 48bbc996a..540162c76 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadata.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadata.php @@ -295,6 +295,9 @@ class ClassMetadata extends ClassMetadataInfo if ($this->generatorType != self::GENERATOR_TYPE_NONE) { $serialized[] = 'generatorType'; + if ($this->generatorType == self::GENERATOR_TYPE_SEQUENCE) { + $serialized[] = 'sequenceGeneratorDefinition'; + } } if ($this->isMappedSuperclass) { diff --git a/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php b/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php index 7dc6cb8cd..5dbe6e431 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php @@ -1,7 +1,5 @@ * @author Jonathan Wage + * @author Benjamin Eberlei */ class DatabaseDriver implements Driver { - /** The SchemaManager. */ + /** + * @var AbstractSchemaManager + */ private $_sm; + + /** + * @var array + */ + private $tables = null; + + private $classes = array(); + + /** + * @var array + */ + private $manyToManyTables = array(); /** * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading @@ -53,27 +65,78 @@ class DatabaseDriver implements Driver { $this->_sm = $schemaManager; } + + private function reverseEngineerMappingFromDatabase() + { + if ($this->tables !== null) { + return; + } + + foreach ($this->_sm->listTableNames() as $tableName) { + $tables[strtolower($tableName)] = $this->_sm->listTableDetails($tableName); + } + + $this->tables = array(); + foreach ($tables AS $name => $table) { + /* @var $table Table */ + if ($this->_sm->getDatabasePlatform()->supportsForeignKeyConstraints()) { + $foreignKeys = $table->getForeignKeys(); + } else { + $foreignKeys = array(); + } + + $allForeignKeyColumns = array(); + foreach ($foreignKeys AS $foreignKey) { + $allForeignKeyColumns = array_merge($allForeignKeyColumns, $foreignKey->getLocalColumns()); + } + + $pkColumns = $table->getPrimaryKey()->getColumns(); + sort($pkColumns); + sort($allForeignKeyColumns); + + if ($pkColumns == $allForeignKeyColumns) { + if (count($table->getForeignKeys()) > 2) { + throw new \InvalidArgumentException("ManyToMany table '" . $name . "' with more or less than two foreign keys are not supported by the Database Reverese Engineering Driver."); + } + + $this->manyToManyTables[$name] = $table; + } else { + $className = Inflector::classify($name); + $this->tables[$name] = $table; + $this->classes[$className] = $name; + } + } + } /** * {@inheritdoc} */ public function loadMetadataForClass($className, ClassMetadataInfo $metadata) { - $tableName = $className; - $className = Inflector::classify($tableName); + $this->reverseEngineerMappingFromDatabase(); + + if (!isset($this->classes[$className])) { + throw new \InvalidArgumentException("Unknown class " . $className); + } + + $tableName = Inflector::tableize($className); $metadata->name = $className; $metadata->table['name'] = $tableName; - $columns = $this->_sm->listTableColumns($tableName); + $columns = $this->tables[$tableName]->getColumns(); + $indexes = $this->tables[$tableName]->getIndexes(); if ($this->_sm->getDatabasePlatform()->supportsForeignKeyConstraints()) { - $foreignKeys = $this->_sm->listTableForeignKeys($tableName); + $foreignKeys = $this->tables[$tableName]->getForeignKeys(); } else { $foreignKeys = array(); } - $indexes = $this->_sm->listTableIndexes($tableName); + $allForeignKeyColumns = array(); + foreach ($foreignKeys AS $foreignKey) { + $allForeignKeyColumns = array_merge($allForeignKeyColumns, $foreignKey->getLocalColumns()); + } $ids = array(); $fieldMappings = array(); @@ -81,6 +144,8 @@ class DatabaseDriver implements Driver $fieldMapping = array(); if (isset($indexes['primary']) && in_array($column->getName(), $indexes['primary']->getColumns())) { $fieldMapping['id'] = true; + } else if (in_array($column->getName(), $allForeignKeyColumns)) { + continue; } $fieldMapping['fieldName'] = Inflector::camelize(strtolower($column->getName())); @@ -116,15 +181,64 @@ class DatabaseDriver implements Driver $metadata->mapField($fieldMapping); } - foreach ($foreignKeys as $foreignKey) { - $cols = $foreignKey->getColumns(); - $localColumn = current($cols); + foreach ($this->manyToManyTables AS $manyTable) { + foreach ($manyTable->getForeignKeys() AS $foreignKey) { + if ($tableName == strtolower($foreignKey->getForeignTableName())) { + $myFk = $foreignKey; + foreach ($manyTable->getForeignKeys() AS $foreignKey) { + if ($foreignKey != $myFk) { + $otherFk = $foreignKey; + break; + } + } + $localColumn = current($myFk->getColumns()); + $associationMapping = array(); + $associationMapping['fieldName'] = Inflector::camelize(str_replace('_id', '', strtolower(current($otherFk->getColumns())))); + $associationMapping['targetEntity'] = Inflector::classify(strtolower($otherFk->getForeignTableName())); + if (current($manyTable->getColumns())->getName() == $localColumn) { + $associationMapping['inversedBy'] = Inflector::camelize(str_replace('_id', '', strtolower(current($myFk->getColumns())))); + $associationMapping['joinTable'] = array( + 'name' => strtolower($manyTable->getName()), + 'joinColumns' => array(), + 'inverseJoinColumns' => array(), + ); + + $fkCols = $myFk->getForeignColumns(); + $cols = $myFk->getColumns(); + for ($i = 0; $i < count($cols); $i++) { + $associationMapping['joinTable']['joinColumns'][] = array( + 'name' => $cols[$i], + 'referencedColumnName' => $fkCols[$i], + ); + } + + $fkCols = $otherFk->getForeignColumns(); + $cols = $otherFk->getColumns(); + for ($i = 0; $i < count($cols); $i++) { + $associationMapping['joinTable']['inverseJoinColumns'][] = array( + 'name' => $cols[$i], + 'referencedColumnName' => $fkCols[$i], + ); + } + } else { + $associationMapping['mappedBy'] = Inflector::camelize(str_replace('_id', '', strtolower(current($myFk->getColumns())))); + } + $metadata->mapManyToMany($associationMapping); + break; + } + } + } + + foreach ($foreignKeys as $foreignKey) { + $foreignTable = $foreignKey->getForeignTableName(); + $cols = $foreignKey->getColumns(); $fkCols = $foreignKey->getForeignColumns(); + $localColumn = current($cols); $associationMapping = array(); - $associationMapping['fieldName'] = Inflector::camelize(str_ireplace('_id', '', $localColumn)); - $associationMapping['targetEntity'] = Inflector::classify($foreignKey->getForeignTableName()); + $associationMapping['fieldName'] = Inflector::camelize(str_replace('_id', '', strtolower($localColumn))); + $associationMapping['targetEntity'] = Inflector::classify($foreignTable); for ($i = 0; $i < count($cols); $i++) { $associationMapping['joinColumns'][] = array( @@ -132,7 +246,6 @@ class DatabaseDriver implements Driver 'referencedColumnName' => $fkCols[$i], ); } - $metadata->mapManyToOne($associationMapping); } } @@ -146,16 +259,16 @@ class DatabaseDriver implements Driver } /** - * {@inheritDoc} + * Return all the class names supported by this driver. + * + * IMPORTANT: This method must return an array of class not tables names. + * + * @return array */ public function getAllClassNames() { - $classes = array(); - - foreach ($this->_sm->listTables() as $table) { - $classes[] = $table->getName(); // TODO: Why is this not correct? Inflector::classify($table->getName()); - } + $this->reverseEngineerMappingFromDatabase(); - return $classes; + return array_keys($this->classes); } } \ No newline at end of file diff --git a/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php b/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php index 537aaf3a3..fb7871c74 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php +++ b/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php @@ -119,7 +119,7 @@ final class JoinTable extends Annotation { } final class SequenceGenerator extends Annotation { public $sequenceName; - public $allocationSize = 10; + public $allocationSize = 1; public $initialValue = 1; } final class ChangeTrackingPolicy extends Annotation {} diff --git a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php index d01a46b3c..575fb2230 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php @@ -106,21 +106,25 @@ class XmlDriver extends AbstractFileDriver // Evaluate if (isset($xmlRoot->indexes)) { + $metadata->table['indexes'] = array(); foreach ($xmlRoot->indexes->index as $index) { - if (is_string($index['columns'])) { - $columns = explode(',', $index['columns']); - } else { - $columns = $index['columns']; - } + $columns = explode(',', (string)$index['columns']); - $metadata->table['indexes'][$index['name']] = array( - 'columns' => $columns - ); + if (isset($index['name'])) { + $metadata->table['indexes'][(string)$index['name']] = array( + 'columns' => $columns + ); + } else { + $metadata->table['indexes'][] = array( + 'columns' => $columns + ); + } } } // Evaluate if (isset($xmlRoot->{'unique-constraints'})) { + $metadata->table['uniqueConstraints'] = array(); foreach ($xmlRoot->{'unique-constraints'}->{'unique-constraint'} as $unique) { $columns = explode(',', (string)$unique['columns']); diff --git a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php index 22388f4fb..08a7452a3 100644 --- a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php +++ b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php @@ -513,10 +513,12 @@ class BasicEntityPersister $targetClass = $this->_em->getClassMetadata($assoc->targetEntityName); if ($assoc->isOwningSide) { + $isInverseSingleValued = $assoc->inversedBy && ! $targetClass->isCollectionValuedAssociation($assoc->inversedBy); + // Mark inverse side as fetched in the hints, otherwise the UoW would // try to load it in a separate query (remember: to-one inverse sides can not be lazy). $hints = array(); - if ($assoc->inversedBy) { + if ($isInverseSingleValued) { $hints['fetched'][$targetClass->name][$assoc->inversedBy] = true; if ($targetClass->subClasses) { foreach ($targetClass->subClasses as $targetSubclassName) { @@ -533,7 +535,7 @@ class BasicEntityPersister $targetEntity = $this->load($identifier, $targetEntity, $assoc, $hints); // Complete bidirectional association, if necessary - if ($targetEntity !== null && $assoc->inversedBy && ! $targetClass->isCollectionValuedAssociation($assoc->inversedBy)) { + if ($targetEntity !== null && $isInverseSingleValued) { $targetClass->reflFields[$assoc->inversedBy]->setValue($targetEntity, $sourceEntity); } } else { diff --git a/lib/Doctrine/ORM/Query.php b/lib/Doctrine/ORM/Query.php index ac0d5bdd6..18087ddd0 100644 --- a/lib/Doctrine/ORM/Query.php +++ b/lib/Doctrine/ORM/Query.php @@ -244,7 +244,7 @@ final class Query extends AbstractQuery if (is_object($value) && $this->_em->getMetadataFactory()->hasMetadataFor(get_class($value))) { $values = $this->_em->getUnitOfWork()->getEntityIdentifier($value); $sqlPositions = $paramMappings[$key]; - $sqlParams = array_merge($sqlParams, array_combine((array)$sqlPositions, $values)); + $sqlParams += array_combine((array)$sqlPositions, $values); } else { foreach ($paramMappings[$key] as $position) { $sqlParams[$position] = $value; diff --git a/lib/Doctrine/ORM/Query/Expr.php b/lib/Doctrine/ORM/Query/Expr.php index 588333f37..e071d325e 100644 --- a/lib/Doctrine/ORM/Query/Expr.php +++ b/lib/Doctrine/ORM/Query/Expr.php @@ -37,7 +37,7 @@ class Expr { /** * Creates a conjunction of the given boolean expressions. - * + * * Example: * * [php] @@ -55,7 +55,7 @@ class Expr /** * Creates a disjunction of the given boolean expressions. - * + * * Example: * * [php] @@ -70,10 +70,10 @@ class Expr { return new Expr\Orx(func_get_args()); } - + /** * Creates an ASCending order expression. - * + * * @param $sort * @return OrderBy */ @@ -81,10 +81,10 @@ class Expr { return new Expr\OrderBy($expr, 'ASC'); } - + /** * Creates a DESCending order expression. - * + * * @param $sort * @return OrderBy */ @@ -95,7 +95,7 @@ class Expr /** * Creates an equality comparison expression with the given arguments. - * + * * First argument is considered the left expression and the second is the right expression. * When converted to string, it will generated a = . Example: * @@ -325,7 +325,7 @@ class Expr /** * Creates a product mathematical expression with the given arguments. - * + * * First argument is considered the left expression and the second is the right expression. * When converted to string, it will generated a * . Example: * @@ -470,9 +470,13 @@ class Expr * @param integer $len Length of crop. May accept negative values. * @return Expr\Func */ - public function substring($x, $from, $len) + public function substring($x, $from, $len = null) { - return new Expr\Func('SUBSTRING', array($x, $from, $len)); + $args = array($x, $from); + if (null !== $len) { + $args[] = $len; + } + return new Expr\Func('SUBSTRING', $args); } /** @@ -518,16 +522,16 @@ class Expr { return new Expr\Literal($this->_quoteLiteral($literal)); } - + /** * Quotes a literal value, if necessary, according to the DQL syntax. - * + * * @param mixed $literal The literal value. * @return string */ private function _quoteLiteral($literal) { - if (is_numeric($literal)) { + if (is_numeric($literal) && !is_string($literal)) { return (string) $literal; } else { return "'" . str_replace("'", "''", $literal) . "'"; @@ -557,4 +561,4 @@ class Expr { return new Expr\Func('TRIM', $x); } -} \ No newline at end of file +} diff --git a/lib/Doctrine/ORM/Query/Expr/Select.php b/lib/Doctrine/ORM/Query/Expr/Select.php index fb049916f..a310a0c7b 100644 --- a/lib/Doctrine/ORM/Query/Expr/Select.php +++ b/lib/Doctrine/ORM/Query/Expr/Select.php @@ -36,4 +36,7 @@ class Select extends Base { protected $_preSeparator = ''; protected $_postSeparator = ''; + protected $_allowedClasses = array( + 'Doctrine\ORM\Query\Expr\Func' + ); } \ No newline at end of file diff --git a/lib/Doctrine/ORM/Tools/Console/Command/ConvertDoctrine1SchemaCommand.php b/lib/Doctrine/ORM/Tools/Console/Command/ConvertDoctrine1SchemaCommand.php index a82824a17..42985393b 100644 --- a/lib/Doctrine/ORM/Tools/Console/Command/ConvertDoctrine1SchemaCommand.php +++ b/lib/Doctrine/ORM/Tools/Console/Command/ConvertDoctrine1SchemaCommand.php @@ -25,7 +25,8 @@ use Symfony\Components\Console\Input\InputArgument, Symfony\Components\Console\Input\InputOption, Symfony\Components\Console, Doctrine\ORM\Tools\Export\ClassMetadataExporter, - Doctrine\ORM\Tools\ConvertDoctrine1Schema; + Doctrine\ORM\Tools\ConvertDoctrine1Schema, + Doctrine\ORM\Tools\EntityGenerator; /** * Command to convert a Doctrine 1 schema to a Doctrine 2 mapping file. @@ -41,6 +42,56 @@ use Symfony\Components\Console\Input\InputArgument, */ class ConvertDoctrine1SchemaCommand extends Console\Command\Command { + /** + * @var EntityGenerator + */ + private $entityGenerator = null; + + /** + * @var ClassMetadataExporter + */ + private $metadataExporter = null; + + /** + * @return EntityGenerator + */ + public function getEntityGenerator() + { + if ($this->entityGenerator == null) { + $this->entityGenerator = new EntityGenerator(); + } + + return $this->entityGenerator; + } + + /** + * @param EntityGenerator $entityGenerator + */ + public function setEntityGenerator(EntityGenerator $entityGenerator) + { + $this->entityGenerator = $entityGenerator; + } + + /** + * @return ClassMetadataExporter + */ + public function getMetadataExporter() + { + if ($this->metadataExporter == null) { + $this->metadataExporter = new ClassMetadataExporter(); + } + + return $this->metadataExporter; + } + + /** + * @param ClassMetadataExporter $metadataExporter + */ + public function setMetadataExporter(ClassMetadataExporter $metadataExporter) + { + $this->metadataExporter = $metadataExporter; + } + /** * @see Console\Command\Command */ @@ -90,6 +141,27 @@ EOT // Process source directories $fromPaths = array_merge(array($input->getArgument('from-path')), $input->getOption('from')); + // Process destination directory + $destPath = realpath($input->getArgument('dest-path')); + + $toType = $input->getArgument('to-type'); + $extend = $input->getOption('extend'); + $numSpaces = $input->getOption('num-spaces'); + + $this->convertDoctrine1Schema($em, $fromPaths, $destPath, $toType, $numSpaces, $extend, $output); + } + + /** + * @param \Doctrine\ORM\EntityManager $em + * @param array $fromPaths + * @param string $destPath + * @param string $toType + * @param int $numSpaces + * @param string|null $extend + * @param Console\Output\OutputInterface $output + */ + public function convertDoctrine1Schema($em, $fromPaths, $destPath, $toType, $numSpaces, $extend, $output) + { foreach ($fromPaths as &$dirName) { $dirName = realpath($dirName); @@ -104,9 +176,6 @@ EOT } } - // Process destination directory - $destPath = realpath($input->getArgument('dest-path')); - if ( ! file_exists($destPath)) { throw new \InvalidArgumentException( sprintf("Doctrine 2.X mapping destination directory '%s' does not exist.", $destPath) @@ -117,18 +186,16 @@ EOT ); } - $toType = $input->getArgument('to-type'); - - $cme = new ClassMetadataExporter(); + $cme = $this->getMetadataExporter(); $exporter = $cme->getExporter($toType, $destPath); if (strtolower($toType) === 'annotation') { - $entityGenerator = new EntityGenerator(); + $entityGenerator = $this->getEntityGenerator(); $exporter->setEntityGenerator($entityGenerator); - $entityGenerator->setNumSpaces($input->getOption('num-spaces')); + $entityGenerator->setNumSpaces($numSpaces); - if (($extend = $input->getOption('extend')) !== null) { + if ($extend !== null) { $entityGenerator->setClassToExtend($extend); } } diff --git a/lib/Doctrine/ORM/Tools/EntityGenerator.php b/lib/Doctrine/ORM/Tools/EntityGenerator.php index b8a47c64d..2af25891f 100644 --- a/lib/Doctrine/ORM/Tools/EntityGenerator.php +++ b/lib/Doctrine/ORM/Tools/EntityGenerator.php @@ -698,6 +698,10 @@ public function () $typeOptions[] = 'targetEntity="' . $associationMapping->targetEntityName . '"'; } + if (isset($associationMapping->inversedBy)) { + $typeOptions[] = 'inversedBy="' . $associationMapping->inversedBy . '"'; + } + if (isset($associationMapping->mappedBy)) { $typeOptions[] = 'mappedBy="' . $associationMapping->mappedBy . '"'; } diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php index 201d1072d..831c28f4a 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php @@ -113,6 +113,7 @@ class PhpExporter extends AbstractExporter $method = 'mapOneToOne'; $oneToOneMappingArray = array( 'mappedBy' => $associationMapping->mappedBy, + 'inversedBy' => $associationMapping->inversedBy, 'joinColumns' => $associationMapping->joinColumns, 'orphanRemoval' => $associationMapping->orphanRemoval, ); diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php index 23466a1b9..63f28ffc9 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php @@ -196,6 +196,9 @@ class XmlExporter extends AbstractExporter if (isset($associationMapping->mappedBy)) { $associationMappingXml->addAttribute('mapped-by', $associationMapping->mappedBy); } + if (isset($associationMapping->inversedBy)) { + $associationMappingXml->addAttribute('inversed-by', $associationMapping->inversedBy); + } if (isset($associationMapping->orphanRemoval)) { $associationMappingXml->addAttribute('orphan-removal', $associationMapping->orphanRemoval); } @@ -266,19 +269,19 @@ class XmlExporter extends AbstractExporter } $cascade = array(); if ($associationMapping->isCascadeRemove) { - $cascade[] = 'remove'; + $cascade[] = 'cascade-remove'; } if ($associationMapping->isCascadePersist) { - $cascade[] = 'persist'; + $cascade[] = 'cascade-persist'; } if ($associationMapping->isCascadeRefresh) { - $cascade[] = 'refresh'; + $cascade[] = 'cascade-refresh'; } if ($associationMapping->isCascadeMerge) { - $cascade[] = 'merge'; + $cascade[] = 'cascade-merge'; } if ($associationMapping->isCascadeDetach) { - $cascade[] = 'detach'; + $cascade[] = 'cascade-detach'; } if ($cascade) { $cascadeXml = $associationMappingXml->addChild('cascade'); diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php index 0eb749ec6..13094a1d9 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php @@ -168,6 +168,7 @@ class YamlExporter extends AbstractExporter } $oneToOneMappingArray = array( 'mappedBy' => $associationMapping->mappedBy, + 'inversedBy' => $associationMapping->inversedBy, 'joinColumns' => $newJoinColumns, 'orphanRemoval' => $associationMapping->orphanRemoval, ); @@ -177,6 +178,7 @@ class YamlExporter extends AbstractExporter } else if ($associationMapping instanceof OneToManyMapping) { $oneToManyMappingArray = array( 'mappedBy' => $associationMapping->mappedBy, + 'inversedBy' => $associationMapping->inversedBy, 'orphanRemoval' => $associationMapping->orphanRemoval, 'orderBy' => $associationMapping->orderBy ); @@ -185,8 +187,9 @@ class YamlExporter extends AbstractExporter $array['oneToMany'][$name] = $associationMappingArray; } else if ($associationMapping instanceof ManyToManyMapping) { $manyToManyMappingArray = array( - 'mappedBy' => $associationMapping->mappedBy, - 'joinTable' => $associationMapping->joinTable, + 'mappedBy' => $associationMapping->mappedBy, + 'inversedBy' => $associationMapping->inversedBy, + 'joinTable' => $associationMapping->joinTable, 'orderBy' => $associationMapping->orderBy ); diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index 828bd19ed..8287d1fa7 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -832,6 +832,17 @@ class UnitOfWork implements PropertyChangedListener $calc->addClass($targetClass); } $calc->addDependency($targetClass, $class); + // If the target class has mapped subclasses, + // these share the same dependency. + if ($targetClass->subClasses) { + foreach ($targetClass->subClasses as $subClassName) { + $targetSubClass = $this->_em->getClassMetadata($subClassName); + if ( ! $calc->hasClass($subClassName)) { + $calc->addClass($targetSubClass); + } + $calc->addDependency($targetSubClass, $class); + } + } } } } diff --git a/lib/Doctrine/Common/Version.php b/lib/Doctrine/ORM/Version.php similarity index 96% rename from lib/Doctrine/Common/Version.php rename to lib/Doctrine/ORM/Version.php index c01da049f..374acf884 100644 --- a/lib/Doctrine/Common/Version.php +++ b/lib/Doctrine/ORM/Version.php @@ -17,7 +17,7 @@ * . */ -namespace Doctrine\Common; +namespace Doctrine\ORM; /** * Class to store and retrieve the version of Doctrine @@ -36,7 +36,7 @@ class Version /** * Current Doctrine Version */ - const VERSION = '2.0-DEV'; + const VERSION = '2.0.0BETA3-DEV'; /** * Compares a Doctrine version with the current one. diff --git a/lib/vendor/doctrine-common b/lib/vendor/doctrine-common new file mode 160000 index 000000000..30eac01b1 --- /dev/null +++ b/lib/vendor/doctrine-common @@ -0,0 +1 @@ +Subproject commit 30eac01b12afc318bc142b79a339ce0b9fb81239 diff --git a/lib/vendor/doctrine-dbal b/lib/vendor/doctrine-dbal new file mode 160000 index 000000000..1142739e1 --- /dev/null +++ b/lib/vendor/doctrine-dbal @@ -0,0 +1 @@ +Subproject commit 1142739e17f495adc7563c1bb18eab7f3465a231 diff --git a/phpdoc.ini b/phpdoc.ini deleted file mode 100644 index 2e2d320ce..000000000 --- a/phpdoc.ini +++ /dev/null @@ -1,126 +0,0 @@ -; Default configuration file for PHPDoctor - -; This config file will cause PHPDoctor to generate API documentation of -; itself. - - -; PHPDoctor settings -; ----------------------------------------------------------------------------- - -; Names of files to parse. This can be a single filename, or a comma separated -; list of filenames. Wildcards are allowed. - -;files = "*.php" -files = *.php - -; Names of files or directories to ignore. This can be a single filename, or a -; comma separated list of filenames. Wildcards are NOT allowed. - -ignore = "CVS, .svn, .git, _compiled, vendor" - -; The directory to look for files in, if not used the PHPDoctor will look in -; the current directory (the directory it is run from). - -source_path = "./lib" - -; If you do not want PHPDoctor to look in each sub directory for files -; uncomment this line. - -;subdirs = off - -; Set how loud PHPDoctor is as it runs. Quiet mode suppresses all output other -; than warnings and errors. Verbose mode outputs additional messages during -; execution. - -;quiet = on -;verbose = on - -; Select the doclet to use for generating output. - -doclet = standard -;doclet = debug - -; The directory to find the doclet in. Doclets are expected to be in a -; directory named after themselves at the location given. - -;doclet_path = ./doclets - -; The directory to find taglets in. Taglets allow you to make PHPDoctor handle -; new tags and to alter the behavour of existing tags and their output. - -;taglet_path = ./taglets - -; If the code you are parsing does not use package tags or not all elements -; have package tags, use this setting to place unbound elements into a -; particular package. - -default_package = "Doctrine" - -; Specifies the name of a HTML file containing text for the overview -; documentation to be placed on the overview page. The path is relative to -; "source_path" unless an absolute path is given. - -overview = readme.html - -; Package comments will be looked for in a file named package.html in the same -; directory as the first source file parsed in that package or in the directory -; given below. If package comments are placed in the directory given below then -; they should be named ".html". - -package_comment_dir = ./ - -; Parse out global variables and/or global constants? - -;globals = off -;constants = off - -; Generate documentation for all class members - -;private = on - -; Generate documentation for public and protected class members - -protected = on - -; Generate documentation for only public class members - -;public = on - -; Use the PEAR compatible handling of the docblock first sentence - -;pear_compat = on - -; Standard doclet settings -; ----------------------------------------------------------------------------- - -; The directory to place generated documentation in. If the given path is -; relative to it will be relative to "source_path". - -d = "api" - -; Specifies the title to be placed in the HTML tag. - -windowtitle = "Doctrine" - -; Specifies the title to be placed near the top of the overview summary file. - -doctitle = "Doctrine: PHP Object-Relational Mapper" - -; Specifies the header text to be placed at the top of each output file. The -; header will be placed to the right of the upper navigation bar. - -header = "Doctrine" - -; Specifies the footer text to be placed at the bottom of each output file. The -; footer will be placed to the right of the lower navigation bar. - -footer = "Doctrine" - -; Specifies the text to be placed at the bottom of each output file. The text -; will be placed at the bottom of the page, below the lower navigation bar. - -;bottom = "This document was generated by <a href="http://phpdoctor.sourceforge.net/">PHPDoctor: The PHP Documentation Creator</a>" - -; Create a class tree? - -;tree = off diff --git a/tests/Doctrine/Tests/AllTests.php b/tests/Doctrine/Tests/AllTests.php index c326c7dd6..032366d04 100644 --- a/tests/Doctrine/Tests/AllTests.php +++ b/tests/Doctrine/Tests/AllTests.php @@ -22,9 +22,6 @@ class AllTests public static function suite() { $suite = new DoctrineTestSuite('Doctrine Tests'); - - $suite->addTest(Common\AllTests::suite()); - $suite->addTest(DBAL\AllTests::suite()); $suite->addTest(ORM\AllTests::suite()); return $suite; diff --git a/tests/Doctrine/Tests/Common/AllTests.php b/tests/Doctrine/Tests/Common/AllTests.php deleted file mode 100644 index db6e81ffa..000000000 --- a/tests/Doctrine/Tests/Common/AllTests.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common; - -use Doctrine\Tests\Common\Collections; -use Doctrine\Tests\Common\Annotations; -use Doctrine\Tests\Common\Cache; - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Common_AllTests::main'); -} - -require_once __DIR__ . '/../TestInit.php'; - -class AllTests -{ - public static function main() - { - \PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - public static function suite() - { - $suite = new \Doctrine\Tests\DoctrineTestSuite('Doctrine Common Tests'); - - $suite->addTestSuite('Doctrine\Tests\Common\ClassLoaderTest'); - $suite->addTestSuite('Doctrine\Tests\Common\EventManagerTest'); - - $suite->addTest(Collections\AllTests::suite()); - $suite->addTest(Annotations\AllTests::suite()); - $suite->addTest(Cache\AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Common_AllTests::main') { - AllTests::main(); -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Annotations/AllTests.php b/tests/Doctrine/Tests/Common/Annotations/AllTests.php deleted file mode 100644 index f7dcfbb9e..000000000 --- a/tests/Doctrine/Tests/Common/Annotations/AllTests.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Annotations; - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Common_Annotations_AllTests::main'); -} - -require_once __DIR__ . '/../../TestInit.php'; - -class AllTests -{ - public static function main() - { - \PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - public static function suite() - { - $suite = new \Doctrine\Tests\DoctrineTestSuite('Doctrine Common Annotations Tests'); - - $suite->addTestSuite('Doctrine\Tests\Common\Annotations\LexerTest'); - $suite->addTestSuite('Doctrine\Tests\Common\Annotations\ParserTest'); - $suite->addTestSuite('Doctrine\Tests\Common\Annotations\AnnotationReaderTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Common_Annotations_AllTests::main') { - AllTests::main(); -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php b/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php deleted file mode 100644 index 3f3ece930..000000000 --- a/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php +++ /dev/null @@ -1,188 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Annotations; - -use Doctrine\Common\Annotations\AnnotationReader; - -require_once __DIR__ . '/../../TestInit.php'; - -class AnnotationReaderTest extends \Doctrine\Tests\DoctrineTestCase -{ - public function testAnnotations() - { - $reader = new AnnotationReader(new \Doctrine\Common\Cache\ArrayCache); - $reader->setDefaultAnnotationNamespace('Doctrine\Tests\Common\Annotations\\'); - - $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClass'); - $classAnnots = $reader->getClassAnnotations($class); - - $annotName = 'Doctrine\Tests\Common\Annotations\DummyAnnotation'; - $this->assertEquals(1, count($classAnnots)); - $this->assertTrue($classAnnots[$annotName] instanceof DummyAnnotation); - $this->assertEquals("hello", $classAnnots[$annotName]->dummyValue); - - $field1Prop = $class->getProperty('field1'); - $propAnnots = $reader->getPropertyAnnotations($field1Prop); - $this->assertEquals(1, count($propAnnots)); - $this->assertTrue($propAnnots[$annotName] instanceof DummyAnnotation); - $this->assertEquals("fieldHello", $propAnnots[$annotName]->dummyValue); - - $getField1Method = $class->getMethod('getField1'); - $methodAnnots = $reader->getMethodAnnotations($getField1Method); - $this->assertEquals(1, count($methodAnnots)); - $this->assertTrue($methodAnnots[$annotName] instanceof DummyAnnotation); - $this->assertEquals(array(1, 2, "three"), $methodAnnots[$annotName]->value); - - $field2Prop = $class->getProperty('field2'); - $propAnnots = $reader->getPropertyAnnotations($field2Prop); - $this->assertEquals(1, count($propAnnots)); - $this->assertTrue(isset($propAnnots['Doctrine\Tests\Common\Annotations\DummyJoinTable'])); - $joinTableAnnot = $propAnnots['Doctrine\Tests\Common\Annotations\DummyJoinTable']; - $this->assertEquals(1, count($joinTableAnnot->joinColumns)); - $this->assertEquals(1, count($joinTableAnnot->inverseJoinColumns)); - $this->assertTrue($joinTableAnnot->joinColumns[0] instanceof DummyJoinColumn); - $this->assertTrue($joinTableAnnot->inverseJoinColumns[0] instanceof DummyJoinColumn); - $this->assertEquals('col1', $joinTableAnnot->joinColumns[0]->name); - $this->assertEquals('col2', $joinTableAnnot->joinColumns[0]->referencedColumnName); - $this->assertEquals('col3', $joinTableAnnot->inverseJoinColumns[0]->name); - $this->assertEquals('col4', $joinTableAnnot->inverseJoinColumns[0]->referencedColumnName); - - $dummyAnnot = $reader->getMethodAnnotation($class->getMethod('getField1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); - $this->assertEquals('', $dummyAnnot->dummyValue); - $this->assertEquals(array(1, 2, 'three'), $dummyAnnot->value); - - $dummyAnnot = $reader->getPropertyAnnotation($class->getProperty('field1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); - $this->assertEquals('fieldHello', $dummyAnnot->dummyValue); - - $classAnnot = $reader->getClassAnnotation($class, 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); - $this->assertEquals('hello', $classAnnot->dummyValue); - } - - public function testClassSyntaxErrorContext() - { - $this->setExpectedException( - "Doctrine\Common\Annotations\AnnotationException", - "[Syntax Error] Expected Doctrine\Common\Annotations\Lexer::T_IDENTIFIER, got ')' at position 18 in class ". - "Doctrine\Tests\Common\Annotations\DummyClassSyntaxError." - ); - - $class = new \ReflectionClass('\Doctrine\Tests\Common\Annotations\DummyClassSyntaxError'); - - $reader = $this->createAnnotationReader(); - $reader->getClassAnnotations($class); - } - - public function testMethodSyntaxErrorContext() - { - $this->setExpectedException( - "Doctrine\Common\Annotations\AnnotationException", - "[Syntax Error] Expected Doctrine\Common\Annotations\Lexer::T_IDENTIFIER, got ')' at position 18 in ". - "method Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError::foo()." - ); - - $class = new \ReflectionClass('\Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError'); - $method = $class->getMethod('foo'); - - $reader = $this->createAnnotationReader(); - $reader->getMethodAnnotations($method); - } - - public function testPropertySyntaxErrorContext() - { - $this->setExpectedException( - "Doctrine\Common\Annotations\AnnotationException", - "[Syntax Error] Expected Doctrine\Common\Annotations\Lexer::T_IDENTIFIER, got ')' at position 18 in ". - "property Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError::\$foo." - ); - - $class = new \ReflectionClass('\Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError'); - $property = $class->getProperty('foo'); - - $reader = $this->createAnnotationReader(); - $reader->getPropertyAnnotations($property); - } - - public function createAnnotationReader() - { - $reader = new AnnotationReader(new \Doctrine\Common\Cache\ArrayCache); - $reader->setDefaultAnnotationNamespace('Doctrine\Tests\Common\Annotations\\'); - return $reader; - } -} - -/** - * A description of this class. - * - * @author robo - * @since 2.0 - * @DummyAnnotation(dummyValue="hello") - */ -class DummyClass { - /** - * A nice property. - * - * @var mixed - * @DummyAnnotation(dummyValue="fieldHello") - */ - private $field1; - - /** - * @DummyJoinTable(name="join_table", - * joinColumns={ - * @DummyJoinColumn(name="col1", referencedColumnName="col2") - * }, - * inverseJoinColumns={ - * @DummyJoinColumn(name="col3", referencedColumnName="col4") - * }) - */ - private $field2; - - /** - * Gets the value of field1. - * - * @return mixed - * @DummyAnnotation({1,2,"three"}) - */ - public function getField1() { - } -} - -class DummyAnnotation extends \Doctrine\Common\Annotations\Annotation { - public $dummyValue; -} -class DummyJoinColumn extends \Doctrine\Common\Annotations\Annotation { - public $name; - public $referencedColumnName; -} -class DummyJoinTable extends \Doctrine\Common\Annotations\Annotation { - public $name; - public $joinColumns; - public $inverseJoinColumns; -} - -/** - * @DummyAnnotation(@) - */ -class DummyClassSyntaxError -{ - -} - -class DummyClassMethodSyntaxError -{ - /** - * @DummyAnnotation(@) - */ - public function foo() - { - - } -} - -class DummyClassPropertySyntaxError -{ - /** - * @DummyAnnotation(@) - */ - public $foo; -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Annotations/LexerTest.php b/tests/Doctrine/Tests/Common/Annotations/LexerTest.php deleted file mode 100644 index 01acc8dc5..000000000 --- a/tests/Doctrine/Tests/Common/Annotations/LexerTest.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Annotations; - -use Doctrine\Common\Annotations\Lexer; - -require_once __DIR__ . '/../../TestInit.php'; - -class LexerTest extends \Doctrine\Tests\DoctrineTestCase -{ - public function testMarkerAnnotation() - { - $lexer = new Lexer; - - $lexer->setInput("@Name"); - $this->assertNull($lexer->token); - $this->assertNull($lexer->lookahead); - - $this->assertTrue($lexer->moveNext()); - $this->assertNull($lexer->token); - $this->assertEquals('@', $lexer->lookahead['value']); - - $this->assertTrue($lexer->moveNext()); - $this->assertEquals('@', $lexer->token['value']); - $this->assertEquals('Name', $lexer->lookahead['value']); - - $this->assertFalse($lexer->moveNext()); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Annotations/ParserTest.php b/tests/Doctrine/Tests/Common/Annotations/ParserTest.php deleted file mode 100644 index db043f35b..000000000 --- a/tests/Doctrine/Tests/Common/Annotations/ParserTest.php +++ /dev/null @@ -1,187 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Annotations; - -use Doctrine\Common\Annotations\Parser; - -require_once __DIR__ . '/../../TestInit.php'; - -class ParserTest extends \Doctrine\Tests\DoctrineTestCase -{ - public function testBasicAnnotations() - { - $parser = $this->createTestParser(); - - // Marker annotation - $result = $parser->parse("@Name"); - $annot = $result['Doctrine\Tests\Common\Annotations\Name']; - $this->assertTrue($annot instanceof Name); - $this->assertNull($annot->value); - $this->assertNull($annot->foo); - - // Associative arrays - $result = $parser->parse('@Name(foo={"key1" = "value1"})'); - $annot = $result['Doctrine\Tests\Common\Annotations\Name']; - $this->assertNull($annot->value); - $this->assertTrue(is_array($annot->foo)); - $this->assertTrue(isset($annot->foo['key1'])); - - // Numerical arrays - $result = $parser->parse('@Name({2="foo", 4="bar"})'); - $annot = $result['Doctrine\Tests\Common\Annotations\Name']; - $this->assertTrue(is_array($annot->value)); - $this->assertEquals('foo', $annot->value[2]); - $this->assertEquals('bar', $annot->value[4]); - $this->assertFalse(isset($annot->value[0])); - $this->assertFalse(isset($annot->value[1])); - $this->assertFalse(isset($annot->value[3])); - - // Nested arrays with nested annotations - $result = $parser->parse('@Name(foo={1,2, {"key"=@Name}})'); - $annot = $result['Doctrine\Tests\Common\Annotations\Name']; - - $this->assertTrue($annot instanceof Name); - $this->assertNull($annot->value); - $this->assertEquals(3, count($annot->foo)); - $this->assertEquals(1, $annot->foo[0]); - $this->assertEquals(2, $annot->foo[1]); - $this->assertTrue(is_array($annot->foo[2])); - - $nestedArray = $annot->foo[2]; - $this->assertTrue(isset($nestedArray['key'])); - $this->assertTrue($nestedArray['key'] instanceof Name); - - // Complete docblock - $docblock = <<<DOCBLOCK -/** - * Some nifty class. - * - * @author Mr.X - * @Name(foo="bar") - */ -DOCBLOCK; - - $result = $parser->parse($docblock); - $this->assertEquals(1, count($result)); - $annot = $result['Doctrine\Tests\Common\Annotations\Name']; - $this->assertTrue($annot instanceof Name); - $this->assertEquals("bar", $annot->foo); - $this->assertNull($annot->value); - } - - public function testNamespacedAnnotations() - { - $parser = new Parser; - - $docblock = <<<DOCBLOCK -/** - * Some nifty class. - * - * @author Mr.X - * @Doctrine\Tests\Common\Annotations\Name(foo="bar") - */ -DOCBLOCK; - - $result = $parser->parse($docblock); - $this->assertEquals(1, count($result)); - $annot = $result['Doctrine\Tests\Common\Annotations\Name']; - $this->assertTrue($annot instanceof Name); - $this->assertEquals("bar", $annot->foo); - } - - /** - * @group DDC-77 - */ - public function testAnnotationWithoutClassIsIgnoredWithoutWarning() - { - $parser = new Parser(); - $result = $parser->parse("@param"); - - $this->assertEquals(0, count($result)); - } - - public function testAnnotationDontAcceptSingleQuotes() - { - $this->setExpectedException( - 'Doctrine\Common\Annotations\AnnotationException', - "[Syntax Error] Expected PlainValue, got ''' at position 10." - ); - - $parser = $this->createTestParser(); - $parser->parse("@Name(foo='bar')"); - } - - /** - * @group parse - */ - public function testAnnotationNamespaceAlias() - { - $parser = $this->createTestParser(); - $parser->setAnnotationNamespaceAlias('Doctrine\Tests\Common\Annotations\\', 'alias'); - $docblock = <<<DOCBLOCK -/** - * Some nifty class. - * - * @author Mr.X - * @alias:Name(foo="stuff") - */ -DOCBLOCK; - - $result = $parser->parse($docblock); - $this->assertEquals(1, count($result)); - $annot = $result['Doctrine\Tests\Common\Annotations\Name']; - $this->assertTrue($annot instanceof Name); - $this->assertEquals("stuff", $annot->foo); - } - - public function createTestParser() - { - $parser = new Parser(); - $parser->setDefaultAnnotationNamespace('Doctrine\Tests\Common\Annotations\\'); - return $parser; - } - - /** - * @group DDC-78 - */ - public function testSyntaxErrorWithContextDescription() - { - $this->setExpectedException( - 'Doctrine\Common\Annotations\AnnotationException', - "[Syntax Error] Expected PlainValue, got ''' at position 10 ". - "in class \Doctrine\Tests\Common\Annotations\Name" - ); - - $parser = $this->createTestParser(); - $parser->parse("@Name(foo='bar')", "class \Doctrine\Tests\Common\Annotations\Name"); - } - - /** - * @group DDC-183 - */ - public function testSyntaxErrorWithUnknownCharacters() - { - $docblock = <<<DOCBLOCK -/** - * @test at. - */ -class A { -} -DOCBLOCK; - - //$lexer = new \Doctrine\Common\Annotations\Lexer(); - //$lexer->setInput(trim($docblock, '/ *')); - //var_dump($lexer); - - try { - $parser = $this->createTestParser(); - $result = $parser->parse($docblock); - } catch (Exception $e) { - $this->fail($e->getMessage()); - } - } -} - -class Name extends \Doctrine\Common\Annotations\Annotation { - public $foo; -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Cache/AllTests.php b/tests/Doctrine/Tests/Common/Cache/AllTests.php deleted file mode 100644 index d3e6f4d77..000000000 --- a/tests/Doctrine/Tests/Common/Cache/AllTests.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Cache; - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Common_Cache_AllTests::main'); -} - -require_once __DIR__ . '/../../TestInit.php'; - -class AllTests -{ - public static function main() - { - \PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - public static function suite() - { - $suite = new \Doctrine\Tests\DoctrineTestSuite('Doctrine Common Cache Tests'); - - $suite->addTestSuite('Doctrine\Tests\Common\Cache\CacheTest'); - $suite->addTestSuite('Doctrine\Tests\Common\Cache\ApcCacheTest'); - $suite->addTestSuite('Doctrine\Tests\Common\Cache\ArrayCacheTest'); - $suite->addTestSuite('Doctrine\Tests\Common\Cache\MemcacheCacheTest'); - $suite->addTestSuite('Doctrine\Tests\Common\Cache\XcacheCacheTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Common_Cache_AllTests::main') { - AllTests::main(); -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php b/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php deleted file mode 100644 index f52f5410f..000000000 --- a/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Cache; - -use Doctrine\Common\Cache\ApcCache; - -require_once __DIR__ . '/../../TestInit.php'; - -class ApcCacheTest extends CacheTest -{ - public function setUp() - { - if ( ! extension_loaded('apc')) { - $this->markTestSkipped('The ' . __CLASS__ .' requires the use of APC'); - } - } - - protected function _getCacheDriver() - { - return new ApcCache(); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php deleted file mode 100644 index 1bb2cb4f2..000000000 --- a/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Cache; - -use Doctrine\Common\Cache\ArrayCache; - -require_once __DIR__ . '/../../TestInit.php'; - -class ArrayCacheTest extends CacheTest -{ - protected function _getCacheDriver() - { - return new ArrayCache(); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Cache/CacheTest.php b/tests/Doctrine/Tests/Common/Cache/CacheTest.php deleted file mode 100644 index 32bf386b5..000000000 --- a/tests/Doctrine/Tests/Common/Cache/CacheTest.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Cache; - -require_once __DIR__ . '/../../TestInit.php'; - -abstract class CacheTest extends \Doctrine\Tests\DoctrineTestCase -{ - public function testBasics() - { - $cache = $this->_getCacheDriver(); - - // Test save - $cache->save('test_key', 'testing this out'); - - // Test contains to test that save() worked - $this->assertTrue($cache->contains('test_key')); - - // Test fetch - $this->assertEquals('testing this out', $cache->fetch('test_key')); - - // Test delete - $cache->save('test_key2', 'test2'); - $cache->delete('test_key2'); - $this->assertFalse($cache->contains('test_key2')); - } - - public function testDeleteAll() - { - $cache = $this->_getCacheDriver(); - $cache->save('test_key1', '1'); - $cache->save('test_key2', '2'); - $cache->deleteAll(); - - $this->assertFalse($cache->contains('test_key1')); - $this->assertFalse($cache->contains('test_key2')); - } - - public function testDeleteByRegex() - { - $cache = $this->_getCacheDriver(); - $cache->save('test_key1', '1'); - $cache->save('test_key2', '2'); - $cache->deleteByRegex('/test_key[0-9]/'); - - $this->assertFalse($cache->contains('test_key1')); - $this->assertFalse($cache->contains('test_key2')); - } - - public function testDeleteByPrefix() - { - $cache = $this->_getCacheDriver(); - $cache->save('test_key1', '1'); - $cache->save('test_key2', '2'); - $cache->deleteByPrefix('test_key'); - - $this->assertFalse($cache->contains('test_key1')); - $this->assertFalse($cache->contains('test_key2')); - } - - public function testDeleteBySuffix() - { - $cache = $this->_getCacheDriver(); - $cache->save('1test_key', '1'); - $cache->save('2test_key', '2'); - $cache->deleteBySuffix('test_key'); - - $this->assertFalse($cache->contains('1test_key')); - $this->assertFalse($cache->contains('2test_key')); - } - - public function testDeleteByWildcard() - { - $cache = $this->_getCacheDriver(); - $cache->save('test_key1', '1'); - $cache->save('test_key2', '2'); - $cache->delete('test_key*'); - - $this->assertFalse($cache->contains('test_key1')); - $this->assertFalse($cache->contains('test_key2')); - } - - public function testNamespace() - { - $cache = $this->_getCacheDriver(); - $cache->setNamespace('test_'); - $cache->save('key1', 'test'); - $this->assertTrue($cache->contains('key1')); - - $ids = $cache->getIds(); - $this->assertTrue(in_array('test_key1', $ids)); - } - - abstract protected function _getCacheDriver(); -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php deleted file mode 100644 index b176ce95a..000000000 --- a/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Cache; - -use Doctrine\Common\Cache\MemcacheCache; - -require_once __DIR__ . '/../../TestInit.php'; - -class MemcacheCacheTest extends CacheTest -{ - private $_memcache; - - public function setUp() - { - if (extension_loaded('memcache')) { - $this->_memcache = new \Memcache; - $ok = @$this->_memcache->connect('localhost', 11211); - if (!$ok) { - $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); - } - } else { - $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); - } - } - - protected function _getCacheDriver() - { - $driver = new MemcacheCache(); - $driver->setMemcache($this->_memcache); - return $driver; - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php b/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php deleted file mode 100644 index d70882335..000000000 --- a/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Cache; - -use Doctrine\Common\Cache\XcacheCache; - -require_once __DIR__ . '/../../TestInit.php'; - -class XcacheCacheTest extends CacheTest -{ - public function setUp() - { - if ( ! extension_loaded('xcache')) { - $this->markTestSkipped('The ' . __CLASS__ .' requires the use of xcache'); - } - } - - protected function _getCacheDriver() - { - return new XcacheCache(); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/ClassLoaderTest.php b/tests/Doctrine/Tests/Common/ClassLoaderTest.php deleted file mode 100644 index e18dff88d..000000000 --- a/tests/Doctrine/Tests/Common/ClassLoaderTest.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common; - -use Doctrine\Common\ClassLoader; - -require_once __DIR__ . '/../TestInit.php'; - -class ClassLoaderTest extends \Doctrine\Tests\DoctrineTestCase -{ - public function testClassLoader() - { - $classLoader = new ClassLoader('ClassLoaderTest'); - $classLoader->setIncludePath(__DIR__); - $classLoader->setFileExtension('.class.php'); - $classLoader->setNamespaceSeparator('_'); - - $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true); - $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true); - $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php b/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php deleted file mode 100644 index f1b499017..000000000 --- a/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php - -class ClassLoaderTest_ClassA -{ - -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php b/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php deleted file mode 100644 index b6b967e08..000000000 --- a/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php - -class ClassLoaderTest_ClassB -{ - -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php b/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php deleted file mode 100644 index d2e33efe4..000000000 --- a/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php - -class ClassLoaderTest_ClassC -{ - -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Collections/AllTests.php b/tests/Doctrine/Tests/Common/Collections/AllTests.php deleted file mode 100644 index 9f2eafb86..000000000 --- a/tests/Doctrine/Tests/Common/Collections/AllTests.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Collections; - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Common_Collections_AllTests::main'); -} - -require_once __DIR__ . '/../../TestInit.php'; - -class AllTests -{ - public static function main() - { - \PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - public static function suite() - { - $suite = new \Doctrine\Tests\DoctrineTestSuite('Doctrine Common Collections Tests'); - - $suite->addTestSuite('Doctrine\Tests\Common\Collections\CollectionTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Common_Collections_AllTests::main') { - AllTests::main(); -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/Collections/CollectionTest.php b/tests/Doctrine/Tests/Common/Collections/CollectionTest.php deleted file mode 100644 index 83bb842f5..000000000 --- a/tests/Doctrine/Tests/Common/Collections/CollectionTest.php +++ /dev/null @@ -1,172 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common\Collections; - -use Doctrine\Tests; - -require_once __DIR__ . '/../../TestInit.php'; - -class CollectionTest extends \Doctrine\Tests\DoctrineTestCase -{ - private $_coll; - - protected function setUp() - { - $this->_coll = new \Doctrine\Common\Collections\ArrayCollection; - } - - public function testIssetAndUnset() - { - $this->assertFalse(isset($this->_coll[0])); - $this->_coll->add('testing'); - $this->assertTrue(isset($this->_coll[0])); - unset($this->_coll[0]); - $this->assertFalse(isset($this->_coll[0])); - } - - public function testToString() - { - $this->_coll->add('testing'); - $this->assertTrue(is_string((string) $this->_coll)); - } - - public function testRemovingNonExistentEntryReturnsNull() - { - $this->assertEquals(null, $this->_coll->remove('testing_does_not_exist')); - } - - public function testExists() - { - $this->_coll->add("one"); - $this->_coll->add("two"); - $exists = $this->_coll->exists(function($k, $e) { return $e == "one"; }); - $this->assertTrue($exists); - $exists = $this->_coll->exists(function($k, $e) { return $e == "other"; }); - $this->assertFalse($exists); - } - - public function testMap() - { - $this->_coll->add(1); - $this->_coll->add(2); - $res = $this->_coll->map(function($e) { return $e * 2; }); - $this->assertEquals(array(2, 4), $res->toArray()); - } - - public function testFilter() - { - $this->_coll->add(1); - $this->_coll->add("foo"); - $this->_coll->add(3); - $res = $this->_coll->filter(function($e) { return is_numeric($e); }); - $this->assertEquals(array(0 => 1, 2 => 3), $res->toArray()); - } - - public function testFirstAndLast() - { - $this->_coll->add('one'); - $this->_coll->add('two'); - - $this->assertEquals($this->_coll->first(), 'one'); - $this->assertEquals($this->_coll->last(), 'two'); - } - - public function testArrayAccess() - { - $this->_coll[] = 'one'; - $this->_coll[] = 'two'; - - $this->assertEquals($this->_coll[0], 'one'); - $this->assertEquals($this->_coll[1], 'two'); - - unset($this->_coll[0]); - $this->assertEquals($this->_coll->count(), 1); - } - - public function testContainsKey() - { - $this->_coll[5] = 'five'; - $this->assertTrue($this->_coll->containsKey(5)); - } - - public function testContains() - { - $this->_coll[0] = 'test'; - $this->assertTrue($this->_coll->contains('test')); - } - - public function testSearch() - { - $this->_coll[0] = 'test'; - $this->assertEquals(0, $this->_coll->indexOf('test')); - } - - public function testGet() - { - $this->_coll[0] = 'test'; - $this->assertEquals('test', $this->_coll->get(0)); - } - - public function testGetKeys() - { - $this->_coll[] = 'one'; - $this->_coll[] = 'two'; - $this->assertEquals(array(0, 1), $this->_coll->getKeys()); - } - - public function testGetValues() - { - $this->_coll[] = 'one'; - $this->_coll[] = 'two'; - $this->assertEquals(array('one', 'two'), $this->_coll->getValues()); - } - - public function testCount() - { - $this->_coll[] = 'one'; - $this->_coll[] = 'two'; - $this->assertEquals($this->_coll->count(), 2); - $this->assertEquals(count($this->_coll), 2); - } - - public function testForAll() - { - $this->_coll[] = 'one'; - $this->_coll[] = 'two'; - $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_string($e); }), true); - $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_array($e); }), false); - } - - public function testPartition() - { - $this->_coll[] = true; - $this->_coll[] = false; - $partition = $this->_coll->partition(function($k, $e) { return $e == true; }); - $this->assertEquals($partition[0][0], true); - $this->assertEquals($partition[1][0], false); - } - - public function testClear() - { - $this->_coll[] = 'one'; - $this->_coll[] = 'two'; - $this->_coll->clear(); - $this->assertEquals($this->_coll->isEmpty(), true); - } - - public function testRemove() - { - $this->_coll[] = 'one'; - $this->_coll[] = 'two'; - $this->_coll->remove(0); - $this->assertEquals($this->_coll->contains('one'), false); - } - - public function testRemoveElement() - { - $this->_coll[] = 'one'; - $this->_coll[] = 'two'; - $this->_coll->removeElement('two'); - $this->assertEquals($this->_coll->contains('two'), false); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php b/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/Doctrine/Tests/Common/EventManagerTest.php b/tests/Doctrine/Tests/Common/EventManagerTest.php deleted file mode 100644 index 1106eeee5..000000000 --- a/tests/Doctrine/Tests/Common/EventManagerTest.php +++ /dev/null @@ -1,90 +0,0 @@ -<?php - -namespace Doctrine\Tests\Common; - -use Doctrine\Common\EventManager; -use Doctrine\Common\EventArgs; - -require_once __DIR__ . '/../TestInit.php'; - -class EventManagerTest extends \Doctrine\Tests\DoctrineTestCase -{ - /* Some pseudo events */ - const preFoo = 'preFoo'; - const postFoo = 'postFoo'; - const preBar = 'preBar'; - const postBar = 'postBar'; - - private $_preFooInvoked = false; - private $_postFooInvoked = false; - - private $_eventManager; - - protected function setUp() - { - $this->_eventManager = new EventManager; - $this->_preFooInvoked = false; - $this->_postFooInvoked = false; - } - - public function testInitialState() - { - $this->assertEquals(array(), $this->_eventManager->getListeners()); - $this->assertFalse($this->_eventManager->hasListeners(self::preFoo)); - $this->assertFalse($this->_eventManager->hasListeners(self::postFoo)); - } - - public function testAddEventListener() - { - $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); - $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); - $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); - $this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo))); - $this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo))); - $this->assertEquals(2, count($this->_eventManager->getListeners())); - } - - public function testDispatchEvent() - { - $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); - $this->_eventManager->dispatchEvent(self::preFoo); - $this->assertTrue($this->_preFooInvoked); - $this->assertFalse($this->_postFooInvoked); - } - - public function testRemoveEventListener() - { - $this->_eventManager->addEventListener(array('preBar'), $this); - $this->assertTrue($this->_eventManager->hasListeners(self::preBar)); - $this->_eventManager->removeEventListener(array('preBar'), $this); - $this->assertFalse($this->_eventManager->hasListeners(self::preBar)); - } - - public function testAddEventSubscriber() - { - $eventSubscriber = new TestEventSubscriber(); - $this->_eventManager->addEventSubscriber($eventSubscriber); - $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); - $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); - } - - /* Listener methods */ - - public function preFoo(EventArgs $e) - { - $this->_preFooInvoked = true; - } - - public function postFoo(EventArgs $e) - { - $this->_postFooInvoked = true; - } -} - -class TestEventSubscriber implements \Doctrine\Common\EventSubscriber -{ - public function getSubscribedEvents() - { - return array('preFoo', 'postFoo'); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/AllTests.php b/tests/Doctrine/Tests/DBAL/AllTests.php deleted file mode 100644 index 3ced01e85..000000000 --- a/tests/Doctrine/Tests/DBAL/AllTests.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL; - -use Doctrine\Tests\DBAL\Component; -use Doctrine\Tests\DBAL\Ticker; -use Doctrine\Tests\DBAL\Functional; - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Dbal_Platforms_AllTests::main'); -} - -require_once __DIR__ . '/../TestInit.php'; - -class AllTests -{ - public static function main() - { - \PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - public static function suite() - { - $suite = new \Doctrine\Tests\DbalTestSuite('Doctrine DBAL'); - - // Platform tests - $suite->addTestSuite('Doctrine\Tests\DBAL\Platforms\SqlitePlatformTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Platforms\MySqlPlatformTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Platforms\PostgreSqlPlatformTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Platforms\MsSqlPlatformTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Platforms\OraclePlatformTest'); - - // Type tests - $suite->addTestSuite('Doctrine\Tests\DBAL\Types\ArrayTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Types\ObjectTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Types\DateTimeTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Types\DateTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Types\TimeTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Types\BooleanTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Types\DecimalTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Types\IntegerTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Types\SmallIntTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Types\StringTest'); - - // Schema tests - $suite->addTestSuite('Doctrine\Tests\DBAL\Schema\ColumnTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Schema\IndexTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Schema\TableTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Schema\SchemaTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Schema\Visitor\SchemaSqlCollectorTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Schema\ComparatorTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Schema\SchemaDiffTest'); - - // Driver manager test - $suite->addTestSuite('Doctrine\Tests\DBAL\DriverManagerTest'); - - // Connection test - $suite->addTestSuite('Doctrine\Tests\DBAL\ConnectionTest'); - - // Events and Listeners - $suite->addTestSuite('Doctrine\Tests\DBAL\Events\OracleSessionInitTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Events\MysqlSessionInitTest'); - - // All Functional DBAL tests - $suite->addTest(Functional\AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Dbal_Platforms_AllTests::main') { - AllTests::main(); -} diff --git a/tests/Doctrine/Tests/DBAL/ConnectionTest.php b/tests/Doctrine/Tests/DBAL/ConnectionTest.php deleted file mode 100644 index 88eb23286..000000000 --- a/tests/Doctrine/Tests/DBAL/ConnectionTest.php +++ /dev/null @@ -1,118 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL; - -require_once __DIR__ . '/../TestInit.php'; - -use Doctrine\DBAL\Connection; -use Doctrine\Common\EventManager; -use Doctrine\DBAL\Configuration; -use Doctrine\DBAL\Events; - -class ConnectionTest extends \Doctrine\Tests\DbalTestCase -{ - /** - * @var Doctrine\DBAL\Connection - */ - protected $_conn = null; - - public function setUp() - { - $params = array( - 'driver' => 'pdo_mysql', - 'host' => 'localhost', - 'user' => 'root', - 'password' => 'password', - 'port' => '1234' - ); - $this->_conn = \Doctrine\DBAL\DriverManager::getConnection($params); - } - - public function testIsConnected() - { - $this->assertFalse($this->_conn->isConnected()); - } - - public function testNoTransactionActiveByDefault() - { - $this->assertFalse($this->_conn->isTransactionActive()); - } - - public function testCommitWithNoActiveTransaction_ThrowsException() - { - $this->setExpectedException('Doctrine\DBAL\ConnectionException'); - $this->_conn->commit(); - } - - public function testRollbackWithNoActiveTransaction_ThrowsException() - { - $this->setExpectedException('Doctrine\DBAL\ConnectionException'); - $this->_conn->rollback(); - } - - public function testSetRollbackOnlyNoActiveTransaction_ThrowsException() - { - $this->setExpectedException('Doctrine\DBAL\ConnectionException'); - $this->_conn->setRollbackOnly(); - } - - public function testIsRollbackOnlyNoActiveTransaction_ThrowsException() - { - $this->setExpectedException('Doctrine\DBAL\ConnectionException'); - $this->_conn->isRollbackOnly(); - } - - public function testGetConfiguration() - { - $config = $this->_conn->getConfiguration(); - - $this->assertType('Doctrine\DBAL\Configuration', $config); - } - - public function testGetHost() - { - $this->assertEquals('localhost', $this->_conn->getHost()); - } - - public function testGetPort() - { - $this->assertEquals('1234', $this->_conn->getPort()); - } - - public function testGetUsername() - { - $this->assertEquals('root', $this->_conn->getUsername()); - } - - public function testGetPassword() - { - $this->assertEquals('password', $this->_conn->getPassword()); - } - - public function testGetDriver() - { - $this->assertType('Doctrine\DBAL\Driver\PDOMySql\Driver', $this->_conn->getDriver()); - } - - public function testGetEventManager() - { - $this->assertType('Doctrine\Common\EventManager', $this->_conn->getEventManager()); - } - - public function testConnectDispatchEvent() - { - $listenerMock = $this->getMock('ConnectDispatchEventListener', array('postConnect')); - $listenerMock->expects($this->once())->method('postConnect'); - - $eventManager = new EventManager(); - $eventManager->addEventListener(array(Events::postConnect), $listenerMock); - - $driverMock = $this->getMock('Doctrine\DBAL\Driver'); - $driverMock->expects(($this->at(0))) - ->method('connect'); - $platform = new Mocks\MockPlatform(); - - $conn = new Connection(array('platform' => $platform), $driverMock, new Configuration(), $eventManager); - $conn->connect(); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/DriverManagerTest.php b/tests/Doctrine/Tests/DBAL/DriverManagerTest.php deleted file mode 100644 index a95c9ad67..000000000 --- a/tests/Doctrine/Tests/DBAL/DriverManagerTest.php +++ /dev/null @@ -1,102 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL; - -require_once __DIR__ . '/../TestInit.php'; - -class DriverManagerTest extends \Doctrine\Tests\DbalTestCase -{ - /** - * @expectedException \Doctrine\DBAL\DBALException - */ - public function testInvalidPdoInstance() - { - $options = array( - 'pdo' => 'test' - ); - $test = \Doctrine\DBAL\DriverManager::getConnection($options); - } - - public function testValidPdoInstance() - { - $options = array( - 'pdo' => new \PDO('sqlite::memory:') - ); - $conn = \Doctrine\DBAL\DriverManager::getConnection($options); - $this->assertEquals('sqlite', $conn->getDatabasePlatform()->getName()); - } - - /** - * @expectedException \Doctrine\DBAL\DBALException - */ - public function testCheckParams() - { - $conn = \Doctrine\DBAL\DriverManager::getConnection(array()); - } - - /** - * @expectedException \Doctrine\DBAL\DBALException - */ - public function testInvalidDriver() - { - $conn = \Doctrine\DBAL\DriverManager::getConnection(array('driver' => 'invalid_driver')); - } - - public function testCustomPlatform() - { - $mockPlatform = new \Doctrine\Tests\DBAL\Mocks\MockPlatform(); - $options = array( - 'pdo' => new \PDO('sqlite::memory:'), - 'platform' => $mockPlatform - ); - - $conn = \Doctrine\DBAL\DriverManager::getConnection($options); - $this->assertSame($mockPlatform, $conn->getDatabasePlatform()); - } - - public function testCustomWrapper() - { - $wrapperClass = 'Doctrine\Tests\Mocks\ConnectionMock'; - - $options = array( - 'pdo' => new \PDO('sqlite::memory:'), - 'wrapperClass' => $wrapperClass, - ); - - $conn = \Doctrine\DBAL\DriverManager::getConnection($options); - $this->assertType($wrapperClass, $conn); - } - - public function testInvalidWrapperClass() - { - $this->setExpectedException('\Doctrine\DBAL\DBALException'); - - $options = array( - 'pdo' => new \PDO('sqlite::memory:'), - 'wrapperClass' => 'stdClass', - ); - - $conn = \Doctrine\DBAL\DriverManager::getConnection($options); - } - - public function testInvalidDriverClass() - { - $this->setExpectedException('\Doctrine\DBAL\DBALException'); - - $options = array( - 'driverClass' => 'stdClass' - ); - - $conn = \Doctrine\DBAL\DriverManager::getConnection($options); - } - - public function testValidDriverClass() - { - $options = array( - 'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver', - ); - - $conn = \Doctrine\DBAL\DriverManager::getConnection($options); - $this->assertType('Doctrine\DBAL\Driver\PDOMySql\Driver', $conn->getDriver()); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Events/MysqlSessionInitTest.php b/tests/Doctrine/Tests/DBAL/Events/MysqlSessionInitTest.php deleted file mode 100644 index 1ef47dd53..000000000 --- a/tests/Doctrine/Tests/DBAL/Events/MysqlSessionInitTest.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Events; - -use Doctrine\Tests\DbalTestCase; -use Doctrine\DBAL\Event\Listeners\MysqlSessionInit; -use Doctrine\DBAL\Event\ConnectionEventArgs; -use Doctrine\DBAL\Events; - -require_once __DIR__ . '/../../TestInit.php'; - -class MysqlSessionInitTest extends DbalTestCase -{ - public function testPostConnect() - { - $connectionMock = $this->getMock('Doctrine\DBAL\Connection', array(), array(), '', false); - $connectionMock->expects($this->once()) - ->method('executeUpdate') - ->with($this->equalTo("SET NAMES foo COLLATE bar")); - - $eventArgs = new ConnectionEventArgs($connectionMock); - - - $listener = new MysqlSessionInit('foo', 'bar'); - $listener->postConnect($eventArgs); - } - - public function testGetSubscribedEvents() - { - $listener = new MysqlSessionInit(); - $this->assertEquals(array(Events::postConnect), $listener->getSubscribedEvents()); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Events/OracleSessionInitTest.php b/tests/Doctrine/Tests/DBAL/Events/OracleSessionInitTest.php deleted file mode 100644 index 847ed6b15..000000000 --- a/tests/Doctrine/Tests/DBAL/Events/OracleSessionInitTest.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Events; - -use Doctrine\Tests\DbalTestCase; -use Doctrine\DBAL\Event\Listeners\OracleSessionInit; -use Doctrine\DBAL\Event\ConnectionEventArgs; -use Doctrine\DBAL\Events; - -require_once __DIR__ . '/../../TestInit.php'; - -class OracleSessionInitTest extends DbalTestCase -{ - public function testPostConnect() - { - $connectionMock = $this->getMock('Doctrine\DBAL\Connection', array(), array(), '', false); - $connectionMock->expects($this->once()) - ->method('executeUpdate') - ->with($this->isType('string')); - - $eventArgs = new ConnectionEventArgs($connectionMock); - - - $listener = new OracleSessionInit(); - $listener->postConnect($eventArgs); - } - - public function testGetSubscribedEvents() - { - $listener = new OracleSessionInit(); - $this->assertEquals(array(Events::postConnect), $listener->getSubscribedEvents()); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Functional/AllTests.php b/tests/Doctrine/Tests/DBAL/Functional/AllTests.php deleted file mode 100644 index 573177070..000000000 --- a/tests/Doctrine/Tests/DBAL/Functional/AllTests.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Functional; - -use Doctrine\Tests\DBAL\Functional; - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Dbal_Functional_AllTests::main'); -} - -require_once __DIR__ . '/../../TestInit.php'; - -class AllTests -{ - public static function main() - { - \PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - public static function suite() - { - $suite = new \Doctrine\Tests\DbalFunctionalTestSuite('Doctrine Dbal Functional'); - - $suite->addTestSuite('Doctrine\Tests\DBAL\Functional\Schema\SqliteSchemaManagerTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Functional\Schema\MySqlSchemaManagerTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Functional\Schema\PostgreSqlSchemaManagerTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Functional\Schema\OracleSchemaManagerTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Functional\Schema\Db2SchemaManagerTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Functional\ConnectionTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Functional\DataAccessTest'); - $suite->addTestSuite('Doctrine\Tests\DBAL\Functional\WriteTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Dbal_Functional_AllTests::main') { - AllTests::main(); -} diff --git a/tests/Doctrine/Tests/DBAL/Functional/ConnectionTest.php b/tests/Doctrine/Tests/DBAL/Functional/ConnectionTest.php deleted file mode 100644 index 5cb6d4167..000000000 --- a/tests/Doctrine/Tests/DBAL/Functional/ConnectionTest.php +++ /dev/null @@ -1,105 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Functional; - -use Doctrine\DBAL\ConnectionException; - -require_once __DIR__ . '/../../TestInit.php'; - -class ConnectionTest extends \Doctrine\Tests\DbalFunctionalTestCase -{ - public function setUp() - { - $this->resetSharedConn(); - parent::setUp(); - } - - public function testGetWrappedConnection() - { - $this->assertType('Doctrine\DBAL\Driver\Connection', $this->_conn->getWrappedConnection()); - } - - public function testCommitWithRollbackOnlyThrowsException() - { - $this->_conn->beginTransaction(); - $this->_conn->setRollbackOnly(); - $this->setExpectedException('Doctrine\DBAL\ConnectionException'); - $this->_conn->commit(); - } - - public function testTransactionNestingBehavior() - { - try { - $this->_conn->beginTransaction(); - $this->assertEquals(1, $this->_conn->getTransactionNestingLevel()); - - try { - $this->_conn->beginTransaction(); - $this->assertEquals(2, $this->_conn->getTransactionNestingLevel()); - throw new \Exception; - $this->_conn->commit(); // never reached - } catch (\Exception $e) { - $this->_conn->rollback(); - $this->assertEquals(1, $this->_conn->getTransactionNestingLevel()); - //no rethrow - } - $this->assertTrue($this->_conn->isRollbackOnly()); - - $this->_conn->commit(); // should throw exception - $this->fail('Transaction commit after failed nested transaction should fail.'); - } catch (ConnectionException $e) { - $this->assertEquals(1, $this->_conn->getTransactionNestingLevel()); - $this->_conn->rollback(); - $this->assertEquals(0, $this->_conn->getTransactionNestingLevel()); - } - } - - public function testTransactionBehaviorWithRollback() - { - try { - $this->_conn->beginTransaction(); - $this->assertEquals(1, $this->_conn->getTransactionNestingLevel()); - - throw new \Exception; - - $this->_connx->commit(); // never reached - } catch (\Exception $e) { - $this->assertEquals(1, $this->_conn->getTransactionNestingLevel()); - $this->_conn->rollback(); - $this->assertEquals(0, $this->_conn->getTransactionNestingLevel()); - } - } - - public function testTransactionBehaviour() - { - try { - $this->_conn->beginTransaction(); - $this->assertEquals(1, $this->_conn->getTransactionNestingLevel()); - $this->_conn->commit(); - } catch (\Exception $e) { - $this->_conn->rollback(); - $this->assertEquals(0, $this->_conn->getTransactionNestingLevel()); - } - - $this->assertEquals(0, $this->_conn->getTransactionNestingLevel()); - } - - public function testTransactionalWithException() - { - try { - $this->_conn->transactional(function($conn) { - $conn->executeQuery("select 1"); - throw new \RuntimeException("Ooops!"); - }); - } catch (\RuntimeException $expected) { - $this->assertEquals(0, $this->_conn->getTransactionNestingLevel()); - } - } - - public function testTransactional() - { - $this->_conn->transactional(function($conn) { - $conn->executeQuery("select 1"); - }); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Functional/DataAccessTest.php b/tests/Doctrine/Tests/DBAL/Functional/DataAccessTest.php deleted file mode 100644 index 0e9693a14..000000000 --- a/tests/Doctrine/Tests/DBAL/Functional/DataAccessTest.php +++ /dev/null @@ -1,170 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Functional; - -require_once __DIR__ . '/../../TestInit.php'; - -class DataAccessTest extends \Doctrine\Tests\DbalFunctionalTestCase -{ - public function setUp() - { - parent::setUp(); - - try { - /* @var $sm \Doctrine\DBAL\Schema\AbstractSchemaManager */ - $table = new \Doctrine\DBAL\Schema\Table("fetch_table"); - $table->addColumn('test_int', 'integer'); - $table->addColumn('test_string', 'string'); - - $sm = $this->_conn->getSchemaManager(); - $sm->createTable($table); - - $this->_conn->insert('fetch_table', array('test_int' => 1, 'test_string' => 'foo')); - } catch(\Exception $e) { - - } - } - - public function testPrepareWithBindValue() - { - $sql = "SELECT test_int, test_string FROM fetch_table WHERE test_int = ? AND test_string = ?"; - $stmt = $this->_conn->prepare($sql); - $this->assertType('Doctrine\DBAL\Statement', $stmt); - - $stmt->bindValue(1, 1); - $stmt->bindValue(2, 'foo'); - $stmt->execute(); - - $row = $stmt->fetch(\PDO::FETCH_ASSOC); - $row = array_change_key_case($row, \CASE_LOWER); - $this->assertEquals(array('test_int' => 1, 'test_string' => 'foo'), $row); - } - - public function testPrepareWithBindParam() - { - $paramInt = 1; - $paramStr = 'foo'; - - $sql = "SELECT test_int, test_string FROM fetch_table WHERE test_int = ? AND test_string = ?"; - $stmt = $this->_conn->prepare($sql); - $this->assertType('Doctrine\DBAL\Statement', $stmt); - - $stmt->bindParam(1, $paramInt); - $stmt->bindParam(2, $paramStr); - $stmt->execute(); - - $row = $stmt->fetch(\PDO::FETCH_ASSOC); - $row = array_change_key_case($row, \CASE_LOWER); - $this->assertEquals(array('test_int' => 1, 'test_string' => 'foo'), $row); - } - - public function testPrepareWithFetchAll() - { - $paramInt = 1; - $paramStr = 'foo'; - - $sql = "SELECT test_int, test_string FROM fetch_table WHERE test_int = ? AND test_string = ?"; - $stmt = $this->_conn->prepare($sql); - $this->assertType('Doctrine\DBAL\Statement', $stmt); - - $stmt->bindParam(1, $paramInt); - $stmt->bindParam(2, $paramStr); - $stmt->execute(); - - $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC); - $rows[0] = array_change_key_case($rows[0], \CASE_LOWER); - $this->assertEquals(array('test_int' => 1, 'test_string' => 'foo'), $rows[0]); - } - - public function testPrepareWithFetchColumn() - { - $paramInt = 1; - $paramStr = 'foo'; - - $sql = "SELECT test_int FROM fetch_table WHERE test_int = ? AND test_string = ?"; - $stmt = $this->_conn->prepare($sql); - $this->assertType('Doctrine\DBAL\Statement', $stmt); - - $stmt->bindParam(1, $paramInt); - $stmt->bindParam(2, $paramStr); - $stmt->execute(); - - $column = $stmt->fetchColumn(); - $this->assertEquals(1, $column); - } - - public function testPrepareWithQuoted() - { - $table = 'fetch_table'; - $paramInt = 1; - $paramStr = 'foo'; - - $sql = "SELECT test_int, test_string FROM " . $this->_conn->quoteIdentifier($table) . " ". - "WHERE test_int = " . $this->_conn->quote($paramInt) . " AND test_string = " . $this->_conn->quote($paramStr); - $stmt = $this->_conn->prepare($sql); - $this->assertType('Doctrine\DBAL\Statement', $stmt); - } - - public function testPrepareWithExecuteParams() - { - $paramInt = 1; - $paramStr = 'foo'; - - $sql = "SELECT test_int, test_string FROM fetch_table WHERE test_int = ? AND test_string = ?"; - $stmt = $this->_conn->prepare($sql); - $this->assertType('Doctrine\DBAL\Statement', $stmt); - $stmt->execute(array($paramInt, $paramStr)); - - $row = $stmt->fetch(\PDO::FETCH_ASSOC); - $row = array_change_key_case($row, \CASE_LOWER); - $this->assertEquals(array('test_int' => 1, 'test_string' => 'foo'), $row); - } - - public function testFetchAll() - { - $sql = "SELECT test_int, test_string FROM fetch_table WHERE test_int = ? AND test_string = ?"; - $data = $this->_conn->fetchAll($sql, array(1, 'foo')); - - $this->assertEquals(1, count($data)); - - $row = $data[0]; - $this->assertEquals(2, count($row)); - - $row = array_change_key_case($row, \CASE_LOWER); - $this->assertEquals(1, $row['test_int']); - $this->assertEquals('foo', $row['test_string']); - } - - public function testFetchRow() - { - $sql = "SELECT test_int, test_string FROM fetch_table WHERE test_int = ? AND test_string = ?"; - $row = $this->_conn->fetchAssoc($sql, array(1, 'foo')); - - $row = array_change_key_case($row, \CASE_LOWER); - - $this->assertEquals(1, $row['test_int']); - $this->assertEquals('foo', $row['test_string']); - } - - public function testFetchArray() - { - $sql = "SELECT test_int, test_string FROM fetch_table WHERE test_int = ? AND test_string = ?"; - $row = $this->_conn->fetchArray($sql, array(1, 'foo')); - - $this->assertEquals(1, $row[0]); - $this->assertEquals('foo', $row[1]); - } - - public function testFetchColumn() - { - $sql = "SELECT test_int, test_string FROM fetch_table WHERE test_int = ? AND test_string = ?"; - $testInt = $this->_conn->fetchColumn($sql, array(1, 'foo'), 0); - - $this->assertEquals(1, $testInt); - - $sql = "SELECT test_int, test_string FROM fetch_table WHERE test_int = ? AND test_string = ?"; - $testString = $this->_conn->fetchColumn($sql, array(1, 'foo'), 1); - - $this->assertEquals('foo', $testString); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Functional/Schema/Db2SchemaManagerTest.php b/tests/Doctrine/Tests/DBAL/Functional/Schema/Db2SchemaManagerTest.php deleted file mode 100644 index a567900c9..000000000 --- a/tests/Doctrine/Tests/DBAL/Functional/Schema/Db2SchemaManagerTest.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Functional\Schema; - -use Doctrine\DBAL\Schema; - -require_once __DIR__ . '/../../../TestInit.php'; - -class Db2SchemaManagerTest extends SchemaManagerFunctionalTestCase -{ - -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Functional/Schema/MySqlSchemaManagerTest.php b/tests/Doctrine/Tests/DBAL/Functional/Schema/MySqlSchemaManagerTest.php deleted file mode 100644 index 94241d476..000000000 --- a/tests/Doctrine/Tests/DBAL/Functional/Schema/MySqlSchemaManagerTest.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Functional\Schema; - -use Doctrine\DBAL\Schema; - -require_once __DIR__ . '/../../../TestInit.php'; - -class MySqlSchemaManagerTest extends SchemaManagerFunctionalTestCase -{ - -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Functional/Schema/OracleSchemaManagerTest.php b/tests/Doctrine/Tests/DBAL/Functional/Schema/OracleSchemaManagerTest.php deleted file mode 100644 index afbd8a880..000000000 --- a/tests/Doctrine/Tests/DBAL/Functional/Schema/OracleSchemaManagerTest.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Functional\Schema; - -use Doctrine\DBAL\Schema; - -require_once __DIR__ . '/../../../TestInit.php'; - -class OracleSchemaManagerTest extends SchemaManagerFunctionalTestCase -{ - public function setUp() - { - parent::setUp(); - - if(!isset($GLOBALS['db_username'])) { - $this->markTestSkipped('Foo'); - } - - $username = $GLOBALS['db_username']; - - $query = "GRANT ALL PRIVILEGES TO ".$username; - - $conn = \Doctrine\Tests\TestUtil::getTempConnection(); - $conn->executeUpdate($query); - } - - public function testRenameTable() - { - $this->_sm->tryMethod('DropTable', 'list_tables_test'); - $this->_sm->tryMethod('DropTable', 'list_tables_test_new_name'); - - $this->createTestTable('list_tables_test'); - $this->_sm->renameTable('list_tables_test', 'list_tables_test_new_name'); - - $tables = $this->_sm->listTables(); - - $this->assertHasTable($tables, 'list_tables_test_new_name'); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Functional/Schema/PostgreSqlSchemaManagerTest.php b/tests/Doctrine/Tests/DBAL/Functional/Schema/PostgreSqlSchemaManagerTest.php deleted file mode 100644 index 967b0ccdc..000000000 --- a/tests/Doctrine/Tests/DBAL/Functional/Schema/PostgreSqlSchemaManagerTest.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Functional\Schema; - -use Doctrine\DBAL\Schema; - -require_once __DIR__ . '/../../../TestInit.php'; - -class PostgreSqlSchemaManagerTest extends SchemaManagerFunctionalTestCase -{ - -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Functional/Schema/SchemaManagerFunctionalTestCase.php b/tests/Doctrine/Tests/DBAL/Functional/Schema/SchemaManagerFunctionalTestCase.php deleted file mode 100644 index 9b8d21bc9..000000000 --- a/tests/Doctrine/Tests/DBAL/Functional/Schema/SchemaManagerFunctionalTestCase.php +++ /dev/null @@ -1,397 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Functional\Schema; - -use Doctrine\DBAL\Types\Type, - Doctrine\DBAL\Schema\AbstractSchemaManager; - -require_once __DIR__ . '/../../../TestInit.php'; - -class SchemaManagerFunctionalTestCase extends \Doctrine\Tests\DbalFunctionalTestCase -{ - /** - * @var \Doctrine\DBAL\Schema\AbstractSchemaManager - */ - protected $_sm; - - protected function setUp() - { - parent::setUp(); - - $class = get_class($this); - $e = explode('\\', $class); - $testClass = end($e); - $dbms = strtolower(str_replace('SchemaManagerTest', null, $testClass)); - - if ($this->_conn->getDatabasePlatform()->getName() !== $dbms) - { - $this->markTestSkipped('The ' . $testClass .' requires the use of ' . $dbms); - } - - #$this->_conn->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger); - - $this->_sm = $this->_conn->getSchemaManager(); - } - - public function testListSequences() - { - if(!$this->_conn->getDatabasePlatform()->supportsSequences()) { - $this->markTestSkipped($this->_conn->getDriver()->getName().' does not support sequences.'); - } - - $sequence = new \Doctrine\DBAL\Schema\Sequence('list_sequences_test_seq', 20, 10); - $this->_sm->createSequence($sequence); - - $sequences = $this->_sm->listSequences(); - - $this->assertType('array', $sequences, 'listSequences() should return an array.'); - - $foundSequence = null; - foreach($sequences AS $sequence) { - $this->assertType('Doctrine\DBAL\Schema\Sequence', $sequence, 'Array elements of listSequences() should be Sequence instances.'); - if(strtolower($sequence->getName()) == 'list_sequences_test_seq') { - $foundSequence = $sequence; - } - } - - $this->assertNotNull($foundSequence, "Sequence with name 'list_sequences_test_seq' was not found."); - $this->assertEquals(20, $foundSequence->getAllocationSize(), "Allocation Size is expected to be 20."); - $this->assertEquals(10, $foundSequence->getInitialValue(), "Initial Value is expected to be 10."); - } - - public function testListDatabases() - { - if (!$this->_sm->getDatabasePlatform()->supportsCreateDropDatabase()) { - $this->markTestSkipped('Cannot drop Database client side with this Driver.'); - } - - $this->_sm->dropAndCreateDatabase('test_create_database'); - $databases = $this->_sm->listDatabases(); - - $databases = \array_map('strtolower', $databases); - - $this->assertEquals(true, \in_array('test_create_database', $databases)); - } - - public function testListTables() - { - $this->createTestTable('list_tables_test'); - $tables = $this->_sm->listTables(); - - $this->assertType('array', $tables); - $this->assertTrue(count($tables) > 0, "List Tables has to find at least one table named 'list_tables_test'."); - - $foundTable = false; - foreach ($tables AS $table) { - $this->assertType('Doctrine\DBAL\Schema\Table', $table); - if (strtolower($table->getName()) == 'list_tables_test') { - $foundTable = true; - - $this->assertTrue($table->hasColumn('id')); - $this->assertTrue($table->hasColumn('test')); - $this->assertTrue($table->hasColumn('foreign_key_test')); - } - } - - $this->assertTrue( $foundTable , "The 'list_tables_test' table has to be found."); - } - - public function testListTableColumns() - { - $table = new \Doctrine\DBAL\Schema\Table('list_table_columns'); - $table->addColumn('id', 'integer', array('notnull' => true)); - $table->addColumn('test', 'string', array('length' => 255, 'notnull' => false)); - $table->addColumn('foo', 'text', array('notnull' => true)); - $table->addColumn('bar', 'decimal', array('precision' => 10, 'scale' => 4, 'notnull' => false)); - $table->addColumn('baz1', 'datetime'); - $table->addColumn('baz2', 'time'); - $table->addColumn('baz3', 'date'); - - $this->_sm->dropAndCreateTable($table); - - $columns = $this->_sm->listTableColumns('list_table_columns'); - - $this->assertArrayHasKey('id', $columns); - $this->assertEquals('id', strtolower($columns['id']->getname())); - $this->assertType('Doctrine\DBAL\Types\IntegerType', $columns['id']->gettype()); - $this->assertEquals(false, $columns['id']->getunsigned()); - $this->assertEquals(true, $columns['id']->getnotnull()); - $this->assertEquals(null, $columns['id']->getdefault()); - $this->assertType('array', $columns['id']->getPlatformOptions()); - - $this->assertArrayHasKey('test', $columns); - $this->assertEquals('test', strtolower($columns['test']->getname())); - $this->assertType('Doctrine\DBAL\Types\StringType', $columns['test']->gettype()); - $this->assertEquals(255, $columns['test']->getlength()); - $this->assertEquals(false, $columns['test']->getfixed()); - $this->assertEquals(false, $columns['test']->getnotnull()); - $this->assertEquals(null, $columns['test']->getdefault()); - $this->assertType('array', $columns['test']->getPlatformOptions()); - - $this->assertEquals('foo', strtolower($columns['foo']->getname())); - $this->assertType('Doctrine\DBAL\Types\TextType', $columns['foo']->gettype()); - $this->assertEquals(false, $columns['foo']->getunsigned()); - $this->assertEquals(false, $columns['foo']->getfixed()); - $this->assertEquals(true, $columns['foo']->getnotnull()); - $this->assertEquals(null, $columns['foo']->getdefault()); - $this->assertType('array', $columns['foo']->getPlatformOptions()); - - $this->assertEquals('bar', strtolower($columns['bar']->getname())); - $this->assertType('Doctrine\DBAL\Types\DecimalType', $columns['bar']->gettype()); - $this->assertEquals(null, $columns['bar']->getlength()); - $this->assertEquals(10, $columns['bar']->getprecision()); - $this->assertEquals(4, $columns['bar']->getscale()); - $this->assertEquals(false, $columns['bar']->getunsigned()); - $this->assertEquals(false, $columns['bar']->getfixed()); - $this->assertEquals(false, $columns['bar']->getnotnull()); - $this->assertEquals(null, $columns['bar']->getdefault()); - $this->assertType('array', $columns['bar']->getPlatformOptions()); - - $this->assertEquals('baz1', strtolower($columns['baz1']->getname())); - $this->assertType('Doctrine\DBAL\Types\DateTimeType', $columns['baz1']->gettype()); - $this->assertEquals(true, $columns['baz1']->getnotnull()); - $this->assertEquals(null, $columns['baz1']->getdefault()); - $this->assertType('array', $columns['baz1']->getPlatformOptions()); - - $this->assertEquals('baz2', strtolower($columns['baz2']->getname())); - $this->assertContains($columns['baz2']->gettype()->getName(), array('time', 'date', 'datetime')); - $this->assertEquals(true, $columns['baz2']->getnotnull()); - $this->assertEquals(null, $columns['baz2']->getdefault()); - $this->assertType('array', $columns['baz2']->getPlatformOptions()); - - $this->assertEquals('baz3', strtolower($columns['baz3']->getname())); - $this->assertContains($columns['baz2']->gettype()->getName(), array('time', 'date', 'datetime')); - $this->assertEquals(true, $columns['baz3']->getnotnull()); - $this->assertEquals(null, $columns['baz3']->getdefault()); - $this->assertType('array', $columns['baz3']->getPlatformOptions()); - } - - public function testListTableIndexes() - { - $table = $this->getTestTable('list_table_indexes_test'); - $table->addUniqueIndex(array('test'), 'test_index_name'); - $table->addIndex(array('id', 'test'), 'test_composite_idx'); - - $this->_sm->createTable($table); - - $tableIndexes = $this->_sm->listTableIndexes('list_table_indexes_test'); - - $this->assertEquals(3, count($tableIndexes)); - - $this->assertArrayHasKey('primary', $tableIndexes, 'listTableIndexes() has to return a "primary" array key.'); - $this->assertEquals(array('id'), array_map('strtolower', $tableIndexes['primary']->getColumns())); - $this->assertTrue($tableIndexes['primary']->isUnique()); - $this->assertTrue($tableIndexes['primary']->isPrimary()); - - $this->assertEquals('test_index_name', $tableIndexes['test_index_name']->getName()); - $this->assertEquals(array('test'), array_map('strtolower', $tableIndexes['test_index_name']->getColumns())); - $this->assertTrue($tableIndexes['test_index_name']->isUnique()); - $this->assertFalse($tableIndexes['test_index_name']->isPrimary()); - - $this->assertEquals('test_composite_idx', $tableIndexes['test_composite_idx']->getName()); - $this->assertEquals(array('id', 'test'), array_map('strtolower', $tableIndexes['test_composite_idx']->getColumns())); - $this->assertFalse($tableIndexes['test_composite_idx']->isUnique()); - $this->assertFalse($tableIndexes['test_composite_idx']->isPrimary()); - } - - public function testDropAndCreateIndex() - { - $table = $this->getTestTable('test_create_index'); - $table->addUniqueIndex(array('test'), 'test'); - $this->_sm->dropAndCreateTable($table); - - $this->_sm->dropAndCreateIndex($table->getIndex('test'), $table); - $tableIndexes = $this->_sm->listTableIndexes('test_create_index'); - $this->assertType('array', $tableIndexes); - - $this->assertEquals('test', strtolower($tableIndexes['test']->getName())); - $this->assertEquals(array('test'), array_map('strtolower', $tableIndexes['test']->getColumns())); - $this->assertTrue($tableIndexes['test']->isUnique()); - $this->assertFalse($tableIndexes['test']->isPrimary()); - } - - public function testCreateTableWithForeignKeys() - { - if(!$this->_sm->getDatabasePlatform()->supportsForeignKeyConstraints()) { - $this->markTestSkipped('Platform does not support foreign keys.'); - } - - $tableB = $this->getTestTable('test_foreign'); - - $this->_sm->dropAndCreateTable($tableB); - - $tableA = $this->getTestTable('test_create_fk'); - $tableA->addForeignKeyConstraint('test_foreign', array('foreign_key_test'), array('id')); - - $this->_sm->dropAndCreateTable($tableA); - - $fkConstraints = $this->_sm->listTableForeignKeys('test_create_fk'); - $this->assertEquals(1, count($fkConstraints), "Table 'test_create_fk1' has to have one foreign key."); - - $fkConstraint = current($fkConstraints); - $this->assertType('\Doctrine\DBAL\Schema\ForeignKeyConstraint', $fkConstraint); - $this->assertEquals('test_foreign', strtolower($fkConstraint->getForeignTableName())); - $this->assertEquals(array('foreign_key_test'), array_map('strtolower', $fkConstraint->getColumns())); - $this->assertEquals(array('id'), array_map('strtolower', $fkConstraint->getForeignColumns())); - } - - public function testListForeignKeys() - { - if(!$this->_conn->getDatabasePlatform()->supportsForeignKeyConstraints()) { - $this->markTestSkipped('Does not support foreign key constraints.'); - } - - $this->createTestTable('test_create_fk1'); - $this->createTestTable('test_create_fk2'); - - $foreignKey = new \Doctrine\DBAL\Schema\ForeignKeyConstraint( - array('foreign_key_test'), 'test_create_fk2', array('id'), 'foreign_key_test_fk', array('onDelete' => 'CASCADE') - ); - - $this->_sm->createForeignKey($foreignKey, 'test_create_fk1'); - - $fkeys = $this->_sm->listTableForeignKeys('test_create_fk1'); - - $this->assertEquals(1, count($fkeys), "Table 'test_create_fk1' has to have one foreign key."); - - $this->assertType('Doctrine\DBAL\Schema\ForeignKeyConstraint', $fkeys[0]); - $this->assertEquals(array('foreign_key_test'), array_map('strtolower', $fkeys[0]->getLocalColumns())); - $this->assertEquals(array('id'), array_map('strtolower', $fkeys[0]->getForeignColumns())); - $this->assertEquals('test_create_fk2', strtolower($fkeys[0]->getForeignTableName())); - - if($fkeys[0]->hasOption('onDelete')) { - $this->assertEquals('CASCADE', $fkeys[0]->getOption('onDelete')); - } - } - - protected function getCreateExampleViewSql() - { - $this->markTestSkipped('No Create Example View SQL was defined for this SchemaManager'); - } - - public function testCreateSchema() - { - $this->createTestTable('test_table'); - - $schema = $this->_sm->createSchema(); - - $this->assertTrue($schema->hasTable('test_table')); - } - - public function testAlterTableScenario() - { - if(!$this->_sm->getDatabasePlatform()->supportsAlterTable()) { - $this->markTestSkipped('Alter Table is not supported by this platform.'); - } - - $this->createTestTable('alter_table'); - $this->createTestTable('alter_table_foreign'); - - $table = $this->_sm->listTableDetails('alter_table'); - $this->assertTrue($table->hasColumn('id')); - $this->assertTrue($table->hasColumn('test')); - $this->assertTrue($table->hasColumn('foreign_key_test')); - $this->assertEquals(0, count($table->getForeignKeys())); - $this->assertEquals(1, count($table->getIndexes())); - - $tableDiff = new \Doctrine\DBAL\Schema\TableDiff("alter_table"); - $tableDiff->addedColumns['foo'] = new \Doctrine\DBAL\Schema\Column('foo', Type::getType('integer')); - $tableDiff->removedColumns['test'] = $table->getColumn('test'); - - $this->_sm->alterTable($tableDiff); - - $table = $this->_sm->listTableDetails('alter_table'); - $this->assertFalse($table->hasColumn('test')); - $this->assertTrue($table->hasColumn('foo')); - - $tableDiff = new \Doctrine\DBAL\Schema\TableDiff("alter_table"); - $tableDiff->addedIndexes[] = new \Doctrine\DBAL\Schema\Index('foo_idx', array('foo')); - - $this->_sm->alterTable($tableDiff); - - $table = $this->_sm->listTableDetails('alter_table'); - $this->assertEquals(2, count($table->getIndexes())); - $this->assertTrue($table->hasIndex('foo_idx')); - $this->assertEquals(array('foo'), array_map('strtolower', $table->getIndex('foo_idx')->getColumns())); - $this->assertFalse($table->getIndex('foo_idx')->isPrimary()); - $this->assertFalse($table->getIndex('foo_idx')->isUnique()); - - $tableDiff = new \Doctrine\DBAL\Schema\TableDiff("alter_table"); - $tableDiff->changedIndexes[] = new \Doctrine\DBAL\Schema\Index('foo_idx', array('foo', 'foreign_key_test')); - - $this->_sm->alterTable($tableDiff); - - $table = $this->_sm->listTableDetails('alter_table'); - $this->assertEquals(2, count($table->getIndexes())); - $this->assertTrue($table->hasIndex('foo_idx')); - $this->assertEquals(array('foo', 'foreign_key_test'), array_map('strtolower', $table->getIndex('foo_idx')->getColumns())); - - $tableDiff = new \Doctrine\DBAL\Schema\TableDiff("alter_table"); - $tableDiff->removedIndexes[] = new \Doctrine\DBAL\Schema\Index('foo_idx', array('foo', 'foreign_key_test')); - $fk = new \Doctrine\DBAL\Schema\ForeignKeyConstraint(array('foreign_key_test'), 'alter_table_foreign', array('id')); - $tableDiff->addedForeignKeys[] = $fk; - - $this->_sm->alterTable($tableDiff); - $table = $this->_sm->listTableDetails('alter_table'); - - // dont check for index size here, some platforms automatically add indexes for foreign keys. - $this->assertFalse($table->hasIndex('foo_idx')); - - $this->assertEquals(1, count($table->getForeignKeys())); - $fks = $table->getForeignKeys(); - $foreignKey = current($fks); - $this->assertEquals('alter_table_foreign', strtolower($foreignKey->getForeignTableName())); - $this->assertEquals(array('foreign_key_test'), array_map('strtolower', $foreignKey->getColumns())); - $this->assertEquals(array('id'), array_map('strtolower', $foreignKey->getForeignColumns())); - } - - public function testCreateAndListViews() - { - $this->createTestTable('view_test_table'); - - $name = "doctrine_test_view"; - $sql = "SELECT * FROM view_test_table"; - - $view = new \Doctrine\DBAL\Schema\View($name, $sql); - - $this->_sm->dropAndCreateView($view); - - $views = $this->_sm->listViews(); - } - - protected function createTestTable($name = 'test_table', $data = array()) - { - $options = array(); - if (isset($data['options'])) { - $options = $data['options']; - } - - $table = $this->getTestTable($name, $options); - - $this->_sm->dropAndCreateTable($table); - } - - protected function getTestTable($name, $options=array()) - { - $table = new \Doctrine\DBAL\Schema\Table($name, array(), array(), array(), \Doctrine\DBAL\Schema\Table::ID_NONE, $options); - $table->setSchemaConfig($this->_sm->createSchemaConfig()); - $table->setIdGeneratorType(\Doctrine\DBAL\Schema\Table::ID_IDENTITY); - $table->addColumn('id', 'integer', array('notnull' => true)); - $table->setPrimaryKey(array('id')); - $table->addColumn('test', 'string', array('length' => 255)); - $table->addColumn('foreign_key_test', 'integer'); - return $table; - } - - protected function assertHasTable($tables, $tableName) - { - $foundTable = false; - foreach ($tables AS $table) { - $this->assertType('Doctrine\DBAL\Schema\Table', $table, 'No Table instance was found in tables array.'); - if (strtolower($table->getName()) == 'list_tables_test_new_name') { - $foundTable = true; - } - } - $this->assertTrue($foundTable, "Could not find new table"); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Functional/Schema/SqliteSchemaManagerTest.php b/tests/Doctrine/Tests/DBAL/Functional/Schema/SqliteSchemaManagerTest.php deleted file mode 100644 index d819ff1b7..000000000 --- a/tests/Doctrine/Tests/DBAL/Functional/Schema/SqliteSchemaManagerTest.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Functional\Schema; - -use Doctrine\DBAL\Schema; - -require_once __DIR__ . '/../../../TestInit.php'; - -class SqliteSchemaManagerTest extends SchemaManagerFunctionalTestCase -{ - /** - * SQLITE does not support databases. - * - * @expectedException \Exception - */ - public function testListDatabases() - { - $this->_sm->listDatabases(); - } - - public function testCreateAndDropDatabase() - { - $path = dirname(__FILE__).'/test_create_and_drop_sqlite_database.sqlite'; - - $this->_sm->createDatabase($path); - $this->assertEquals(true, file_exists($path)); - $this->_sm->dropDatabase($path); - $this->assertEquals(false, file_exists($path)); - } - - /** - * @expectedException \Exception - */ - // This test is not correct. createSequence expects an object. - // PHPUnit wrapping the PHP error in an exception hides this but it shows up - // when the tests are run in the build (phing). - /*public function testCreateSequence() - { - $this->_sm->createSequence('seqname', 1, 1); - }*/ - - /** - * @expectedException \Exception - */ - // This test is not correct. createForeignKey expects an object. - // PHPUnit wrapping the PHP error in an exception hides this but it shows up - // when the tests are run in the build (phing). - /*public function testCreateForeignKey() - { - $this->_sm->createForeignKey('table', array()); - }*/ - - /** - * @expectedException \Exception - */ - public function testRenameTable() - { - $this->_sm->renameTable('oldname', 'newname'); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Functional/WriteTest.php b/tests/Doctrine/Tests/DBAL/Functional/WriteTest.php deleted file mode 100644 index 3b2538fee..000000000 --- a/tests/Doctrine/Tests/DBAL/Functional/WriteTest.php +++ /dev/null @@ -1,122 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Functional; -use Doctrine\DBAL\Types\Type; - -require_once __DIR__ . '/../../TestInit.php'; - -class WriteTest extends \Doctrine\Tests\DbalFunctionalTestCase -{ - public function setUp() - { - parent::setUp(); - - try { - /* @var $sm \Doctrine\DBAL\Schema\AbstractSchemaManager */ - $table = new \Doctrine\DBAL\Schema\Table("write_table"); - $table->addColumn('test_int', 'integer'); - $table->addColumn('test_string', 'string', array('notnull' => false)); - - $sm = $this->_conn->getSchemaManager(); - $sm->createTable($table); - } catch(\Exception $e) { - - } - $this->_conn->executeUpdate('DELETE FROM write_table'); - } - - public function testExecuteUpdate() - { - $sql = "INSERT INTO " . $this->_conn->quoteIdentifier('write_table') . " ( " . - $this->_conn->quoteIdentifier('test_int') . " ) VALUES ( " . $this->_conn->quote(1) . ")"; - $affected = $this->_conn->executeUpdate($sql); - - $this->assertEquals(1, $affected, "executeUpdate() should return the number of affected rows!"); - } - - public function testExecuteUpdateWithTypes() - { - $sql = "INSERT INTO write_table (test_int, test_string) VALUES (?, ?)"; - $affected = $this->_conn->executeUpdate($sql, array(1, 'foo'), array(\PDO::PARAM_INT, \PDO::PARAM_STR)); - - $this->assertEquals(1, $affected, "executeUpdate() should return the number of affected rows!"); - } - - public function testPrepareRowCountReturnsAffectedRows() - { - $sql = "INSERT INTO write_table (test_int, test_string) VALUES (?, ?)"; - $stmt = $this->_conn->prepare($sql); - - $stmt->bindValue(1, 1); - $stmt->bindValue(2, "foo"); - $stmt->execute(); - - $this->assertEquals(1, $stmt->rowCount()); - } - - public function testPrepareWithPdoTypes() - { - $sql = "INSERT INTO write_table (test_int, test_string) VALUES (?, ?)"; - $stmt = $this->_conn->prepare($sql); - - $stmt->bindValue(1, 1, \PDO::PARAM_INT); - $stmt->bindValue(2, "foo", \PDO::PARAM_STR); - $stmt->execute(); - - $this->assertEquals(1, $stmt->rowCount()); - } - - public function testPrepareWithDbalTypes() - { - $sql = "INSERT INTO write_table (test_int, test_string) VALUES (?, ?)"; - $stmt = $this->_conn->prepare($sql); - - $stmt->bindValue(1, 1, Type::getType('integer')); - $stmt->bindValue(2, "foo", Type::getType('string')); - $stmt->execute(); - - $this->assertEquals(1, $stmt->rowCount()); - } - - public function testPrepareWithDbalTypeNames() - { - $sql = "INSERT INTO write_table (test_int, test_string) VALUES (?, ?)"; - $stmt = $this->_conn->prepare($sql); - - $stmt->bindValue(1, 1, 'integer'); - $stmt->bindValue(2, "foo", 'string'); - $stmt->execute(); - - $this->assertEquals(1, $stmt->rowCount()); - } - - public function insertRows() - { - $this->assertEquals(1, $this->_conn->insert('write_table', array('test_int' => 1))); - $this->assertEquals(1, $this->_conn->insert('write_table', array('test_int' => 2))); - } - - public function testInsert() - { - $this->insertRows(); - } - - public function testDelete() - { - $this->insertRows(); - - $this->assertEquals(1, $this->_conn->delete('write_table', array('test_int' => 2))); - $this->assertEquals(1, count($this->_conn->fetchAll('SELECT * FROM write_table'))); - - $this->assertEquals(1, $this->_conn->delete('write_table', array('test_int' => 1))); - $this->assertEquals(0, count($this->_conn->fetchAll('SELECT * FROM write_table'))); - } - - public function testUpdate() - { - $this->insertRows(); - - $this->assertEquals(1, $this->_conn->update('write_table', array('test_int' => 2), array('test_int' => 1))); - $this->assertEquals(2, $this->_conn->update('write_table', array('test_int' => 3), array('test_int' => 2))); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Mocks/MockPlatform.php b/tests/Doctrine/Tests/DBAL/Mocks/MockPlatform.php deleted file mode 100644 index 95e6b55b4..000000000 --- a/tests/Doctrine/Tests/DBAL/Mocks/MockPlatform.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Mocks; - -use Doctrine\DBAL\Platforms; - -class MockPlatform extends \Doctrine\DBAL\Platforms\AbstractPlatform -{ - public function getBooleanTypeDeclarationSQL(array $columnDef) {} - public function getIntegerTypeDeclarationSQL(array $columnDef) {} - public function getBigIntTypeDeclarationSQL(array $columnDef) {} - public function getSmallIntTypeDeclarationSQL(array $columnDef) {} - public function _getCommonIntegerTypeDeclarationSQL(array $columnDef) {} - - public function getVarcharTypeDeclarationSQL(array $field) - { - return "DUMMYVARCHAR()"; - } - - /** @override */ - public function getClobTypeDeclarationSQL(array $field) - { - return 'DUMMYCLOB'; - } - - public function getVarcharDefaultLength() - { - return 255; - } - - public function getName() - { - return 'mock'; - } -} diff --git a/tests/Doctrine/Tests/DBAL/Platforms/AbstractPlatformTestCase.php b/tests/Doctrine/Tests/DBAL/Platforms/AbstractPlatformTestCase.php deleted file mode 100644 index 3884ddc6d..000000000 --- a/tests/Doctrine/Tests/DBAL/Platforms/AbstractPlatformTestCase.php +++ /dev/null @@ -1,145 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Platforms; - -abstract class AbstractPlatformTestCase extends \Doctrine\Tests\DbalTestCase -{ - /** - * @var Doctrine\DBAL\Platforms\AbstractPlatform - */ - protected $_platform; - - abstract public function createPlatform(); - - public function setUp() - { - $this->_platform = $this->createPlatform(); - } - - public function testCreateWithNoColumns() - { - $table = new \Doctrine\DBAL\Schema\Table('test'); - - $this->setExpectedException('Doctrine\DBAL\DBALException'); - $sql = $this->_platform->getCreateTableSQL($table); - } - - public function testGeneratesTableCreationSql() - { - $table = new \Doctrine\DBAL\Schema\Table('test'); - $table->addColumn('id', 'integer', array('notnull' => true)); - $table->addColumn('test', 'string', array('notnull' => false, 'length' => 255)); - $table->setPrimaryKey(array('id')); - $table->setIdGeneratorType(\Doctrine\DBAL\Schema\Table::ID_IDENTITY); - - $sql = $this->_platform->getCreateTableSQL($table); - $this->assertEquals($this->getGenerateTableSql(), $sql[0]); - } - - abstract public function getGenerateTableSql(); - - public function testGenerateTableWithMultiColumnUniqueIndex() - { - $table = new \Doctrine\DBAL\Schema\Table('test'); - $table->addColumn('foo', 'string', array('notnull' => false, 'length' => 255)); - $table->addColumn('bar', 'string', array('notnull' => false, 'length' => 255)); - $table->addUniqueIndex(array("foo", "bar")); - - $sql = $this->_platform->getCreateTableSQL($table); - $this->assertEquals($this->getGenerateTableWithMultiColumnUniqueIndexSql(), $sql); - } - - abstract public function getGenerateTableWithMultiColumnUniqueIndexSql(); - - public function testGeneratesIndexCreationSql() - { - $indexDef = new \Doctrine\DBAL\Schema\Index('my_idx', array('user_name', 'last_login')); - - $this->assertEquals( - $this->getGenerateIndexSql(), - $this->_platform->getCreateIndexSQL($indexDef, 'mytable') - ); - } - - abstract public function getGenerateIndexSql(); - - public function testGeneratesUniqueIndexCreationSql() - { - $indexDef = new \Doctrine\DBAL\Schema\Index('index_name', array('test', 'test2'), true); - - $sql = $this->_platform->getCreateIndexSQL($indexDef, 'test'); - $this->assertEquals($this->getGenerateUniqueIndexSql(), $sql); - } - - abstract public function getGenerateUniqueIndexSql(); - - public function testGeneratesForeignKeyCreationSql() - { - $fk = new \Doctrine\DBAL\Schema\ForeignKeyConstraint(array('fk_name_id'), 'other_table', array('id'), ''); - - $sql = $this->_platform->getCreateForeignKeySQL($fk, 'test'); - $this->assertEquals($sql, $this->getGenerateForeignKeySql()); - } - - abstract public function getGenerateForeignKeySql(); - - public function testGeneratesConstraintCreationSql() - { - $idx = new \Doctrine\DBAL\Schema\Index('constraint_name', array('test'), true, false); - $sql = $this->_platform->getCreateConstraintSQL($idx, 'test'); - $this->assertEquals($this->getGenerateConstraintUniqueIndexSql(), $sql); - - $pk = new \Doctrine\DBAL\Schema\Index('constraint_name', array('test'), true, true); - $sql = $this->_platform->getCreateConstraintSQL($pk, 'test'); - $this->assertEquals($this->getGenerateConstraintPrimaryIndexSql(), $sql); - - $fk = new \Doctrine\DBAL\Schema\ForeignKeyConstraint(array('fk_name'), 'foreign', array('id'), 'constraint_fk'); - $sql = $this->_platform->getCreateConstraintSQL($fk, 'test'); - $this->assertEquals($this->getGenerateConstraintForeignKeySql(), $sql); - } - - public function getGenerateConstraintUniqueIndexSql() - { - return 'ALTER TABLE test ADD CONSTRAINT constraint_name UNIQUE (test)'; - } - - public function getGenerateConstraintPrimaryIndexSql() - { - return 'ALTER TABLE test ADD CONSTRAINT constraint_name PRIMARY KEY (test)'; - } - - public function getGenerateConstraintForeignKeySql() - { - return 'ALTER TABLE test ADD CONSTRAINT constraint_fk FOREIGN KEY (fk_name) REFERENCES foreign (id)'; - } - - abstract public function getGenerateAlterTableSql(); - - public function testGeneratesTableAlterationSql() - { - $expectedSql = $this->getGenerateAlterTableSql(); - - $columnDiff = new \Doctrine\DBAL\Schema\ColumnDiff( - 'bar', new \Doctrine\DBAL\Schema\Column( - 'baz', \Doctrine\DBAL\Types\Type::getType('string'), array('default' => 'def') - ), - array('type', 'notnull', 'default') - ); - - $tableDiff = new \Doctrine\DBAL\Schema\TableDiff('mytable'); - $tableDiff->newName = 'userlist'; - $tableDiff->addedColumns['quota'] = new \Doctrine\DBAL\Schema\Column('quota', \Doctrine\DBAL\Types\Type::getType('integer'), array('notnull' => false)); - $tableDiff->removedColumns['foo'] = new \Doctrine\DBAL\Schema\Column('foo', \Doctrine\DBAL\Types\Type::getType('integer')); - $tableDiff->changedColumns['bar'] = $columnDiff; - - $sql = $this->_platform->getAlterTableSQL($tableDiff); - - $this->assertEquals($expectedSql, $sql); - } - - public function testGetCustomColumnDeclarationSql() - { - $field = array('columnDefinition' => 'MEDIUMINT(6) UNSIGNED'); - $this->assertEquals('foo MEDIUMINT(6) UNSIGNED', $this->_platform->getColumnDeclarationSQL('foo', $field)); - } -} diff --git a/tests/Doctrine/Tests/DBAL/Platforms/MsSqlPlatformTest.php b/tests/Doctrine/Tests/DBAL/Platforms/MsSqlPlatformTest.php deleted file mode 100644 index 1302be035..000000000 --- a/tests/Doctrine/Tests/DBAL/Platforms/MsSqlPlatformTest.php +++ /dev/null @@ -1,160 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Platforms; - -use Doctrine\DBAL\Platforms\MsSqlPlatform; -use Doctrine\DBAL\Types\Type; - -require_once __DIR__ . '/../../TestInit.php'; - -class MsSqlPlatformTest extends AbstractPlatformTestCase -{ - public function createPlatform() - { - return new MsSqlPlatform; - } - - public function getGenerateTableSql() - { - return 'CREATE TABLE test (id INT AUTO_INCREMENT NOT NULL, test VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'; - } - - public function getGenerateTableWithMultiColumnUniqueIndexSql() - { - return array( - 'CREATE TABLE test (foo VARCHAR(255) DEFAULT NULL, bar VARCHAR(255) DEFAULT NULL, UNIQUE INDEX test_foo_bar_uniq (foo, bar))' - ); - } - - public function getGenerateAlterTableSql() - { - return array( - "ALTER TABLE mytable RENAME TO userlist, ADD quota INT DEFAULT NULL, DROP foo, CHANGE bar baz VARCHAR(255) DEFAULT 'def' NOT NULL" - ); - } - - public function testGeneratesSqlSnippets() - { - $this->assertEquals('RLIKE', $this->_platform->getRegexpExpression(), 'Regular expression operator is not correct'); - $this->assertEquals('"', $this->_platform->getIdentifierQuoteCharacter(), 'Identifier quote character is not correct'); - $this->assertEquals('(column1 + column2 + column3)', $this->_platform->getConcatExpression('column1', 'column2', 'column3'), 'Concatenation expression is not correct'); - } - - public function testGeneratesTransactionsCommands() - { - $this->assertEquals( - 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_UNCOMMITTED) - ); - $this->assertEquals( - 'SET TRANSACTION ISOLATION LEVEL READ COMMITTED', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_COMMITTED) - ); - $this->assertEquals( - 'SET TRANSACTION ISOLATION LEVEL REPEATABLE READ', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_REPEATABLE_READ) - ); - $this->assertEquals( - 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_SERIALIZABLE) - ); - } - - public function testGeneratesDDLSnippets() - { - $this->assertEquals('SHOW DATABASES', $this->_platform->getShowDatabasesSQL()); - $this->assertEquals('CREATE DATABASE foobar', $this->_platform->getCreateDatabaseSQL('foobar')); - $this->assertEquals('DROP DATABASE foobar', $this->_platform->getDropDatabaseSQL('foobar')); - $this->assertEquals('DROP TABLE foobar', $this->_platform->getDropTableSQL('foobar')); - } - - public function testGeneratesTypeDeclarationForIntegers() - { - $this->assertEquals( - 'INT', - $this->_platform->getIntegerTypeDeclarationSQL(array()) - ); - $this->assertEquals( - 'INT AUTO_INCREMENT', - $this->_platform->getIntegerTypeDeclarationSQL(array('autoincrement' => true) - )); - $this->assertEquals( - 'INT AUTO_INCREMENT', - $this->_platform->getIntegerTypeDeclarationSQL( - array('autoincrement' => true, 'primary' => true) - )); - } - - public function testGeneratesTypeDeclarationsForStrings() - { - $this->assertEquals( - 'CHAR(10)', - $this->_platform->getVarcharTypeDeclarationSQL( - array('length' => 10, 'fixed' => true) - )); - $this->assertEquals( - 'VARCHAR(50)', - $this->_platform->getVarcharTypeDeclarationSQL(array('length' => 50)), - 'Variable string declaration is not correct' - ); - $this->assertEquals( - 'TEXT', - $this->_platform->getVarcharTypeDeclarationSQL(array()), - 'Long string declaration is not correct' - ); - } - - public function testPrefersIdentityColumns() - { - $this->assertTrue($this->_platform->prefersIdentityColumns()); - } - - public function testSupportsIdentityColumns() - { - $this->assertTrue($this->_platform->supportsIdentityColumns()); - } - - public function testDoesNotSupportSavePoints() - { - $this->assertFalse($this->_platform->supportsSavepoints()); - } - - public function getGenerateIndexSql() - { - return 'CREATE INDEX my_idx ON mytable (user_name, last_login)'; - } - - public function getGenerateUniqueIndexSql() - { - return 'CREATE UNIQUE INDEX index_name ON test (test, test2)'; - } - - public function getGenerateForeignKeySql() - { - return 'ALTER TABLE test ADD FOREIGN KEY (fk_name_id) REFERENCES other_table(id)'; - } - - public function testModifyLimitQuery() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10, 0); - $this->assertEquals('SELECT * FROM (SELECT TOP 10 * FROM (SELECT TOP 10 * FROM user) AS inner_tbl) AS outer_tbl', $sql); - } - - public function testModifyLimitQueryWithEmptyOffset() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10); - $this->assertEquals('SELECT * FROM (SELECT TOP 10 * FROM (SELECT TOP 10 * FROM user) AS inner_tbl) AS outer_tbl', $sql); - } - - public function testModifyLimitQueryWithAscOrderBy() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user ORDER BY username ASC', 10); - $this->assertEquals('SELECT * FROM (SELECT TOP 10 * FROM (SELECT TOP 10 * FROM user ORDER BY username ASC) AS inner_tbl ORDER BY inner_tbl.u DESC) AS outer_tbl ORDER BY outer_tbl.u ASC', $sql); - } - - public function testModifyLimitQueryWithDescOrderBy() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user ORDER BY username DESC', 10); - $this->assertEquals('SELECT * FROM (SELECT TOP 10 * FROM (SELECT TOP 10 * FROM user ORDER BY username DESC) AS inner_tbl ORDER BY inner_tbl.u ASC) AS outer_tbl ORDER BY outer_tbl.u DESC', $sql); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Platforms/MySqlPlatformTest.php b/tests/Doctrine/Tests/DBAL/Platforms/MySqlPlatformTest.php deleted file mode 100644 index 8dbeac5db..000000000 --- a/tests/Doctrine/Tests/DBAL/Platforms/MySqlPlatformTest.php +++ /dev/null @@ -1,169 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Platforms; - -use Doctrine\DBAL\Platforms\MySqlPlatform; -use Doctrine\DBAL\Types\Type; - -require_once __DIR__ . '/../../TestInit.php'; - -class MySqlPlatformTest extends AbstractPlatformTestCase -{ - public function createPlatform() - { - return new MysqlPlatform; - } - - public function testGenerateMixedCaseTableCreate() - { - $table = new \Doctrine\DBAL\Schema\Table("Foo"); - $table->addColumn("Bar", "integer"); - - $sql = $this->_platform->getCreateTableSQL($table); - $this->assertEquals('CREATE TABLE Foo (Bar INT NOT NULL) ENGINE = InnoDB', array_shift($sql)); - } - - public function getGenerateTableSql() - { - return 'CREATE TABLE test (id INT AUTO_INCREMENT NOT NULL, test VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) ENGINE = InnoDB'; - } - - public function getGenerateTableWithMultiColumnUniqueIndexSql() - { - return array( - 'CREATE TABLE test (foo VARCHAR(255) DEFAULT NULL, bar VARCHAR(255) DEFAULT NULL, UNIQUE INDEX test_foo_bar_uniq (foo, bar)) ENGINE = InnoDB' - ); - } - - public function getGenerateAlterTableSql() - { - return array( - "ALTER TABLE mytable RENAME TO userlist, ADD quota INT DEFAULT NULL, DROP foo, CHANGE bar baz VARCHAR(255) DEFAULT 'def' NOT NULL" - ); - } - - public function testGeneratesSqlSnippets() - { - $this->assertEquals('RLIKE', $this->_platform->getRegexpExpression(), 'Regular expression operator is not correct'); - $this->assertEquals('`', $this->_platform->getIdentifierQuoteCharacter(), 'Quote character is not correct'); - $this->assertEquals('CONCAT(column1, column2, column3)', $this->_platform->getConcatExpression('column1', 'column2', 'column3'), 'Concatenation function is not correct'); - } - - public function testGeneratesTransactionsCommands() - { - $this->assertEquals( - 'SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_UNCOMMITTED), - '' - ); - $this->assertEquals( - 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_COMMITTED) - ); - $this->assertEquals( - 'SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_REPEATABLE_READ) - ); - $this->assertEquals( - 'SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_SERIALIZABLE) - ); - } - - - public function testGeneratesDDLSnippets() - { - $this->assertEquals('SHOW DATABASES', $this->_platform->getShowDatabasesSQL()); - $this->assertEquals('CREATE DATABASE foobar', $this->_platform->getCreateDatabaseSQL('foobar')); - $this->assertEquals('DROP DATABASE foobar', $this->_platform->getDropDatabaseSQL('foobar')); - $this->assertEquals('DROP TABLE foobar', $this->_platform->getDropTableSQL('foobar')); - } - - public function testGeneratesTypeDeclarationForIntegers() - { - $this->assertEquals( - 'INT', - $this->_platform->getIntegerTypeDeclarationSQL(array()) - ); - $this->assertEquals( - 'INT AUTO_INCREMENT', - $this->_platform->getIntegerTypeDeclarationSQL(array('autoincrement' => true) - )); - $this->assertEquals( - 'INT AUTO_INCREMENT', - $this->_platform->getIntegerTypeDeclarationSQL( - array('autoincrement' => true, 'primary' => true) - )); - } - - public function testGeneratesTypeDeclarationForStrings() - { - $this->assertEquals( - 'CHAR(10)', - $this->_platform->getVarcharTypeDeclarationSQL( - array('length' => 10, 'fixed' => true) - )); - $this->assertEquals( - 'VARCHAR(50)', - $this->_platform->getVarcharTypeDeclarationSQL(array('length' => 50)), - 'Variable string declaration is not correct' - ); - $this->assertEquals( - 'VARCHAR(255)', - $this->_platform->getVarcharTypeDeclarationSQL(array()), - 'Long string declaration is not correct' - ); - } - - public function testPrefersIdentityColumns() - { - $this->assertTrue($this->_platform->prefersIdentityColumns()); - } - - public function testSupportsIdentityColumns() - { - $this->assertTrue($this->_platform->supportsIdentityColumns()); - } - - public function testDoesNotSupportSavePoints() - { - $this->assertFalse($this->_platform->supportsSavepoints()); - } - - public function getGenerateIndexSql() - { - return 'CREATE INDEX my_idx ON mytable (user_name, last_login)'; - } - - public function getGenerateUniqueIndexSql() - { - return 'CREATE UNIQUE INDEX index_name ON test (test, test2)'; - } - - public function getGenerateForeignKeySql() - { - return 'ALTER TABLE test ADD FOREIGN KEY (fk_name_id) REFERENCES other_table(id)'; - } - - public function testModifyLimitQuery() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10, 0); - $this->assertEquals('SELECT * FROM user LIMIT 10 OFFSET 0', $sql); - } - - public function testModifyLimitQueryWithEmptyOffset() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10); - $this->assertEquals('SELECT * FROM user LIMIT 10', $sql); - } - - /** - * @group DDC-118 - */ - public function testGetDateTimeTypeDeclarationSql() - { - $this->assertEquals("DATETIME", $this->_platform->getDateTimeTypeDeclarationSQL(array('version' => false))); - $this->assertEquals("TIMESTAMP", $this->_platform->getDateTimeTypeDeclarationSQL(array('version' => true))); - $this->assertEquals("DATETIME", $this->_platform->getDateTimeTypeDeclarationSQL(array())); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Platforms/OraclePlatformTest.php b/tests/Doctrine/Tests/DBAL/Platforms/OraclePlatformTest.php deleted file mode 100644 index 8fb24abf6..000000000 --- a/tests/Doctrine/Tests/DBAL/Platforms/OraclePlatformTest.php +++ /dev/null @@ -1,189 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Platforms; - -use Doctrine\DBAL\Platforms\OraclePlatform; -use Doctrine\DBAL\Types\Type; - -require_once __DIR__ . '/../../TestInit.php'; - -class OraclePlatformTest extends AbstractPlatformTestCase -{ - public function createPlatform() - { - return new OraclePlatform; - } - - public function getGenerateTableSql() - { - return 'CREATE TABLE test (id NUMBER(10) NOT NULL, test VARCHAR2(255) DEFAULT NULL, PRIMARY KEY(id))'; - } - - public function getGenerateTableWithMultiColumnUniqueIndexSql() - { - return array( - 'CREATE TABLE test (foo VARCHAR2(255) DEFAULT NULL, bar VARCHAR2(255) DEFAULT NULL)', - 'CREATE UNIQUE INDEX test_foo_bar_uniq ON test (foo, bar)', - ); - } - - public function getGenerateAlterTableSql() - { - return array( - 'ALTER TABLE mytable ADD (quota NUMBER(10) DEFAULT NULL)', - "ALTER TABLE mytable MODIFY (baz VARCHAR2(255) DEFAULT 'def' NOT NULL)", - "ALTER TABLE mytable DROP COLUMN foo", - "ALTER TABLE mytable RENAME TO userlist", - ); - } - - /** - * @expectedException Doctrine\DBAL\DBALException - */ - public function testRLike() - { - $this->assertEquals('RLIKE', $this->_platform->getRegexpExpression(), 'Regular expression operator is not correct'); - } - - public function testGeneratesSqlSnippets() - { - $this->assertEquals('"', $this->_platform->getIdentifierQuoteCharacter(), 'Identifier quote character is not correct'); - $this->assertEquals('column1 || column2 || column3', $this->_platform->getConcatExpression('column1', 'column2', 'column3'), 'Concatenation expression is not correct'); - } - - public function testGeneratesTransactionsCommands() - { - $this->assertEquals( - 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_UNCOMMITTED) - ); - $this->assertEquals( - 'SET TRANSACTION ISOLATION LEVEL READ COMMITTED', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_COMMITTED) - ); - $this->assertEquals( - 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_REPEATABLE_READ) - ); - $this->assertEquals( - 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_SERIALIZABLE) - ); - } - - /** - * @expectedException Doctrine\DBAL\DBALException - */ - public function testShowDatabasesThrowsException() - { - $this->assertEquals('SHOW DATABASES', $this->_platform->getShowDatabasesSQL()); - } - - /** - * @expectedException Doctrine\DBAL\DBALException - */ - public function testCreateDatabaseThrowsException() - { - $this->assertEquals('CREATE DATABASE foobar', $this->_platform->getCreateDatabaseSQL('foobar')); - } - - public function testDropDatabaseThrowsException() - { - $this->assertEquals('DROP USER foobar CASCADE', $this->_platform->getDropDatabaseSQL('foobar')); - } - - public function testDropTable() - { - $this->assertEquals('DROP TABLE foobar', $this->_platform->getDropTableSQL('foobar')); - } - - public function testGeneratesTypeDeclarationForIntegers() - { - $this->assertEquals( - 'NUMBER(10)', - $this->_platform->getIntegerTypeDeclarationSQL(array()) - ); - $this->assertEquals( - 'NUMBER(10)', - $this->_platform->getIntegerTypeDeclarationSQL(array('autoincrement' => true) - )); - $this->assertEquals( - 'NUMBER(10)', - $this->_platform->getIntegerTypeDeclarationSQL( - array('autoincrement' => true, 'primary' => true) - )); - } - - public function testGeneratesTypeDeclarationsForStrings() - { - $this->assertEquals( - 'CHAR(10)', - $this->_platform->getVarcharTypeDeclarationSQL( - array('length' => 10, 'fixed' => true) - )); - $this->assertEquals( - 'VARCHAR2(50)', - $this->_platform->getVarcharTypeDeclarationSQL(array('length' => 50)), - 'Variable string declaration is not correct' - ); - $this->assertEquals( - 'VARCHAR2(4000)', - $this->_platform->getVarcharTypeDeclarationSQL(array()), - 'Long string declaration is not correct' - ); - } - - public function testPrefersIdentityColumns() - { - $this->assertFalse($this->_platform->prefersIdentityColumns()); - } - - public function testSupportsIdentityColumns() - { - $this->assertFalse($this->_platform->supportsIdentityColumns()); - } - - public function testSupportsSavePoints() - { - $this->assertTrue($this->_platform->supportsSavepoints()); - } - - public function getGenerateIndexSql() - { - return 'CREATE INDEX my_idx ON mytable (user_name, last_login)'; - } - - public function getGenerateUniqueIndexSql() - { - return 'CREATE UNIQUE INDEX index_name ON test (test, test2)'; - } - - public function getGenerateForeignKeySql() - { - return 'ALTER TABLE test ADD FOREIGN KEY (fk_name_id) REFERENCES other_table(id)'; - } - - public function testModifyLimitQuery() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10, 0); - $this->assertEquals('SELECT a.* FROM (SELECT * FROM user) a WHERE ROWNUM <= 10', $sql); - } - - public function testModifyLimitQueryWithEmptyOffset() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10); - $this->assertEquals('SELECT a.* FROM (SELECT * FROM user) a WHERE ROWNUM <= 10', $sql); - } - - public function testModifyLimitQueryWithAscOrderBy() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user ORDER BY username ASC', 10); - $this->assertEquals('SELECT a.* FROM (SELECT * FROM user ORDER BY username ASC) a WHERE ROWNUM <= 10', $sql); - } - - public function testModifyLimitQueryWithDescOrderBy() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user ORDER BY username DESC', 10); - $this->assertEquals('SELECT a.* FROM (SELECT * FROM user ORDER BY username DESC) a WHERE ROWNUM <= 10', $sql); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Platforms/PostgreSqlPlatformTest.php b/tests/Doctrine/Tests/DBAL/Platforms/PostgreSqlPlatformTest.php deleted file mode 100644 index 38681b3e1..000000000 --- a/tests/Doctrine/Tests/DBAL/Platforms/PostgreSqlPlatformTest.php +++ /dev/null @@ -1,193 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Platforms; - -use Doctrine\DBAL\Platforms\PostgreSqlPlatform; -use Doctrine\DBAL\Types\Type; - -require_once __DIR__ . '/../../TestInit.php'; - -class PostgreSqlPlatformTest extends AbstractPlatformTestCase -{ - public function createPlatform() - { - return new PostgreSqlPlatform; - } - - public function getGenerateTableSql() - { - return 'CREATE TABLE test (id SERIAL NOT NULL, test VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'; - } - - public function getGenerateTableWithMultiColumnUniqueIndexSql() - { - return array( - 'CREATE TABLE test (foo VARCHAR(255) DEFAULT NULL, bar VARCHAR(255) DEFAULT NULL)', - 'CREATE UNIQUE INDEX test_foo_bar_uniq ON test (foo, bar)' - ); - } - - public function getGenerateAlterTableSql() - { - return array( - 'ALTER TABLE mytable ADD quota INT DEFAULT NULL', - 'ALTER TABLE mytable DROP foo', - 'ALTER TABLE mytable ALTER bar TYPE VARCHAR(255)', - "ALTER TABLE mytable ALTER bar SET DEFAULT 'def'", - 'ALTER TABLE mytable ALTER bar SET NOT NULL', - 'ALTER TABLE mytable RENAME TO userlist', - ); - } - - public function getGenerateIndexSql() - { - return 'CREATE INDEX my_idx ON mytable (user_name, last_login)'; - } - - public function getGenerateForeignKeySql() - { - return 'ALTER TABLE test ADD FOREIGN KEY (fk_name_id) REFERENCES other_table(id) NOT DEFERRABLE INITIALLY IMMEDIATE'; - } - - public function testGeneratesForeignKeySqlForNonStandardOptions() - { - $foreignKey = new \Doctrine\DBAL\Schema\ForeignKeyConstraint( - array('foreign_id'), 'my_table', array('id'), 'my_fk', array('onDelete' => 'CASCADE') - ); - $this->assertEquals( - "CONSTRAINT my_fk FOREIGN KEY (foreign_id) REFERENCES my_table(id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE", - $this->_platform->getForeignKeyDeclarationSQL($foreignKey) - ); - } - - public function testGeneratesSqlSnippets() - { - $this->assertEquals('SIMILAR TO', $this->_platform->getRegexpExpression(), 'Regular expression operator is not correct'); - $this->assertEquals('"', $this->_platform->getIdentifierQuoteCharacter(), 'Identifier quote character is not correct'); - $this->assertEquals('column1 || column2 || column3', $this->_platform->getConcatExpression('column1', 'column2', 'column3'), 'Concatenation expression is not correct'); - $this->assertEquals('SUBSTR(column, 5)', $this->_platform->getSubstringExpression('column', 5), 'Substring expression without length is not correct'); - $this->assertEquals('SUBSTR(column, 0, 5)', $this->_platform->getSubstringExpression('column', 0, 5), 'Substring expression with length is not correct'); - } - - public function testGeneratesTransactionCommands() - { - $this->assertEquals( - 'SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_UNCOMMITTED) - ); - $this->assertEquals( - 'SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_COMMITTED) - ); - $this->assertEquals( - 'SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_REPEATABLE_READ) - ); - $this->assertEquals( - 'SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_SERIALIZABLE) - ); - } - - public function testGeneratesDDLSnippets() - { - $this->assertEquals('CREATE DATABASE foobar', $this->_platform->getCreateDatabaseSQL('foobar')); - $this->assertEquals('DROP DATABASE foobar', $this->_platform->getDropDatabaseSQL('foobar')); - $this->assertEquals('DROP TABLE foobar', $this->_platform->getDropTableSQL('foobar')); - } - - public function testGeneratesTypeDeclarationForIntegers() - { - $this->assertEquals( - 'INT', - $this->_platform->getIntegerTypeDeclarationSQL(array()) - ); - $this->assertEquals( - 'SERIAL', - $this->_platform->getIntegerTypeDeclarationSQL(array('autoincrement' => true) - )); - $this->assertEquals( - 'SERIAL', - $this->_platform->getIntegerTypeDeclarationSQL( - array('autoincrement' => true, 'primary' => true) - )); - } - - public function testGeneratesTypeDeclarationForStrings() - { - $this->assertEquals( - 'CHAR(10)', - $this->_platform->getVarcharTypeDeclarationSQL( - array('length' => 10, 'fixed' => true)) - ); - $this->assertEquals( - 'VARCHAR(50)', - $this->_platform->getVarcharTypeDeclarationSQL(array('length' => 50)), - 'Variable string declaration is not correct' - ); - $this->assertEquals( - 'TEXT', - $this->_platform->getVarcharTypeDeclarationSQL(array()), - 'Long string declaration is not correct' - ); - } - - public function getGenerateUniqueIndexSql() - { - return 'CREATE UNIQUE INDEX index_name ON test (test, test2)'; - } - - public function testGeneratesSequenceSqlCommands() - { - $sequence = new \Doctrine\DBAL\Schema\Sequence('myseq', 20, 1); - $this->assertEquals( - 'CREATE SEQUENCE myseq INCREMENT BY 20 MINVALUE 1 START 1', - $this->_platform->getCreateSequenceSQL($sequence) - ); - $this->assertEquals( - 'DROP SEQUENCE myseq', - $this->_platform->getDropSequenceSQL('myseq') - ); - $this->assertEquals( - "SELECT NEXTVAL('myseq')", - $this->_platform->getSequenceNextValSQL('myseq') - ); - } - - public function testDoesNotPreferIdentityColumns() - { - $this->assertFalse($this->_platform->prefersIdentityColumns()); - } - - public function testPrefersSequences() - { - $this->assertTrue($this->_platform->prefersSequences()); - } - - public function testSupportsIdentityColumns() - { - $this->assertTrue($this->_platform->supportsIdentityColumns()); - } - - public function testSupportsSavePoints() - { - $this->assertTrue($this->_platform->supportsSavepoints()); - } - - public function testSupportsSequences() - { - $this->assertTrue($this->_platform->supportsSequences()); - } - - public function testModifyLimitQuery() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10, 0); - $this->assertEquals('SELECT * FROM user LIMIT 10 OFFSET 0', $sql); - } - - public function testModifyLimitQueryWithEmptyOffset() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10); - $this->assertEquals('SELECT * FROM user LIMIT 10', $sql); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Platforms/SqlitePlatformTest.php b/tests/Doctrine/Tests/DBAL/Platforms/SqlitePlatformTest.php deleted file mode 100644 index fae5538e3..000000000 --- a/tests/Doctrine/Tests/DBAL/Platforms/SqlitePlatformTest.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Platforms; - -use Doctrine\DBAL\Platforms\SqlitePlatform; -use Doctrine\DBAL\Types\Type; - -require_once __DIR__ . '/../../TestInit.php'; - -class SqlitePlatformTest extends AbstractPlatformTestCase -{ - public function createPlatform() - { - return new SqlitePlatform; - } - - public function getGenerateTableSql() - { - return 'CREATE TABLE test (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, test VARCHAR(255) DEFAULT NULL)'; - } - - public function getGenerateTableWithMultiColumnUniqueIndexSql() - { - return array( - 'CREATE TABLE test (foo VARCHAR(255) DEFAULT NULL, bar VARCHAR(255) DEFAULT NULL)', - 'CREATE UNIQUE INDEX test_foo_bar_uniq ON test (foo, bar)', - ); - } - - public function testGeneratesSqlSnippets() - { - $this->assertEquals('RLIKE', $this->_platform->getRegexpExpression(), 'Regular expression operator is not correct'); - $this->assertEquals('SUBSTR(column, 5, LENGTH(column))', $this->_platform->getSubstringExpression('column', 5), 'Substring expression without length is not correct'); - $this->assertEquals('SUBSTR(column, 0, 5)', $this->_platform->getSubstringExpression('column', 0, 5), 'Substring expression with length is not correct'); - } - - public function testGeneratesTransactionCommands() - { - $this->assertEquals( - 'PRAGMA read_uncommitted = 0', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_UNCOMMITTED) - ); - $this->assertEquals( - 'PRAGMA read_uncommitted = 1', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_COMMITTED) - ); - $this->assertEquals( - 'PRAGMA read_uncommitted = 1', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_REPEATABLE_READ) - ); - $this->assertEquals( - 'PRAGMA read_uncommitted = 1', - $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_SERIALIZABLE) - ); - } - - public function testPrefersIdentityColumns() - { - $this->assertTrue($this->_platform->prefersIdentityColumns()); - } - - public function testGeneratesTypeDeclarationForIntegers() - { - $this->assertEquals( - 'INTEGER', - $this->_platform->getIntegerTypeDeclarationSQL(array()) - ); - $this->assertEquals( - 'INTEGER AUTOINCREMENT', - $this->_platform->getIntegerTypeDeclarationSQL(array('autoincrement' => true)) - ); - $this->assertEquals( - 'INTEGER PRIMARY KEY AUTOINCREMENT', - $this->_platform->getIntegerTypeDeclarationSQL( - array('autoincrement' => true, 'primary' => true)) - ); - } - - public function testGeneratesTypeDeclarationForStrings() - { - $this->assertEquals( - 'CHAR(10)', - $this->_platform->getVarcharTypeDeclarationSQL( - array('length' => 10, 'fixed' => true)) - ); - $this->assertEquals( - 'VARCHAR(50)', - $this->_platform->getVarcharTypeDeclarationSQL(array('length' => 50)), - 'Variable string declaration is not correct' - ); - $this->assertEquals( - 'TEXT', - $this->_platform->getVarcharTypeDeclarationSQL(array()), - 'Long string declaration is not correct' - ); - } - - public function getGenerateIndexSql() - { - return 'CREATE INDEX my_idx ON mytable (user_name, last_login)'; - } - - public function getGenerateUniqueIndexSql() - { - return 'CREATE UNIQUE INDEX index_name ON test (test, test2)'; - } - - public function getGenerateForeignKeySql() - { - $this->markTestSkipped('SQLite does not support ForeignKeys.'); - } - - public function testModifyLimitQuery() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10, 0); - $this->assertEquals('SELECT * FROM user LIMIT 10 OFFSET 0', $sql); - } - - public function testModifyLimitQueryWithEmptyOffset() - { - $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10); - $this->assertEquals('SELECT * FROM user LIMIT 10', $sql); - } - - public function getGenerateAlterTableSql() - { - $this->markTestSkipped('SQlite does not support ALTER Table.'); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Schema/ColumnTest.php b/tests/Doctrine/Tests/DBAL/Schema/ColumnTest.php deleted file mode 100644 index 4b6cd85a4..000000000 --- a/tests/Doctrine/Tests/DBAL/Schema/ColumnTest.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Schema; - -require_once __DIR__ . '/../../TestInit.php'; - -use Doctrine\DBAL\Schema\Schema; -use Doctrine\DBAL\Schema\Table; -use Doctrine\DBAL\Schema\Column; -use Doctrine\DBAL\Types\Type; - -class ColumnTest extends \PHPUnit_Framework_TestCase -{ - public function testGet() - { - $column = $this->createColumn(); - - $this->assertEquals("foo", $column->getName()); - $this->assertSame(Type::getType('string'), $column->getType()); - - $this->assertEquals(200, $column->getLength()); - $this->assertEquals(5, $column->getPrecision()); - $this->assertEquals(2, $column->getScale()); - $this->assertTrue($column->getUnsigned()); - $this->assertFalse($column->getNotNull()); - $this->assertTrue($column->getFixed()); - $this->assertEquals("baz", $column->getDefault()); - - $this->assertEquals(array('foo' => 'bar'), $column->getPlatformOptions()); - $this->assertTrue($column->hasPlatformOption('foo')); - $this->assertEquals('bar', $column->getPlatformOption('foo')); - $this->assertFalse($column->hasPlatformOption('bar')); - } - - public function testToArray() - { - $expected = array( - 'name' => 'foo', - 'type' => Type::getType('string'), - 'default' => 'baz', - 'notnull' => false, - 'length' => 200, - 'precision' => 5, - 'scale' => 2, - 'fixed' => true, - 'unsigned' => true, - 'columnDefinition' => null, - 'foo' => 'bar', - ); - - $this->assertEquals($expected, $this->createColumn()->toArray()); - } - - /** - * @return Column - */ - public function createColumn() - { - $options = array( - 'length' => 200, - 'precision' => 5, - 'scale' => 2, - 'unsigned' => true, - 'notnull' => false, - 'fixed' => true, - 'default' => 'baz', - 'platformOptions' => array('foo' => 'bar'), - ); - - $string = Type::getType('string'); - return new Column("foo", $string, $options); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Schema/ComparatorTest.php b/tests/Doctrine/Tests/DBAL/Schema/ComparatorTest.php deleted file mode 100644 index 4433ef924..000000000 --- a/tests/Doctrine/Tests/DBAL/Schema/ComparatorTest.php +++ /dev/null @@ -1,600 +0,0 @@ -<?php -/* - * $Id$ - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * This software consists of voluntary contributions made by many individuals - * and is licensed under the LGPL. For more information, see - * <http://www.doctrine-project.org>. - */ - -namespace Doctrine\Tests\DBAL\Schema; - -require_once __DIR__ . '/../../TestInit.php'; - -use Doctrine\DBAL\Schema\Schema, - Doctrine\DBAL\Schema\Table, - Doctrine\DBAL\Schema\Column, - Doctrine\DBAL\Schema\Index, - Doctrine\DBAL\Schema\Sequence, - Doctrine\DBAL\Schema\SchemaDiff, - Doctrine\DBAL\Schema\TableDiff, - Doctrine\DBAL\Schema\Comparator, - Doctrine\DBAL\Types\Type, - Doctrine\DBAL\Schema\ForeignKeyConstraint; - -/** - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved. - * @license http://ez.no/licenses/new_bsd New BSD License - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei <kontakt@beberlei.de> - */ -class ComparatorTest extends \PHPUnit_Framework_TestCase -{ - public function testCompareSame1() - { - $schema1 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer' ) ), - ) - ), - ) ); - $schema2 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer') ), - ) - ), - ) ); - - $this->assertEquals(new SchemaDiff(), Comparator::compareSchemas( $schema1, $schema2 ) ); - } - - public function testCompareSame2() - { - $schema1 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ) - ), - ) ); - $schema2 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - ) - ), - ) ); - $this->assertEquals(new SchemaDiff(), Comparator::compareSchemas( $schema1, $schema2 ) ); - } - - public function testCompareMissingTable() - { - $schemaConfig = new \Doctrine\DBAL\Schema\SchemaConfig; - $table = new Table('bugdb', array ('integerfield1' => new Column('integerfield1', Type::getType('integer')))); - $table->setSchemaConfig($schemaConfig); - - $schema1 = new Schema( array($table), array(), $schemaConfig ); - $schema2 = new Schema( array(), array(), $schemaConfig ); - - $expected = new SchemaDiff( array(), array(), array('bugdb' => $table) ); - - $this->assertEquals($expected, Comparator::compareSchemas( $schema1, $schema2 ) ); - } - - public function testCompareNewTable() - { - $schemaConfig = new \Doctrine\DBAL\Schema\SchemaConfig; - $table = new Table('bugdb', array ('integerfield1' => new Column('integerfield1', Type::getType('integer')))); - $table->setSchemaConfig($schemaConfig); - - $schema1 = new Schema( array(), array(), $schemaConfig ); - $schema2 = new Schema( array($table), array(), $schemaConfig ); - - $expected = new SchemaDiff( array('bugdb' => $table), array(), array() ); - $this->assertEquals($expected, Comparator::compareSchemas( $schema1, $schema2 ) ); - } - - public function testCompareMissingField() - { - $missingColumn = new Column('integerfield1', Type::getType('integer')); - $schema1 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => $missingColumn, - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ) - ), - ) ); - $schema2 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ) - ), - ) ); - - $expected = new SchemaDiff ( array(), - array ( - 'bugdb' => new TableDiff( 'bugdb', array(), array(), - array ( - 'integerfield1' => $missingColumn, - ) - ) - ) - ); - $this->assertEquals($expected, Comparator::compareSchemas( $schema1, $schema2 ) ); - } - - public function testCompareNewField() - { - $schema1 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - ) - ), - ) ); - $schema2 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ) - ), - ) ); - - $expected = new SchemaDiff ( array(), - array ( - 'bugdb' => new TableDiff ('bugdb', - array ( - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ) - ), - ) - ); - $this->assertEquals($expected, Comparator::compareSchemas( $schema1, $schema2 ) ); - } - - public function testCompareChangedColumns_ChangeType() - { - $column1 = new Column('charfield1', Type::getType('string')); - $column2 = new Column('charfield1', Type::getType('integer')); - - $c = new Comparator(); - $this->assertEquals(array('type'), $c->diffColumn($column1, $column2)); - $this->assertEquals(array(), $c->diffColumn($column1, $column1)); - } - - public function testCompareRemovedIndex() - { - $schema1 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ), - array ( - 'primary' => new Index('primary', - array( - 'integerfield1' - ), - true - ) - ) - ), - ) ); - $schema2 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ) - ), - ) ); - - $expected = new SchemaDiff ( array(), - array ( - 'bugdb' => new TableDiff( 'bugdb', array(), array(), array(), array(), array(), - array ( - 'primary' => new Index('primary', - array( - 'integerfield1' - ), - true - ) - ) - ), - ) - ); - $this->assertEquals($expected, Comparator::compareSchemas( $schema1, $schema2 ) ); - } - - public function testCompareNewIndex() - { - $schema1 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ) - ), - ) ); - $schema2 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ), - array ( - 'primary' => new Index('primary', - array( - 'integerfield1' - ), - true - ) - ) - ), - ) ); - - $expected = new SchemaDiff ( array(), - array ( - 'bugdb' => new TableDiff( 'bugdb', array(), array(), array(), - array ( - 'primary' => new Index('primary', - array( - 'integerfield1' - ), - true - ) - ) - ), - ) - ); - $this->assertEquals($expected, Comparator::compareSchemas( $schema1, $schema2 ) ); - } - - public function testCompareChangedIndex() - { - $schema1 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ), - array ( - 'primary' => new Index('primary', - array( - 'integerfield1' - ), - true - ) - ) - ), - ) ); - $schema2 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ), - array ( - 'primary' => new Index('primary', - array('integerfield1', 'integerfield2'), - true - ) - ) - ), - ) ); - - $expected = new SchemaDiff ( array(), - array ( - 'bugdb' => new TableDiff( 'bugdb', array(), array(), array(), array(), - array ( - 'primary' => new Index('primary', - array( - 'integerfield1', - 'integerfield2' - ), - true - ) - ) - ), - ) - ); - $actual = Comparator::compareSchemas( $schema1, $schema2 ); - $this->assertEquals($expected, $actual); - } - - public function testCompareChangedIndexFieldPositions() - { - $schema1 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ), - array ( - 'primary' => new Index('primary', array('integerfield1', 'integerfield2'), true) - ) - ), - ) ); - $schema2 = new Schema( array( - 'bugdb' => new Table('bugdb', - array ( - 'integerfield1' => new Column('integerfield1', Type::getType('integer')), - 'integerfield2' => new Column('integerfield2', Type::getType('integer')), - ), - array ( - 'primary' => new Index('primary', array('integerfield2', 'integerfield1'), true) - ) - ), - ) ); - - $expected = new SchemaDiff ( array(), - array ( - 'bugdb' => new TableDiff('bugdb', array(), array(), array(), array(), - array ( - 'primary' => new Index('primary', array('integerfield2', 'integerfield1'), true) - ) - ), - ) - ); - $actual = Comparator::compareSchemas( $schema1, $schema2 ); - $this->assertEquals($expected, $actual); - } - - public function testCompareSequences() - { - $seq1 = new Sequence('foo', 1, 1); - $seq2 = new Sequence('foo', 1, 2); - $seq3 = new Sequence('foo', 2, 1); - - $c = new Comparator(); - - $this->assertTrue($c->diffSequence($seq1, $seq2)); - $this->assertTrue($c->diffSequence($seq1, $seq3)); - } - - public function testRemovedSequence() - { - $schema1 = new Schema(); - $seq = $schema1->createSequence('foo'); - - $schema2 = new Schema(); - - $c = new Comparator(); - $diffSchema = $c->compare($schema1, $schema2); - - $this->assertEquals(1, count($diffSchema->removedSequences)); - $this->assertSame($seq, $diffSchema->removedSequences[0]); - } - - public function testAddedSequence() - { - $schema1 = new Schema(); - - $schema2 = new Schema(); - $seq = $schema2->createSequence('foo'); - - $c = new Comparator(); - $diffSchema = $c->compare($schema1, $schema2); - - $this->assertEquals(1, count($diffSchema->newSequences)); - $this->assertSame($seq, $diffSchema->newSequences[0]); - } - - public function testTableAddForeignKey() - { - $tableForeign = new Table("bar"); - $tableForeign->addColumn('id', 'integer'); - - $table1 = new Table("foo"); - $table1->addColumn('fk', 'integer'); - - $table2 = new Table("foo"); - $table2->addColumn('fk', 'integer'); - $table2->addForeignKeyConstraint($tableForeign, array('fk'), array('id')); - - $c = new Comparator(); - $tableDiff = $c->diffTable($table1, $table2); - - $this->assertType('Doctrine\DBAL\Schema\TableDiff', $tableDiff); - $this->assertEquals(1, count($tableDiff->addedForeignKeys)); - } - - public function testTableRemoveForeignKey() - { - $tableForeign = new Table("bar"); - $tableForeign->addColumn('id', 'integer'); - - $table1 = new Table("foo"); - $table1->addColumn('fk', 'integer'); - - $table2 = new Table("foo"); - $table2->addColumn('fk', 'integer'); - $table2->addForeignKeyConstraint($tableForeign, array('fk'), array('id')); - - $c = new Comparator(); - $tableDiff = $c->diffTable($table2, $table1); - - $this->assertType('Doctrine\DBAL\Schema\TableDiff', $tableDiff); - $this->assertEquals(1, count($tableDiff->removedForeignKeys)); - } - - public function testTableUpdateForeignKey() - { - $tableForeign = new Table("bar"); - $tableForeign->addColumn('id', 'integer'); - - $table1 = new Table("foo"); - $table1->addColumn('fk', 'integer'); - $table1->addForeignKeyConstraint($tableForeign, array('fk'), array('id')); - - $table2 = new Table("foo"); - $table2->addColumn('fk', 'integer'); - $table2->addForeignKeyConstraint($tableForeign, array('fk'), array('id'), array('onUpdate' => 'CASCADE')); - - $c = new Comparator(); - $tableDiff = $c->diffTable($table1, $table2); - - $this->assertType('Doctrine\DBAL\Schema\TableDiff', $tableDiff); - $this->assertEquals(1, count($tableDiff->changedForeignKeys)); - } - - public function testTablesCaseInsensitive() - { - $schemaA = new Schema(); - $schemaA->createTable('foo'); - $schemaA->createTable('bAr'); - $schemaA->createTable('BAZ'); - $schemaA->createTable('new'); - - $schemaB = new Schema(); - $schemaB->createTable('FOO'); - $schemaB->createTable('bar'); - $schemaB->createTable('Baz'); - $schemaB->createTable('old'); - - $c = new Comparator(); - $diff = $c->compare($schemaA, $schemaB); - - $this->assertSchemaTableChangeCount($diff, 1, 0, 1); - } - - public function testSequencesCaseInsenstive() - { - $schemaA = new Schema(); - $schemaA->createSequence('foo'); - $schemaA->createSequence('BAR'); - $schemaA->createSequence('Baz'); - $schemaA->createSequence('new'); - - $schemaB = new Schema(); - $schemaB->createSequence('FOO'); - $schemaB->createSequence('Bar'); - $schemaB->createSequence('baz'); - $schemaB->createSequence('old'); - - $c = new Comparator(); - $diff = $c->compare($schemaA, $schemaB); - - $this->assertSchemaSequenceChangeCount($diff, 1, 0, 1); - } - - public function testCompareColumnCompareCaseInsensitive() - { - $tableA = new Table("foo"); - $tableA->addColumn('id', 'integer'); - - $tableB = new Table("foo"); - $tableB->addColumn('ID', 'integer'); - - $c = new Comparator(); - $tableDiff = $c->diffTable($tableA, $tableB); - - $this->assertFalse($tableDiff); - } - - public function testCompareIndexBasedOnPropertiesNotName() - { - $tableA = new Table("foo"); - $tableA->addColumn('id', 'integer'); - $tableA->addIndex(array("id"), "foo_bar_idx"); - - $tableB = new Table("foo"); - $tableB->addColumn('ID', 'integer'); - $tableB->addIndex(array("id"), "bar_foo_idx"); - - $c = new Comparator(); - $tableDiff = $c->diffTable($tableA, $tableB); - - $this->assertFalse($tableDiff); - } - - public function testCompareForeignKeyBasedOnPropertiesNotName() - { - $tableA = new Table("foo"); - $tableA->addColumn('id', 'integer'); - $tableA->addNamedForeignKeyConstraint('foo_constraint', 'bar', array('id'), array('id')); - - $tableB = new Table("foo"); - $tableB->addColumn('ID', 'integer'); - $tableB->addNamedForeignKeyConstraint('bar_constraint', 'bar', array('id'), array('id')); - - $c = new Comparator(); - $tableDiff = $c->diffTable($tableA, $tableB); - - $this->assertFalse($tableDiff); - } - - public function testCompareForeignKey_RestrictNoAction_AreTheSame() - { - $fk1 = new ForeignKeyConstraint(array("foo"), "bar", array("baz"), "fk1", array('onDelete' => 'NO ACTION')); - $fk2 = new ForeignKeyConstraint(array("foo"), "bar", array("baz"), "fk1", array('onDelete' => 'RESTRICT')); - - $c = new Comparator(); - $this->assertFalse($c->diffForeignKey($fk1, $fk2)); - } - - public function testDetectRenameColumn() - { - $tableA = new Table("foo"); - $tableA->addColumn('foo', 'integer'); - - $tableB = new Table("foo"); - $tableB->addColumn('bar', 'integer'); - - $c = new Comparator(); - $tableDiff = $c->diffTable($tableA, $tableB); - - $this->assertEquals(0, count($tableDiff->addedColumns)); - $this->assertEquals(0, count($tableDiff->removedColumns)); - $this->assertArrayHasKey('foo', $tableDiff->renamedColumns); - $this->assertEquals('bar', $tableDiff->renamedColumns['foo']->getName()); - } - - /** - * @param SchemaDiff $diff - * @param int $newTableCount - * @param int $changeTableCount - * @param int $removeTableCount - */ - public function assertSchemaTableChangeCount($diff, $newTableCount=0, $changeTableCount=0, $removeTableCount=0) - { - $this->assertEquals($newTableCount, count($diff->newTables)); - $this->assertEquals($changeTableCount, count($diff->changedTables)); - $this->assertEquals($removeTableCount, count($diff->removedTables)); - } - - /** - * @param SchemaDiff $diff - * @param int $newSequenceCount - * @param int $changeSequenceCount - * @param int $changeSequenceCount - */ - public function assertSchemaSequenceChangeCount($diff, $newSequenceCount=0, $changeSequenceCount=0, $removeSequenceCount=0) - { - $this->assertEquals($newSequenceCount, count($diff->newSequences), "Expected number of new sequences is wrong."); - $this->assertEquals($changeSequenceCount, count($diff->changedSequences), "Expected number of changed sequences is wrong."); - $this->assertEquals($removeSequenceCount, count($diff->removedSequences), "Expected number of removed sequences is wrong."); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Schema/IndexTest.php b/tests/Doctrine/Tests/DBAL/Schema/IndexTest.php deleted file mode 100644 index 338fbedc8..000000000 --- a/tests/Doctrine/Tests/DBAL/Schema/IndexTest.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Schema; - -require_once __DIR__ . '/../../TestInit.php'; - -use Doctrine\DBAL\Schema\Schema; -use Doctrine\DBAL\Schema\Table; -use Doctrine\DBAL\Schema\Column; -use Doctrine\DBAL\Schema\Index; - -class IndexTest extends \PHPUnit_Framework_TestCase -{ - public function createIndex($unique=false, $primary=false) - { - return new Index("foo", array("bar", "baz"), $unique, $primary); - } - - public function testCreateIndex() - { - $idx = $this->createIndex(); - $this->assertEquals("foo", $idx->getName()); - $columns = $idx->getColumns(); - $this->assertEquals(2, count($columns)); - $this->assertEquals(array("bar", "baz"), $columns); - $this->assertFalse($idx->isUnique()); - $this->assertFalse($idx->isPrimary()); - } - - public function testCreatePrimary() - { - $idx = $this->createIndex(false, true); - $this->assertTrue($idx->isUnique()); - $this->assertTrue($idx->isPrimary()); - } - - public function testCreateUnique() - { - $idx = $this->createIndex(true, false); - $this->assertTrue($idx->isUnique()); - $this->assertFalse($idx->isPrimary()); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Schema/SchemaDiffTest.php b/tests/Doctrine/Tests/DBAL/Schema/SchemaDiffTest.php deleted file mode 100644 index ecffaf5d1..000000000 --- a/tests/Doctrine/Tests/DBAL/Schema/SchemaDiffTest.php +++ /dev/null @@ -1,97 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Schema; - -require_once __DIR__ . '/../../TestInit.php'; - -use Doctrine\DBAL\Schema\Schema, - Doctrine\DBAL\Schema\Table, - Doctrine\DBAL\Schema\Column, - Doctrine\DBAL\Schema\Index, - Doctrine\DBAL\Schema\Sequence, - Doctrine\DBAL\Schema\SchemaDiff, - Doctrine\DBAL\Schema\TableDiff, - Doctrine\DBAL\Schema\Comparator, - Doctrine\DBAL\Types\Type; - -class SchemaDiffTest extends \PHPUnit_Framework_TestCase -{ - public function testSchemaDiffToSql() - { - $diff = $this->createSchemaDiff(); - $platform = $this->createPlatform(); - - $sql = $diff->toSql($platform); - - $expected = array('drop_orphan_fk', 'drop_seq', 'create_seq', 'drop_seq', 'create_seq', 'create_table', 'drop_table', 'alter_table'); - - $this->assertEquals($expected, $sql); - } - - public function testSchemaDiffToSaveSql() - { - $diff = $this->createSchemaDiff(); - $platform = $this->createPlatform(1, 0, 0); - - $sql = $diff->toSaveSql($platform); - - $expected = array('drop_seq', 'create_seq', 'create_seq', 'create_table', 'alter_table'); - - $this->assertEquals($expected, $sql); - } - - public function createPlatform($dropSequenceCount=2, $dropTableCount=1, $dropOrphanedFkCount=1) - { - $platform = $this->getMock('Doctrine\Tests\DBAL\Mocks\MockPlatform'); - $platform->expects($this->exactly($dropSequenceCount)) - ->method('getDropSequenceSql') - ->with($this->isInstanceOf('Doctrine\DBAL\Schema\Sequence')) - ->will($this->returnValue('drop_seq')); - $platform->expects($this->exactly(2)) - ->method('getCreateSequenceSql') - ->with($this->isInstanceOf('Doctrine\DBAL\Schema\Sequence')) - ->will($this->returnValue('create_seq')); - if ($dropTableCount > 0) { - $platform->expects($this->exactly($dropTableCount)) - ->method('getDropTableSql') - ->with($this->isInstanceof('Doctrine\DBAL\Schema\Table')) - ->will($this->returnValue('drop_table')); - } - $platform->expects($this->exactly(1)) - ->method('getCreateTableSql') - ->with($this->isInstanceof('Doctrine\DBAL\Schema\Table')) - ->will($this->returnValue(array('create_table'))); - $platform->expects($this->exactly(1)) - ->method('getAlterTableSql') - ->with($this->isInstanceOf('Doctrine\DBAL\Schema\TableDiff')) - ->will($this->returnValue(array('alter_table'))); - if ($dropOrphanedFkCount > 0) { - $platform->expects($this->exactly($dropOrphanedFkCount)) - ->method('getDropForeignKeySql') - ->with($this->isInstanceof('Doctrine\DBAL\Schema\ForeignKeyConstraint'), $this->equalTo('local_table')) - ->will($this->returnValue('drop_orphan_fk')); - } - $platform->expects($this->exactly(1)) - ->method('supportsSequences') - ->will($this->returnValue(true)); - $platform->expects($this->exactly(1)) - ->method('supportsForeignKeyConstraints') - ->will($this->returnValue(true)); - return $platform; - } - - public function createSchemaDiff() - { - $diff = new SchemaDiff(); - $diff->changedSequences['foo_seq'] = new Sequence('foo_seq'); - $diff->newSequences['bar_seq'] = new Sequence('bar_seq'); - $diff->removedSequences['baz_seq'] = new Sequence('baz_seq'); - $diff->newTables['foo_table'] = new Table('foo_table'); - $diff->removedTables['bar_table'] = new Table('bar_table'); - $diff->changedTables['baz_table'] = new TableDiff('baz_table'); - $fk = new \Doctrine\DBAL\Schema\ForeignKeyConstraint(array('id'), 'foreign_table', array('id')); - $fk->setLocalTable(new Table('local_table')); - $diff->orphanedForeignKeys[] = $fk; - return $diff; - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Schema/SchemaTest.php b/tests/Doctrine/Tests/DBAL/Schema/SchemaTest.php deleted file mode 100644 index 9e073fdd4..000000000 --- a/tests/Doctrine/Tests/DBAL/Schema/SchemaTest.php +++ /dev/null @@ -1,243 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Schema; - -require_once __DIR__ . '/../../TestInit.php'; - -use Doctrine\DBAL\Schema\Schema; -use Doctrine\DBAL\Schema\Table; -use Doctrine\DBAL\Schema\Sequence; - -class SchemaTest extends \PHPUnit_Framework_TestCase -{ - public function testAddTable() - { - $tableName = "foo"; - $table = new Table($tableName); - - $schema = new Schema(array($table)); - - $this->assertTrue($schema->hasTable($tableName)); - - $tables = $schema->getTables(); - $this->assertTrue( isset($tables[$tableName]) ); - $this->assertSame($table, $tables[$tableName]); - $this->assertSame($table, $schema->getTable($tableName)); - $this->assertTrue($schema->hasTable($tableName)); - } - - public function testTableMatchingCaseInsenstive() - { - $table = new Table("Foo"); - - $schema = new Schema(array($table)); - $this->assertTrue($schema->hasTable("foo")); - $this->assertTrue($schema->hasTable("FOO")); - - $this->assertSame($table, $schema->getTable('FOO')); - $this->assertSame($table, $schema->getTable('foo')); - $this->assertSame($table, $schema->getTable('Foo')); - } - - public function testGetUnknownTableThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $schema = new Schema(); - $schema->getTable("unknown"); - } - - public function testCreateTableTwiceThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $tableName = "foo"; - $table = new Table($tableName); - $tables = array($table, $table); - - $schema = new Schema($tables); - } - - public function testRenameTable() - { - $tableName = "foo"; - $table = new Table($tableName); - $schema = new Schema(array($table)); - - $this->assertTrue($schema->hasTable("foo")); - $schema->renameTable("foo", "bar"); - $this->assertFalse($schema->hasTable("foo")); - $this->assertTrue($schema->hasTable("bar")); - $this->assertSame($table, $schema->getTable("bar")); - } - - public function testDropTable() - { - $tableName = "foo"; - $table = new Table($tableName); - $schema = new Schema(array($table)); - - $this->assertTrue($schema->hasTable("foo")); - - $schema->dropTable("foo"); - - $this->assertFalse($schema->hasTable("foo")); - } - - public function testCreateTable() - { - $schema = new Schema(); - - $this->assertFalse($schema->hasTable("foo")); - - $table = $schema->createTable("foo"); - - $this->assertType('Doctrine\DBAL\Schema\Table', $table); - $this->assertEquals("foo", $table->getName()); - $this->assertTrue($schema->hasTable("foo")); - } - - public function testAddSequences() - { - $sequence = new Sequence("a_seq", 1, 1); - - $schema = new Schema(array(), array($sequence)); - - $this->assertTrue($schema->hasSequence("a_seq")); - $this->assertType('Doctrine\DBAL\Schema\Sequence', $schema->getSequence("a_seq")); - - $sequences = $schema->getSequences(); - $this->assertArrayHasKey('a_seq', $sequences); - } - - public function testSequenceAccessCaseInsensitive() - { - $sequence = new Sequence("a_Seq"); - - $schema = new Schema(array(), array($sequence)); - $this->assertTrue($schema->hasSequence('a_seq')); - $this->assertTrue($schema->hasSequence('a_Seq')); - $this->assertTrue($schema->hasSequence('A_SEQ')); - - $this->assertEquals($sequence, $schema->getSequence('a_seq')); - $this->assertEquals($sequence, $schema->getSequence('a_Seq')); - $this->assertEquals($sequence, $schema->getSequence('A_SEQ')); - } - - public function testGetUnknownSequenceThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $schema = new Schema(); - $schema->getSequence("unknown"); - } - - public function testCreateSequence() - { - $schema = new Schema(); - $sequence = $schema->createSequence('a_seq', 10, 20); - - $this->assertEquals('a_seq', $sequence->getName()); - $this->assertEquals(10, $sequence->getAllocationSize()); - $this->assertEquals(20, $sequence->getInitialValue()); - - $this->assertTrue($schema->hasSequence("a_seq")); - $this->assertType('Doctrine\DBAL\Schema\Sequence', $schema->getSequence("a_seq")); - - $sequences = $schema->getSequences(); - $this->assertArrayHasKey('a_seq', $sequences); - } - - public function testDropSequence() - { - $sequence = new Sequence("a_seq", 1, 1); - - $schema = new Schema(array(), array($sequence)); - - $schema->dropSequence("a_seq"); - $this->assertFalse($schema->hasSequence("a_seq")); - } - - public function testAddSequenceTwiceThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $sequence = new Sequence("a_seq", 1, 1); - - $schema = new Schema(array(), array($sequence, $sequence)); - } - - public function testFixSchema_AddExplicitIndexForForeignKey() - { - $schema = new Schema(); - $tableA = $schema->createTable('foo'); - $tableA->addColumn('id', 'integer'); - - $tableB = $schema->createTable('bar'); - $tableB->addColumn('id', 'integer'); - $tableB->addColumn('foo_id', 'integer'); - $tableB->addForeignKeyConstraint($tableA, array('foo_id'), array('id')); - - $this->assertEquals(0, count($tableB->getIndexes())); - - $schema->visit(new \Doctrine\DBAL\Schema\Visitor\FixSchema(true)); - - $this->assertEquals(1, count($tableB->getIndexes())); - $indexes = $tableB->getIndexes(); - $index = current($indexes); - $this->assertTrue($index->hasColumnAtPosition('foo_id', 0)); - } - - public function testConfigHasExplicitForeignKeyIndex() - { - $schemaConfig = new \Doctrine\DBAL\Schema\SchemaConfig(); - $schemaConfig->setExplicitForeignKeyIndexes(false); - - $schema = new Schema(array(), array(), $schemaConfig); - $this->assertFalse($schema->hasExplicitForeignKeyIndexes()); - - $schemaConfig->setExplicitForeignKeyIndexes(true); - $this->assertTrue($schema->hasExplicitForeignKeyIndexes()); - } - - public function testConfigMaxIdentifierLength() - { - $schemaConfig = new \Doctrine\DBAL\Schema\SchemaConfig(); - $schemaConfig->setMaxIdentifierLength(10); - - $schema = new Schema(array(), array(), $schemaConfig); - $table = $schema->createTable("smalltable"); - $table->addColumn('long_id', 'integer'); - $table->addIndex(array('long_id')); - - $this->assertTrue($table->hasIndex('le_id_idx')); - } - - public function testDeepClone() - { - $schema = new Schema(); - $sequence = $schema->createSequence('baz'); - - $tableA = $schema->createTable('foo'); - $tableA->addColumn('id', 'integer'); - - $tableB = $schema->createTable('bar'); - $tableB->addColumn('id', 'integer'); - $tableB->addColumn('foo_id', 'integer'); - $tableB->addForeignKeyConstraint($tableA, array('foo_id'), array('id')); - - $schemaNew = clone $schema; - - $this->assertNotSame($sequence, $schemaNew->getSequence('baz')); - - $this->assertNotSame($tableA, $schemaNew->getTable('foo')); - $this->assertNotSame($tableA->getColumn('id'), $schemaNew->getTable('foo')->getColumn('id')); - - $this->assertNotSame($tableB, $schemaNew->getTable('bar')); - $this->assertNotSame($tableB->getColumn('id'), $schemaNew->getTable('bar')->getColumn('id')); - - $fk = $schemaNew->getTable('bar')->getForeignKeys(); - $fk = current($fk); - $this->assertSame($schemaNew->getTable('bar'), $this->readAttribute($fk, '_localTable')); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Schema/TableTest.php b/tests/Doctrine/Tests/DBAL/Schema/TableTest.php deleted file mode 100644 index 652e475b9..000000000 --- a/tests/Doctrine/Tests/DBAL/Schema/TableTest.php +++ /dev/null @@ -1,362 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Schema; - -require_once __DIR__ . '/../../TestInit.php'; - -use Doctrine\DBAL\Schema\Schema; -use Doctrine\DBAL\Schema\Table; -use Doctrine\DBAL\Schema\TableBuilder; -use Doctrine\DBAL\Schema\Column; -use Doctrine\DBAL\Schema\Index; -use Doctrine\DBAL\Schema\ForeignKeyConstraint; -use Doctrine\DBAL\Types\Type; - -class TableTest extends \PHPUnit_Framework_TestCase -{ - public function testCreateWithInvalidTableName() - { - $this->setExpectedException('Doctrine\DBAL\DBALException'); - $table = new \Doctrine\DBAL\Schema\Table(''); - } - - public function testGetName() - { - $table = new Table("foo", array(), array(), array()); - $this->assertEquals("foo", $table->getName()); - } - - public function testColumns() - { - $type = Type::getType('integer'); - $columns = array(); - $columns[] = new Column("foo", $type); - $columns[] = new Column("bar", $type); - $table = new Table("foo", $columns, array(), array()); - - $this->assertTrue($table->hasColumn("foo")); - $this->assertTrue($table->hasColumn("bar")); - $this->assertFalse($table->hasColumn("baz")); - - $this->assertType('Doctrine\DBAL\Schema\Column', $table->getColumn("foo")); - $this->assertType('Doctrine\DBAL\Schema\Column', $table->getColumn("bar")); - - $this->assertEquals(2, count($table->getColumns())); - } - - public function testColumnsCaseInsensitive() - { - $table = new Table("foo"); - $column = $table->addColumn('Foo', 'integer'); - - $this->assertTrue($table->hasColumn('Foo')); - $this->assertTrue($table->hasColumn('foo')); - $this->assertTrue($table->hasColumn('FOO')); - - $this->assertSame($column, $table->getColumn('Foo')); - $this->assertSame($column, $table->getColumn('foo')); - $this->assertSame($column, $table->getColumn('FOO')); - } - - public function testCreateColumn() - { - $type = Type::getType('integer'); - - $table = new Table("foo"); - - $this->assertFalse($table->hasColumn("bar")); - $table->addColumn("bar", 'integer'); - $this->assertTrue($table->hasColumn("bar")); - $this->assertSame($type, $table->getColumn("bar")->getType()); - } - - public function testDropColumn() - { - $type = Type::getType('integer'); - $columns = array(); - $columns[] = new Column("foo", $type); - $columns[] = new Column("bar", $type); - $table = new Table("foo", $columns, array(), array()); - - $this->assertTrue($table->hasColumn("foo")); - $this->assertTrue($table->hasColumn("bar")); - - $table->dropColumn("foo")->dropColumn("bar"); - - $this->assertFalse($table->hasColumn("foo")); - $this->assertFalse($table->hasColumn("bar")); - } - - public function testGetUnknownColumnThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $table = new Table("foo", array(), array(), array()); - $table->getColumn('unknown'); - } - - public function testAddColumnTwiceThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $type = \Doctrine\DBAL\Types\Type::getType('integer'); - $columns = array(); - $columns[] = new Column("foo", $type); - $columns[] = new Column("foo", $type); - $table = new Table("foo", $columns, array(), array()); - } - - public function testCreateIndex() - { - $type = \Doctrine\DBAL\Types\Type::getType('integer'); - $columns = array(new Column("foo", $type), new Column("bar", $type), new Column("baz", $type)); - $table = new Table("foo", $columns); - - $table->addIndex(array("foo", "bar", "baz")); - $table->addUniqueIndex(array("foo", "bar", "baz")); - - $this->assertTrue($table->hasIndex("foo_foo_bar_baz_idx")); - $this->assertTrue($table->hasIndex("foo_foo_bar_baz_uniq")); - } - - public function testIndexCaseInsensitive() - { - $type = \Doctrine\DBAL\Types\Type::getType('integer'); - $columns = array(new Column("foo", $type), new Column("bar", $type), new Column("baz", $type)); - $table = new Table("foo", $columns); - - $table->addIndex(array("foo", "bar", "baz"), "Foo_Idx"); - - $this->assertTrue($table->hasIndex('foo_idx')); - $this->assertTrue($table->hasIndex('Foo_Idx')); - $this->assertTrue($table->hasIndex('FOO_IDX')); - } - - public function testAddIndexes() - { - $type = \Doctrine\DBAL\Types\Type::getType('integer'); - $columns = array(new Column("foo", $type)); - $indexes = array( - new Index("the_primary", array("foo"), true, true), - new Index("foo_idx", array("foo"), false, false), - ); - $table = new Table("foo", $columns, $indexes, array()); - - $this->assertTrue($table->hasIndex("the_primary")); - $this->assertTrue($table->hasIndex("foo_idx")); - $this->assertFalse($table->hasIndex("some_idx")); - - $this->assertType('Doctrine\DBAL\Schema\Index', $table->getPrimaryKey()); - $this->assertType('Doctrine\DBAL\Schema\Index', $table->getIndex('the_primary')); - $this->assertType('Doctrine\DBAL\Schema\Index', $table->getIndex('foo_idx')); - } - - public function testGetUnknownIndexThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $table = new Table("foo", array(), array(), array()); - $table->getIndex("unknownIndex"); - } - - public function testAddTwoPrimaryThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $type = \Doctrine\DBAL\Types\Type::getType('integer'); - $columns = array(new Column("foo", $type), new Column("bar", $type)); - $indexes = array( - new Index("the_primary", array("foo"), true, true), - new Index("other_primary", array("bar"), true, true), - ); - $table = new Table("foo", $columns, $indexes, array()); - } - - public function testAddTwoIndexesWithSameNameThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $type = \Doctrine\DBAL\Types\Type::getType('integer'); - $columns = array(new Column("foo", $type), new Column("bar", $type)); - $indexes = array( - new Index("an_idx", array("foo"), false, false), - new Index("an_idx", array("bar"), false, false), - ); - $table = new Table("foo", $columns, $indexes, array()); - } - - public function testIdGenerator() - { - $tableA = new Table("foo", array(), array(), array(), Table::ID_NONE); - $this->assertFalse($tableA->isIdGeneratorIdentity()); - $this->assertFalse($tableA->isIdGeneratorSequence());; - - $tableB = new Table("foo", array(), array(), array(), Table::ID_IDENTITY); - $this->assertTrue($tableB->isIdGeneratorIdentity()); - $this->assertFalse($tableB->isIdGeneratorSequence());; - - $tableC = new Table("foo", array(), array(), array(), Table::ID_SEQUENCE); - $this->assertFalse($tableC->isIdGeneratorIdentity()); - $this->assertTrue($tableC->isIdGeneratorSequence());; - } - - public function testConstraints() - { - $constraint = new ForeignKeyConstraint(array(), "foo", array()); - - $tableA = new Table("foo", array(), array(), array($constraint)); - $constraints = $tableA->getForeignKeys(); - - $this->assertEquals(1, count($constraints)); - $this->assertSame($constraint, array_shift($constraints)); - } - - public function testOptions() - { - $table = new Table("foo", array(), array(), array(), Table::ID_NONE, array("foo" => "bar")); - - $this->assertTrue($table->hasOption("foo")); - $this->assertEquals("bar", $table->getOption("foo")); - } - - public function testBuilderSetPrimaryKey() - { - $table = new Table("foo"); - - $table->addColumn("bar", 'integer'); - $table->setPrimaryKey(array("bar")); - - $this->assertTrue($table->hasIndex("primary")); - $this->assertType('Doctrine\DBAL\Schema\Index', $table->getPrimaryKey()); - $this->assertTrue($table->getIndex("primary")->isUnique()); - $this->assertTrue($table->getIndex("primary")->isPrimary()); - } - - public function testBuilderAddUniqueIndex() - { - $table = new Table("foo"); - - $table->addColumn("bar", 'integer'); - $table->addUniqueIndex(array("bar"), "my_idx"); - - $this->assertTrue($table->hasIndex("my_idx")); - $this->assertTrue($table->getIndex("my_idx")->isUnique()); - $this->assertFalse($table->getIndex("my_idx")->isPrimary()); - } - - public function testBuilderAddIndex() - { - $table = new Table("foo"); - - $table->addColumn("bar", 'integer'); - $table->addIndex(array("bar"), "my_idx"); - - $this->assertTrue($table->hasIndex("my_idx")); - $this->assertFalse($table->getIndex("my_idx")->isUnique()); - $this->assertFalse($table->getIndex("my_idx")->isPrimary()); - } - - public function testBuilderAddIndexWithInvalidNameThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $table = new Table("foo"); - $table->addColumn("bar",'integer'); - $table->addIndex(array("bar"), "invalid name %&/"); - } - - public function testBuilderAddIndexWithUnknownColumnThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $table = new Table("foo"); - $table->addIndex(array("bar"), "invalidName"); - } - - public function testBuilderOptions() - { - $table = new Table("foo"); - $table->addOption("foo", "bar"); - $this->assertTrue($table->hasOption("foo")); - $this->assertEquals("bar", $table->getOption("foo")); - } - - public function testIdGeneratorType() - { - $table = new Table("foo"); - - $table->setIdGeneratorType(Table::ID_IDENTITY); - $this->assertTrue($table->isIdGeneratorIdentity()); - - $table->setIdGeneratorType(Table::ID_SEQUENCE); - $this->assertTrue($table->isIdGeneratorSequence()); - } - - public function testAddForeignKeyConstraint_UnknownLocalColumn_ThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $table = new Table("foo"); - $table->addColumn("id", 'integer'); - - $foreignTable = new Table("bar"); - $foreignTable->addColumn("id", 'integer'); - - $table->addForeignKeyConstraint($foreignTable, array("foo"), array("id")); - } - - public function testAddForeignKeyConstraint_UnknownForeignColumn_ThrowsException() - { - $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException"); - - $table = new Table("foo"); - $table->addColumn("id", 'integer'); - - $foreignTable = new Table("bar"); - $foreignTable->addColumn("id", 'integer'); - - $table->addForeignKeyConstraint($foreignTable, array("id"), array("foo")); - } - - public function testAddForeignKeyConstraint() - { - $table = new Table("foo"); - $table->addColumn("id", 'integer'); - - $foreignTable = new Table("bar"); - $foreignTable->addColumn("id", 'integer'); - - $table->addForeignKeyConstraint($foreignTable, array("id"), array("id"), array("foo" => "bar")); - - $constraints = $table->getForeignKeys(); - $this->assertEquals(1, count($constraints)); - $this->assertType('Doctrine\DBAL\Schema\ForeignKeyConstraint', $constraints["foo_id_fk"]); - - $this->assertEquals("foo_id_fk", $constraints["foo_id_fk"]->getName()); - $this->assertTrue($constraints["foo_id_fk"]->hasOption("foo")); - $this->assertEquals("bar", $constraints["foo_id_fk"]->getOption("foo")); - } - - public function testAddIndexWithCaseSensitiveColumnProblem() - { - $table = new Table("foo"); - $table->addColumn("id", 'integer'); - - $table->addIndex(array("ID"), "my_idx"); - - $this->assertTrue($table->hasIndex('my_idx')); - $this->assertEquals(array("ID"), $table->getIndex("my_idx")->getColumns()); - } - - public function testAddPrimaryKey_ColumnsAreExplicitlySetToNotNull() - { - $table = new Table("foo"); - $column = $table->addColumn("id", 'integer', array('notnull' => false)); - - $this->assertFalse($column->getNotnull()); - - $table->setPrimaryKey(array('id')); - - $this->assertTrue($column->getNotnull()); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Schema/Visitor/SchemaSqlCollectorTest.php b/tests/Doctrine/Tests/DBAL/Schema/Visitor/SchemaSqlCollectorTest.php deleted file mode 100644 index f38a609d1..000000000 --- a/tests/Doctrine/Tests/DBAL/Schema/Visitor/SchemaSqlCollectorTest.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Schema\Visitor; - -require_once __DIR__ . '/../../../TestInit.php'; - -use Doctrine\DBAL\Schema\Schema; -use Doctrine\DBAL\Schema\Table; -use Doctrine\DBAL\Types\Type; - -class SchemaSqlCollectorTest extends \PHPUnit_Framework_TestCase -{ - public function testCreateSchema() - { - $platformMock = $this->getMock( - 'Doctrine\DBAL\Platforms\MySqlPlatform', - array('getCreateTableSql', 'getCreateSequenceSql', 'getCreateForeignKeySql') - ); - $platformMock->expects($this->exactly(2)) - ->method('getCreateTableSql') - ->will($this->returnValue(array("foo"))); - $platformMock->expects($this->exactly(1)) - ->method('getCreateSequenceSql') - ->will($this->returnValue(array("bar"))); - $platformMock->expects($this->exactly(1)) - ->method('getCreateForeignKeySql') - ->will($this->returnValue(array("baz"))); - - $schema = $this->createFixtureSchema(); - - $sql = $schema->toSql($platformMock); - - $this->assertEquals(array("foo", "foo", "bar", "baz"), $sql); - } - - public function testDropSchema() - { - $platformMock = $this->getMock( - 'Doctrine\DBAL\Platforms\MySqlPlatform', - array('getDropTableSql', 'getDropSequenceSql', 'getDropForeignKeySql') - ); - $platformMock->expects($this->exactly(2)) - ->method('getDropTableSql') - ->will($this->returnValue("tbl")); - $platformMock->expects($this->exactly(1)) - ->method('getDropSequenceSql') - ->will($this->returnValue("seq")); - $platformMock->expects($this->exactly(1)) - ->method('getDropForeignKeySql') - ->will($this->returnValue("fk")); - - $schema = $this->createFixtureSchema(); - - $sql = $schema->toDropSql($platformMock); - - $this->assertEquals(array("fk", "seq", "tbl", "tbl"), $sql); - } - - /** - * @return Schema - */ - public function createFixtureSchema() - { - $schema = new Schema(); - $tableA = $schema->createTable("foo"); - $tableA->addColumn("id", 'integer'); - $tableA->addColumn("bar", 'string', array('length' => 255)); - $tableA->setPrimaryKey(array("id")); - $tableA->setIdGeneratorType(Table::ID_SEQUENCE); - - $schema->createSequence("foo_seq"); - - $tableB = $schema->createTable("bar"); - $tableB->addColumn("id", 'integer'); - $tableB->setPrimaryKey(array("id")); - - $tableA->addForeignKeyConstraint($tableB, array("bar"), array("id")); - - return $schema; - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Types/ArrayTest.php b/tests/Doctrine/Tests/DBAL/Types/ArrayTest.php deleted file mode 100644 index dc4a223a9..000000000 --- a/tests/Doctrine/Tests/DBAL/Types/ArrayTest.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Types; - -use Doctrine\DBAL\Types\Type; -use Doctrine\Tests\DBAL\Mocks; - -require_once __DIR__ . '/../../TestInit.php'; - -class ArrayTest extends \Doctrine\Tests\DbalTestCase -{ - protected - $_platform, - $_type; - - protected function setUp() - { - $this->_platform = new \Doctrine\Tests\DBAL\Mocks\MockPlatform(); - $this->_type = Type::getType('array'); - } - - public function testArrayConvertsToDatabaseValue() - { - $this->assertTrue( - is_string($this->_type->convertToDatabaseValue(array(), $this->_platform)) - ); - } - - public function testArrayConvertsToPHPValue() - { - $this->assertTrue( - is_array($this->_type->convertToPHPValue(serialize(array()), $this->_platform)) - ); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Types/BooleanTest.php b/tests/Doctrine/Tests/DBAL/Types/BooleanTest.php deleted file mode 100644 index 1e9cf2a44..000000000 --- a/tests/Doctrine/Tests/DBAL/Types/BooleanTest.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Types; - -use Doctrine\DBAL\Types\Type; -use Doctrine\Tests\DBAL\Mocks; - -require_once __DIR__ . '/../../TestInit.php'; - -class BooleanTest extends \Doctrine\Tests\DbalTestCase -{ - protected - $_platform, - $_type; - - protected function setUp() - { - $this->_platform = new \Doctrine\Tests\DBAL\Mocks\MockPlatform(); - $this->_type = Type::getType('boolean'); - } - - public function testBooleanConvertsToDatabaseValue() - { - $this->assertTrue( - is_integer($this->_type->convertToDatabaseValue(1, $this->_platform)) - ); - } - - public function testBooleanConvertsToPHPValue() - { - $this->assertTrue( - is_bool($this->_type->convertToPHPValue(0, $this->_platform)) - ); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Types/DateTest.php b/tests/Doctrine/Tests/DBAL/Types/DateTest.php deleted file mode 100644 index 3368a6c93..000000000 --- a/tests/Doctrine/Tests/DBAL/Types/DateTest.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Types; - -use Doctrine\DBAL\Types\Type; -use Doctrine\Tests\DBAL\Mocks; - -require_once __DIR__ . '/../../TestInit.php'; - -class DateTest extends \Doctrine\Tests\DbalTestCase -{ - protected - $_platform, - $_type, - $_tz; - - protected function setUp() - { - $this->_platform = new \Doctrine\Tests\DBAL\Mocks\MockPlatform(); - $this->_type = Type::getType('date'); - $this->_tz = date_default_timezone_get(); - } - - public function tearDown() - { - date_default_timezone_set($this->_tz); - } - - public function testDateConvertsToDatabaseValue() - { - $this->assertTrue( - is_string($this->_type->convertToDatabaseValue(new \DateTime(), $this->_platform)) - ); - } - - public function testDateConvertsToPHPValue() - { - // Birthday of jwage and also birthday of Doctrine. Send him a present ;) - $this->assertTrue( - $this->_type->convertToPHPValue('1985-09-01', $this->_platform) - instanceof \DateTime - ); - } - - public function testDateResetsNonDatePartsToZeroUnixTimeValues() - { - $date = $this->_type->convertToPHPValue('1985-09-01', $this->_platform); - - $this->assertEquals('00:00:00', $date->format('H:i:s')); - } - - public function testDateRests_SummerTimeAffection() - { - date_default_timezone_set('Europe/Berlin'); - - $date = $this->_type->convertToPHPValue('2009-08-01', $this->_platform); - $this->assertEquals('00:00:00', $date->format('H:i:s')); - $this->assertEquals('2009-08-01', $date->format('Y-m-d')); - - $date = $this->_type->convertToPHPValue('2009-11-01', $this->_platform); - $this->assertEquals('00:00:00', $date->format('H:i:s')); - $this->assertEquals('2009-11-01', $date->format('Y-m-d')); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Types/DateTimeTest.php b/tests/Doctrine/Tests/DBAL/Types/DateTimeTest.php deleted file mode 100644 index a60cae01b..000000000 --- a/tests/Doctrine/Tests/DBAL/Types/DateTimeTest.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Types; - -use Doctrine\DBAL\Types\Type; -use Doctrine\Tests\DBAL\Mocks; - -require_once __DIR__ . '/../../TestInit.php'; - -class DateTimeTest extends \Doctrine\Tests\DbalTestCase -{ - protected - $_platform, - $_type; - - protected function setUp() - { - $this->_platform = new \Doctrine\Tests\DBAL\Mocks\MockPlatform(); - $this->_type = Type::getType('datetime'); - } - - public function testDateTimeConvertsToDatabaseValue() - { - $this->assertTrue( - is_string($this->_type->convertToDatabaseValue(new \DateTime(), $this->_platform)) - ); - } - - public function testDateTimeConvertsToPHPValue() - { - // Birthday of jwage and also birthday of Doctrine. Send him a present ;) - $this->assertTrue( - $this->_type->convertToPHPValue('1985-09-01 00:00:00', $this->_platform) - instanceof \DateTime - ); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Types/DecimalTest.php b/tests/Doctrine/Tests/DBAL/Types/DecimalTest.php deleted file mode 100644 index ee5e2491a..000000000 --- a/tests/Doctrine/Tests/DBAL/Types/DecimalTest.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Types; - -use Doctrine\DBAL\Types\Type; -use Doctrine\Tests\DBAL\Mocks; - -require_once __DIR__ . '/../../TestInit.php'; - -class DecimalTest extends \Doctrine\Tests\DbalTestCase -{ - protected - $_platform, - $_type; - - protected function setUp() - { - $this->_platform = new \Doctrine\Tests\DBAL\Mocks\MockPlatform(); - $this->_type = Type::getType('decimal'); - } - - public function testDecimalConvertsToPHPValue() - { - $this->assertTrue( - is_float($this->_type->convertToPHPValue('5.5', $this->_platform)) - ); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Types/IntegerTest.php b/tests/Doctrine/Tests/DBAL/Types/IntegerTest.php deleted file mode 100644 index f03e400ba..000000000 --- a/tests/Doctrine/Tests/DBAL/Types/IntegerTest.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Types; - -use Doctrine\DBAL\Types\Type; -use Doctrine\Tests\DBAL\Mocks; - -require_once __DIR__ . '/../../TestInit.php'; - -class IntegerTest extends \Doctrine\Tests\DbalTestCase -{ - protected - $_platform, - $_type; - - protected function setUp() - { - $this->_platform = new \Doctrine\Tests\DBAL\Mocks\MockPlatform(); - $this->_type = Type::getType('integer'); - } - - public function testIntegerConvertsToPHPValue() - { - $this->assertTrue( - is_integer($this->_type->convertToPHPValue('1', $this->_platform)) - ); - - $this->assertTrue( - is_null($this->_type->convertToPHPValue(null, $this->_platform)) - ); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Types/ObjectTest.php b/tests/Doctrine/Tests/DBAL/Types/ObjectTest.php deleted file mode 100644 index 122844c22..000000000 --- a/tests/Doctrine/Tests/DBAL/Types/ObjectTest.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Types; - -use Doctrine\DBAL\Types\Type; -use Doctrine\Tests\DBAL\Mocks; - -require_once __DIR__ . '/../../TestInit.php'; - -class ObjectTest extends \Doctrine\Tests\DbalTestCase -{ - protected - $_platform, - $_type; - - protected function setUp() - { - $this->_platform = new \Doctrine\Tests\DBAL\Mocks\MockPlatform(); - $this->_type = Type::getType('object'); - } - - public function testObjectConvertsToDatabaseValue() - { - $this->assertTrue( - is_string($this->_type->convertToDatabaseValue(new \stdClass(), $this->_platform)) - ); - } - - public function testObjectConvertsToPHPValue() - { - $this->assertTrue( - is_object($this->_type->convertToPHPValue(serialize(new \stdClass), $this->_platform)) - ); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Types/SmallIntTest.php b/tests/Doctrine/Tests/DBAL/Types/SmallIntTest.php deleted file mode 100644 index 8495d45f3..000000000 --- a/tests/Doctrine/Tests/DBAL/Types/SmallIntTest.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Types; - -use Doctrine\DBAL\Types\Type; -use Doctrine\Tests\DBAL\Mocks; - -require_once __DIR__ . '/../../TestInit.php'; - -class SmallIntTest extends \Doctrine\Tests\DbalTestCase -{ - protected - $_platform, - $_type; - - protected function setUp() - { - $this->_platform = new \Doctrine\Tests\DBAL\Mocks\MockPlatform(); - $this->_type = Type::getType('smallint'); - } - - public function testDecimalConvertsToPHPValue() - { - $this->assertTrue( - is_integer($this->_type->convertToPHPValue('1', $this->_platform)) - ); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/DBAL/Types/StringTest.php b/tests/Doctrine/Tests/DBAL/Types/StringTest.php deleted file mode 100644 index f67adbf0b..000000000 --- a/tests/Doctrine/Tests/DBAL/Types/StringTest.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Types; - -use Doctrine\DBAL\Types\Type; -use Doctrine\Tests\DBAL\Mocks; - -require_once __DIR__ . '/../../TestInit.php'; - -class StringTest extends \Doctrine\Tests\DbalTestCase -{ - protected - $_platform, - $_type; - - protected function setUp() - { - $this->_platform = new \Doctrine\Tests\DBAL\Mocks\MockPlatform(); - $this->_type = Type::getType('string'); - } - - public function testReturnsSqlDeclarationFromPlatformVarchar() - { - $this->assertEquals("DUMMYVARCHAR()", $this->_type->getSqlDeclaration(array(), $this->_platform)); - } - - public function testReturnsDefaultLengthFromPlatformVarchar() - { - $this->assertEquals(255, $this->_type->getDefaultLength($this->_platform)); - } -} diff --git a/tests/Doctrine/Tests/DBAL/Types/TimeTest.php b/tests/Doctrine/Tests/DBAL/Types/TimeTest.php deleted file mode 100644 index eb272ed59..000000000 --- a/tests/Doctrine/Tests/DBAL/Types/TimeTest.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -namespace Doctrine\Tests\DBAL\Types; - -use Doctrine\DBAL\Types\Type; -use Doctrine\Tests\DBAL\Mocks; - -require_once __DIR__ . '/../../TestInit.php'; - -class TimeTest extends \Doctrine\Tests\DbalTestCase -{ - protected - $_platform, - $_type; - - protected function setUp() - { - $this->_platform = new \Doctrine\Tests\DBAL\Mocks\MockPlatform(); - $this->_type = Type::getType('time'); - } - - public function testTimeConvertsToDatabaseValue() - { - $this->assertTrue( - is_string($this->_type->convertToDatabaseValue(new \DateTime(), $this->_platform)) - ); - } - - public function testTimeConvertsToPHPValue() - { - $this->assertTrue( - $this->_type->convertToPHPValue('5:30:55', $this->_platform) - instanceof \DateTime - ); - } -} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Mocks/DatabasePlatformMock.php b/tests/Doctrine/Tests/Mocks/DatabasePlatformMock.php index f2bbf1215..b2954cf55 100644 --- a/tests/Doctrine/Tests/Mocks/DatabasePlatformMock.php +++ b/tests/Doctrine/Tests/Mocks/DatabasePlatformMock.php @@ -82,4 +82,9 @@ class DatabasePlatformMock extends \Doctrine\DBAL\Platforms\AbstractPlatform { return 'mock'; } + + protected function initializeDoctrineTypeMappings() + { + + } } \ No newline at end of file diff --git a/tests/Doctrine/Tests/Models/Generic/DateTimeModel.php b/tests/Doctrine/Tests/Models/Generic/DateTimeModel.php index 0733245ff..3298a8850 100644 --- a/tests/Doctrine/Tests/Models/Generic/DateTimeModel.php +++ b/tests/Doctrine/Tests/Models/Generic/DateTimeModel.php @@ -14,15 +14,15 @@ class DateTimeModel */ public $id; /** - * @Column(name="col_datetime", type="datetime") + * @Column(name="col_datetime", type="datetime", nullable=true) */ public $datetime; /** - * @Column(name="col_date", type="date") + * @Column(name="col_date", type="date", nullable=true) */ public $date; /** - * @Column(name="col_time", type="time") + * @Column(name="col_time", type="time", nullable=true) */ public $time; } \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Functional/DatabaseDriverTest.php b/tests/Doctrine/Tests/ORM/Functional/DatabaseDriverTest.php index ccd59a7ed..6f02328dc 100644 --- a/tests/Doctrine/Tests/ORM/Functional/DatabaseDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/DatabaseDriverTest.php @@ -4,7 +4,8 @@ namespace Doctrine\Tests\ORM\Functional; require_once __DIR__ . '/../../TestInit.php'; -use Doctrine\ORM\Mapping\ClassMetadataInfo; +use Doctrine\ORM\Mapping\ClassMetadataInfo, + Doctrine\Common\Util\Inflector; class DatabaseDriverTest extends \Doctrine\Tests\OrmFunctionalTestCase { @@ -15,12 +16,13 @@ class DatabaseDriverTest extends \Doctrine\Tests\OrmFunctionalTestCase public function setUp() { + $this->useModelSet('cms'); parent::setUp(); $this->_sm = $this->_em->getConnection()->getSchemaManager(); } - public function testCreateSimpleYamlFromDatabase() + public function testLoadMetadataFromDatabase() { if (!$this->_em->getConnection()->getDatabasePlatform()->supportsForeignKeyConstraints()) { $this->markTestSkipped('Platform does not support foreign keys.'); @@ -29,27 +31,29 @@ class DatabaseDriverTest extends \Doctrine\Tests\OrmFunctionalTestCase $table = new \Doctrine\DBAL\Schema\Table("dbdriver_foo"); $table->addColumn('id', 'integer'); $table->setPrimaryKey(array('id')); - $table->addColumn('bar', 'string', array('length' => 200)); + $table->addColumn('bar', 'string', array('notnull' => false, 'length' => 200)); $this->_sm->dropAndCreateTable($table); - $metadata = $this->extractClassMetadata("DbdriverFoo"); + $metadatas = $this->extractClassMetadata(array("DbdriverFoo")); + + $this->assertArrayHasKey('DbdriverFoo', $metadatas); + $metadata = $metadatas['DbdriverFoo']; $this->assertArrayHasKey('id', $metadata->fieldMappings); $this->assertEquals('id', $metadata->fieldMappings['id']['fieldName']); $this->assertEquals('id', strtolower($metadata->fieldMappings['id']['columnName'])); $this->assertEquals('integer', (string)$metadata->fieldMappings['id']['type']); - $this->assertTrue($metadata->fieldMappings['id']['notnull']); $this->assertArrayHasKey('bar', $metadata->fieldMappings); $this->assertEquals('bar', $metadata->fieldMappings['bar']['fieldName']); $this->assertEquals('bar', strtolower($metadata->fieldMappings['bar']['columnName'])); $this->assertEquals('string', (string)$metadata->fieldMappings['bar']['type']); $this->assertEquals(200, $metadata->fieldMappings['bar']['length']); - $this->assertTrue($metadata->fieldMappings['bar']['notnull']); + $this->assertTrue($metadata->fieldMappings['bar']['nullable']); } - public function testCreateYamlWithForeignKeyFromDatabase() + public function testLoadMetadataWithForeignKeyFromDatabase() { if (!$this->_em->getConnection()->getDatabasePlatform()->supportsForeignKeyConstraints()) { $this->markTestSkipped('Platform does not support foreign keys.'); @@ -69,33 +73,61 @@ class DatabaseDriverTest extends \Doctrine\Tests\OrmFunctionalTestCase $this->_sm->dropAndCreateTable($tableA); - $metadata = $this->extractClassMetadata("DbdriverBaz"); + $metadatas = $this->extractClassMetadata(array("DbdriverBar", "DbdriverBaz")); - $this->assertArrayNotHasKey('bar', $metadata->fieldMappings); - $this->assertArrayHasKey('id', $metadata->fieldMappings); + $this->assertArrayHasKey('DbdriverBaz', $metadatas); + $bazMetadata = $metadatas['DbdriverBaz']; - $metadata->associationMappings = \array_change_key_case($metadata->associationMappings, \CASE_LOWER); + $this->assertArrayNotHasKey('barId', $bazMetadata->fieldMappings, "The foreign Key field should not be inflected as 'barId' field, its an association."); + $this->assertArrayHasKey('id', $bazMetadata->fieldMappings); - $this->assertArrayHasKey('bar', $metadata->associationMappings); - $this->assertType('Doctrine\ORM\Mapping\OneToOneMapping', $metadata->associationMappings['bar']); + $bazMetadata->associationMappings = \array_change_key_case($bazMetadata->associationMappings, \CASE_LOWER); + + $this->assertArrayHasKey('bar', $bazMetadata->associationMappings); + $this->assertType('Doctrine\ORM\Mapping\OneToOneMapping', $bazMetadata->associationMappings['bar']); } + public function testDetectManyToManyTables() + { + if (!$this->_em->getConnection()->getDatabasePlatform()->supportsForeignKeyConstraints()) { + $this->markTestSkipped('Platform does not support foreign keys.'); + } + + $metadatas = $this->extractClassMetadata(array("CmsUsers", "CmsGroups")); + + $this->assertArrayHasKey('CmsUsers', $metadatas, 'CmsUsers entity was not detected.'); + $this->assertArrayHasKey('CmsGroups', $metadatas, 'CmsGroups entity was not detected.'); + + $this->assertEquals(1, count($metadatas['CmsUsers']->associationMappings)); + $this->assertArrayHasKey('group', $metadatas['CmsUsers']->associationMappings); + $this->assertEquals(1, count($metadatas['CmsGroups']->associationMappings)); + $this->assertArrayHasKey('user', $metadatas['CmsGroups']->associationMappings); + } + + /** * * @param string $className * @return ClassMetadata */ - protected function extractClassMetadata($className) + protected function extractClassMetadata(array $classNames) { + $classNames = array_map('strtolower', $classNames); + $metadatas = array(); + $driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver($this->_sm); - foreach ($driver->getAllClassNames() as $dbClassName) { - $class = new ClassMetadataInfo($dbClassName); - $driver->loadMetadataForClass($dbClassName, $class); - if (strtolower($class->name) == strtolower($className)) { - return $class; + foreach ($driver->getAllClassNames() as $className) { + if (!in_array(strtolower($className), $classNames)) { + continue; } + $class = new ClassMetadataInfo($className); + $driver->loadMetadataForClass($className, $class); + $metadatas[$className] = $class; } - $this->fail("No class matching the name '".$className."' was found!"); + if (count($metadatas) != count($classNames)) { + $this->fail("Have not found all classes matching the names '" . implode(", ", $classNames) . "' only tables " . implode(", ", array_keys($metadatas))); + } + return $metadatas; } } diff --git a/tests/Doctrine/Tests/ORM/Functional/Locking/LockTest.php b/tests/Doctrine/Tests/ORM/Functional/Locking/LockTest.php index c5316f769..6917e7252 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Locking/LockTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/Locking/LockTest.php @@ -125,7 +125,13 @@ class LockTest extends \Doctrine\Tests\OrmFunctionalTestCase { $this->_em->flush(); $this->_em->beginTransaction(); - $this->_em->lock($article, LockMode::PESSIMISTIC_WRITE); + try { + $this->_em->lock($article, LockMode::PESSIMISTIC_WRITE); + $this->_em->commit(); + } catch (\Exception $e) { + $this->_em->rollback(); + throw $e; + } $query = array_pop( $this->_sqlLoggerStack->queries ); $this->assertContains($writeLockSql, $query['sql']); @@ -149,7 +155,13 @@ class LockTest extends \Doctrine\Tests\OrmFunctionalTestCase { $this->_em->flush(); $this->_em->beginTransaction(); - $this->_em->lock($article, LockMode::PESSIMISTIC_READ); + try { + $this->_em->lock($article, LockMode::PESSIMISTIC_READ); + $this->_em->commit(); + } catch (\Exception $e) { + $this->_em->rollback(); + throw $e; + } $query = array_pop( $this->_sqlLoggerStack->queries ); $this->assertContains($readLockSql, $query['sql']); diff --git a/tests/Doctrine/Tests/ORM/Functional/QueryTest.php b/tests/Doctrine/Tests/ORM/Functional/QueryTest.php index b1074cbc5..c55c76149 100644 --- a/tests/Doctrine/Tests/ORM/Functional/QueryTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/QueryTest.php @@ -281,4 +281,34 @@ class QueryTest extends \Doctrine\Tests\OrmFunctionalTestCase $this->_em->getConfiguration()->setEntityNamespaces(array()); } + + /** + * @group DDC-604 + */ + public function testEntityParameters() + { + $article = new CmsArticle; + $article->topic = "dr. dolittle"; + $article->text = "Once upon a time ..."; + $author = new CmsUser; + $author->name = "anonymous"; + $author->username = "anon"; + $author->status = "here"; + $article->user = $author; + $this->_em->persist($author); + $this->_em->persist($article); + $this->_em->flush(); + $this->_em->clear(); + //$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger); + $q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a where a.topic = :topic and a.user = :user") + ->setParameter("user", $this->_em->getReference('Doctrine\Tests\Models\CMS\CmsUser', $author->id)) + ->setParameter("topic", "dr. dolittle"); + + $result = $q->getResult(); + $this->assertEquals(1, count($result)); + $this->assertTrue($result[0] instanceof CmsArticle); + $this->assertEquals("dr. dolittle", $result[0]->topic); + $this->assertTrue($result[0]->user instanceof \Doctrine\ORM\Proxy\Proxy); + $this->assertFalse($result[0]->user->__isInitialized__); + } } \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC144Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC144Test.php index 9b493e7da..82a2e314c 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC144Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC144Test.php @@ -8,7 +8,6 @@ class DDC144Test extends \Doctrine\Tests\OrmFunctionalTestCase { protected function setUp() { parent::setUp(); - //$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger); $this->_schemaTool->createSchema(array( diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC353Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC353Test.php index 5091cd44c..40f4ca298 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC353Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC353Test.php @@ -10,15 +10,12 @@ class DDC353Test extends \Doctrine\Tests\OrmFunctionalTestCase protected function setUp() { parent::setUp(); - try { $this->_schemaTool->createSchema(array( $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC353File'), $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC353Picture'), )); - } catch(\Exception $e) { - - } + } catch(\Exception $ignored) {} } public function testWorkingCase() diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC531Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC531Test.php new file mode 100644 index 000000000..0ac3b9b8d --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC531Test.php @@ -0,0 +1,88 @@ +<?php + +namespace Doctrine\Tests\ORM\Functional\Ticket; + +require_once __DIR__ . '/../../../TestInit.php'; + +class DDC531Test extends \Doctrine\Tests\OrmFunctionalTestCase +{ + protected function setUp() + { + parent::setUp(); + $this->_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC531Item'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC531SubItem'), + )); + } + + public function testIssue() + { + $item1 = new DDC531Item; + $item2 = new DDC531Item; + $item2->parent = $item1; + $item1->getChildren()->add($item2); + $this->_em->persist($item1); + $this->_em->persist($item2); + $this->_em->flush(); + $this->_em->clear(); + + $item3 = $this->_em->find(__NAMESPACE__ . '\DDC531Item', $item2->id); // Load child item first (id 2) + // parent will already be loaded, cannot be lazy because it has mapped subclasses and we would not + // know which proxy type to put in. + $this->assertTrue($item3->parent instanceof DDC531Item); + $this->assertFalse($item3->parent instanceof \Doctrine\ORM\Proxy\Proxy); + $item4 = $this->_em->find(__NAMESPACE__ . '\DDC531Item', $item1->id); // Load parent item (id 1) + $this->assertNull($item4->parent); + $this->assertNotNull($item4->getChildren()); + $this->assertTrue($item4->getChildren()->contains($item3)); // lazy-loads children + } +} + +/** + * @Entity + * @InheritanceType("SINGLE_TABLE") + * @DiscriminatorColumn(name="type", type="integer") + * @DiscriminatorMap({"0" = "DDC531Item", "1" = "DDC531SubItem"}) + */ +class DDC531Item +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue(strategy="AUTO") + */ + public $id; + + /** + * @OneToMany(targetEntity="DDC531Item", mappedBy="parent") + */ + protected $children; + + /** + * @ManyToOne(targetEntity="DDC531Item", inversedBy="children") + * @JoinColumn(name="parentId", referencedColumnName="id") + */ + public $parent; + + public function __construct() + { + $this->children = new \Doctrine\Common\Collections\ArrayCollection; + } + + public function getParent() + { + return $this->parent; + } + + public function getChildren() + { + return $this->children; + } +} + +/** + * @Entity + */ +class DDC531SubItem extends DDC531Item +{ +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC599Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC599Test.php new file mode 100644 index 000000000..d9f9a82be --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC599Test.php @@ -0,0 +1,132 @@ +<?php +namespace Doctrine\Tests\ORM\Functional\Ticket; + +require_once __DIR__ . '/../../../TestInit.php'; + +class DDC599Test extends \Doctrine\Tests\OrmFunctionalTestCase +{ + protected function setUp() + { + parent::setUp(); + //$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger); + try { + $this->_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC599Item'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC599Subitem'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC599Child'), + )); + } catch (\Exception $ignored) {} + } + + public function testCascadeRemoveOnInheritanceHierachy() + { + $item = new DDC599Subitem; + $item->elem = "foo"; + $child = new DDC599Child; + $child->parent = $item; + $item->getChildren()->add($child); + $this->_em->persist($item); + $this->_em->persist($child); + $this->_em->flush(); + $this->_em->clear(); + + $item = $this->_em->find(__NAMESPACE__ . '\DDC599Item', $item->id); + + $this->_em->remove($item); + $this->_em->flush(); // Should not fail + + $this->assertFalse($this->_em->contains($item)); + $children = $item->getChildren(); + $this->assertFalse($this->_em->contains($children[0])); + + $this->_em->clear(); + + + $item2 = new DDC599Subitem; + $item2->elem = "bar"; + $this->_em->persist($item2); + $this->_em->flush(); + + $child2 = new DDC599Child; + $child2->parent = $item2; + $item2->getChildren()->add($child2); + $this->_em->persist($child2); + $this->_em->flush(); + + $this->_em->remove($item2); + $this->_em->flush(); // should not fail + + $this->assertFalse($this->_em->contains($item)); + $children = $item->getChildren(); + $this->assertFalse($this->_em->contains($children[0])); + } + + public function testCascadeRemoveOnChildren() + { + $class = $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC599Subitem'); + + $this->assertArrayHasKey('children', $class->associationMappings); + $this->assertTrue($class->associationMappings['children']->isCascadeRemove); + } +} + +/** + * @Entity + * @InheritanceType("SINGLE_TABLE") + * @DiscriminatorColumn(name="type", type="integer") + * @DiscriminatorMap({"0" = "DDC599Item", "1" = "DDC599Subitem"}) + */ +class DDC599Item +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue(strategy="AUTO") + */ + public $id; + + /** + * @OneToMany(targetEntity="DDC599Child", mappedBy="parent", cascade={"remove"}) + */ + protected $children; + + public function __construct() + { + $this->children = new \Doctrine\Common\Collections\ArrayCollection; + } + + public function getChildren() + { + return $this->children; + } +} + +/** + * @Entity + */ +class DDC599Subitem extends DDC599Item +{ + /** + * @Column(type="string") + */ + public $elem; +} + +/** + * @Entity + */ +class DDC599Child +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue(strategy="AUTO") + */ + public $id; + + /** + * @ManyToOne(targetEntity="DDC599Item", inversedBy="children") + * @JoinColumn(name="parentId", referencedColumnName="id") + */ + public $parent; +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Functional/TypeTest.php b/tests/Doctrine/Tests/ORM/Functional/TypeTest.php index 001087639..a4ef84589 100644 --- a/tests/Doctrine/Tests/ORM/Functional/TypeTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/TypeTest.php @@ -91,4 +91,49 @@ class TypeTest extends \Doctrine\Tests\OrmFunctionalTestCase $this->assertType('stdClass', $serialize->object); } + + public function testDate() + { + $dateTime = new DateTimeModel(); + $dateTime->date = new \DateTime('2009-10-01', new \DateTimeZone('Europe/Berlin')); + + $this->_em->persist($dateTime); + $this->_em->flush(); + $this->_em->clear(); + + $dateTimeDb = $this->_em->find('Doctrine\Tests\Models\Generic\DateTimeModel', $dateTime->id); + + $this->assertType('DateTime', $dateTimeDb->date); + $this->assertEquals('2009-10-01', $dateTimeDb->date->format('Y-m-d')); + } + + public function testDateTime() + { + $dateTime = new DateTimeModel(); + $dateTime->datetime = new \DateTime('2009-10-02 20:10:52', new \DateTimeZone('Europe/Berlin')); + + $this->_em->persist($dateTime); + $this->_em->flush(); + $this->_em->clear(); + + $dateTimeDb = $this->_em->find('Doctrine\Tests\Models\Generic\DateTimeModel', $dateTime->id); + + $this->assertType('DateTime', $dateTime->datetime); + $this->assertEquals('2009-10-02 20:10:52', $dateTimeDb->datetime->format('Y-m-d H:i:s')); + } + + public function testTime() + { + $dateTime = new DateTimeModel(); + $dateTime->time = new \DateTime('2010-01-01 19:27:20'); + + $this->_em->persist($dateTime); + $this->_em->flush(); + $this->_em->clear(); + + $dateTimeDb = $this->_em->find('Doctrine\Tests\Models\Generic\DateTimeModel', $dateTime->id); + + $this->assertType('DateTime', $dateTime->time); + $this->assertEquals('19:27:20', $dateTime->time->format('H:i:s')); + } } \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Hydration/AllTests.php b/tests/Doctrine/Tests/ORM/Hydration/AllTests.php index 76a9cbcb1..d2ecafec3 100644 --- a/tests/Doctrine/Tests/ORM/Hydration/AllTests.php +++ b/tests/Doctrine/Tests/ORM/Hydration/AllTests.php @@ -25,6 +25,7 @@ class AllTests $suite->addTestSuite('Doctrine\Tests\ORM\Hydration\ScalarHydratorTest'); $suite->addTestSuite('Doctrine\Tests\ORM\Hydration\SingleScalarHydratorTest'); $suite->addTestSuite('Doctrine\Tests\ORM\Hydration\ResultSetMappingTest'); + $suite->addTestSuite('Doctrine\Tests\ORM\Hydration\CustomHydratorTest'); return $suite; } diff --git a/tests/Doctrine/Tests/ORM/Hydration/CustomHydratorTest.php b/tests/Doctrine/Tests/ORM/Hydration/CustomHydratorTest.php new file mode 100644 index 000000000..6b5e45149 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Hydration/CustomHydratorTest.php @@ -0,0 +1,29 @@ +<?php + +namespace Doctrine\Tests\ORM\Hydration; + +use PDO, Doctrine\ORM\Internal\Hydration\AbstractHydrator; + +require_once __DIR__ . '/../../TestInit.php'; + +class CustomHydratorTest extends HydrationTestCase +{ + public function testCustomHydrator() + { + $em = $this->_getTestEntityManager(); + $config = $em->getConfiguration(); + $config->addCustomHydrationMode('CustomHydrator', 'Doctrine\Tests\ORM\Hydration\CustomHydrator'); + + $hydrator = $em->newHydrator('CustomHydrator'); + $this->assertTrue($hydrator instanceof \Doctrine\Tests\ORM\Hydration\CustomHydrator); + $this->assertNull($config->getCustomHydrationMode('does not exist')); + } +} + +class CustomHydrator extends AbstractHydrator +{ + protected function _hydrateAll() + { + return $this->_stmt->fetchAll(PDO::FETCH_ASSOC); + } +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php index 270e16234..858a00eba 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php @@ -36,6 +36,21 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase return $class; } + /** + * @depends testEntityTableNameAndInheritance + * @param ClassMetadata $class + */ + public function testEntityIndexes($class) + { + $this->assertArrayHasKey('indexes', $class->table, 'ClassMetadata should have indexes key in table property.'); + $this->assertEquals(array( + 'name_idx' => array('columns' => array('name')), + 0 => array('columns' => array('user_email')) + ), $class->table['indexes']); + + return $class; + } + /** * @depends testEntityTableNameAndInheritance * @param ClassMetadata $class @@ -240,7 +255,11 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase /** * @Entity * @HasLifecycleCallbacks - * @Table(name="cms_users", uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "user_email"})}) + * @Table( + * name="cms_users", + * uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "user_email"})}, + * indexes={@Index(name="name_idx", columns={"name"}), @Index(name="0", columns={"user_email"})} + * ) */ class User { @@ -411,6 +430,9 @@ class User $metadata->table['uniqueConstraints'] = array( 'search_idx' => array('columns' => array('name', 'user_email')), ); + $metadata->table['indexes'] = array( + 'name_idx' => array('columns' => array('name')), 0 => array('columns' => array('user_email')) + ); $metadata->setSequenceGeneratorDefinition(array( 'sequenceName' => 'tablename_seq', 'allocationSize' => 100, diff --git a/tests/Doctrine/Tests/ORM/Mapping/XmlMappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/XmlMappingDriverTest.php index d41e01eed..5c2edff5b 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/XmlMappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/XmlMappingDriverTest.php @@ -32,6 +32,19 @@ class XmlMappingDriverTest extends AbstractMappingDriverTest $this->assertEquals(3, count($class->discriminatorMap)); $this->assertEquals($expectedMap, $class->discriminatorMap); } + + public function testValidateXmlSchema() + { + $xsdSchemaFile = __DIR__ . "/../../../../../doctrine-mapping.xsd"; + + $dom = new \DOMDocument('UTF-8'); + $dom->load(__DIR__ . "/xml/Doctrine.Tests.ORM.Mapping.CTI.dcm.xml"); + $this->assertTrue($dom->schemaValidate($xsdSchemaFile)); + + $dom = new \DOMDocument('UTF-8'); + $dom->load(__DIR__ . "/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml"); + $this->assertTrue($dom->schemaValidate($xsdSchemaFile)); + } } class CTI diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.User.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.User.php index 819a01109..4aadffb30 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.User.php +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.User.php @@ -106,6 +106,9 @@ $metadata->mapManyToMany(array( $metadata->table['uniqueConstraints'] = array( 'search_idx' => array('columns' => array('name', 'user_email')), ); +$metadata->table['indexes'] = array( + 'name_idx' => array('columns' => array('name')), 0 => array('columns' => array('user_email')) +); $metadata->setSequenceGeneratorDefinition(array( 'sequenceName' => 'tablename_seq', 'allocationSize' => 100, diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.CTI.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.CTI.dcm.xml index 472c16558..e6459afae 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.CTI.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.CTI.dcm.xml @@ -1,9 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" - xsi="http://www.w3.org/2001/XMLSchema-instance" - schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping + http://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> <entity name="Doctrine\Tests\ORM\Mapping\CTI"> - <discriminator-column name="discr" type="string" length=""/> + <discriminator-column name="discr" type="string" length="60"/> <discriminator-map> <discriminator-mapping value="foo" class="CTIFoo"/> <discriminator-mapping value="bar" class="CTIBar"/> diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml index 793be0f06..948430c24 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml @@ -7,6 +7,11 @@ <entity name="Doctrine\Tests\ORM\Mapping\User" table="cms_users"> + <indexes> + <index name="name_idx" columns="name"/> + <index columns="user_email"/> + </indexes> + <unique-constraints> <unique-constraint columns="name,user_email" name="search_idx" /> </unique-constraints> @@ -18,8 +23,8 @@ </lifecycle-callbacks> <id name="id" type="integer" column="id"> - <sequence-generator sequence-name="tablename_seq" allocation-size="100" initial-value="1" /> <generator strategy="AUTO"/> + <sequence-generator sequence-name="tablename_seq" allocation-size="100" initial-value="1" /> </id> <field name="name" column="name" type="string" length="50" nullable="true" unique="true" /> @@ -31,12 +36,12 @@ </one-to-one> <one-to-many field="phonenumbers" target-entity="Phonenumber" mapped-by="user"> - <order-by> - <order-by-field name="number" direction="ASC" /> - </order-by> <cascade> <cascade-persist/> </cascade> + <order-by> + <order-by-field name="number" direction="ASC" /> + </order-by> </one-to-many> <many-to-many field="groups" target-entity="Group"> diff --git a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml index 7dd6bfaed..b541c8877 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml +++ b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml @@ -58,4 +58,9 @@ Doctrine\Tests\ORM\Mapping\User: postPersist: [ doStuffOnPostPersist ] uniqueConstraints: search_idx: - columns: name,user_email \ No newline at end of file + columns: name,user_email + indexes: + name_idx: + columns: name + 0: + columns: user_email \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Query/ExprTest.php b/tests/Doctrine/Tests/ORM/Query/ExprTest.php index 8a3d966d7..032411761 100644 --- a/tests/Doctrine/Tests/ORM/Query/ExprTest.php +++ b/tests/Doctrine/Tests/ORM/Query/ExprTest.php @@ -27,7 +27,7 @@ use Doctrine\ORM\Query; require_once __DIR__ . '/../../TestInit.php'; /** - * Test case for the DQL Expr class used for generating DQL snippets through + * Test case for the DQL Expr class used for generating DQL snippets through * a programmatic interface * * @author Jonathan H. Wage <jonwage@gmail.com> @@ -75,7 +75,7 @@ class ExprTest extends \Doctrine\Tests\OrmTestCase { $qb = $this->_em->createQueryBuilder(); $qb->select('u')->from('User', 'u')->where('u.name = ?1'); - + $this->assertEquals('EXISTS(SELECT u FROM User u WHERE u.name = ?1)', (string) $this->_expr->exists($qb)); } @@ -83,7 +83,7 @@ class ExprTest extends \Doctrine\Tests\OrmTestCase { $qb = $this->_em->createQueryBuilder(); $qb->select('u')->from('User', 'u')->where('u.name = ?1'); - + $this->assertEquals('ALL(SELECT u FROM User u WHERE u.name = ?1)', (string) $this->_expr->all($qb)); } @@ -91,7 +91,7 @@ class ExprTest extends \Doctrine\Tests\OrmTestCase { $qb = $this->_em->createQueryBuilder(); $qb->select('u')->from('User', 'u')->where('u.name = ?1'); - + $this->assertEquals('SOME(SELECT u FROM User u WHERE u.name = ?1)', (string) $this->_expr->some($qb)); } @@ -99,7 +99,7 @@ class ExprTest extends \Doctrine\Tests\OrmTestCase { $qb = $this->_em->createQueryBuilder(); $qb->select('u')->from('User', 'u')->where('u.name = ?1'); - + $this->assertEquals('ANY(SELECT u FROM User u WHERE u.name = ?1)', (string) $this->_expr->any($qb)); } @@ -107,7 +107,7 @@ class ExprTest extends \Doctrine\Tests\OrmTestCase { $qb = $this->_em->createQueryBuilder(); $qb->select('u')->from('User', 'u')->where('u.name = ?1'); - + $this->assertEquals('NOT(SELECT u FROM User u WHERE u.name = ?1)', (string) $this->_expr->not($qb)); } @@ -115,11 +115,11 @@ class ExprTest extends \Doctrine\Tests\OrmTestCase { $this->assertEquals('(1 = 1) AND (2 = 2)', (string) $this->_expr->andx((string) $this->_expr->eq(1, 1), (string) $this->_expr->eq(2, 2))); } - + public function testIntelligentParenthesisPreventionAndExpr() { $this->assertEquals( - '(1 = 1) AND (2 = 2)', + '(1 = 1) AND (2 = 2)', (string) $this->_expr->andx($this->_expr->orx($this->_expr->andx($this->_expr->eq(1, 1))), (string) $this->_expr->eq(2, 2)) ); } @@ -153,7 +153,7 @@ class ExprTest extends \Doctrine\Tests\OrmTestCase { $this->assertEquals('10 / 2', (string) $this->_expr->quot(10, 2)); } - + public function testScopeInArithmeticExpr() { $this->assertEquals('(100 - 20) / 2', (string) $this->_expr->quot($this->_expr->diff(100, 20), 2)); @@ -185,6 +185,15 @@ class ExprTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals('SUBSTRING(a.title, 0, 25)', (string) $this->_expr->substring('a.title', 0, 25)); } + /** + * @group regression + * @group DDC-612 + */ + public function testSubstringExprAcceptsTwoArguments() + { + $this->assertEquals('SUBSTRING(a.title, 5)', (string) $this->_expr->substring('a.title', 5)); + } + public function testLowerExpr() { $this->assertEquals('LOWER(u.first_name)', (string) $this->_expr->lower('u.first_name')); @@ -220,6 +229,15 @@ class ExprTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals(5, (string) $this->_expr->literal(5)); } + /** + * @group regression + * @group DDC-610 + */ + public function testLiteralExprProperlyQuotesStrings() + { + $this->assertEquals("'00010001'", (string) $this->_expr->literal('00010001')); + } + public function testGreaterThanOrEqualToExpr() { $this->assertEquals('5 >= 2', (string) $this->_expr->gte(5, 2)); @@ -266,7 +284,7 @@ class ExprTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals('(1 = 1) OR (1 < 5)', (string) $orExpr); } - + public function testOrderByCountExpr() { $orderExpr = $this->_expr->desc('u.username'); diff --git a/tests/Doctrine/Tests/ORM/QueryBuilderTest.php b/tests/Doctrine/Tests/ORM/QueryBuilderTest.php index 468e0e20c..e2430e8cc 100644 --- a/tests/Doctrine/Tests/ORM/QueryBuilderTest.php +++ b/tests/Doctrine/Tests/ORM/QueryBuilderTest.php @@ -516,4 +516,13 @@ class QueryBuilderTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState()); } + + public function testSelectWithFuncExpression() + { + $qb = $this->_em->createQueryBuilder(); + $expr = $qb->expr(); + $qb->select($expr->count('e.id')); + + $this->assertValidQueryBuilder($qb, 'SELECT COUNT(e.id)'); + } } \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Tools/AllTests.php b/tests/Doctrine/Tests/ORM/Tools/AllTests.php index faeeb1dd0..3d9fe929c 100644 --- a/tests/Doctrine/Tests/ORM/Tools/AllTests.php +++ b/tests/Doctrine/Tests/ORM/Tools/AllTests.php @@ -28,6 +28,7 @@ class AllTests $suite->addTestSuite('Doctrine\Tests\ORM\Tools\SchemaToolTest'); $suite->addTestSuite('Doctrine\Tests\ORM\Tools\EntityGeneratorTest'); $suite->addTestSuite('Doctrine\Tests\ORM\Tools\SchemaValidatorTest'); + $suite->addTestSuite('Doctrine\Tests\ORM\Tools\Console\Command\ConvertDoctrine1SchemaCommandTest'); return $suite; } diff --git a/tests/Doctrine/Tests/ORM/Tools/Console/Command/ConvertDoctrine1SchemaCommandTest.php b/tests/Doctrine/Tests/ORM/Tools/Console/Command/ConvertDoctrine1SchemaCommandTest.php new file mode 100644 index 000000000..cf520fc39 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Tools/Console/Command/ConvertDoctrine1SchemaCommandTest.php @@ -0,0 +1,23 @@ +<?php + +namespace Doctrine\Tests\ORM\Tools\Console\Command; + +use Doctrine\ORM\Tools\Console\Command\ConvertDoctrine1SchemaCommand; + +class ConvertDoctrine1SchemaCommandTest extends \Doctrine\Tests\OrmTestCase +{ + public function testExecution() + { + $entityGenerator = $this->getMock('Doctrine\ORM\Tools\EntityGenerator'); + $metadataExporter = $this->getMock('Doctrine\ORM\Tools\Export\ClassMetadataExporter'); + $command = new ConvertDoctrine1SchemaCommand(); + $command->setEntityGenerator($entityGenerator); + + $output = $this->getMock('Symfony\Components\Console\Output\OutputInterface'); + $output->expects($this->once()) + ->method('write') + ->with($this->equalTo('No Metadata Classes to process.' . PHP_EOL)); + + $command->convertDoctrine1Schema($this->_getTestEntityManager(), array(), sys_get_temp_dir(), 'annotation', 4, null, $output); + } +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php b/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php index f1ba8ba92..0fa781285 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php +++ b/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php @@ -102,7 +102,9 @@ abstract class AbstractClassMetadataExporterTest extends \Doctrine\Tests\OrmTest $cmf = $this->_createClassMetadataFactory($em, $type); $metadata = $cmf->getAllMetadata(); - $this->assertEquals('Doctrine\Tests\ORM\Tools\Export\User', $metadata[0]->name); + $metadata[0]->name = 'Doctrine\Tests\ORM\Tools\Export\ExportedUser'; + + $this->assertEquals('Doctrine\Tests\ORM\Tools\Export\ExportedUser', $metadata[0]->name); $type = $this->_getType(); $cme = new ClassMetadataExporter(); @@ -117,9 +119,9 @@ abstract class AbstractClassMetadataExporterTest extends \Doctrine\Tests\OrmTest $exporter->export(); if ($type == 'annotation') { - $this->assertTrue(file_exists(__DIR__ . '/export/' . $type . '/'.str_replace('\\', '/', 'Doctrine\Tests\ORM\Tools\Export\User').$this->_extension)); + $this->assertTrue(file_exists(__DIR__ . '/export/' . $type . '/'.str_replace('\\', '/', 'Doctrine\Tests\ORM\Tools\Export\ExportedUser').$this->_extension)); } else { - $this->assertTrue(file_exists(__DIR__ . '/export/' . $type . '/Doctrine.Tests.ORM.Tools.Export.User'.$this->_extension)); + $this->assertTrue(file_exists(__DIR__ . '/export/' . $type . '/Doctrine.Tests.ORM.Tools.Export.ExportedUser'.$this->_extension)); } } @@ -130,14 +132,14 @@ abstract class AbstractClassMetadataExporterTest extends \Doctrine\Tests\OrmTest { $type = $this->_getType(); - $metadataDriver = $this->_createMetadataDriver($type, __DIR__ . '/' . $type); + $metadataDriver = $this->_createMetadataDriver($type, __DIR__ . '/export/' . $type); $em = $this->_createEntityManager($metadataDriver); $cmf = $this->_createClassMetadataFactory($em, $type); $metadata = $cmf->getAllMetadata(); $class = current($metadata); - $this->assertEquals('Doctrine\Tests\ORM\Tools\Export\User', $class->name); + $this->assertEquals('Doctrine\Tests\ORM\Tools\Export\ExportedUser', $class->name); return $class; } @@ -290,6 +292,29 @@ abstract class AbstractClassMetadataExporterTest extends \Doctrine\Tests\OrmTest return $class; } + /** + * @depends testLifecycleCallbacksAreExported + * @param ClassMetadataInfo $class + */ + public function testCascadeIsExported($class) + { + $this->assertTrue($class->associationMappings['phonenumbers']->isCascadePersist); + $this->assertFalse($class->associationMappings['phonenumbers']->isCascadeMerge); + $this->assertFalse($class->associationMappings['phonenumbers']->isCascadeRemove); + $this->assertFalse($class->associationMappings['phonenumbers']->isCascadeRefresh); + + return $class; + } + + /** + * @depends testCascadeIsExported + * @param ClassMetadataInfo $class + */ + public function testInversedByIsExported($class) + { + $this->assertEquals('user', $class->associationMappings['address']->inversedBy); + } + public function __destruct() { $type = $this->_getType(); diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/annotation/Doctrine.Tests.ORM.Tools.Export.User.php b/tests/Doctrine/Tests/ORM/Tools/Export/annotation/Doctrine.Tests.ORM.Tools.Export.User.php index 25f6fdd7b..e71da460e 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/annotation/Doctrine.Tests.ORM.Tools.Export.User.php +++ b/tests/Doctrine/Tests/ORM/Tools/Export/annotation/Doctrine.Tests.ORM.Tools.Export.User.php @@ -23,7 +23,7 @@ class User public $email; /** - * @OneToOne(targetEntity="Doctrine\Tests\ORM\Tools\Export\Address", cascade={"remove"}) + * @OneToOne(targetEntity="Doctrine\Tests\ORM\Tools\Export\Address", cascade={"remove"}, inversedBy="user") * @JoinColumn(name="address_id", onDelete="CASCADE", onUpdate="CASCADE") */ public $address; diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php b/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php index 5b1e328e1..1a3824543 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php +++ b/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php @@ -34,6 +34,7 @@ $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_AUTO); $metadata->mapOneToOne(array( 'fieldName' => 'address', 'targetEntity' => 'Doctrine\\Tests\\ORM\\Tools\\Export\\Address', + 'inversedBy' => 'user', 'cascade' => array( 0 => 'remove', diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/xml/Doctrine.Tests.ORM.Tools.Export.User.dcm.xml b/tests/Doctrine/Tests/ORM/Tools/Export/xml/Doctrine.Tests.ORM.Tools.Export.User.dcm.xml index e8444e738..11bb6ac95 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/xml/Doctrine.Tests.ORM.Tools.Export.User.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Tools/Export/xml/Doctrine.Tests.ORM.Tools.Export.User.dcm.xml @@ -20,7 +20,7 @@ <field name="name" column="name" type="string" length="50" nullable="true" unique="true" /> <field name="email" column="user_email" type="string" column-definition="CHAR(32) NOT NULL" /> - <one-to-one field="address" target-entity="Doctrine\Tests\ORM\Tools\Export\Address"> + <one-to-one field="address" target-entity="Doctrine\Tests\ORM\Tools\Export\Address" inversed-by="user"> <cascade><cascade-remove /></cascade> <join-column name="address_id" referenced-column-name="id" on-delete="CASCADE" on-update="CASCADE"/> </one-to-one> diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/yaml/Doctrine.Tests.ORM.Tools.Export.User.dcm.yml b/tests/Doctrine/Tests/ORM/Tools/Export/yaml/Doctrine.Tests.ORM.Tools.Export.User.dcm.yml index d60f41026..2b3048fba 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/yaml/Doctrine.Tests.ORM.Tools.Export.User.dcm.yml +++ b/tests/Doctrine/Tests/ORM/Tools/Export/yaml/Doctrine.Tests.ORM.Tools.Export.User.dcm.yml @@ -25,6 +25,7 @@ Doctrine\Tests\ORM\Tools\Export\User: onDelete: CASCADE onUpdate: CASCADE cascade: [ remove ] + inversedBy: user oneToMany: phonenumbers: targetEntity: Doctrine\Tests\ORM\Tools\Export\Phonenumber diff --git a/tests/Doctrine/Tests/TestInit.php b/tests/Doctrine/Tests/TestInit.php index 1c7bea434..cd3bf4daa 100644 --- a/tests/Doctrine/Tests/TestInit.php +++ b/tests/Doctrine/Tests/TestInit.php @@ -8,7 +8,21 @@ error_reporting(E_ALL | E_STRICT); require_once 'PHPUnit/Framework.php'; require_once 'PHPUnit/TextUI/TestRunner.php'; -require_once __DIR__ . '/../../../lib/Doctrine/Common/ClassLoader.php'; +require_once __DIR__ . '/../../../lib/vendor/doctrine-common/lib/Doctrine/Common/ClassLoader.php'; + +if (isset($GLOBALS['DOCTRINE_COMMON_PATH'])) { + $classLoader = new \Doctrine\Common\ClassLoader('Doctrine\Common', $GLOBALS['DOCTRINE_COMMON_PATH']); +} else { + $classLoader = new \Doctrine\Common\ClassLoader('Doctrine\Common', __DIR__ . '/../../../lib/vendor/doctrine-common/lib'); +} +$classLoader->register(); + +if (isset($GLOBALS['DOCTRINE_DBAL_PATH'])) { + $classLoader = new \Doctrine\Common\ClassLoader('Doctrine\DBAL', $GLOBALS['DOCTRINE_DBAL_PATH']); +} else { + $classLoader = new \Doctrine\Common\ClassLoader('Doctrine\DBAL', __DIR__ . '/../../../lib/vendor/doctrine-dbal/lib'); +} +$classLoader->register(); $classLoader = new \Doctrine\Common\ClassLoader('Doctrine'); $classLoader->register(); diff --git a/tools/NativePhpunitTask.php b/tests/NativePhpunitTask.php similarity index 100% rename from tools/NativePhpunitTask.php rename to tests/NativePhpunitTask.php diff --git a/tools/sandbox/cli-config.php b/tools/sandbox/cli-config.php index afe1296e6..c949668e0 100644 --- a/tools/sandbox/cli-config.php +++ b/tools/sandbox/cli-config.php @@ -1,10 +1,17 @@ <?php -require_once __DIR__ . '/../../lib/Doctrine/Common/ClassLoader.php'; +require_once '../../lib/vendor/doctrine-common/lib/Doctrine/Common/ClassLoader.php'; +$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\ORM', realpath(__DIR__ . '/../../lib')); +$classLoader->register(); +$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\DBAL', realpath(__DIR__ . '/../../lib/vendor/doctrine-dbal/lib')); +$classLoader->register(); +$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\Common', realpath(__DIR__ . '/../../lib/vendor/doctrine-common/lib')); +$classLoader->register(); +$classLoader = new \Doctrine\Common\ClassLoader('Symfony', realpath(__DIR__ . '/../../lib/vendor')); +$classLoader->register(); $classLoader = new \Doctrine\Common\ClassLoader('Entities', __DIR__); $classLoader->register(); - $classLoader = new \Doctrine\Common\ClassLoader('Proxies', __DIR__); $classLoader->register(); diff --git a/tools/sandbox/doctrine.php b/tools/sandbox/doctrine.php index f325e143a..9d498d440 100644 --- a/tools/sandbox/doctrine.php +++ b/tools/sandbox/doctrine.php @@ -1,11 +1,18 @@ <?php -require __DIR__ . '/../../lib/Doctrine/Common/ClassLoader.php'; +require_once '../../lib/vendor/doctrine-common/lib/Doctrine/Common/ClassLoader.php'; -$classLoader = new \Doctrine\Common\ClassLoader('Doctrine', __DIR__ . '/../../lib'); +$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\ORM', realpath(__DIR__ . '/../../lib')); $classLoader->register(); - -$classLoader = new \Doctrine\Common\ClassLoader('Symfony', __DIR__ . '/../../lib/vendor'); +$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\DBAL', realpath(__DIR__ . '/../../lib/vendor/doctrine-dbal/lib')); +$classLoader->register(); +$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\Common', realpath(__DIR__ . '/../../lib/vendor/doctrine-common/lib')); +$classLoader->register(); +$classLoader = new \Doctrine\Common\ClassLoader('Symfony', realpath(__DIR__ . '/../../lib/vendor')); +$classLoader->register(); +$classLoader = new \Doctrine\Common\ClassLoader('Entities', __DIR__); +$classLoader->register(); +$classLoader = new \Doctrine\Common\ClassLoader('Proxies', __DIR__); $classLoader->register(); // Variable $helperSet is defined inside cli-config.php diff --git a/tools/sandbox/index.php b/tools/sandbox/index.php index 37879eef4..ad1cb9d6b 100644 --- a/tools/sandbox/index.php +++ b/tools/sandbox/index.php @@ -15,16 +15,22 @@ use Doctrine\Common\ClassLoader, Doctrine\Common\Cache\ApcCache, Entities\User, Entities\Address; -require '../../lib/Doctrine/Common/ClassLoader.php'; +require_once '../../lib/vendor/doctrine-common/lib/Doctrine/Common/ClassLoader.php'; // Set up class loading. You could use different autoloaders, provided by your favorite framework, // if you want to. -$doctrineClassLoader = new ClassLoader('Doctrine', realpath(__DIR__ . '/../../lib')); -$doctrineClassLoader->register(); -$entitiesClassLoader = new ClassLoader('Entities', __DIR__); -$entitiesClassLoader->register(); -$proxiesClassLoader = new ClassLoader('Proxies', __DIR__); -$proxiesClassLoader->register(); +$classLoader = new ClassLoader('Doctrine\ORM', realpath(__DIR__ . '/../../lib')); +$classLoader->register(); +$classLoader = new ClassLoader('Doctrine\DBAL', realpath(__DIR__ . '/../../lib/vendor/doctrine-dbal/lib')); +$classLoader->register(); +$classLoader = new ClassLoader('Doctrine\Common', realpath(__DIR__ . '/../../lib/vendor/doctrine-common/lib')); +$classLoader->register(); +$classLoader = new ClassLoader('Symfony', realpath(__DIR__ . '/../../lib/vendor')); +$classLoader->register(); +$classLoader = new ClassLoader('Entities', __DIR__); +$classLoader->register(); +$classLoader = new ClassLoader('Proxies', __DIR__); +$classLoader->register(); // Set up caches $config = new Configuration; @@ -54,4 +60,3 @@ $user = new User; $address = new Address; echo 'Hello World!' . PHP_EOL; -