From: Vincent Vanwaelscappel Date: Tue, 4 Feb 2025 17:09:00 +0000 (+0100) Subject: wip #7264 @3.5 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=096be5817ff63ef197c8ce31ec9cbc09490c8cda;p=bloomsburie.git wip #7264 @3.5 --- diff --git a/.docker/images/php-fpm/Dockerfile b/.docker/images/php-fpm/Dockerfile index 123d9b7..97cc5d5 100644 --- a/.docker/images/php-fpm/Dockerfile +++ b/.docker/images/php-fpm/Dockerfile @@ -1,5 +1,5 @@ ############################################ -# PHPDocker.io PHP 7.4 / CLI and FPM image # +# PHPDocker.io PHP 8.3 / CLI and FPM image # ############################################ FROM ubuntu:jammy AS cli @@ -26,30 +26,30 @@ RUN apt update RUN apt -y --no-install-recommends install \ git \ - php7.4-apcu \ - php7.4-cli \ - php7.4-curl \ - php7.4-mbstring \ - php7.4-opcache \ - php7.4-readline \ - php7.4-xml \ - php7.4-zip \ - php7.4-bz2 \ - php7.4-gd \ - php7.4-igbinary \ - php7.4-imap \ - php7.4-imagick \ - php7.4-intl \ - php7.4-memcached \ - php7.4-mysql \ - php7.4-redis \ - php7.4-soap \ - php7.4-ssh2 \ - php7.4-tidy \ - php7.4-xsl \ - php7.4-curl \ - php7.4-bcmath \ - php7.4-fpm \ + php8.3-apcu \ + php8.3-cli \ + php8.3-curl \ + php8.3-mbstring \ + php8.3-opcache \ + php8.3-readline \ + php8.3-xml \ + php8.3-zip \ + php8.3-bz2 \ + php8.3-gd \ + php8.3-igbinary \ + php8.3-imap \ + php8.3-imagick \ + php8.3-intl \ + php8.3-memcached \ + php8.3-mysql \ + php8.3-redis \ + php8.3-soap \ + php8.3-ssh2 \ + php8.3-tidy \ + php8.3-xsl \ + php8.3-curl \ + php8.3-bcmath \ + php8.3-fpm \ less nano wget nodejs sudo openssh-server rsyslog cron mariadb-client zip unzip imagemagick locales postfix RUN sed -i '/fr_FR.UTF-8/s/^# //g' /etc/locale.gen && \ @@ -70,7 +70,7 @@ STOPSIGNAL SIGQUIT RUN groupadd sudo;useradd -d /application -g 33 -G sudo -s /bin/bash -u 1001 bloomsburie # PHP-FPM packages need a nudge to make them docker-friendly -COPY overrides.conf /etc/php/7.4/fpm/pool.d/z-overrides.conf +COPY overrides.conf /etc/php/8.3/fpm/pool.d/z-overrides.conf COPY --chmod=755 startup /usr/bin/startup CMD exec /usr/bin/startup diff --git a/.docker/images/php-fpm/startup b/.docker/images/php-fpm/startup index e367045..16d4ab5 100644 --- a/.docker/images/php-fpm/startup +++ b/.docker/images/php-fpm/startup @@ -30,4 +30,4 @@ chmod 0644 /etc/crontab && crontab -u root /etc/crontab && /usr/sbin/service cro chpasswd < /root/passwords # Launch PHP -/usr/sbin/php-fpm7.4 -O +/usr/sbin/php-fpm8.3 -O diff --git a/.docker/production/docker-compose.yml b/.docker/production/docker-compose.yml index 7c9dd88..19def5e 100644 --- a/.docker/production/docker-compose.yml +++ b/.docker/production/docker-compose.yml @@ -39,9 +39,7 @@ services: # Cron - './www/.docker/config/cron/crontab:/etc/crontab' # PHP - - './www/.docker/config/php.ini:/etc/php/7.4/fpm/conf.d/99-overrides.ini' - # ENV - - './www/.env.production:/application/.env' + - './www/.docker/config/php.ini:/etc/php/8.3/fpm/conf.d/99-overrides.ini' # Web path - './www:/application' ports: diff --git a/.idea/deployment.xml b/.idea/deployment.xml index a8a7d9b..66946e4 100644 --- a/.idea/deployment.xml +++ b/.idea/deployment.xml @@ -24,7 +24,7 @@ - + @@ -269,6 +269,13 @@ + + + + + + + @@ -332,6 +339,13 @@ + + + + + + + diff --git a/framework/application/configs/application.ini b/framework/application/configs/application.ini index 0ba315c..02b87ef 100644 --- a/framework/application/configs/application.ini +++ b/framework/application/configs/application.ini @@ -49,7 +49,36 @@ mail.test = APPLICATION_PATH "/../data/email/test" privacy.dnt = 1 privacy.analytics = 1 -[testing : production] +[staging : production] + +dev = true + +mail.from = external@cubedesigners.com +mail.host=mail2.cubedesigners.com +mail.port=587 +mail.username=external@cubedesigners.com +mail.password=z6hfYZJEfFZp48pza3 +mail.encryption=tls + +database.params.host = localhost +database.params.password = 7^ACmhtEx4P^8s&44#jN +database.params.dbname = bloomsburie_2025_staging +database.params.username = cubedesigners + +webhost = staging.bloomsburie.com + +locales.en = staging.bloomsburie.com +locales.fr = fr.staging.bloomsburie.com + +seo.robots = false + +httpauth.username = bloomsburie +httpauth.password = training2025 + +session.adapter = files + +[testing : staging] + dev = false mail.from = external@cubedesigners.com @@ -67,9 +96,4 @@ database.params.username = root webhost = bloomsburie.dev2.cubedesigners.com locales.en = bloomsburie.dev2.cubedesigners.com -locales.fr = fr.bloomsburie.dev2.cubedesigners.com - -seo.robots = false - -httpauth.username = bloomsburie -httpauth.password = training2025 \ No newline at end of file +locales.fr = fr.bloomsburie.dev2.cubedesigners.com \ No newline at end of file diff --git a/framework/application/views/helpers/CasestudiesList.php b/framework/application/views/helpers/CasestudiesList.php index 9c19ca0..ccc48a1 100644 --- a/framework/application/views/helpers/CasestudiesList.php +++ b/framework/application/views/helpers/CasestudiesList.php @@ -182,17 +182,11 @@ class Cubedesigners_View_Helper_CasestudiesList extends CubeIT_View_Helper_Abstr */ $c.= '

' . $s->legende . '

'; - // Make a list of class names for each category this study is - // assigned to so it can be filtered later on the frontend - $category_classes = array_reduce($s->categories, function($list, $categoryID) { - $list .= ' cat-'. $categoryID; - return $list; - }); return $this->link($c, $url, array( //'data-cat' => $s->categories, - 'class' => 'wow fadeInUp' . $category_classes, + 'class' => 'wow fadeInUp', 'data-wow-delay' => '300ms', )) . ' '; // Space needed between elements for justified alignment } diff --git a/framework/library/CubeIT/Bootstrap/Db.php b/framework/library/CubeIT/Bootstrap/Db.php index 167af5c..c04477e 100644 --- a/framework/library/CubeIT/Bootstrap/Db.php +++ b/framework/library/CubeIT/Bootstrap/Db.php @@ -2,196 +2,11 @@ class CubeIT_Bootstrap_Db extends CubeIT_Bootstrap_Base { - protected function _initDoctrine() { - profile(__FILE__, __LINE__, 'Init Doctrine'); - CubeIT_Library::Doctrine(); - - // Connect with application.ini - $ini = $this->getOption('database'); - $config = new \Doctrine\DBAL\Configuration(); - $params = array('driver' => $ini['adapter'], 'dbname' => $ini['params']['dbname']); - - if (isset($ini['params']['username'])) { - $params['user'] = $ini['params']['username']; - } - if (isset($ini['params']['password'])) { - $params['password'] = $ini['params']['password']; - } - if (isset($ini['params']['unix_socket'])) { - $params['unix_socket'] = $ini['params']['unix_socket']; - } else if (isset($ini['params']['host'])) { - $params['host'] = $ini['params']['host']; - } - - $params['options']['charset'] = 'utf8'; - $params['options']['collate'] = 'utf8_unicode_ci'; - $params['options']['engine'] = 'MyISAM'; - - if ($params['driver'] == 'pdo_sqlite') { - $params['path'] = $params['dbname']; - } - - $doctrine = Doctrine\DBAL\DriverManager::getConnection($params, $config); - return $doctrine; - } - - protected function _initSyncDb() { - profile(__FILE__, __LINE__, 'Init Sync Db'); - // Find the final class which instantiate _defineSchema - $reflection = new ReflectionObject($this); - $method = $reflection->getMethod('_defineSchema'); - $class = $method->getDeclaringClass(); - $file = $class->getFilename(); - $done = CACHE_PATH . '/' . APPLICATION_ENV . '/CubeIT_SYNCDB_DONE'; - $sync = false; - - $time = max(filemtime(__FILE__), filemtime($file)); - - // Check mtime of models - $modelsSource = CubeIT_Model::getModelSources(); - $time = max(CubeIT_Files::dirmtime($modelsSource, true), $time); - - // Compare last mod of final class file and done time - // If db is synced skip sync process - - if (file_exists($done) && filemtime($done) >= $time) { - return; - } - profile(__FILE__, __LINE__, 'Sync DB'); - $sync = true; - - /* @var $doctrine Doctrine\DBAL\Connection */ - $doctrine = $this->getDoctrine(); - - // Init schema - $schema = new Doctrine\DBAL\Schema\Schema(); - // Define the schema - $options = array('engine' => 'MyISAM', 'charset' => 'utf8', 'collate' => 'utf8_unicode_ci'); - // Get Schema from bootstrap - $this->_defineSchema($schema, $options); - // Get Schema from model - foreach ($this->_getModels() as $c) { - $skipCallback = array($c, 'skipSchemaSync'); - if (is_callable($skipCallback) && call_user_func($skipCallback)) { - continue; - } - $callback = array($c, 'getSchema'); - - if (is_callable($callback)) { - call_user_func($callback, $schema); - } - } - - // Sync it - $comparator = new Doctrine\DBAL\Schema\Comparator(); - $currentSchema = $doctrine->getSchemaManager()->createSchema(); - $diff = $comparator->compare($currentSchema, $schema); - - if (stristr($doctrine->getDriver()->getName(), 'mysql')) { - $platform = new CubeIT_Db_MysqlPlatform(); - } else { - $platform = $doctrine->getDatabasePlatform(); - } - - $queries = $diff->toSaveSql($platform); - foreach ($queries as $q) { - $doctrine->exec($q); - } - - touch($done); - return $sync; - } protected function _initDbViews() { profile(__FILE__, __LINE__, 'Create Db views'); } - /** - * - * @param \Doctrine\DBAL\Schema\Schema $schema - * @param array $options - */ - protected function _defineSchema(&$schema, $options) { - profile(__FILE__, __LINE__, '_defineSchema'); - $this->getFrameworkCache()->clean(); - - $url = $schema->createTable('cubeit_url'); - $url->addColumn('id', 'string', array('length' => 64)); - $url->addColumn('uri', 'string', array('length' => 256)); - $url->addColumn('locale', 'string', array('length' => 8)); - $url->setPrimaryKey(array('uri', 'locale')); - $url->addIndex(array('id')); - - $page = $schema->createTable('cubeit_page'); - $page->addColumn('id', 'integer', array('unsigned' => true)); - $page->addColumn('variant', 'integer', array('unsigned' => true)); - $page->setPrimaryKey(array('id', 'variant')); - $page->addColumn('label', 'string', array('length' => 64)); - $page->addColumn('parentPage', 'integer'); - $page->addColumn('template', 'string', array('length' => 32, 'default' => 'default')); - $page->addColumn('acl', 'string', array('length' => 128, 'default' => 'inherit')); - $page->addColumn('online', 'boolean', array('default' => 1)); - $page->addColumn('ordre', 'integer', array('unsigned' => true)); - $page->addColumn('level', 'integer', array('unsigned' => true)); - $page->addIndex(array('online')); - $page->addIndex(array('level')); - $page->addIndex(array('ordre')); - $page->addIndex(array('variant')); - - $content = $schema->createTable('cubeit_content'); - $content->addColumn('id', 'integer', array('unsigned' => true)); - $content->addColumn('locale', 'string', array('length' => 6)); - $content->addColumn('label', 'string', array('length' => 256)); - $content->addColumn('variant', 'integer'); - $content->setPrimaryKey(array('id', 'locale', 'label', 'variant')); - $content->addIndex(array('locale')); - $content->addIndex(array('label')); - $content->addIndex(array('variant')); - $content->addColumn('content', 'text'); - - $mailqueue = $schema->createTable('cubeit_mailqueue'); - $mailqueue->addColumn('id', 'integer', array('unsigned' => true, 'autoincrement' => true)); - $mailqueue->setPrimaryKey(array('id')); - $mailqueue->addColumn('mail', 'text'); - $mailqueue->addColumn('transport', 'text'); - $mailqueue->addColumn('added', 'datetime'); - $mailqueue->addColumn('recipients', 'text'); - $mailqueue->addColumn('error', 'string', array('length' => 256)); - $mailqueue->addColumn('sent', 'boolean'); - $mailqueue->addIndex(array('sent')); - $mailqueue->addIndex(array('added')); - - $session = $schema->createTable('cubeit_session'); - $session->addColumn('id', 'string', array('length' => 32)); - $session->setPrimaryKey(array('id')); - $session->addColumn('modified', 'integer', array('unsigned' => true)); - $session->addIndex(array('modified')); - $session->addColumn('lifetime', 'integer', array('unsigned' => true)); - $session->addIndex(array('lifetime')); - $session->addColumn('data', 'text'); - - $geocode = $schema->createTable('cubeit_geocode'); - $geocode->addColumn('id', 'integer', array('unsigned' => true, 'autoincrement' => true)); - $geocode->setPrimaryKey(array('id')); - $geocode->addColumn('address', 'string', array('length' => 256)); - $geocode->addUniqueIndex(array('address')); - $geocode->addColumn('response', 'text'); - $geocode->addColumn('valid', 'datetime'); - - $group = $schema->createTable('cubeit_group'); - $group->addColumn('id', 'integer', array('unsigned' => true, 'autoincrement' => true)); - $group->setPrimaryKey(array('id')); - $group->addColumn('name', 'string', array('length' => 64)); - - $group_content = $schema->createTable('cubeit_group_content'); - $group_content->addColumn('group_id', 'integer', array('unsigned' => true)); - $group_content->addIndex(array('group_id')); - $group_content->addColumn('user_id', 'integer', array('unsigned' => true)); - $group_content->addIndex(array('user_id')); - $group_content->setPrimaryKey(array('group_id', 'user_id')); - - CubeIT_Model_Registry::getSchema($schema); - } protected function _initDb() { profile(__FILE__, __LINE__, 'Init DB'); @@ -200,11 +15,6 @@ class CubeIT_Bootstrap_Db extends CubeIT_Bootstrap_Base { Zend_Db_Table::setDefaultAdapter($db); Zend_Db_Table_Abstract::setDefaultMetadataCache($this->getFrameworkCache()); - $this->bootstrap('syncDb'); - if ($this->getResource('syncDb')) { - $this->bootstrap('dbViews'); - } - return $db; } @@ -264,12 +74,4 @@ class CubeIT_Bootstrap_Db extends CubeIT_Bootstrap_Base { return $this->getResource('formerDb'); } - /** - * @return Doctrine\DBAL\Connection - */ - public function getDoctrine() { - $this->bootstrap('doctrine'); - return $this->getResource('doctrine'); - } - } diff --git a/framework/library/CubeIT/View/Helper/CMSValue.php b/framework/library/CubeIT/View/Helper/CMSValue.php index f783aa0..53bb190 100644 --- a/framework/library/CubeIT/View/Helper/CMSValue.php +++ b/framework/library/CubeIT/View/Helper/CMSValue.php @@ -1,13 +1,11 @@ view->$key; - if (!$v && isset($this->options[$key])) { - $v = $this->options[$key]; - } - return CubeIT_Util_Cms::unserialize($v); + public function cMSValue(){ + $res = ''; + + return $res; } -} +} \ No newline at end of file diff --git a/framework/library/CubeIT/View/Helper/Image.php b/framework/library/CubeIT/View/Helper/Image.php index fa95a81..98e7e87 100644 --- a/framework/library/CubeIT/View/Helper/Image.php +++ b/framework/library/CubeIT/View/Helper/Image.php @@ -16,7 +16,7 @@ class CubeIT_View_Helper_Image extends CubeIT_View_Helper_HtmlElement $markup = 'iframe'; $content = ''; $oam = self::getOAMData($src); - if(null===$oam){ + if (null === $oam) { return; } $attributes['src'] = $oam['url']; @@ -67,8 +67,8 @@ class CubeIT_View_Helper_Image extends CubeIT_View_Helper_HtmlElement public static function getOAMData($src) { $unz = self::unzipOAM($src); - $config=$unz . 'config.xml'; - if(!file_exists($config)){ + $config = $unz . 'config.xml'; + if (!file_exists($config)) { return null; } @@ -142,10 +142,10 @@ class CubeIT_View_Helper_Image extends CubeIT_View_Helper_HtmlElement } $attributes['src'] = $srcu; - if (!is_null($width) && $width >= 0) { + if (!is_null($width) && is_numeric($width) && $width >= 0) { $attributes['width'] = ceil($width / $initialResolution); } - if (!is_null($height) && $height >= 0) { + if (!is_null($height) && is_numeric($height) && $height >= 0) { $attributes['height'] = ceil($height / $initialResolution); } diff --git a/framework/library/CubeIT/View/Helper/ImageProcess.php b/framework/library/CubeIT/View/Helper/ImageProcess.php index d0a1795..f33f083 100644 --- a/framework/library/CubeIT/View/Helper/ImageProcess.php +++ b/framework/library/CubeIT/View/Helper/ImageProcess.php @@ -1,190 +1,199 @@ 'crop', 'F' => 'force', 'R' => 'ratio'); - - public function imageProcess($image = null, $alt = '', $width = null, $height = null, $attributes = array(), $method = 'C', $horizontalAlign = 'C', $verticalAlign = 'M', $expand = false, $type = 'auto', $fillColor = null, $quality = 92, $filesdir = 'files', $onlyURL = false) { - - if (is_null($image)) { - return $this; - } - - $image = $this->_image($image); - - $finalWidth = $finalHeight = -1; - if ($method == 'F' || $method == 'C') { - if ($width > 0) { - $finalWidth = $width; - } - if ($height > 0) { - $finalHeight = $height; - } - } - - if (!$alt) { - $alt = CubeIT_Util_Cms::getImageAlt($image); - } - - $url = $this->imageProcessGetURL($image, $alt, $width, $height, $attributes, $method, $horizontalAlign, $verticalAlign, $expand, $type, $fillColor, $quality, $filesdir); - if ($url === false) { - return false; - } +class CubeIT_View_Helper_ImageProcess extends CubeIT_View_Helper_ImageCms +{ + + const CENTER = 'C'; + const MIDDLE = 'M'; + const TOP = 'T'; + const LEFT = 'L'; + const RIGHT = 'R'; + const BOTTOM = 'B'; + const CROP = 'C'; + const FORCE = 'F'; + const RATIO = 'R'; + + const SPACER = '/CubeIT/images/spacer.gif'; + + public static $lastProcessedDimensions; + public static $_methods = array('C' => 'crop', 'F' => 'force', 'R' => 'ratio'); + + public function imageProcess($image = null, $alt = '', $width = null, $height = null, $attributes = array(), $method = 'C', $horizontalAlign = 'C', $verticalAlign = 'M', $expand = false, $type = 'auto', $fillColor = null, $quality = 92, $filesdir = 'files', $onlyURL = false) + { + + if (is_null($image)) { + return $this; + } + + $image = $this->_image($image); + + $finalWidth = $finalHeight = -1; + if ($method == 'F' || $method == 'C') { + if ($width > 0) { + $finalWidth = $width; + } + if ($height > 0) { + $finalHeight = $height; + } + } + + if (!$alt) { + $alt = CubeIT_Util_Cms::getImageAlt($image); + } + + $url = $this->imageProcessGetURL($image, $alt, $width, $height, $attributes, $method, $horizontalAlign, $verticalAlign, $expand, $type, $fillColor, $quality, $filesdir); + if ($url === false) { + return false; + } if ($onlyURL) { return $url; } - return $this->image($url, $alt, $finalWidth, $finalHeight, $attributes); - } - - public function imageProcessRatio($image = null, $alt = '', $attributes = array(), $ratio = 1.5, $horizontalAlign = 'C', $verticalAlign = 'M', $expand = false, $type = 'auto', $fillColor = null, $quality = 92, $filesdir = 'files') { - if (is_null($image)) { - return $this; - } - - $image = $this->_image($image); - $ih = $iw = null; - CubeIT_Image::getDimensions(CubeIT_View_Helper_ImageCms::getPath($image, $filesdir), $iw, $ih); - - $width = $iw; - $height = round($iw / $ratio); - - $url = $this->imageProcessGetURL($image, $alt, $width, $height, $attributes, 'C', $horizontalAlign, $verticalAlign, $expand, $type, $fillColor, $quality, $filesdir); - if ($url === false) { - return false; - } - return $this->image($url, $alt, $width, $height, $attributes); - } - - public function imageProcessGetURL($image, $alt = '', $width = null, $height = null, $attributes = array(), $method = 'C', $horizontalAlign = 'C', $verticalAlign = 'M', $expand = false, $type = 'auto', $fillColor = null, $quality = 92, $filesdir = 'files') { - $image = $this->_image($image); - - if (stristr($image, '.nr.')) { - return CubeIT_Util_Cms::filePath($image); - } - - if ($image === false) { - return false; - } - - if (is_null($type)) { - $type = 'auto'; - } - - $width = round($width); - $height = round($height); - - $ext = CubeIT_Files::getExtension($image); - if ($ext == 'pdf' && $type == 'auto') { - $type = 'jpg'; - $fillColor = '#ffffffff'; - } - - $external = false; - if (preg_match('#^https?://#', $image, $matches)) { - $image = $this->_copyExternal($image); - $external = true; - } - - if ($type == 'auto') { - $type = $ext; - $toImage = $image; - } else { - $e = explode('.', $image); - array_pop($e); - array_push($e, $type); - $toImage = implode('.', $e); - } - - - $resize = CubeIT_Image_Resizer::getInstance(); - $toImage = $resize->transformDestName($toImage); - - - if (!$resize->accept($type)) { - fb($image, 'not accepted format'); - return self::SPACER; - } - - $dir = $width . 'x' . $height . '_' . $method . $horizontalAlign . $verticalAlign; - - if ($external) { - $dir .= '/external'; - } - $processedDir = FILES_PATH . '/processed/' . $dir; - $processedFile = $processedDir . '/' . $toImage; - $processedFileURL = '/files/processed/' . $dir . '/' . $toImage; - if (substr($image, 0, 1) == '/') { - $fromFile = PUBLIC_PATH . $image; - } elseif (!$external) { - $fromFile = PUBLIC_PATH . '/' . CubeIT_View_Helper_ImageCms::getPath($image, $filesdir); - } else { - $fromFile = FILES_PATH . '/external/' . $image; - } - - if (!file_exists($fromFile)) { - fb($fromFile, 'File not exists'); - return self::SPACER; - } - - if (!file_exists($processedFile) || filemtime($processedFile) < filemtime($fromFile)) { - if (!file_exists($processedDir)) { - mkdir($processedDir, 0777, true); - } - try { - $resize->loadImage($fromFile); - } catch (Exception $e) { - fb($fromFile, $e->getMessage()); - return self::SPACER; - } - $mode = $method; - if (isset(self::$_methods[$method])) { - $mode = self::$_methods[$method]; - } - $resize->resize(round($width), round($height), $mode, $expand, $horizontalAlign, $verticalAlign, $fillColor); - $resize->output($type, $processedFile, $quality); - } - $width = -1; - $height = -1; - CubeIT_Image::getDimensions($processedFileURL, $width, $height); - - if ($width <= 0) { - return self::SPACER; - } - - self::$lastProcessedDimensions = array($width, $height); - - return $processedFileURL; - } - - protected function _copyExternal($image) { - if (!file_exists(FILES_PATH . '/external/')) { - mkdir(FILES_PATH . '/external/', 0777, true); - } - - $ext = CubeIT_Files::getExtension($image); - $hash = sha1($image); - $localname = 'external/' . $hash . '.' . $ext; - - $local = FILES_PATH . '/' . $localname; - - if (!file_exists($local)) { - copy($image, $local); - } - return $hash . '.' . $ext; - } + return $this->image($url, $alt, $finalWidth, $finalHeight, $attributes); + } + + public function imageProcessRatio($image = null, $alt = '', $attributes = array(), $ratio = 1.5, $horizontalAlign = 'C', $verticalAlign = 'M', $expand = false, $type = 'auto', $fillColor = null, $quality = 92, $filesdir = 'files') + { + if (is_null($image)) { + return $this; + } + + $image = $this->_image($image); + $ih = $iw = null; + CubeIT_Image::getDimensions(CubeIT_View_Helper_ImageCms::getPath($image, $filesdir), $iw, $ih); + + $width = $iw; + $height = round($iw / $ratio); + + $url = $this->imageProcessGetURL($image, $alt, $width, $height, $attributes, 'C', $horizontalAlign, $verticalAlign, $expand, $type, $fillColor, $quality, $filesdir); + if ($url === false) { + return false; + } + return $this->image($url, $alt, $width, $height, $attributes); + } + + public function imageProcessGetURL($image, $alt = '', $width = null, $height = null, $attributes = array(), $method = 'C', $horizontalAlign = 'C', $verticalAlign = 'M', $expand = false, $type = 'auto', $fillColor = null, $quality = 92, $filesdir = 'files') + { + $image = $this->_image($image); + + if (stristr($image, '.nr.')) { + return CubeIT_Util_Cms::filePath($image); + } + + if ($image === false) { + return false; + } + + if (is_null($type)) { + $type = 'auto'; + } + + if (is_numeric($width)) { + $width = round($width); + } + if (is_numeric($height)) { + $height = round($height); + } + + $ext = CubeIT_Files::getExtension($image); + if ($ext == 'pdf' && $type == 'auto') { + $type = 'jpg'; + $fillColor = '#ffffffff'; + } + + $external = false; + if (preg_match('#^https?://#', $image, $matches)) { + $image = $this->_copyExternal($image); + $external = true; + } + + if ($type == 'auto') { + $type = $ext; + $toImage = $image; + } else { + $e = explode('.', $image); + array_pop($e); + array_push($e, $type); + $toImage = implode('.', $e); + } + + + $resize = CubeIT_Image_Resizer::getInstance(); + $toImage = $resize->transformDestName($toImage); + + + if (!$resize->accept($type)) { + fb($image, 'not accepted format'); + return self::SPACER; + } + + $dir = $width . 'x' . $height . '_' . $method . $horizontalAlign . $verticalAlign; + + if ($external) { + $dir .= '/external'; + } + $processedDir = FILES_PATH . '/processed/' . $dir; + $processedFile = $processedDir . '/' . $toImage; + $processedFileURL = '/files/processed/' . $dir . '/' . $toImage; + if (substr($image, 0, 1) == '/') { + $fromFile = PUBLIC_PATH . $image; + } elseif (!$external) { + $fromFile = PUBLIC_PATH . '/' . CubeIT_View_Helper_ImageCms::getPath($image, $filesdir); + } else { + $fromFile = FILES_PATH . '/external/' . $image; + } + + if (!file_exists($fromFile)) { + fb($fromFile, 'File not exists'); + return self::SPACER; + } + + if (!file_exists($processedFile) || filemtime($processedFile) < filemtime($fromFile)) { + if (!file_exists($processedDir)) { + mkdir($processedDir, 0777, true); + } + try { + $resize->loadImage($fromFile); + } catch (Exception $e) { + fb($fromFile, $e->getMessage()); + return self::SPACER; + } + $mode = $method; + if (isset(self::$_methods[$method])) { + $mode = self::$_methods[$method]; + } + $resize->resize($width,$height, $mode, $expand, $horizontalAlign, $verticalAlign, $fillColor); + $resize->output($type, $processedFile, $quality); + } + $width = -1; + $height = -1; + CubeIT_Image::getDimensions($processedFileURL, $width, $height); + + if ($width <= 0) { + return self::SPACER; + } + + self::$lastProcessedDimensions = array($width, $height); + + return $processedFileURL; + } + + protected function _copyExternal($image) + { + if (!file_exists(FILES_PATH . '/external/')) { + mkdir(FILES_PATH . '/external/', 0777, true); + } + + $ext = CubeIT_Files::getExtension($image); + $hash = sha1($image); + $localname = 'external/' . $hash . '.' . $ext; + + $local = FILES_PATH . '/' . $localname; + + if (!file_exists($local)) { + copy($image, $local); + } + return $hash . '.' . $ext; + } } diff --git a/framework/library/Doctrine/Common/Annotations/Annotation.php b/framework/library/Doctrine/Common/Annotations/Annotation.php deleted file mode 100644 index 6a1390a..0000000 --- a/framework/library/Doctrine/Common/Annotations/Annotation.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Annotations class - * - * @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 - * - * @throws \BadMethodCallException - */ - 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 - * - * @throws \BadMethodCallException - */ - public function __set($name, $value) - { - throw new \BadMethodCallException( - sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) - ); - } -} diff --git a/framework/library/Doctrine/Common/Annotations/Annotation/Attribute.php b/framework/library/Doctrine/Common/Annotations/Annotation/Attribute.php deleted file mode 100644 index dbef6df..0000000 --- a/framework/library/Doctrine/Common/Annotations/Annotation/Attribute.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations\Annotation; - -/** - * Annotation that can be used to signal to the parser - * to check the attribute type during the parsing process. - * - * @author Fabio B. Silva - * - * @Annotation - */ -final class Attribute -{ - /** - * @var string - */ - public $name; - - /** - * @var string - */ - public $type; - - /** - * @var boolean - */ - public $required = false; -} diff --git a/framework/library/Doctrine/Common/Annotations/Annotation/Attributes.php b/framework/library/Doctrine/Common/Annotations/Annotation/Attributes.php deleted file mode 100644 index 53134e3..0000000 --- a/framework/library/Doctrine/Common/Annotations/Annotation/Attributes.php +++ /dev/null @@ -1,37 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations\Annotation; - -/** - * Annotation that can be used to signal to the parser - * to check the types of all declared attributes during the parsing process. - * - * @author Fabio B. Silva - * - * @Annotation - */ -final class Attributes -{ - /** - * @var array - */ - public $value; -} diff --git a/framework/library/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/framework/library/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php deleted file mode 100644 index a84a4f5..0000000 --- a/framework/library/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations\Annotation; - -/** - * Annotation that can be used to signal to the parser to ignore specific - * annotations during the parsing process. - * - * @Annotation - * @author Johannes M. Schmitt - */ -final class IgnoreAnnotation -{ - /** - * @var array - */ - public $names; - - /** - * Constructor - * - * @param array $values - * - * @throws \RuntimeException - */ - public function __construct(array $values) - { - if (is_string($values['value'])) { - $values['value'] = array($values['value']); - } - if (!is_array($values['value'])) { - throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); - } - - $this->names = $values['value']; - } -} diff --git a/framework/library/Doctrine/Common/Annotations/Annotation/Required.php b/framework/library/Doctrine/Common/Annotations/Annotation/Required.php deleted file mode 100644 index d67f960..0000000 --- a/framework/library/Doctrine/Common/Annotations/Annotation/Required.php +++ /dev/null @@ -1,33 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations\Annotation; - -/** - * Annotation that can be used to signal to the parser - * to check if that attribute is required during the parsing process. - * - * @author Fabio B. Silva - * - * @Annotation - */ -final class Required -{ -} diff --git a/framework/library/Doctrine/Common/Annotations/Annotation/Target.php b/framework/library/Doctrine/Common/Annotations/Annotation/Target.php deleted file mode 100644 index 64655ef..0000000 --- a/framework/library/Doctrine/Common/Annotations/Annotation/Target.php +++ /dev/null @@ -1,107 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations\Annotation; - -/** - * Annotation that can be used to signal to the parser - * to check the annotation target during the parsing process. - * - * @author Fabio B. Silva - * - * @Annotation - */ -final class Target -{ - const TARGET_CLASS = 1; - const TARGET_METHOD = 2; - const TARGET_PROPERTY = 4; - const TARGET_ANNOTATION = 8; - const TARGET_ALL = 15; - - /** - * @var array - */ - private static $map = array( - 'ALL' => self::TARGET_ALL, - 'CLASS' => self::TARGET_CLASS, - 'METHOD' => self::TARGET_METHOD, - 'PROPERTY' => self::TARGET_PROPERTY, - 'ANNOTATION' => self::TARGET_ANNOTATION, - ); - - /** - * @var array - */ - public $value; - - /** - * Targets as bitmask. - * - * @var integer - */ - public $targets; - - /** - * Literal target declaration. - * - * @var integer - */ - public $literal; - - /** - * Annotation construct - * - * @param array $values - * - * @throws \InvalidArgumentException - */ - public function __construct(array $values) - { - if (!isset($values['value'])){ - $values['value'] = null; - } - if (is_string($values['value'])){ - $values['value'] = array($values['value']); - } - if (!is_array($values['value'])){ - throw new \InvalidArgumentException( - sprintf('@Target expects either a string value, or an array of strings, "%s" given.', - is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) - ) - ); - } - - $bitmask = 0; - foreach ($values['value'] as $literal) { - if(!isset(self::$map[$literal])){ - throw new \InvalidArgumentException( - sprintf('Invalid Target "%s". Available targets: [%s]', - $literal, implode(', ', array_keys(self::$map))) - ); - } - $bitmask += self::$map[$literal]; - } - - $this->targets = $bitmask; - $this->value = $values['value']; - $this->literal = implode(', ', $this->value); - } -} diff --git a/framework/library/Doctrine/Common/Annotations/AnnotationException.php b/framework/library/Doctrine/Common/Annotations/AnnotationException.php deleted file mode 100644 index 109beeb..0000000 --- a/framework/library/Doctrine/Common/Annotations/AnnotationException.php +++ /dev/null @@ -1,127 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Description of AnnotationException - * - * @since 2.0 - * @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); - } - - /** - * Creates a new AnnotationException describing a constant semantical error. - * - * @since 2.3 - * @param string $identifier - * @param string $context - * @return AnnotationException - */ - public static function semanticalErrorConstants($identifier, $context = null) - { - return self::semanticalError(sprintf( - "Couldn't find constant %s%s", $identifier, - $context ? ", $context." : "." - )); - } - - /** - * Creates a new AnnotationException describing an error which occurred during - * the creation of the annotation. - * - * @since 2.2 - * @param string $message - * @return AnnotationException - */ - public static function creationError($message) - { - return new self('[Creation Error] ' . $message); - } - - /** - * Creates a new AnnotationException describing an type error of an attribute. - * - * @since 2.2 - * @param string $attributeName - * @param string $annotationName - * @param string $context - * @param string $expected - * @param mixed $actual - * @return AnnotationException - */ - public static function typeError($attributeName, $annotationName, $context, $expected, $actual) - { - return new self(sprintf( - '[Type Error] Attribute "%s" of @%s declared on %s expects %s, but got %s.', - $attributeName, - $annotationName, - $context, - $expected, - is_object($actual) ? 'an instance of '.get_class($actual) : gettype($actual) - )); - } - - /** - * Creates a new AnnotationException describing an required error of an attribute. - * - * @since 2.2 - * @param string $attributeName - * @param string $annotationName - * @param string $context - * @param string $expected - * @return AnnotationException - */ - public static function requiredError($attributeName, $annotationName, $context, $expected) - { - return new self(sprintf( - '[Type Error] Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', - $attributeName, - $annotationName, - $context, - $expected - )); - } -} diff --git a/framework/library/Doctrine/Common/Annotations/AnnotationReader.php b/framework/library/Doctrine/Common/Annotations/AnnotationReader.php deleted file mode 100644 index 286e7d0..0000000 --- a/framework/library/Doctrine/Common/Annotations/AnnotationReader.php +++ /dev/null @@ -1,310 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; -use Doctrine\Common\Annotations\Annotation\Target; -use Closure; -use ReflectionClass; -use ReflectionMethod; -use ReflectionProperty; - -/** - * A reader for docblock annotations. - * - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Johannes M. Schmitt - */ -class AnnotationReader implements Reader -{ - /** - * Global map for imports. - * - * @var array - */ - private static $globalImports = array( - 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', - ); - - /** - * A list with annotations that are not causing exceptions when not resolved to an annotation class. - * - * The names are case sensitive. - * - * @var array - */ - private static $globalIgnoredNames = array( - 'access'=> true, 'author'=> true, 'copyright'=> true, 'deprecated'=> true, - 'example'=> true, 'ignore'=> true, 'internal'=> true, 'link'=> true, 'see'=> true, - 'since'=> true, 'tutorial'=> true, 'version'=> true, 'package'=> true, - 'subpackage'=> true, 'name'=> true, 'global'=> true, 'param'=> true, - 'return'=> true, 'staticvar'=> true, 'category'=> true, 'staticVar'=> true, - 'static'=> true, 'var'=> true, 'throws'=> true, 'inheritdoc'=> true, - 'inheritDoc'=> true, 'license'=> true, 'todo'=> true, - 'deprec'=> true, 'property' => true, 'method' => true, - 'abstract'=> true, 'exception'=> true, 'magic' => true, 'api' => true, - 'final'=> true, 'filesource'=> true, 'throw' => true, 'uses' => true, - 'usedby'=> true, 'private' => true, 'Annotation' => true, 'override' => true, - 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, - 'Required' => true, 'Attribute' => true, 'Attributes' => true, - 'Target' => true, 'SuppressWarnings' => true, - 'ingroup' => true, 'code' => true, 'endcode' => true, - 'package_version' => true, - ); - - /** - * Add a new annotation to the globally ignored annotation names with regard to exception handling. - * - * @param string $name - */ - static public function addGlobalIgnoredName($name) - { - self::$globalIgnoredNames[$name] = true; - } - - /** - * Annotations Parser - * - * @var \Doctrine\Common\Annotations\DocParser - */ - private $parser; - - /** - * Annotations Parser used to collect parsing metadata - * - * @var \Doctrine\Common\Annotations\DocParser - */ - private $preParser; - - /** - * PHP Parser used to collect imports. - * - * @var \Doctrine\Common\Annotations\PhpParser - */ - private $phpParser; - - /** - * In-memory cache mechanism to store imported annotations per class. - * - * @var array - */ - private $imports = array(); - - /** - * In-memory cache mechanism to store ignored annotations per class. - * - * @var array - */ - private $ignoredAnnotationNames = array(); - - /** - * Constructor. - * - * Initializes a new AnnotationReader. - */ - public function __construct() - { - AnnotationRegistry::registerFile(__DIR__ . '/Annotation/IgnoreAnnotation.php'); - - $this->parser = new DocParser; - - $this->preParser = new DocParser; - $this->preParser->setImports(self::$globalImports); - $this->preParser->setIgnoreNotImportedAnnotations(true); - - $this->phpParser = new PhpParser; - } - - /** - * Gets the annotations applied to a class. - * - * @param ReflectionClass $class The ReflectionClass of the class from which - * the class annotations should be read. - * @return array An array of Annotations. - */ - public function getClassAnnotations(ReflectionClass $class) - { - $this->parser->setTarget(Target::TARGET_CLASS); - $this->parser->setImports($this->getImports($class)); - $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); - - return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); - } - - /** - * Gets a class annotation. - * - * @param ReflectionClass $class The ReflectionClass of the class from which - * the class annotations should be read. - * @param string $annotationName The name of the annotation. - * @return mixed The Annotation or NULL, if the requested annotation does not exist. - */ - public function getClassAnnotation(ReflectionClass $class, $annotationName) - { - $annotations = $this->getClassAnnotations($class); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * Gets the annotations applied to a property. - * - * @param ReflectionProperty $property The ReflectionProperty of the property - * from which the annotations should be read. - * @return array An array of Annotations. - */ - public function getPropertyAnnotations(ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - $context = 'property ' . $class->getName() . "::\$" . $property->getName(); - $this->parser->setTarget(Target::TARGET_PROPERTY); - $this->parser->setImports($this->getImports($class)); - $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); - - return $this->parser->parse($property->getDocComment(), $context); - } - - /** - * Gets a property annotation. - * - * @param ReflectionProperty $property - * @param string $annotationName The name of the annotation. - * @return mixed The Annotation or NULL, if the requested annotation does not exist. - */ - public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) - { - $annotations = $this->getPropertyAnnotations($property); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * Gets the annotations applied to a method. - * - * @param \ReflectionMethod $method The ReflectionMethod of the method from which - * the annotations should be read. - * - * @return array An array of Annotations. - */ - public function getMethodAnnotations(ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; - $this->parser->setTarget(Target::TARGET_METHOD); - $this->parser->setImports($this->getImports($class)); - $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); - - return $this->parser->parse($method->getDocComment(), $context); - } - - /** - * Gets a method annotation. - * - * @param ReflectionMethod $method - * @param string $annotationName The name of the annotation. - * @return mixed The Annotation or NULL, if the requested annotation does not exist. - */ - public function getMethodAnnotation(ReflectionMethod $method, $annotationName) - { - $annotations = $this->getMethodAnnotations($method); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * Returns the ignored annotations for the given class. - * - * @param ReflectionClass $class - * @return array - */ - private function getIgnoredAnnotationNames(ReflectionClass $class) - { - if (isset($this->ignoredAnnotationNames[$name = $class->getName()])) { - return $this->ignoredAnnotationNames[$name]; - } - $this->collectParsingMetadata($class); - - return $this->ignoredAnnotationNames[$name]; - } - - /** - * Retrieve imports - * - * @param \ReflectionClass $class - * @return array - */ - private function getImports(ReflectionClass $class) - { - if (isset($this->imports[$name = $class->getName()])) { - return $this->imports[$name]; - } - $this->collectParsingMetadata($class); - - return $this->imports[$name]; - } - - /** - * Collects parsing metadata for a given class - * - * @param ReflectionClass $class - */ - private function collectParsingMetadata(ReflectionClass $class) - { - $ignoredAnnotationNames = self::$globalIgnoredNames; - - $annotations = $this->preParser->parse($class->getDocComment(), 'class '.$class->name); - foreach ($annotations as $annotation) { - if ($annotation instanceof IgnoreAnnotation) { - foreach ($annotation->names AS $annot) { - $ignoredAnnotationNames[$annot] = true; - } - } - } - - $name = $class->getName(); - $this->imports[$name] = array_merge( - self::$globalImports, - $this->phpParser->parseClass($class), - array('__NAMESPACE__' => $class->getNamespaceName()) - ); - $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; - } -} diff --git a/framework/library/Doctrine/Common/Annotations/AnnotationRegistry.php b/framework/library/Doctrine/Common/Annotations/AnnotationRegistry.php deleted file mode 100644 index dfa846a..0000000 --- a/framework/library/Doctrine/Common/Annotations/AnnotationRegistry.php +++ /dev/null @@ -1,139 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * AnnotationRegistry - */ -final class AnnotationRegistry -{ - /** - * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. - * - * Contains the namespace as key and an array of directories as value. If the value is NULL - * the include path is used for checking for the corresponding file. - * - * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. - * - * @var array - */ - static private $autoloadNamespaces = array(); - - /** - * A map of autoloader callables. - * - * @var array - */ - static private $loaders = array(); - - static public function reset() - { - self::$autoloadNamespaces = array(); - self::$loaders = array(); - } - - /** - * Register file - * - * @param string $file - */ - static public function registerFile($file) - { - require_once $file; - } - - /** - * Add a namespace with one or many directories to look for files or null for the include path. - * - * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. - * - * @param string $namespace - * @param string|array|null $dirs - */ - static public function registerAutoloadNamespace($namespace, $dirs = null) - { - self::$autoloadNamespaces[$namespace] = $dirs; - } - - /** - * Register multiple namespaces - * - * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. - * - * @param array $namespaces - */ - static public function registerAutoloadNamespaces(array $namespaces) - { - self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); - } - - /** - * Register an autoloading callable for annotations, much like spl_autoload_register(). - * - * NOTE: These class loaders HAVE to be silent when a class was not found! - * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. - * - * @param callable $callable - * - * @throws \InvalidArgumentException - */ - static public function registerLoader($callable) - { - if (!is_callable($callable)) { - throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader()."); - } - self::$loaders[] = $callable; - } - - /** - * Autoload an annotation class silently. - * - * @param string $class - * @return boolean - */ - static public function loadAnnotationClass($class) - { - foreach (self::$autoloadNamespaces AS $namespace => $dirs) { - if (strpos($class, $namespace) === 0) { - $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; - if ($dirs === null) { - if ($path = stream_resolve_include_path($file)) { - require $path; - return true; - } - } else { - foreach((array)$dirs AS $dir) { - if (file_exists($dir . DIRECTORY_SEPARATOR . $file)) { - require $dir . DIRECTORY_SEPARATOR . $file; - return true; - } - } - } - } - } - - foreach (self::$loaders AS $loader) { - if (call_user_func($loader, $class) === true) { - return true; - } - } - return false; - } -} diff --git a/framework/library/Doctrine/Common/Annotations/CachedReader.php b/framework/library/Doctrine/Common/Annotations/CachedReader.php deleted file mode 100644 index e377e3b..0000000 --- a/framework/library/Doctrine/Common/Annotations/CachedReader.php +++ /dev/null @@ -1,250 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use Doctrine\Common\Cache\Cache; - -/** - * A cache aware annotation reader. - * - * @author Johannes M. Schmitt - * @author Benjamin Eberlei - */ -final class CachedReader implements Reader -{ - /** - * @var string - */ - private static $CACHE_SALT = '@[Annot]'; - - /** - * @var Reader - */ - private $delegate; - - /** - * @var Cache - */ - private $cache; - - /** - * @var boolean - */ - private $debug; - - /** - * @var array - */ - private $loadedAnnotations; - - /** - * Constructor - * - * @param Reader $reader - * @param Cache $cache - * @param bool $debug - */ - public function __construct(Reader $reader, Cache $cache, $debug = false) - { - $this->delegate = $reader; - $this->cache = $cache; - $this->debug = (Boolean) $debug; - } - - /** - * Get annotations for class - * - * @param \ReflectionClass $class - * @return array - */ - public function getClassAnnotations(\ReflectionClass $class) - { - $cacheKey = $class->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { - $annots = $this->delegate->getClassAnnotations($class); - $this->saveToCache($cacheKey, $annots); - } - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * Get selected annotation for class - * - * @param \ReflectionClass $class - * @param string $annotationName - * @return null - */ - public function getClassAnnotation(\ReflectionClass $class, $annotationName) - { - foreach ($this->getClassAnnotations($class) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * Get annotations for property - * - * @param \ReflectionProperty $property - * @return array - */ - public function getPropertyAnnotations(\ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - $cacheKey = $class->getName().'$'.$property->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { - $annots = $this->delegate->getPropertyAnnotations($property); - $this->saveToCache($cacheKey, $annots); - } - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * Get selected annotation for property - * - * @param \ReflectionProperty $property - * @param string $annotationName - * @return null - */ - public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) - { - foreach ($this->getPropertyAnnotations($property) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * Get method annotations - * - * @param \ReflectionMethod $method - * @return array - */ - public function getMethodAnnotations(\ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - $cacheKey = $class->getName().'#'.$method->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { - $annots = $this->delegate->getMethodAnnotations($method); - $this->saveToCache($cacheKey, $annots); - } - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * Get selected method annotation - * - * @param \ReflectionMethod $method - * @param string $annotationName - * @return null - */ - public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) - { - foreach ($this->getMethodAnnotations($method) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * Clear loaded annotations - */ - public function clearLoadedAnnotations() - { - $this->loadedAnnotations = array(); - } - - /** - * Fetches a value from the cache. - * - * @param string $rawCacheKey The cache key. - * @param \ReflectionClass $class The related class. - * @return mixed|boolean The cached value or false when the value is not in cache. - */ - private function fetchFromCache($rawCacheKey, \ReflectionClass $class) - { - $cacheKey = $rawCacheKey . self::$CACHE_SALT; - if (($data = $this->cache->fetch($cacheKey)) !== false) { - if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { - return $data; - } - } - - return false; - } - - /** - * Saves a value to the cache - * - * @param string $rawCacheKey The cache key. - * @param mixed $value The value. - */ - private function saveToCache($rawCacheKey, $value) - { - $cacheKey = $rawCacheKey . self::$CACHE_SALT; - $this->cache->save($cacheKey, $value); - if ($this->debug) { - $this->cache->save('[C]'.$cacheKey, time()); - } - } - - /** - * Check if cache is fresh - * - * @param string $cacheKey - * @param \ReflectionClass $class - * @return bool - */ - private function isCacheFresh($cacheKey, \ReflectionClass $class) - { - if (false === $filename = $class->getFilename()) { - return true; - } - - return $this->cache->fetch('[C]'.$cacheKey) >= filemtime($filename); - } -} diff --git a/framework/library/Doctrine/Common/Annotations/DocLexer.php b/framework/library/Doctrine/Common/Annotations/DocLexer.php deleted file mode 100644 index c9a6f7a..0000000 --- a/framework/library/Doctrine/Common/Annotations/DocLexer.php +++ /dev/null @@ -1,132 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use Doctrine\Common\Lexer; - -/** - * Simple lexer for docblock annotations. - * - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Johannes M. Schmitt - */ -final class DocLexer extends Lexer -{ - const T_NONE = 1; - const T_INTEGER = 2; - const T_STRING = 3; - const T_FLOAT = 4; - - // All tokens that are also identifiers should be >= 100 - const T_IDENTIFIER = 100; - 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; - const T_NULL = 111; - const T_COLON = 112; - - protected $noCase = array( - '@' => self::T_AT, - ',' => self::T_COMMA, - '(' => self::T_OPEN_PARENTHESIS, - ')' => self::T_CLOSE_PARENTHESIS, - '{' => self::T_OPEN_CURLY_BRACES, - '}' => self::T_CLOSE_CURLY_BRACES, - '=' => self::T_EQUALS, - ':' => self::T_COLON, - '\\' => self::T_NAMESPACE_SEPARATOR - ); - - protected $withCase = array( - 'true' => self::T_TRUE, - 'false' => self::T_FALSE, - 'null' => self::T_NULL - ); - - /** - * {@inheritdoc} - */ - protected function getCatchablePatterns() - { - return array( - '[a-z_\\\][a-z0-9_\:\\\]*[a-z]{1}', - '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', - '"(?:[^"]|"")*"', - ); - } - - /** - * {@inheritdoc} - */ - protected function getNonCatchablePatterns() - { - return array('\s+', '\*+', '(.)'); - } - - /** - * {@inheritdoc} - * - * @param string $value - * - * @return int - */ - protected function getType(&$value) - { - $type = self::T_NONE; - - if ($value[0] === '"') { - $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); - - return self::T_STRING; - } - - if (isset($this->noCase[$value])) { - return $this->noCase[$value]; - } - - if ($value[0] === '_' || $value[0] === '\\' || ctype_alpha($value[0])) { - return self::T_IDENTIFIER; - } - - $lowerValue = strtolower($value); - - if (isset($this->withCase[$lowerValue])) { - return $this->withCase[$lowerValue]; - } - - // Checking numeric value - if (is_numeric($value)) { - return (strpos($value, '.') !== false || stripos($value, 'e') !== false) - ? self::T_FLOAT : self::T_INTEGER; - } - - return $type; - } -} diff --git a/framework/library/Doctrine/Common/Annotations/DocParser.php b/framework/library/Doctrine/Common/Annotations/DocParser.php deleted file mode 100644 index de31e0b..0000000 --- a/framework/library/Doctrine/Common/Annotations/DocParser.php +++ /dev/null @@ -1,988 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use Closure; -use ReflectionClass; -use Doctrine\Common\Annotations\Annotation\Target; -use Doctrine\Common\Annotations\Annotation\Attribute; -use Doctrine\Common\Annotations\Annotation\Attributes; - -/** - * A parser for docblock annotations. - * - * It is strongly discouraged to change the default annotation parsing process. - * - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Johannes M. Schmitt - * @author Fabio B. Silva - */ -final class DocParser -{ - /** - * An array of all valid tokens for a class name. - * - * @var array - */ - private static $classIdentifiers = array(DocLexer::T_IDENTIFIER, DocLexer::T_TRUE, DocLexer::T_FALSE, DocLexer::T_NULL); - - /** - * The lexer. - * - * @var \Doctrine\Common\Annotations\DocLexer - */ - private $lexer; - - /** - * Current target context - * - * @var string - */ - private $target; - - /** - * Doc Parser used to collect annotation target - * - * @var \Doctrine\Common\Annotations\DocParser - */ - private static $metadataParser; - - /** - * Flag to control if the current annotation is nested or not. - * - * @var boolean - */ - private $isNestedAnnotation = false; - - /** - * Hashmap containing all use-statements that are to be used when parsing - * the given doc block. - * - * @var array - */ - private $imports = array(); - - /** - * This hashmap is used internally to cache results of class_exists() - * look-ups. - * - * @var array - */ - private $classExists = array(); - - /** - * Whether annotations that have not been imported should be ignored. - * - * @var boolean - */ - private $ignoreNotImportedAnnotations = false; - - /** - * An array of default namespaces if operating in simple mode. - * - * @var array - */ - private $namespaces = array(); - - /** - * A list with annotations that are not causing exceptions when not resolved to an annotation class. - * - * The names must be the raw names as used in the class, not the fully qualified - * class names. - * - * @var array - */ - private $ignoredAnnotationNames = array(); - - /** - * @var string - */ - private $context = ''; - - /** - * Hash-map for caching annotation metadata - * @var array - */ - private static $annotationMetadata = array( - 'Doctrine\Common\Annotations\Annotation\Target' => array( - 'is_annotation' => true, - 'has_constructor' => true, - 'properties' => array(), - 'targets_literal' => 'ANNOTATION_CLASS', - 'targets' => Target::TARGET_CLASS, - 'default_property' => 'value', - 'attribute_types' => array( - 'value' => array( - 'required' => false, - 'type' =>'array', - 'array_type'=>'string', - 'value' =>'array' - ) - ), - ), - 'Doctrine\Common\Annotations\Annotation\Attribute' => array( - 'is_annotation' => true, - 'has_constructor' => false, - 'targets_literal' => 'ANNOTATION_ANNOTATION', - 'targets' => Target::TARGET_ANNOTATION, - 'default_property' => 'name', - 'properties' => array( - 'name' => 'name', - 'type' => 'type', - 'required' => 'required' - ), - 'attribute_types' => array( - 'value' => array( - 'required' => true, - 'type' =>'string', - 'value' =>'string' - ), - 'type' => array( - 'required' =>true, - 'type' =>'string', - 'value' =>'string' - ), - 'required' => array( - 'required' =>false, - 'type' =>'boolean', - 'value' =>'boolean' - ) - ), - ), - 'Doctrine\Common\Annotations\Annotation\Attributes' => array( - 'is_annotation' => true, - 'has_constructor' => false, - 'targets_literal' => 'ANNOTATION_CLASS', - 'targets' => Target::TARGET_CLASS, - 'default_property' => 'value', - 'properties' => array( - 'value' => 'value' - ), - 'attribute_types' => array( - 'value' => array( - 'type' =>'array', - 'required' =>true, - 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', - 'value' =>'array' - ) - ), - ), - ); - - /** - * Hash-map for handle types declaration - * - * @var array - */ - private static $typeMap = array( - 'float' => 'double', - 'bool' => 'boolean', - // allow uppercase Boolean in honor of George Boole - 'Boolean' => 'boolean', - 'int' => 'integer', - ); - - /** - * Constructs a new DocParser. - */ - public function __construct() - { - $this->lexer = new DocLexer; - } - - /** - * Sets the annotation names that are ignored during the parsing process. - * - * The names are supposed to be the raw names as used in the class, not the - * fully qualified class names. - * - * @param array $names - */ - public function setIgnoredAnnotationNames(array $names) - { - $this->ignoredAnnotationNames = $names; - } - - /** - * Sets ignore on not-imported annotations - * - * @param $bool - */ - public function setIgnoreNotImportedAnnotations($bool) - { - $this->ignoreNotImportedAnnotations = (Boolean) $bool; - } - - /** - * Sets the default namespaces. - * - * @param array $namespace - * - * @throws \RuntimeException - */ - public function addNamespace($namespace) - { - if ($this->imports) { - throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); - } - $this->namespaces[] = $namespace; - } - - /** - * Sets the imports - * - * @param array $imports - * @throws \RuntimeException - */ - public function setImports(array $imports) - { - if ($this->namespaces) { - throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); - } - $this->imports = $imports; - } - - /** - * Sets current target context as bitmask. - * - * @param integer $target - */ - public function setTarget($target) - { - $this->target = $target; - } - - /** - * Parses the given docblock string for annotations. - * - * @param string $input The docblock string to parse. - * @param string $context The parsing context. - * @return array Array of annotations. If no annotations are found, an empty array is returned. - */ - public function parse($input, $context = '') - { - if (false === $pos = strpos($input, '@')) { - return array(); - } - - // also parse whatever character is before the @ - if ($pos > 0) { - $pos -= 1; - } - - $this->context = $context; - $this->lexer->setInput(trim(substr($input, $pos), '* /')); - $this->lexer->moveNext(); - - return $this->Annotations(); - } - - /** - * 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 $token type of Token. - * @return bool True if tokens match; false otherwise. - */ - private function match($token) - { - if ( ! $this->lexer->isNextToken($token) ) { - $this->syntaxError($this->lexer->getLiteral($token)); - } - - return $this->lexer->moveNext(); - } - - /** - * Attempts to match the current lookahead token with any of the given tokens. - * - * If any of them matches, this method updates the lookahead token; otherwise - * a syntax error is raised. - * - * @param array $tokens - * @return bool - */ - private function matchAny(array $tokens) - { - if ( ! $this->lexer->isNextTokenAny($tokens)) { - $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens))); - } - - return $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); - } - - /** - * Attempt to check if a class exists or not. This never goes through the PHP autoloading mechanism - * but uses the {@link AnnotationRegistry} to load classes. - * - * @param string $fqcn - * @return boolean - */ - private function classExists($fqcn) - { - if (isset($this->classExists[$fqcn])) { - return $this->classExists[$fqcn]; - } - - // first check if the class already exists, maybe loaded through another AnnotationReader - if (class_exists($fqcn, false)) { - return $this->classExists[$fqcn] = true; - } - - // final check, does this class exist? - return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); - } - - /** - * Collects parsing metadata for a given annotation class - * - * @param string $name The annotation name - */ - private function collectAnnotationMetadata($name) - { - if (self::$metadataParser == null){ - self::$metadataParser = new self(); - self::$metadataParser->setTarget(Target::TARGET_CLASS); - self::$metadataParser->setIgnoreNotImportedAnnotations(true); - self::$metadataParser->setImports(array( - 'target' => 'Doctrine\Common\Annotations\Annotation\Target', - 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', - 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' - )); - AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php'); - AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php'); - AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php'); - } - - $class = new \ReflectionClass($name); - $docComment = $class->getDocComment(); - - // Sets default values for annotation metadata - $metadata = array( - 'default_property' => null, - 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, - 'properties' => array(), - 'property_types' => array(), - 'attribute_types' => array(), - 'targets_literal' => null, - 'targets' => Target::TARGET_ALL, - 'is_annotation' => false !== strpos($docComment, '@Annotation'), - ); - - // verify that the class is really meant to be an annotation - if ($metadata['is_annotation']) { - foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { - if ($annotation instanceof Target) { - $metadata['targets'] = $annotation->targets; - $metadata['targets_literal'] = $annotation->literal; - - } elseif ($annotation instanceof Attributes) { - foreach ($annotation->value as $attrib) { - // handle internal type declaration - $type = isset(self::$typeMap[$attrib->type]) ? self::$typeMap[$attrib->type] : $attrib->type; - - // handle the case if the property type is mixed - if ('mixed' !== $type) { - // Checks if the property has array - if (false !== $pos = strpos($type, '<')) { - $arrayType = substr($type, $pos+1, -1); - $type = 'array'; - - if (isset(self::$typeMap[$arrayType])) { - $arrayType = self::$typeMap[$arrayType]; - } - - $metadata['attribute_types'][$attrib->name]['array_type'] = $arrayType; - } - - $metadata['attribute_types'][$attrib->name]['type'] = $type; - $metadata['attribute_types'][$attrib->name]['value'] = $attrib->type; - $metadata['attribute_types'][$attrib->name]['required'] = $attrib->required; - } - } - } - } - - // if not has a constructor will inject values into public properties - if (false === $metadata['has_constructor']) { - // collect all public properties - foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { - $metadata['properties'][$property->name] = $property->name; - - // checks if the property has @var annotation - if ((false !== $propertyComment = $property->getDocComment()) - && false !== strpos($propertyComment, '@var') - && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) { - // literal type declaration - $value = $matches[1]; - - // handle internal type declaration - $type = isset(self::$typeMap[$value]) ? self::$typeMap[$value] : $value; - - // handle the case if the property type is mixed - if ('mixed' !== $type) { - // Checks if the property has @var array annotation - if (false !== $pos = strpos($type, '<')) { - $arrayType = substr($type, $pos+1, -1); - $type = 'array'; - - if (isset(self::$typeMap[$arrayType])) { - $arrayType = self::$typeMap[$arrayType]; - } - - $metadata['attribute_types'][$property->name]['array_type'] = $arrayType; - } - - $metadata['attribute_types'][$property->name]['type'] = $type; - $metadata['attribute_types'][$property->name]['value'] = $value; - $metadata['attribute_types'][$property->name]['required'] = false !== strpos($propertyComment, '@Required'); - } - } - } - - // choose the first property as default property - $metadata['default_property'] = reset($metadata['properties']); - } - } - - self::$annotationMetadata[$name] = $metadata; - } - - /** - * Annotations ::= Annotation {[ "*" ]* [Annotation]}* - * - * @return array - */ - private function Annotations() - { - $annotations = array(); - - while (null !== $this->lexer->lookahead) { - if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { - $this->lexer->moveNext(); - continue; - } - - // make sure the @ is preceded by non-catchable pattern - if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { - $this->lexer->moveNext(); - continue; - } - - // make sure the @ is followed by either a namespace separator, or - // an identifier token - if ((null === $peek = $this->lexer->glimpse()) - || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) - || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { - $this->lexer->moveNext(); - continue; - } - - $this->isNestedAnnotation = false; - if (false !== $annot = $this->Annotation()) { - $annotations[] = $annot; - } - } - - return $annotations; - } - - /** - * Annotation ::= "@" AnnotationName ["(" [Values] ")"] - * AnnotationName ::= QualifiedName | SimpleName - * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName - * NameSpacePart ::= identifier | null | false | true - * SimpleName ::= identifier | null | false | true - * - * @throws AnnotationException - * @return mixed False if it is not a valid annotation. - */ - private function Annotation() - { - $this->match(DocLexer::T_AT); - - // check if we have an annotation - $name = $this->Identifier(); - - // only process names which are not fully qualified, yet - // fully qualified names must start with a \ - $originalName = $name; - if ('\\' !== $name[0]) { - $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos); - - $found = false; - if ($this->namespaces) { - foreach ($this->namespaces as $namespace) { - if ($this->classExists($namespace.'\\'.$name)) { - $name = $namespace.'\\'.$name; - $found = true; - break; - } - } - } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) { - if (false !== $pos) { - $name = $this->imports[$loweredAlias].substr($name, $pos); - } else { - $name = $this->imports[$loweredAlias]; - } - $found = true; - } elseif (isset($this->imports['__NAMESPACE__']) && $this->classExists($this->imports['__NAMESPACE__'].'\\'.$name)) { - $name = $this->imports['__NAMESPACE__'].'\\'.$name; - $found = true; - } elseif ($this->classExists($name)) { - $found = true; - } - - if (!$found) { - if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { - return false; - } - - throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); - } - } - - if (!$this->classExists($name)) { - throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); - } - - // at this point, $name contains the fully qualified class name of the - // annotation, and it is also guaranteed that this class exists, and - // that it is loaded - - - // collects the metadata annotation only if there is not yet - if (!isset(self::$annotationMetadata[$name])) { - $this->collectAnnotationMetadata($name); - } - - // verify that the class is really meant to be an annotation and not just any ordinary class - if (self::$annotationMetadata[$name]['is_annotation'] === false) { - if (isset($this->ignoredAnnotationNames[$originalName])) { - return false; - } - - throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); - } - - //if target is nested annotation - $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; - - // Next will be nested - $this->isNestedAnnotation = true; - - //if annotation does not support current target - if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { - throw AnnotationException::semanticalError( - sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', - $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) - ); - } - - $values = array(); - if ($this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { - $this->match(DocLexer::T_OPEN_PARENTHESIS); - - if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { - $values = $this->Values(); - } - - $this->match(DocLexer::T_CLOSE_PARENTHESIS); - } - - // checks all declared attributes - foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { - if ($property === self::$annotationMetadata[$name]['default_property'] - && !isset($values[$property]) && isset($values['value'])) { - $property = 'value'; - } - - // handle a not given attribute or null value - if (!isset($values[$property])) { - if ($type['required']) { - throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); - } - - continue; - } - - if ($type['type'] === 'array') { - // handle the case of a single value - if (!is_array($values[$property])) { - $values[$property] = array($values[$property]); - } - - // checks if the attribute has array type declaration, such as "array" - if (isset($type['array_type'])) { - foreach ($values[$property] as $item) { - if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { - throw AnnotationException::typeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); - } - } - } - } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { - throw AnnotationException::typeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); - } - } - - // check if the annotation expects values via the constructor, - // or directly injected into public properties - if (self::$annotationMetadata[$name]['has_constructor'] === true) { - return new $name($values); - } - - $instance = new $name(); - foreach ($values as $property => $value) { - if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { - if ('value' !== $property) { - throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); - } - - // handle the case if the property has no annotations - if (!$property = self::$annotationMetadata[$name]['default_property']) { - throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); - } - } - - $instance->{$property} = $value; - } - - return $instance; - } - - /** - * Values ::= Array | Value {"," Value}* - * - * @return array - */ - private function Values() - { - $values = array(); - - // Handle the case of a single array as value, i.e. @Foo({....}) - if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { - $values['value'] = $this->Value(); - return $values; - } - - $values[] = $this->Value(); - - while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { - $this->match(DocLexer::T_COMMA); - $token = $this->lexer->lookahead; - $value = $this->Value(); - - if ( ! is_object($value) && ! is_array($value)) { - $this->syntaxError('Value', $token); - } - - $values[] = $value; - } - - foreach ($values as $k => $value) { - if (is_object($value) && $value instanceof \stdClass) { - $values[$value->name] = $value->value; - } else if ( ! isset($values['value'])){ - $values['value'] = $value; - } else { - if ( ! is_array($values['value'])) { - $values['value'] = array($values['value']); - } - - $values['value'][] = $value; - } - - unset($values[$k]); - } - - return $values; - } - - /** - * Constant ::= integer | string | float | boolean - * - * @throws AnnotationException - * @return mixed - */ - private function Constant() - { - $identifier = $this->Identifier(); - - if (!defined($identifier) && false !== strpos($identifier, '::') && '\\' !== $identifier[0]) { - - list($className, $const) = explode('::', $identifier); - $alias = (false === $pos = strpos($className, '\\'))? $className : substr($className, 0, $pos); - - $found = false; - switch (true) { - case !empty ($this->namespaces): - foreach ($this->namespaces as $ns) { - if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) { - $className = $ns.'\\'.$className; - $found = true; - break; - } - } - break; - - case isset($this->imports[$loweredAlias = strtolower($alias)]): - $found = true; - if (false !== $pos) { - $className = $this->imports[$loweredAlias].substr($className, $pos); - } else { - $className = $this->imports[$loweredAlias]; - } - break; - - default: - if(isset($this->imports['__NAMESPACE__'])) { - $ns = $this->imports['__NAMESPACE__']; - if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) { - $className = $ns.'\\'.$className; - $found = true; - } - } - break; - } - - if ($found) { - $identifier = $className . '::' . $const; - } - } - - if (!defined($identifier)) { - throw AnnotationException::semanticalErrorConstants($identifier, $this->context); - } - - return constant($identifier); - } - - /** - * Identifier ::= string - * - * @return string - */ - private function Identifier() - { - // check if we have an annotation - if ($this->lexer->isNextTokenAny(self::$classIdentifiers)) { - $this->lexer->moveNext(); - $className = $this->lexer->token['value']; - } else { - $this->syntaxError('namespace separator or identifier'); - } - - while ($this->lexer->lookahead['position'] === ($this->lexer->token['position'] + strlen($this->lexer->token['value'])) - && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { - - $this->match(DocLexer::T_NAMESPACE_SEPARATOR); - $this->matchAny(self::$classIdentifiers); - $className .= '\\' . $this->lexer->token['value']; - } - - return $className; - } - - /** - * Value ::= PlainValue | FieldAssignment - * - * @return mixed - */ - private function Value() - { - $peek = $this->lexer->glimpse(); - - if (DocLexer::T_EQUALS === $peek['type']) { - return $this->FieldAssignment(); - } - - return $this->PlainValue(); - } - - /** - * PlainValue ::= integer | string | float | boolean | Array | Annotation - * - * @return mixed - */ - private function PlainValue() - { - if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { - return $this->Arrayx(); - } - - if ($this->lexer->isNextToken(DocLexer::T_AT)) { - return $this->Annotation(); - } - - if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) { - return $this->Constant(); - } - - switch ($this->lexer->lookahead['type']) { - case DocLexer::T_STRING: - $this->match(DocLexer::T_STRING); - return $this->lexer->token['value']; - - case DocLexer::T_INTEGER: - $this->match(DocLexer::T_INTEGER); - return (int)$this->lexer->token['value']; - - case DocLexer::T_FLOAT: - $this->match(DocLexer::T_FLOAT); - return (float)$this->lexer->token['value']; - - case DocLexer::T_TRUE: - $this->match(DocLexer::T_TRUE); - return true; - - case DocLexer::T_FALSE: - $this->match(DocLexer::T_FALSE); - return false; - - case DocLexer::T_NULL: - $this->match(DocLexer::T_NULL); - return null; - - default: - $this->syntaxError('PlainValue'); - } - } - - /** - * FieldAssignment ::= FieldName "=" PlainValue - * FieldName ::= identifier - * - * @return array - */ - private function FieldAssignment() - { - $this->match(DocLexer::T_IDENTIFIER); - $fieldName = $this->lexer->token['value']; - - $this->match(DocLexer::T_EQUALS); - - $item = new \stdClass(); - $item->name = $fieldName; - $item->value = $this->PlainValue(); - - return $item; - } - - /** - * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" - * - * @return array - */ - private function Arrayx() - { - $array = $values = array(); - - $this->match(DocLexer::T_OPEN_CURLY_BRACES); - $values[] = $this->ArrayEntry(); - - while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { - $this->match(DocLexer::T_COMMA); - - // optional trailing comma - if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { - break; - } - - $values[] = $this->ArrayEntry(); - } - - $this->match(DocLexer::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 | Constant - * Key ::= string | integer | Constant - * - * @return array - */ - private function ArrayEntry() - { - $peek = $this->lexer->glimpse(); - - if (DocLexer::T_EQUALS === $peek['type'] - || DocLexer::T_COLON === $peek['type']) { - - if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) { - $key = $this->Constant(); - } else { - $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING)); - $key = $this->lexer->token['value']; - } - - $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON)); - - return array($key, $this->PlainValue()); - } - - return array(null, $this->Value()); - } -} diff --git a/framework/library/Doctrine/Common/Annotations/FileCacheReader.php b/framework/library/Doctrine/Common/Annotations/FileCacheReader.php deleted file mode 100644 index 3934861..0000000 --- a/framework/library/Doctrine/Common/Annotations/FileCacheReader.php +++ /dev/null @@ -1,258 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - - -/** - * File cache reader for annotations. - * - * @author Johannes M. Schmitt - * @author Benjamin Eberlei - */ -class FileCacheReader implements Reader -{ - /** - * @var Reader - */ - private $reader; - - /** - * @var string - */ - private $dir; - - /** - * @var bool - */ - private $debug; - - /** - * @var array - */ - private $loadedAnnotations = array(); - - /** - * Constructor - * - * @param Reader $reader - * @param string $cacheDir - * @param bool $debug - * - * @throws \InvalidArgumentException - */ - public function __construct(Reader $reader, $cacheDir, $debug = false) - { - $this->reader = $reader; - if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true)) { - throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); - } - if (!is_writable($cacheDir)) { - throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $cacheDir)); - } - - $this->dir = rtrim($cacheDir, '\\/'); - $this->debug = $debug; - } - - /** - * Retrieve annotations for class - * - * @param \ReflectionClass $class - * @return array - */ - public function getClassAnnotations(\ReflectionClass $class) - { - $key = $class->getName(); - - if (isset($this->loadedAnnotations[$key])) { - return $this->loadedAnnotations[$key]; - } - - $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; - if (!file_exists($path)) { - $annot = $this->reader->getClassAnnotations($class); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - if ($this->debug - && (false !== $filename = $class->getFilename()) - && filemtime($path) < filemtime($filename)) { - @unlink($path); - - $annot = $this->reader->getClassAnnotations($class); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - return $this->loadedAnnotations[$key] = include $path; - } - - /** - * Get annotations for property - * - * @param \ReflectionProperty $property - * @return array - */ - public function getPropertyAnnotations(\ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - $key = $class->getName().'$'.$property->getName(); - - if (isset($this->loadedAnnotations[$key])) { - return $this->loadedAnnotations[$key]; - } - - $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; - if (!file_exists($path)) { - $annot = $this->reader->getPropertyAnnotations($property); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - if ($this->debug - && (false !== $filename = $class->getFilename()) - && filemtime($path) < filemtime($filename)) { - unlink($path); - - $annot = $this->reader->getPropertyAnnotations($property); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - return $this->loadedAnnotations[$key] = include $path; - } - - /** - * Retrieve annotations for method - * - * @param \ReflectionMethod $method - * @return array - */ - public function getMethodAnnotations(\ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - $key = $class->getName().'#'.$method->getName(); - - if (isset($this->loadedAnnotations[$key])) { - return $this->loadedAnnotations[$key]; - } - - $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; - if (!file_exists($path)) { - $annot = $this->reader->getMethodAnnotations($method); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - if ($this->debug - && (false !== $filename = $class->getFilename()) - && filemtime($path) < filemtime($filename)) { - unlink($path); - - $annot = $this->reader->getMethodAnnotations($method); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - return $this->loadedAnnotations[$key] = include $path; - } - - /** - * Save cache file - * - * @param string $path - * @param mixed $data - */ - private function saveCacheFile($path, $data) - { - file_put_contents($path, 'getClassAnnotations($class); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * Gets a method annotation. - * - * @param \ReflectionMethod $method - * @param string $annotationName The name of the annotation. - * @return mixed The Annotation or NULL, if the requested annotation does not exist. - */ - public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) - { - $annotations = $this->getMethodAnnotations($method); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * Gets a property annotation. - * - * @param \ReflectionProperty $property - * @param string $annotationName The name of the annotation. - * @return mixed The Annotation or NULL, if the requested annotation does not exist. - */ - public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) - { - $annotations = $this->getPropertyAnnotations($property); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * Clear stores annotations - */ - public function clearLoadedAnnotations() - { - $this->loadedAnnotations = array(); - } -} diff --git a/framework/library/Doctrine/Common/Annotations/IndexedReader.php b/framework/library/Doctrine/Common/Annotations/IndexedReader.php deleted file mode 100644 index 2dfdd4d..0000000 --- a/framework/library/Doctrine/Common/Annotations/IndexedReader.php +++ /dev/null @@ -1,141 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use Doctrine\Common\Annotations\Reader; - -/** - * Allows the reader to be used in-place of Doctrine's reader. - * - * @author Johannes M. Schmitt - */ -class IndexedReader implements Reader -{ - /** - * @var Reader - */ - private $delegate; - - /** - * Constructor - * - * @param Reader $reader - */ - public function __construct(Reader $reader) - { - $this->delegate = $reader; - } - - /** - * Get Annotations for class - * - * @param \ReflectionClass $class - * @return array - */ - public function getClassAnnotations(\ReflectionClass $class) - { - $annotations = array(); - foreach ($this->delegate->getClassAnnotations($class) as $annot) { - $annotations[get_class($annot)] = $annot; - } - - return $annotations; - } - - /** - * Get selected annotation for class - * - * @param \ReflectionClass $class - * @param string $annotation - * @return mixed - */ - public function getClassAnnotation(\ReflectionClass $class, $annotation) - { - return $this->delegate->getClassAnnotation($class, $annotation); - } - - /** - * Get Annotations for method - * - * @param \ReflectionMethod $method - * @return array - */ - public function getMethodAnnotations(\ReflectionMethod $method) - { - $annotations = array(); - foreach ($this->delegate->getMethodAnnotations($method) as $annot) { - $annotations[get_class($annot)] = $annot; - } - - return $annotations; - } - - /** - * Get selected annotation for method - * - * @param \ReflectionMethod $method - * @param string $annotation - * @return mixed - */ - public function getMethodAnnotation(\ReflectionMethod $method, $annotation) - { - return $this->delegate->getMethodAnnotation($method, $annotation); - } - - /** - * Get annotations for property - * - * @param \ReflectionProperty $property - * @return array - */ - public function getPropertyAnnotations(\ReflectionProperty $property) - { - $annotations = array(); - foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { - $annotations[get_class($annot)] = $annot; - } - - return $annotations; - } - - /** - * Get selected annotation for property - * - * @param \ReflectionProperty $property - * @param string $annotation - * @return mixed - */ - public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) - { - return $this->delegate->getPropertyAnnotation($property, $annotation); - } - - /** - * Proxy all methods to the delegate. - * - * @param string $method - * @param array $args - * @return mixed - */ - public function __call($method, $args) - { - return call_user_func_array(array($this->delegate, $method), $args); - } -} diff --git a/framework/library/Doctrine/Common/Annotations/PhpParser.php b/framework/library/Doctrine/Common/Annotations/PhpParser.php deleted file mode 100644 index c09dd51..0000000 --- a/framework/library/Doctrine/Common/Annotations/PhpParser.php +++ /dev/null @@ -1,80 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use SplFileObject; - -/** - * Parses a file for namespaces/use/class declarations. - * - * @author Fabien Potencier - * @author Christian Kaps - */ -final class PhpParser -{ - /** - * Parses a class. - * - * @param \ReflectionClass $class A ReflectionClass object. - * @return array A list with use statements in the form (Alias => FQN). - */ - public function parseClass(\ReflectionClass $class) - { - if (method_exists($class, 'getUseStatements')) { - return $class->getUseStatements(); - } - - if (false === $filename = $class->getFilename()) { - return array(); - } - - $content = $this->getFileContent($filename, $class->getStartLine()); - $namespace = str_replace('\\', '\\\\', $class->getNamespaceName()); - $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); - $tokenizer = new TokenParser('parseUseStatements($class->getNamespaceName()); - - return $statements; - } - - /** - * Get the content of the file right up to the given line number. - * - * @param string $filename The name of the file to load. - * @param int $lineNumber The number of lines to read from file. - * @return string The content of the file. - */ - private function getFileContent($filename, $lineNumber) - { - $content = ''; - $lineCnt = 0; - $file = new SplFileObject($filename); - while (!$file->eof()) { - if ($lineCnt++ == $lineNumber) { - break; - } - - $content .= $file->fgets(); - } - - return $content; - } -} diff --git a/framework/library/Doctrine/Common/Annotations/Reader.php b/framework/library/Doctrine/Common/Annotations/Reader.php deleted file mode 100644 index 6a01cb4..0000000 --- a/framework/library/Doctrine/Common/Annotations/Reader.php +++ /dev/null @@ -1,67 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Interface for annotation readers. - * - * @author Johannes M. Schmitt - */ -interface Reader -{ - /** - * @param \ReflectionClass $class - * @return mixed - */ - function getClassAnnotations(\ReflectionClass $class); - - /** - * @param \ReflectionClass $class - * @param string $annotationName - * @return mixed - */ - function getClassAnnotation(\ReflectionClass $class, $annotationName); - - /** - * @param \ReflectionMethod $method - * @return mixed - */ - function getMethodAnnotations(\ReflectionMethod $method); - - /** - * @param \ReflectionMethod $method - * @param string $annotationName - * @return mixed - */ - function getMethodAnnotation(\ReflectionMethod $method, $annotationName); - - /** - * @param \ReflectionProperty $property - * @return mixed - */ - function getPropertyAnnotations(\ReflectionProperty $property); - - /** - * @param \ReflectionProperty $property - * @param string $annotationName - * @return mixed - */ - function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); -} diff --git a/framework/library/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/framework/library/Doctrine/Common/Annotations/SimpleAnnotationReader.php deleted file mode 100644 index 4210d90..0000000 --- a/framework/library/Doctrine/Common/Annotations/SimpleAnnotationReader.php +++ /dev/null @@ -1,157 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use Doctrine\Common\Annotations\Annotation\Target; - -/** - * Simple Annotation Reader. - * - * This annotation reader is intended to be used in projects where you have - * full-control over all annotations that are available. - * - * @since 2.2 - * @author Johannes M. Schmitt - * @author Fabio B. Silva - */ -class SimpleAnnotationReader implements Reader -{ - /** - * @var DocParser - */ - private $parser; - - /** - * Constructor. - * - * Initializes a new SimpleAnnotationReader. - */ - public function __construct() - { - $this->parser = new DocParser(); - $this->parser->setIgnoreNotImportedAnnotations(true); - } - - /** - * Adds a namespace in which we will look for annotations. - * - * @param string $namespace - */ - public function addNamespace($namespace) - { - $this->parser->addNamespace($namespace); - } - - /** - * Gets the annotations applied to a class. - * - * @param \ReflectionClass $class The ReflectionClass of the class from which - * the class annotations should be read. - * - * @return array An array of Annotations. - */ - public function getClassAnnotations(\ReflectionClass $class) - { - return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); - } - - /** - * Gets the annotations applied to a method. - * - * @param \ReflectionMethod $method The ReflectionMethod of the method from which - * the annotations should be read. - * - * @return array An array of Annotations. - */ - public function getMethodAnnotations(\ReflectionMethod $method) - { - return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); - } - - /** - * Gets the annotations applied to a property. - * - * @param \ReflectionProperty $property The ReflectionProperty of the property - * from which the annotations should be read. - * - * @return array An array of Annotations. - */ - public function getPropertyAnnotations(\ReflectionProperty $property) - { - return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); - } - - /** - * Gets a class annotation. - * - * @param \ReflectionClass $class The ReflectionClass of the class from which - * the class annotations should be read. - * @param string $annotationName The name of the annotation. - * - * @return mixed The Annotation or NULL, if the requested annotation does not exist. - */ - public function getClassAnnotation(\ReflectionClass $class, $annotationName) - { - foreach ($this->getClassAnnotations($class) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * Gets a method annotation. - * - * @param \ReflectionMethod $method - * @param string $annotationName The name of the annotation. - * - * @return mixed The Annotation or NULL, if the requested annotation does not exist. - */ - public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) - { - foreach ($this->getMethodAnnotations($method) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * Gets a property annotation. - * - * @param \ReflectionProperty $property - * @param string $annotationName The name of the annotation. - * @return mixed The Annotation or NULL, if the requested annotation does not exist. - */ - public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) - { - foreach ($this->getPropertyAnnotations($property) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } -} diff --git a/framework/library/Doctrine/Common/Annotations/TokenParser.php b/framework/library/Doctrine/Common/Annotations/TokenParser.php deleted file mode 100644 index a1ef115..0000000 --- a/framework/library/Doctrine/Common/Annotations/TokenParser.php +++ /dev/null @@ -1,175 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Parses a file for namespaces/use/class declarations. - * - * @author Fabien Potencier - * @author Christian Kaps - */ -class TokenParser -{ - /** - * The token list. - * - * @var array - */ - private $tokens; - - /** - * The number of tokens. - * - * @var int - */ - private $numTokens = 0; - - /** - * The current array pointer. - * - * @var int - */ - private $pointer = 0; - - public function __construct($contents) - { - $this->tokens = token_get_all($contents); - $this->numTokens = count($this->tokens); - $this->pointer = 0; - } - - /** - * Gets the next non whitespace and non comment token. - * - * @param $docCommentIsComment - * If TRUE then a doc comment is considered a comment and skipped. - * If FALSE then only whitespace and normal comments are skipped. - * - * @return array The token if exists, null otherwise. - */ - public function next($docCommentIsComment = TRUE) - { - for ($i = $this->pointer; $i < $this->numTokens; $i++) { - $this->pointer++; - if ($this->tokens[$i][0] === T_WHITESPACE || - $this->tokens[$i][0] === T_COMMENT || - ($docCommentIsComment && $this->tokens[$i][0] === T_DOC_COMMENT)) { - - continue; - } - - return $this->tokens[$i]; - } - - return null; - } - - /** - * Parse a single use statement. - * - * @return array A list with all found class names for a use statement. - */ - public function parseUseStatement() - { - $class = ''; - $alias = ''; - $statements = array(); - $explicitAlias = false; - while (($token = $this->next())) { - $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; - if (!$explicitAlias && $isNameToken) { - $class .= $token[1]; - $alias = $token[1]; - } else if ($explicitAlias && $isNameToken) { - $alias .= $token[1]; - } else if ($token[0] === T_AS) { - $explicitAlias = true; - $alias = ''; - } else if ($token === ',') { - $statements[strtolower($alias)] = $class; - $class = ''; - $alias = ''; - $explicitAlias = false; - } else if ($token === ';') { - $statements[strtolower($alias)] = $class; - break; - } else { - break; - } - } - - return $statements; - } - - /** - * Get all use statements. - * - * @param string $namespaceName The namespace name of the reflected class. - * @return array A list with all found use statements. - */ - public function parseUseStatements($namespaceName) - { - $statements = array(); - while (($token = $this->next())) { - if ($token[0] === T_USE) { - $statements = array_merge($statements, $this->parseUseStatement()); - continue; - } - if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { - continue; - } - - // Get fresh array for new namespace. This is to prevent the parser to collect the use statements - // for a previous namespace with the same name. This is the case if a namespace is defined twice - // or if a namespace with the same name is commented out. - $statements = array(); - } - - return $statements; - } - - /** - * Get the namespace. - * - * @return string The found namespace. - */ - public function parseNamespace() - { - $name = ''; - while (($token = $this->next()) && ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR)) { - $name .= $token[1]; - } - - return $name; - } - - /** - * Get the class name. - * - * @return string The foundclass name. - */ - public function parseClass() - { - // Namespaces and class names are tokenized the same: T_STRINGs - // separated by T_NS_SEPARATOR so we can use one function to provide - // both. - return $this->parseNamespace(); - } -} diff --git a/framework/library/Doctrine/Common/Cache/ApcCache.php b/framework/library/Doctrine/Common/Cache/ApcCache.php deleted file mode 100644 index 2d0cd23..0000000 --- a/framework/library/Doctrine/Common/Cache/ApcCache.php +++ /dev/null @@ -1,93 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * APC cache provider. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class ApcCache extends CacheProvider -{ - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return apc_fetch($id); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return apc_exists($id); - } - - /** - * {@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); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - return apc_clear_cache() && apc_clear_cache('user'); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $info = apc_cache_info(); - $sma = apc_sma_info(); - - return array( - Cache::STATS_HITS => $info['num_hits'], - Cache::STATS_MISSES => $info['num_misses'], - Cache::STATS_UPTIME => $info['start_time'], - Cache::STATS_MEMORY_USAGE => $info['mem_size'], - Cache::STATS_MEMORY_AVAILIABLE => $sma['avail_mem'], - ); - } -} diff --git a/framework/library/Doctrine/Common/Cache/ArrayCache.php b/framework/library/Doctrine/Common/Cache/ArrayCache.php deleted file mode 100644 index a7a70aa..0000000 --- a/framework/library/Doctrine/Common/Cache/ArrayCache.php +++ /dev/null @@ -1,96 +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 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class ArrayCache extends CacheProvider -{ - /** - * @var array $data - */ - private $data = array(); - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return (isset($this->data[$id])) ? $this->data[$id] : 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; - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - $this->data = array(); - - return true; - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - return null; - } -} diff --git a/framework/library/Doctrine/Common/Cache/Cache.php b/framework/library/Doctrine/Common/Cache/Cache.php deleted file mode 100644 index 5493562..0000000 --- a/framework/library/Doctrine/Common/Cache/Cache.php +++ /dev/null @@ -1,102 +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 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Fabio B. Silva - */ -interface Cache -{ - const STATS_HITS = 'hits'; - const STATS_MISSES = 'misses'; - const STATS_UPTIME = 'uptime'; - const STATS_MEMORY_USAGE = 'memory_usage'; - const STATS_MEMORY_AVAILIABLE = 'memory_available'; - - /** - * Fetches an entry from the cache. - * - * @param string $id cache id The id of the cache entry to fetch. - * @return mixed 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 mixed $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); - - /** - * Retrieves cached information from data store - * - * The server's statistics array has the following values: - * - * - hits - * Number of keys that have been requested and found present. - * - * - misses - * Number of items that have been requested and not found. - * - * - uptime - * Time that the server is running. - * - * - memory_usage - * Memory used by this server to store items. - * - * - memory_available - * Memory allowed to use for storage. - * - * @since 2.2 - * @var array Associative array with server's statistics if available, NULL otherwise. - */ - function getStats(); -} diff --git a/framework/library/Doctrine/Common/Cache/CacheProvider.php b/framework/library/Doctrine/Common/Cache/CacheProvider.php deleted file mode 100644 index 4221a62..0000000 --- a/framework/library/Doctrine/Common/Cache/CacheProvider.php +++ /dev/null @@ -1,231 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Base class for cache provider implementations. - * - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Fabio B. Silva - */ -abstract class CacheProvider implements Cache -{ - const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]'; - - /** - * @var string The namespace to prefix all cache ids with - */ - private $namespace = ''; - - /** - * @var string The namespace version - */ - private $namespaceVersion; - - /** - * Set the namespace to prefix all cache ids with. - * - * @param string $namespace - * @return void - */ - public function setNamespace($namespace) - { - $this->namespace = (string) $namespace; - } - - /** - * Retrieve the namespace that prefixes all cache ids. - * - * @return string - */ - public function getNamespace() - { - return $this->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) - { - return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); - } - - /** - * {@inheritdoc} - */ - public function delete($id) - { - return $this->doDelete($this->getNamespacedId($id)); - } - - /** - * {@inheritdoc} - */ - public function getStats() - { - return $this->doGetStats(); - } - - /** - * Deletes all cache entries. - * - * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise. - */ - public function flushAll() - { - return $this->doFlush(); - } - - /** - * Delete all cache entries. - * - * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise. - */ - public function deleteAll() - { - $namespaceCacheKey = $this->getNamespaceCacheKey(); - $namespaceVersion = $this->getNamespaceVersion() + 1; - - $this->namespaceVersion = $namespaceVersion; - - return $this->doSave($namespaceCacheKey, $namespaceVersion); - } - - /** - * 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) - { - $namespaceVersion = $this->getNamespaceVersion(); - - return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); - } - - /** - * Namespace cache key - * - * @return string $namespaceCacheKey - */ - private function getNamespaceCacheKey() - { - return sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); - } - - /** - * Namespace version - * - * @return string $namespaceVersion - */ - private function getNamespaceVersion() - { - if (null !== $this->namespaceVersion) { - return $this->namespaceVersion; - } - - $namespaceCacheKey = $this->getNamespaceCacheKey(); - $namespaceVersion = $this->doFetch($namespaceCacheKey); - - if (false === $namespaceVersion) { - $namespaceVersion = 1; - - $this->doSave($namespaceCacheKey, $namespaceVersion); - } - - $this->namespaceVersion = $namespaceVersion; - - return $this->namespaceVersion; - } - - /** - * 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 bool|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); - - /** - * Deletes all cache entries. - * - * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. - */ - abstract protected function doFlush(); - - /** - * Retrieves cached information from data store - * - * @since 2.2 - * @return array An associative array with server's statistics if available, NULL otherwise. - */ - abstract protected function doGetStats(); -} diff --git a/framework/library/Doctrine/Common/Cache/FileCache.php b/framework/library/Doctrine/Common/Cache/FileCache.php deleted file mode 100644 index da650b4..0000000 --- a/framework/library/Doctrine/Common/Cache/FileCache.php +++ /dev/null @@ -1,132 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Base file cache driver. - * - * @since 2.3 - * @author Fabio B. Silva - */ -abstract class FileCache extends CacheProvider -{ - /** - * @var string Cache directory. - */ - protected $directory; - - /** - * @var string Cache file extension. - */ - protected $extension; - - /** - * Constructor - * - * @param string $directory Cache directory. - * @param string $directory Cache file extension. - * - * @throws \InvalidArgumentException - */ - public function __construct($directory, $extension = null) - { - if ( ! is_dir($directory) && ! @mkdir($directory, 0777, true)) { - throw new \InvalidArgumentException(sprintf( - 'The directory "%s" does not exist and could not be created.', - $directory - )); - } - - if ( ! is_writable($directory)) { - throw new \InvalidArgumentException(sprintf( - 'The directory "%s" is not writable.', - $directory - )); - } - - $this->directory = realpath($directory); - $this->extension = $extension ?: $this->extension; - } - - /** - * Gets the cache directory. - * - * @return string - */ - public function getDirectory() - { - return $this->directory; - } - - /** - * Gets the cache file extension. - * - * @return string - */ - public function getExtension() - { - return $this->extension; - } - - /** - * @return string - */ - protected function getFilename($id) - { - $path = implode(str_split(md5($id), 12), DIRECTORY_SEPARATOR); - $path = $this->directory . DIRECTORY_SEPARATOR . $path; - - return $path . DIRECTORY_SEPARATOR . $id . $this->extension; - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return @unlink($this->getFilename($id)); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - $pattern = '/^.+\\' . $this->extension . '$/i'; - $iterator = new \RecursiveDirectoryIterator($this->directory); - $iterator = new \RecursiveIteratorIterator($iterator); - $iterator = new \RegexIterator($iterator, $pattern); - - foreach ($iterator as $name => $file) { - @unlink($name); - } - - return true; - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - return null; - } -} \ No newline at end of file diff --git a/framework/library/Doctrine/Common/Cache/FilesystemCache.php b/framework/library/Doctrine/Common/Cache/FilesystemCache.php deleted file mode 100644 index a27a717..0000000 --- a/framework/library/Doctrine/Common/Cache/FilesystemCache.php +++ /dev/null @@ -1,114 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Filesystem cache driver. - * - * @since 2.3 - * @author Fabio B. Silva - */ -class FilesystemCache extends FileCache -{ - const EXTENSION = '.doctrinecache.data'; - - /** - * {@inheritdoc} - */ - protected $extension = self::EXTENSION; - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - $data = ''; - $lifetime = -1; - $filename = $this->getFilename($id); - - if ( ! file_exists($filename)) { - return false; - } - - $resource = fopen($filename, "r"); - - if (false !== ($line = fgets($resource))) { - $lifetime = (integer) $line; - } - - if ($lifetime !== 0 && $lifetime < time()) { - fclose($resource); - - return false; - } - - while (false !== ($line = fgets($resource))) { - $data .= $line; - } - - fclose($resource); - - return unserialize($data); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - $lifetime = -1; - $filename = $this->getFilename($id); - - if ( ! file_exists($filename)) { - return false; - } - - $resource = fopen($filename, "r"); - - if (false !== ($line = fgets($resource))) { - $lifetime = (integer) $line; - } - - fclose($resource); - - return $lifetime === 0 || $lifetime > time(); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - if ($lifeTime > 0) { - $lifeTime = time() + $lifeTime; - } - - $data = serialize($data); - $filename = $this->getFilename($id); - $filepath = pathinfo($filename, PATHINFO_DIRNAME); - - if ( ! is_dir($filepath)) { - mkdir($filepath, 0777, true); - } - - return file_put_contents($filename, $lifeTime . PHP_EOL . $data); - } -} \ No newline at end of file diff --git a/framework/library/Doctrine/Common/Cache/MemcacheCache.php b/framework/library/Doctrine/Common/Cache/MemcacheCache.php deleted file mode 100644 index 5687b96..0000000 --- a/framework/library/Doctrine/Common/Cache/MemcacheCache.php +++ /dev/null @@ -1,121 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -use \Memcache; - -/** - * Memcache cache provider. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class MemcacheCache extends CacheProvider -{ - /** - * @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} - */ - 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) - { - if ($lifeTime > 30 * 24 * 3600) { - $lifeTime = time() + $lifeTime; - } - return $this->memcache->set($id, $data, 0, (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return $this->memcache->delete($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - return $this->memcache->flush(); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $stats = $this->memcache->getStats(); - return array( - Cache::STATS_HITS => $stats['get_hits'], - Cache::STATS_MISSES => $stats['get_misses'], - Cache::STATS_UPTIME => $stats['uptime'], - Cache::STATS_MEMORY_USAGE => $stats['bytes'], - Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], - ); - } -} diff --git a/framework/library/Doctrine/Common/Cache/MemcachedCache.php b/framework/library/Doctrine/Common/Cache/MemcachedCache.php deleted file mode 100644 index 75f1345..0000000 --- a/framework/library/Doctrine/Common/Cache/MemcachedCache.php +++ /dev/null @@ -1,124 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -use \Memcached; - -/** - * Memcached cache provider. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class MemcachedCache extends CacheProvider -{ - /** - * @var Memcached - */ - private $memcached; - - /** - * Sets the memcache instance to use. - * - * @param Memcached $memcached - */ - public function setMemcached(Memcached $memcached) - { - $this->memcached = $memcached; - } - - /** - * Gets the memcached instance used by the cache. - * - * @return Memcached - */ - public function getMemcached() - { - return $this->memcached; - } - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return $this->memcached->get($id); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return (false !== $this->memcached->get($id)); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - if ($lifeTime > 30 * 24 * 3600) { - $lifeTime = time() + $lifeTime; - } - return $this->memcached->set($id, $data, (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return $this->memcached->delete($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - return $this->memcached->flush(); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $stats = $this->memcached->getStats(); - $servers = $this->memcached->getServerList(); - $key = $servers[0]['host'] . ':' . $servers[0]['port']; - $stats = $stats[$key]; - return array( - Cache::STATS_HITS => $stats['get_hits'], - Cache::STATS_MISSES => $stats['get_misses'], - Cache::STATS_UPTIME => $stats['uptime'], - Cache::STATS_MEMORY_USAGE => $stats['bytes'], - Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], - ); - } -} diff --git a/framework/library/Doctrine/Common/Cache/PhpFileCache.php b/framework/library/Doctrine/Common/Cache/PhpFileCache.php deleted file mode 100644 index 0971cd9..0000000 --- a/framework/library/Doctrine/Common/Cache/PhpFileCache.php +++ /dev/null @@ -1,108 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Php file cache driver. - * - * @since 2.3 - * @author Fabio B. Silva - */ -class PhpFileCache extends FileCache -{ - const EXTENSION = '.doctrinecache.php'; - - /** - * {@inheritdoc} - */ - protected $extension = self::EXTENSION; - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - $filename = $this->getFilename($id); - - if ( ! file_exists($filename)) { - return false; - } - - $value = include $filename; - - if ($value['lifetime'] !== 0 && $value['lifetime'] < time()) { - return false; - } - - return $value['data']; - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - $filename = $this->getFilename($id); - - if ( ! file_exists($filename)) { - return false; - } - - $value = include $filename; - - return $value['lifetime'] === 0 || $value['lifetime'] > time(); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - if ($lifeTime > 0) { - $lifeTime = time() + $lifeTime; - } - - if (is_object($data) && ! method_exists($data, '__set_state')) { - throw new \InvalidArgumentException( - "Invalid argument given, PhpFileCache only allows objects that implement __set_state() " . - "and fully support var_export(). You can use the FilesystemCache to save arbitrary object " . - "graphs using serialize()/deserialize()." - ); - } - - $filename = $this->getFilename($id); - $filepath = pathinfo($filename, PATHINFO_DIRNAME); - - if ( ! is_dir($filepath)) { - mkdir($filepath, 0777, true); - } - - $value = array( - 'lifetime' => $lifeTime, - 'data' => $data - ); - - $value = var_export($value, true); - $code = sprintf('. - */ - -namespace Doctrine\Common\Cache; - -use Redis; - -/** - * Redis cache provider. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.2 - * @author Osman Ungur - */ -class RedisCache extends CacheProvider -{ - /** - * @var Redis - */ - private $redis; - - /** - * Sets the redis instance to use. - * - * @param Redis $redis - */ - public function setRedis(Redis $redis) - { - $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_IGBINARY); - $this->redis = $redis; - } - - /** - * Gets the redis instance used by the cache. - * - * @return Redis - */ - public function getRedis() - { - return $this->redis; - } - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return $this->redis->get($id); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return $this->redis->exists($id); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - $result = $this->redis->set($id, $data); - if ($lifeTime > 0) { - $this->redis->expire($id, $lifeTime); - } - return $result; - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return $this->redis->delete($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - return $this->redis->flushDB(); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $info = $this->redis->info(); - return array( - Cache::STATS_HITS => false, - Cache::STATS_MISSES => false, - Cache::STATS_UPTIME => $info['uptime_in_seconds'], - Cache::STATS_MEMORY_USAGE => $info['used_memory'], - Cache::STATS_MEMORY_AVAILIABLE => false - ); - } -} diff --git a/framework/library/Doctrine/Common/Cache/WinCacheCache.php b/framework/library/Doctrine/Common/Cache/WinCacheCache.php deleted file mode 100644 index 777d0fd..0000000 --- a/framework/library/Doctrine/Common/Cache/WinCacheCache.php +++ /dev/null @@ -1,93 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * WinCache cache provider. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class WinCacheCache extends CacheProvider -{ - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return wincache_ucache_get($id); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return wincache_ucache_exists($id); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - return (bool) wincache_ucache_set($id, $data, (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return wincache_ucache_delete($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - return wincache_ucache_clear(); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $info = wincache_ucache_info(); - $meminfo = wincache_ucache_meminfo(); - - return array( - Cache::STATS_HITS => $info['total_hit_count'], - Cache::STATS_MISSES => $info['total_miss_count'], - Cache::STATS_UPTIME => $info['total_cache_uptime'], - Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], - Cache::STATS_MEMORY_AVAILIABLE => $meminfo['memory_free'], - ); - } -} diff --git a/framework/library/Doctrine/Common/Cache/XcacheCache.php b/framework/library/Doctrine/Common/Cache/XcacheCache.php deleted file mode 100644 index 8733e26..0000000 --- a/framework/library/Doctrine/Common/Cache/XcacheCache.php +++ /dev/null @@ -1,110 +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 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class XcacheCache extends CacheProvider -{ - /** - * {@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); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - $this->checkAuthorization(); - - xcache_clear_cache(XC_TYPE_VAR, 0); - - return true; - } - - /** - * Checks that xcache.admin.enable_auth is Off - * - * @throws \BadMethodCallException When xcache.admin.enable_auth is On - * @return void - */ - protected function checkAuthorization() - { - 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.'); - } - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $this->checkAuthorization(); - - $info = xcache_info(XC_TYPE_VAR, 0); - return array( - Cache::STATS_HITS => $info['hits'], - Cache::STATS_MISSES => $info['misses'], - Cache::STATS_UPTIME => null, - Cache::STATS_MEMORY_USAGE => $info['size'], - Cache::STATS_MEMORY_AVAILIABLE => $info['avail'], - ); - } -} diff --git a/framework/library/Doctrine/Common/Cache/ZendDataCache.php b/framework/library/Doctrine/Common/Cache/ZendDataCache.php deleted file mode 100644 index fc90bc6..0000000 --- a/framework/library/Doctrine/Common/Cache/ZendDataCache.php +++ /dev/null @@ -1,84 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Zend Data Cache cache driver. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @author Ralph Schindler - * @author Guilherme Blanco - */ -class ZendDataCache extends CacheProvider -{ - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return zend_shm_cache_fetch($id); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return (false !== zend_shm_cache_fetch($id)); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - return zend_shm_cache_store($id, $data, $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return zend_shm_cache_delete($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - $namespace = $this->getNamespace(); - if (empty($namespace)) { - return zend_shm_cache_clear(); - } - return zend_shm_cache_clear($namespace); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - return null; - } -} diff --git a/framework/library/Doctrine/Common/ClassLoader.php b/framework/library/Doctrine/Common/ClassLoader.php deleted file mode 100644 index 45024e1..0000000 --- a/framework/library/Doctrine/Common/ClassLoader.php +++ /dev/null @@ -1,263 +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 either loads only classes - * of a specific namespace or all namespaces and it is suitable for working together - * with other autoloaders in the SPL autoload stack. - * - * If no include path is configured through the constructor or {@link setIncludePath}, a ClassLoader - * relies on the PHP include_path. - * - * @author Roman Borschel - * @since 2.0 - */ -class ClassLoader -{ - /** - * @var string PHP file extension - */ - protected $fileExtension = '.php'; - - /** - * @var string Current namespace - */ - protected $namespace; - - /** - * @var string Current include path - */ - protected $includePath; - - /** - * @var string PHP namespace separator - */ - protected $namespaceSeparator = '\\'; - - /** - * Creates a new ClassLoader that loads classes of the - * specified namespace from the specified include path. - * - * If no include path is given, the ClassLoader relies on the PHP include_path. - * If neither a namespace nor an include path is given, the ClassLoader will - * be responsible for loading all classes, thereby relying on the PHP include_path. - * - * @param string $ns The namespace of the classes to load. - * @param string $includePath The base include path 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 ClassLoader. - * - * @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 ClassLoader. - * - * @return string - */ - public function getNamespaceSeparator() - { - return $this->namespaceSeparator; - } - - /** - * Sets the base include path for all class files in the namespace of this ClassLoader. - * - * @param string $includePath - */ - public function setIncludePath($includePath) - { - $this->includePath = $includePath; - } - - /** - * Gets the base include path for all class files in the namespace of this ClassLoader. - * - * @return string - */ - public function getIncludePath() - { - return $this->includePath; - } - - /** - * Sets the file extension of class files in the namespace of this ClassLoader. - * - * @param string $fileExtension - */ - public function setFileExtension($fileExtension) - { - $this->fileExtension = $fileExtension; - } - - /** - * Gets the file extension of class files in the namespace of this ClassLoader. - * - * @return string - */ - public function getFileExtension() - { - return $this->fileExtension; - } - - /** - * Registers this ClassLoader on the SPL autoload stack. - */ - public function register() - { - spl_autoload_register(array($this, 'loadClass')); - } - - /** - * Removes this ClassLoader from 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; - } - - /** - * Asks this ClassLoader whether it can potentially load the class (file) with - * the given name. - * - * @param string $className The fully-qualified name of the class. - * @return boolean TRUE if this ClassLoader can load the class, FALSE otherwise. - */ - public function canLoadClass($className) - { - if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { - return false; - } - - $file = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) . $this->fileExtension; - - if ($this->includePath !== null) { - return file_exists($this->includePath . DIRECTORY_SEPARATOR . $file); - } - - return (false !== stream_resolve_include_path($file)); - } - - /** - * Checks whether a class with a given name exists. A class "exists" if it is either - * already defined in the current request or if there is an autoloader on the SPL - * autoload stack that is a) responsible for the class in question and b) is able to - * load a class file in which the class definition resides. - * - * If the class is not already defined, each autoloader in the SPL autoload stack - * is asked whether it is able to tell if the class exists. If the autoloader is - * a ClassLoader, {@link canLoadClass} is used, otherwise the autoload - * function of the autoloader is invoked and expected to return a value that - * evaluates to TRUE if the class (file) exists. As soon as one autoloader reports - * that the class exists, TRUE is returned. - * - * Note that, depending on what kinds of autoloaders are installed on the SPL - * autoload stack, the class (file) might already be loaded as a result of checking - * for its existence. This is not the case with a ClassLoader, who separates - * these responsibilities. - * - * @param string $className The fully-qualified name of the class. - * @return boolean TRUE if the class exists as per the definition given above, FALSE otherwise. - */ - public static function classExists($className) - { - if (class_exists($className, false) || interface_exists($className, false)) { - return true; - } - - foreach (spl_autoload_functions() as $loader) { - if (is_array($loader)) { // array(???, ???) - if (is_object($loader[0])) { - if ($loader[0] instanceof ClassLoader) { // array($obj, 'methodName') - if ($loader[0]->canLoadClass($className)) { - return true; - } - } else if ($loader[0]->{$loader[1]}($className)) { - return true; - } - } else if ($loader[0]::$loader[1]($className)) { // array('ClassName', 'methodName') - return true; - } - } else if ($loader instanceof \Closure) { // function($className) {..} - if ($loader($className)) { - return true; - } - } else if (is_string($loader) && $loader($className)) { // "MyClass::loadClass" - return true; - } - } - - return class_exists($className, false) || interface_exists($className, false); - } - - /** - * Gets the ClassLoader from the SPL autoload stack that is responsible - * for (and is able to load) the class with the given name. - * - * @param string $className The name of the class. - * @return ClassLoader The ClassLoader for the class or NULL if no such ClassLoader exists. - */ - public static function getClassLoader($className) - { - foreach (spl_autoload_functions() as $loader) { - if (is_array($loader) - && $loader[0] instanceof ClassLoader - && $loader[0]->canLoadClass($className) - ) { - return $loader[0]; - } - } - - return null; - } -} diff --git a/framework/library/Doctrine/Common/Collections/ArrayCollection.php b/framework/library/Doctrine/Common/Collections/ArrayCollection.php deleted file mode 100644 index 7c2b13e..0000000 --- a/framework/library/Doctrine/Common/Collections/ArrayCollection.php +++ /dev/null @@ -1,500 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections; - -use Closure, ArrayIterator; -use Doctrine\Common\Collections\Expr\Expression; -use Doctrine\Common\Collections\Expr\ClosureExpressionVisitor; - -/** - * 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, Selectable -{ - /** - * 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() - { - return 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 The element to remove. - * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. - */ - public function removeElement($element) - { - $key = array_search($element, $this->_elements, true); - - if ($key !== false) { - unset($this->_elements[$key]); - - return true; - } - - return false; - } - - /** - * ArrayAccess implementation of offsetExists() - * - * @see containsKey() - * - * @param mixed $offset - * @return bool - */ - public function offsetExists($offset) - { - return $this->containsKey($offset); - } - - /** - * ArrayAccess implementation of offsetGet() - * - * @see get() - * - * @param mixed $offset - * @return mixed - */ - public function offsetGet($offset) - { - return $this->get($offset); - } - - /** - * ArrayAccess implementation of offsetSet() - * - * @see add() - * @see set() - * - * @param mixed $offset - * @param mixed $value - * @return bool - */ - public function offsetSet($offset, $value) - { - if ( ! isset($offset)) { - return $this->add($value); - } - return $this->set($offset, $value); - } - - /** - * ArrayAccess implementation of offsetUnset() - * - * @see remove() - * - * @param mixed $offset - * @return mixed - */ - 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) - { - foreach ($this->_elements as $collectionElement) { - if ($element === $collectionElement) { - return true; - } - } - - return false; - } - - /** - * 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. - */ - 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 preferable 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 static(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 static(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 static($coll1), new static($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(); - } - - /** - * Extract a slice of $length elements starting at position $offset from the Collection. - * - * If $length is null it returns all elements from $offset to the end of the Collection. - * Keys have to be preserved by this method. Calling this method will only return the - * selected slice and NOT change the elements contained in the collection slice is called on. - * - * @param int $offset - * @param int $length - * @return array - */ - public function slice($offset, $length = null) - { - return array_slice($this->_elements, $offset, $length, true); - } - - /** - * Select all elements from a selectable that match the criteria and - * return a new collection containing these elements. - * - * @param Criteria $criteria - * @return Collection - */ - public function matching(Criteria $criteria) - { - $expr = $criteria->getWhereExpression(); - $filtered = $this->_elements; - - if ($expr) { - $visitor = new ClosureExpressionVisitor(); - $filter = $visitor->dispatch($expr); - $filtered = array_filter($filtered, $filter); - } - - if ($orderings = $criteria->getOrderings()) { - $next = null; - foreach (array_reverse($orderings) as $field => $ordering) { - $next = ClosureExpressionVisitor::sortByField($field, $ordering == 'DESC' ? -1 : 1, $next); - } - - usort($filtered, $next); - } - - $offset = $criteria->getFirstResult(); - $length = $criteria->getMaxResults(); - - if ($offset || $length) { - $filtered = array_slice($filtered, (int)$offset, $length); - } - - return new static($filtered); - } -} - diff --git a/framework/library/Doctrine/Common/Collections/Collection.php b/framework/library/Doctrine/Common/Collections/Collection.php deleted file mode 100644 index 51eb9e7..0000000 --- a/framework/library/Doctrine/Common/Collections/Collection.php +++ /dev/null @@ -1,243 +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 the specified element from the collection, if it is found. - * - * @param mixed $element The element to remove. - * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. - */ - 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); - - /** - * Extract a slice of $length elements starting at position $offset from the Collection. - * - * If $length is null it returns all elements from $offset to the end of the Collection. - * Keys have to be preserved by this method. Calling this method will only return the - * selected slice and NOT change the elements contained in the collection slice is called on. - * - * @param int $offset - * @param int $length - * @return array - */ - function slice($offset, $length = null); -} diff --git a/framework/library/Doctrine/Common/Collections/Criteria.php b/framework/library/Doctrine/Common/Collections/Criteria.php deleted file mode 100644 index 3b05549..0000000 --- a/framework/library/Doctrine/Common/Collections/Criteria.php +++ /dev/null @@ -1,240 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections; - -use Doctrine\Common\Collections\Expr\Expression; -use Doctrine\Common\Collections\Expr\CompositeExpression; - -/** - * Criteria for filtering Selectable collections. - * - * @author Benjamin Eberlei - * @since 2.3 - */ -class Criteria -{ - /** - * @var string - */ - const ASC = 'ASC'; - - /** - * @var string - */ - const DESC = 'DESC'; - - /** - * @var \Doctrine\Common\Collections\ExpressionBuilder - */ - private static $expressionBuilder; - - /** - * @var \Doctrine\Common\Collections\Expr\Expression - */ - private $expression; - - /** - * @var array|null - */ - private $orderings; - - /** - * @var int - */ - private $firstResult; - - /** - * @var int - */ - private $maxResults; - - /** - * Creates an instance of the class. - * - * @return Criteria - */ - public static function create() - { - return new static(); - } - - /** - * Return the expression builder. - * - * @return \Doctrine\Common\Collections\ExpressionBuilder - */ - public static function expr() - { - if (self::$expressionBuilder === null) { - self::$expressionBuilder = new ExpressionBuilder(); - } - return self::$expressionBuilder; - } - - /** - * Construct new criteria - * - * @param Expression $expression - * @param array $orderings - * @param int $firstResult - * @param int $maxResults - */ - public function __construct(Expression $expression = null, array $orderings = null, $firstResult = null, $maxResults = null) - { - $this->expression = $expression; - $this->orderings = $orderings; - $this->firstResult = $firstResult; - $this->maxResults = $maxResults; - } - - /** - * Set the where expression to evaluate when this criteria is searched for. - * - * @param Expression - * @return Criteria - */ - public function where(Expression $expression) - { - $this->expression = $expression; - return $this; - } - - /** - * Append the where expression to evaluate when this criteria is searched for - * using an AND with previous expression. - * - * @param Expression - * @return Criteria - */ - public function andWhere(Expression $expression) - { - if ($this->expression === null) { - return $this->where($expression); - } - - $this->expression = new CompositeExpression(CompositeExpression::TYPE_AND, array( - $this->expression, $expression - )); - - return $this; - } - - /** - * Append the where expression to evaluate when this criteria is searched for - * using an OR with previous expression. - * - * @param Expression - * @return Criteria - */ - public function orWhere(Expression $expression) - { - if ($this->expression === null) { - return $this->where($expression); - } - - $this->expression = new CompositeExpression(CompositeExpression::TYPE_OR, array( - $this->expression, $expression - )); - - return $this; - } - - /** - * Get the expression attached to this criteria. - * - * @return Expression|null - */ - public function getWhereExpression() - { - return $this->expression; - } - - /** - * Get current orderings of this Criteria - * - * @return array - */ - public function getOrderings() - { - return $this->orderings; - } - - /** - * Set the ordering of the result of this criteria. - * - * Keys are field and values are the order, being either ASC or DESC. - * - * @see Criteria::ASC - * @see Criteria::DESC - * - * @param array - * @return Criteria - */ - public function orderBy(array $orderings) - { - $this->orderings = $orderings; - return $this; - } - - /** - * Get current first result option of the critera. - * - * @return firstResult. - */ - public function getFirstResult() - { - return $this->firstResult; - } - - /** - * Set number of first result that this criteria should return. - * - * @param firstResult the value to set. - * @return Criteria - */ - public function setFirstResult($firstResult) - { - $this->firstResult = $firstResult; - return $this; - } - - /** - * Get maxResults. - * - * @return maxResults. - */ - public function getMaxResults() - { - return $this->maxResults; - } - - /** - * Set maxResults. - * - * @param maxResults the value to set. - * @return Criteria - */ - public function setMaxResults($maxResults) - { - $this->maxResults = $maxResults; - return $this; - } -} - diff --git a/framework/library/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php b/framework/library/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php deleted file mode 100644 index 06ccb04..0000000 --- a/framework/library/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php +++ /dev/null @@ -1,195 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections\Expr; - -/** - * Walks an expression graph and turns it into a PHP closure. - * - * This closure can be used with {@Collection#filter()} and is used internally - * by {@ArrayCollection#select()}. - * - * @author Benjamin Eberlei - * @since 2.3 - */ -class ClosureExpressionVisitor extends ExpressionVisitor -{ - /** - * Access the field of a given object. This field has to be public directly - * or indirectly (through an accessor get* or a magic method, __get, __call). - * - * is*() is not supported. - * - * @return mixed - */ - static public function getObjectFieldValue($object, $field) - { - $accessor = "get" . $field; - - if (method_exists($object, $accessor) || method_exists($object, '__call')) { - return $object->$accessor(); - } - - if ($object instanceof \ArrayAccess) { - return $object[$field]; - } - - return $object->$field; - } - - /** - * Helper for sorting arrays of objects based on multiple fields + - * orientations. - * - * @param string $name - * @param int $orientation - * @param Closure $next - * @return Closure - */ - static public function sortByField($name, $orientation = 1, \Closure $next = null) - { - if (!$next) { - $next = function() { - return 0; - }; - } - - return function ($a, $b) use ($name, $next, $orientation) { - $aValue = ClosureExpressionVisitor::getObjectFieldValue($a, $name); - $bValue = ClosureExpressionVisitor::getObjectFieldValue($b, $name); - - if ($aValue === $bValue) { - return $next($a, $b); - } - - return (($aValue > $bValue) ? 1 : -1) * $orientation; - }; - } - - /** - * {@inheritDoc} - */ - public function walkComparison(Comparison $comparison) - { - $field = $comparison->getField(); - $value = $comparison->getValue()->getValue(); // shortcut for walkValue() - - switch ($comparison->getOperator()) { - case Comparison::EQ: - case Comparison::IS: - return function ($object) use ($field, $value) { - return ClosureExpressionVisitor::getObjectFieldValue($object, $field) === $value; - }; - - case Comparison::NEQ: - return function ($object) use ($field, $value) { - return ClosureExpressionVisitor::getObjectFieldValue($object, $field) !== $value; - }; - - case Comparison::LT: - return function ($object) use ($field, $value) { - return ClosureExpressionVisitor::getObjectFieldValue($object, $field) < $value; - }; - - case Comparison::LTE: - return function ($object) use ($field, $value) { - return ClosureExpressionVisitor::getObjectFieldValue($object, $field) <= $value; - }; - - case Comparison::GT: - return function ($object) use ($field, $value) { - return ClosureExpressionVisitor::getObjectFieldValue($object, $field) > $value; - }; - - case Comparison::GTE: - return function ($object) use ($field, $value) { - return ClosureExpressionVisitor::getObjectFieldValue($object, $field) >= $value; - }; - - case Comparison::IN: - return function ($object) use ($field, $value) { - return in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value); - }; - - case Comparison::NIN: - return function ($object) use ($field, $value) { - return ! in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value); - }; - - default: - throw new \RuntimeException("Unknown comparison operator: " . $comparison->getOperator()); - } - } - - /** - * {@inheritDoc} - */ - public function walkValue(Value $value) - { - return $value->getValue(); - } - - /** - * {@inheritDoc} - */ - public function walkCompositeExpression(CompositeExpression $expr) - { - $expressionList = array(); - - foreach ($expr->getExpressionList() as $child) { - $expressionList[] = $this->dispatch($child); - } - - switch($expr->getType()) { - case CompositeExpression::TYPE_AND: - return $this->andExpressions($expressionList); - - case CompositeExpression::TYPE_OR: - return $this->orExpressions($expressionList); - - default: - throw new \RuntimeException("Unknown composite " . $expr->getType()); - } - } - - private function andExpressions($expressions) - { - return function ($object) use ($expressions) { - foreach ($expressions as $expression) { - if ( ! $expression($object)) { - return false; - } - } - return true; - }; - } - - private function orExpressions($expressions) - { - return function ($object) use ($expressions) { - foreach ($expressions as $expression) { - if ($expression($object)) { - return true; - } - } - return false; - }; - } -} - diff --git a/framework/library/Doctrine/Common/Collections/Expr/Comparison.php b/framework/library/Doctrine/Common/Collections/Expr/Comparison.php deleted file mode 100644 index 29cfcff..0000000 --- a/framework/library/Doctrine/Common/Collections/Expr/Comparison.php +++ /dev/null @@ -1,75 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections\Expr; - -/** - * Comparison of a field with a value by the given operator. - * - * @author Benjamin Eberlei - * @since 2.3 - */ -class Comparison implements Expression -{ - const EQ = '='; - const NEQ = '<>'; - const LT = '<'; - const LTE = '<='; - const GT = '>'; - const GTE = '>='; - const IS = 'IS'; - const IN = 'IN'; - const NIN = 'NIN'; - - private $field; - private $op; - private $value; - - public function __construct($field, $operator, $value) - { - if ( ! ($value instanceof Value)) { - $value = new Value($value); - } - - $this->field = $field; - $this->op = $operator; - $this->value = $value; - } - - public function getField() - { - return $this->field; - } - - public function getValue() - { - return $this->value; - } - - public function getOperator() - { - return $this->op; - } - - public function visit(ExpressionVisitor $visitor) - { - return $visitor->walkComparison($this); - } -} - diff --git a/framework/library/Doctrine/Common/Collections/Expr/CompositeExpression.php b/framework/library/Doctrine/Common/Collections/Expr/CompositeExpression.php deleted file mode 100644 index fe917cf..0000000 --- a/framework/library/Doctrine/Common/Collections/Expr/CompositeExpression.php +++ /dev/null @@ -1,72 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections\Expr; - -/** - * Expression of Expressions combined by AND or OR operation. - * - * @author Benjamin Eberlei - * @since 2.3 - */ -class CompositeExpression implements Expression -{ - const TYPE_AND = 'AND'; - const TYPE_OR = 'OR'; - - private $type; - private $expressions = array(); - - public function __construct($type, array $expressions) - { - $this->type = $type; - - foreach ($expressions as $expr) { - if ($expr instanceof Value) { - throw new \RuntimeException("Values are not supported expressions as children of and/or expressions."); - } - if ( ! ($expr instanceof Expression)) { - throw new \RuntimeException("No expression given to CompositeExpression."); - } - - $this->expressions[] = $expr; - } - } - - /** - * Return the list of expressions nested in this composite. - * - * @return Expression[] - */ - public function getExpressionList() - { - return $this->expressions; - } - - public function getType() - { - return $this->type; - } - - public function visit(ExpressionVisitor $visitor) - { - return $visitor->walkCompositeExpression($this); - } -} - diff --git a/framework/library/Doctrine/Common/Collections/Expr/Expression.php b/framework/library/Doctrine/Common/Collections/Expr/Expression.php deleted file mode 100644 index b0762ad..0000000 --- a/framework/library/Doctrine/Common/Collections/Expr/Expression.php +++ /dev/null @@ -1,31 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections\Expr; - -/** - * Expression for the {@link Selectable} interface. - * - * @author Benjamin Eberlei - */ -interface Expression -{ - public function visit(ExpressionVisitor $visitor); -} - diff --git a/framework/library/Doctrine/Common/Collections/Expr/ExpressionVisitor.php b/framework/library/Doctrine/Common/Collections/Expr/ExpressionVisitor.php deleted file mode 100644 index 5e69b98..0000000 --- a/framework/library/Doctrine/Common/Collections/Expr/ExpressionVisitor.php +++ /dev/null @@ -1,81 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections\Expr; - -/** - * An Expression visitor walks a graph of expressions and turns them into a - * query for the underlying implementation. - * - * @author Benjamin Eberlei - */ -abstract class ExpressionVisitor -{ - /** - * Convert a comparison expression into the target query language output - * - * @param Comparison $comparison - * - * @return mixed - */ - abstract public function walkComparison(Comparison $comparison); - - /** - * Convert a value expression into the target query language part. - * - * @param Value $value - * - * @return mixed - */ - abstract public function walkValue(Value $value); - - /** - * Convert a composite expression into the target query language output - * - * @param CompositeExpression $expr - * - * @return mixed - */ - abstract public function walkCompositeExpression(CompositeExpression $expr); - - /** - * Dispatch walking an expression to the appropriate handler. - * - * @param Expression - * - * @return mixed - */ - public function dispatch(Expression $expr) - { - switch (true) { - case ($expr instanceof Comparison): - return $this->walkComparison($expr); - - case ($expr instanceof Value): - return $this->walkValue($expr); - - case ($expr instanceof CompositeExpression): - return $this->walkCompositeExpression($expr); - - default: - throw new \RuntimeException("Unknown Expression " . get_class($expr)); - } - } -} - diff --git a/framework/library/Doctrine/Common/Collections/Expr/Value.php b/framework/library/Doctrine/Common/Collections/Expr/Value.php deleted file mode 100644 index f0df11a..0000000 --- a/framework/library/Doctrine/Common/Collections/Expr/Value.php +++ /dev/null @@ -1,41 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections\Expr; - -class Value implements Expression -{ - private $value; - - public function __construct($value) - { - $this->value = $value; - } - - public function getValue() - { - return $this->value; - } - - public function visit(ExpressionVisitor $visitor) - { - return $visitor->walkValue($this); - } -} - diff --git a/framework/library/Doctrine/Common/Collections/ExpressionBuilder.php b/framework/library/Doctrine/Common/Collections/ExpressionBuilder.php deleted file mode 100644 index b53f0cd..0000000 --- a/framework/library/Doctrine/Common/Collections/ExpressionBuilder.php +++ /dev/null @@ -1,149 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections; - -use Doctrine\Common\Collections\Expr\Comparison; -use Doctrine\Common\Collections\Expr\CompositeExpression; -use Doctrine\Common\Collections\Expr\Value; - -/** - * Builder for Expressions in the {@link Selectable} interface. - * - * @author Benjamin Eberlei - * @since 2.3 - */ -class ExpressionBuilder -{ - /** - * @return CompositeExpression - */ - public function andX($x = null) - { - return new CompositeExpression(CompositeExpression::TYPE_AND, func_get_args()); - } - - /** - * @return CompositeExpression - */ - public function orX($x = null) - { - return new CompositeExpression(CompositeExpression::TYPE_OR, func_get_args()); - } - - /** - * @param string $field - * @param mixed $value - * - * @return Comparison - */ - public function eq($field, $value) - { - return new Comparison($field, Comparison::EQ, new Value($value)); - } - - /** - * @param string $field - * @param mixed $value - * - * @return Comparison - */ - public function gt($field, $value) - { - return new Comparison($field, Comparison::GT, new Value($value)); - } - - /** - * @param string $field - * @param mixed $value - * - * @return Comparison - */ - public function lt($field, $value) - { - return new Comparison($field, Comparison::LT, new Value($value)); - } - - /** - * @param string $field - * @param mixed $value - * - * @return Comparison - */ - public function gte($field, $value) - { - return new Comparison($field, Comparison::GTE, new Value($value)); - } - - /** - * @param string $field - * @param mixed $value - * - * @return Comparison - */ - public function lte($field, $value) - { - return new Comparison($field, Comparison::LTE, new Value($value)); - } - - /** - * @param string $field - * @param mixed $value - * - * @return Comparison - */ - public function neq($field, $value) - { - return new Comparison($field, Comparison::NEQ, new Value($value)); - } - - /** - * @param string $field - * @param mixed $value - * - * @return Comparison - */ - public function isNull($field) - { - return new Comparison($field, Comparison::IS, new Value(null)); - } - - /** - * @param string $field - * @param mixed $value - * - * @return Comparison - */ - public function in($field, array $values) - { - return new Comparison($field, Comparison::IN, new Value($values)); - } - - /** - * @param string $field - * @param mixed $value - * - * @return Comparison - */ - public function notIn($field, array $values) - { - return new Comparison($field, Comparison::NIN, new Value($values)); - } -} - diff --git a/framework/library/Doctrine/Common/Collections/Selectable.php b/framework/library/Doctrine/Common/Collections/Selectable.php deleted file mode 100644 index 675d6ea..0000000 --- a/framework/library/Doctrine/Common/Collections/Selectable.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ - -namespace Doctrine\Common\Collections; - -/** - * Interface for collections that allow efficient filtering with an expression API. - * - * Goal of this interface is a backend independent method to fetch elements - * from a collections. {@link Expression} is crafted in a way that you can - * implement queries from both in-memory and database-backed collections. - * - * For database backed collections this allows very efficient access by - * utilizing the query APIs, for example SQL in the ORM. Applications using - * this API can implement efficient database access without having to ask the - * EntityManager or Repositories. - * - * @author Benjamin Eberlei - * @since 2.3 - */ -interface Selectable -{ - /** - * Select all elements from a selectable that match the expression and - * return a new collection containing these elements. - * - * @param Criteria $criteria - * @return Collection - */ - function matching(Criteria $criteria); -} - diff --git a/framework/library/Doctrine/Common/CommonException.php b/framework/library/Doctrine/Common/CommonException.php deleted file mode 100644 index 6db7675..0000000 --- a/framework/library/Doctrine/Common/CommonException.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\Common; - -/** - * Base exception class for package Doctrine\Common - * @author heinrich - * - */ -class CommonException extends \Exception { -} diff --git a/framework/library/Doctrine/Common/Comparable.php b/framework/library/Doctrine/Common/Comparable.php deleted file mode 100644 index 20d065e..0000000 --- a/framework/library/Doctrine/Common/Comparable.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - - -namespace Doctrine\Common; - -/** - * Comparable interface that allows to compare two value objects to each other for similarity. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - */ -interface Comparable -{ - /** - * Compare the current object to the passed $other. - * - * Returns 0 if they are semantically equal, 1 if the other object - * is less than the current one, or -1 if its more than the current one. - * - * This method should not check for identity using ===, only for semantical equality for example - * when two different DateTime instances point to the exact same Date + TZ. - * - * @param mixed $other - * - * @return int - */ - public function compareTo($other); -} - diff --git a/framework/library/Doctrine/Common/EventArgs.php b/framework/library/Doctrine/Common/EventArgs.php deleted file mode 100644 index a87eee8..0000000 --- a/framework/library/Doctrine/Common/EventArgs.php +++ /dev/null @@ -1,67 +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 - */ - 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 - * @return EventArgs - */ - public static function getEmptyInstance() - { - if ( ! self::$_emptyEventArgsInstance) { - self::$_emptyEventArgsInstance = new EventArgs; - } - - return self::$_emptyEventArgsInstance; - } -} diff --git a/framework/library/Doctrine/Common/EventManager.php b/framework/library/Doctrine/Common/EventManager.php deleted file mode 100644 index 25aac44..0000000 --- a/framework/library/Doctrine/Common/EventManager.php +++ /dev/null @@ -1,147 +0,0 @@ -. - */ - -namespace Doctrine\Common; - -/** - * 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); - } - - /** - * Removes an EventSubscriber. The subscriber is asked for all the events it is - * interested in and removed as a listener for these events. - * - * @param \Doctrine\Common\EventSubscriber $subscriber The subscriber. - */ - public function removeEventSubscriber(EventSubscriber $subscriber) - { - $this->removeEventListener($subscriber->getSubscribedEvents(), $subscriber); - } -} diff --git a/framework/library/Doctrine/Common/EventSubscriber.php b/framework/library/Doctrine/Common/EventSubscriber.php deleted file mode 100644 index 1458791..0000000 --- a/framework/library/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 - */ - function getSubscribedEvents(); -} diff --git a/framework/library/Doctrine/Common/Lexer.php b/framework/library/Doctrine/Common/Lexer.php deleted file mode 100644 index 8e2554c..0000000 --- a/framework/library/Doctrine/Common/Lexer.php +++ /dev/null @@ -1,266 +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 null !== $this->lookahead && $this->lookahead['type'] === $token; - } - - /** - * Checks whether any of the given tokens matches the current lookahead - * - * @param array $tokens - * @return boolean - */ - public function isNextTokenAny(array $tokens) - { - return null !== $this->lookahead && in_array($this->lookahead['type'], $tokens, true); - } - - /** - * 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 string $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); -} diff --git a/framework/library/Doctrine/Common/NotifyPropertyChanged.php b/framework/library/Doctrine/Common/NotifyPropertyChanged.php deleted file mode 100644 index e32c0b9..0000000 --- a/framework/library/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/framework/library/Doctrine/Common/Persistence/AbstractManagerRegistry.php b/framework/library/Doctrine/Common/Persistence/AbstractManagerRegistry.php deleted file mode 100644 index 94fcd05..0000000 --- a/framework/library/Doctrine/Common/Persistence/AbstractManagerRegistry.php +++ /dev/null @@ -1,259 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence; - -use Doctrine\Common\Persistence\ManagerRegistry; - -/** - * Abstract implementation of the ManagerRegistry contract. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.2 - * @author Fabien Potencier - * @author Benjamin Eberlei - * @author Lukas Kahwe Smith - */ -abstract class AbstractManagerRegistry implements ManagerRegistry -{ - /** - * @var string - */ - private $name; - - /** - * @var array - */ - private $connections; - - /** - * @var array - */ - private $managers; - - /** - * @var string - */ - private $defaultConnection; - - /** - * @var string - */ - private $defaultManager; - - /** - * @var string - */ - private $proxyInterfaceName; - - /** - * Constructor - * - * @param string $name - * @param array $connections - * @param array $managers - * @param string $defaultConnection - * @param string $defaultManager - * @param string $proxyInterfaceName - */ - public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName) - { - $this->name = $name; - $this->connections = $connections; - $this->managers = $managers; - $this->defaultConnection = $defaultConnection; - $this->defaultManager = $defaultManager; - $this->proxyInterfaceName = $proxyInterfaceName; - } - - /** - * Fetches/creates the given services - * - * A service in this context is connection or a manager instance - * - * @param string $name name of the service - * @return object instance of the given service - */ - abstract protected function getService($name); - - /** - * Resets the given services - * - * A service in this context is connection or a manager instance - * - * @param string $name name of the service - * @return void - */ - abstract protected function resetService($name); - - /** - * Get the name of the registry - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * {@inheritdoc} - */ - public function getConnection($name = null) - { - if (null === $name) { - $name = $this->defaultConnection; - } - - if (!isset($this->connections[$name])) { - throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name)); - } - - return $this->getService($this->connections[$name]); - } - - /** - * {@inheritdoc} - */ - public function getConnectionNames() - { - return $this->connections; - } - - /** - * {@inheritdoc} - */ - public function getConnections() - { - $connections = array(); - foreach ($this->connections as $name => $id) { - $connections[$name] = $this->getService($id); - } - - return $connections; - } - - /** - * {@inheritdoc} - */ - public function getDefaultConnectionName() - { - return $this->defaultConnection; - } - - /** - * {@inheritdoc} - */ - public function getDefaultManagerName() - { - return $this->defaultManager; - } - - /** - * {@inheritdoc} - * - * @throws \InvalidArgumentException - */ - public function getManager($name = null) - { - if (null === $name) { - $name = $this->defaultManager; - } - - if (!isset($this->managers[$name])) { - throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); - } - - return $this->getService($this->managers[$name]); - } - - /** - * {@inheritdoc} - */ - public function getManagerForClass($class) - { - // Check for namespace alias - if (strpos($class, ':') !== false) { - list($namespaceAlias, $simpleClassName) = explode(':', $class); - $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; - } - - $proxyClass = new \ReflectionClass($class); - if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { - $class = $proxyClass->getParentClass()->getName(); - } - - foreach ($this->managers as $id) { - $manager = $this->getService($id); - - if (!$manager->getMetadataFactory()->isTransient($class)) { - return $manager; - } - } - } - - /** - * {@inheritdoc} - */ - public function getManagerNames() - { - return $this->managers; - } - - /** - * {@inheritdoc} - */ - public function getManagers() - { - $dms = array(); - foreach ($this->managers as $name => $id) { - $dms[$name] = $this->getService($id); - } - - return $dms; - } - - /** - * {@inheritdoc} - */ - public function getRepository($persistentObjectName, $persistentManagerName = null) - { - return $this->getManager($persistentManagerName)->getRepository($persistentObjectName); - } - - /** - * {@inheritdoc} - */ - public function resetManager($name = null) - { - if (null === $name) { - $name = $this->defaultManager; - } - - if (!isset($this->managers[$name])) { - throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); - } - - // force the creation of a new document manager - // if the current one is closed - $this->resetService($this->managers[$name]); - } -} diff --git a/framework/library/Doctrine/Common/Persistence/ConnectionRegistry.php b/framework/library/Doctrine/Common/Persistence/ConnectionRegistry.php deleted file mode 100644 index 7d6f0cf..0000000 --- a/framework/library/Doctrine/Common/Persistence/ConnectionRegistry.php +++ /dev/null @@ -1,63 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence; - -/** - * Contract covering connection for a Doctrine persistence layer ManagerRegistry class to implement. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.2 - * @author Fabien Potencier - * @author Benjamin Eberlei - * @author Lukas Kahwe Smith - */ -interface ConnectionRegistry -{ - /** - * Gets the default connection name. - * - * @return string The default connection name - */ - function getDefaultConnectionName(); - - /** - * Gets the named connection. - * - * @param string $name The connection name (null for the default one) - * - * @return object - */ - function getConnection($name = null); - - /** - * Gets an array of all registered connections - * - * @return array An array of Connection instances - */ - function getConnections(); - - /** - * Gets all connection names. - * - * @return array An array of connection names - */ - function getConnectionNames(); -} diff --git a/framework/library/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php b/framework/library/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php deleted file mode 100644 index 2fb7c47..0000000 --- a/framework/library/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php +++ /dev/null @@ -1,77 +0,0 @@ -. -*/ - -namespace Doctrine\Common\Persistence\Event; - -use Doctrine\Common\EventArgs; -use Doctrine\Common\Persistence\ObjectManager; - -/** - * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions - * of entities. - * - * @link www.doctrine-project.org - * @since 2.2 - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class LifecycleEventArgs extends EventArgs -{ - /** - * @var ObjectManager - */ - private $objectManager; - - /** - * @var object - */ - private $entity; - - /** - * Constructor - * - * @param object $entity - * @param ObjectManager $objectManager - */ - public function __construct($entity, ObjectManager $objectManager) - { - $this->entity = $entity; - $this->objectManager = $objectManager; - } - - /** - * Retrieve associated Entity. - * - * @return object - */ - public function getEntity() - { - return $this->entity; - } - - /** - * Retrieve associated ObjectManager. - * - * @return ObjectManager - */ - public function getObjectManager() - { - return $this->objectManager; - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php b/framework/library/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php deleted file mode 100644 index c014d73..0000000 --- a/framework/library/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php +++ /dev/null @@ -1,76 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Event; - -use Doctrine\Common\EventArgs; -use Doctrine\Common\Persistence\ObjectManager; -use Doctrine\Common\Persistence\Mapping\ClassMetadata; - -/** - * Class that holds event arguments for a loadMetadata event. - * - * @author Jonathan H. Wage - * @since 2.2 - */ -class LoadClassMetadataEventArgs extends EventArgs -{ - /** - * @var ClassMetadata - */ - private $classMetadata; - - /** - * @var ObjectManager - */ - private $objectManager; - - /** - * Constructor. - * - * @param ClassMetadata $classMetadata - * @param ObjectManager $objectManager - */ - public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager) - { - $this->classMetadata = $classMetadata; - $this->objectManager = $objectManager; - } - - /** - * Retrieve associated ClassMetadata. - * - * @return ClassMetadata - */ - public function getClassMetadata() - { - return $this->classMetadata; - } - - /** - * Retrieve associated ObjectManager. - * - * @return ObjectManager - */ - public function getObjectManager() - { - return $this->objectManager; - } -} - diff --git a/framework/library/Doctrine/Common/Persistence/Event/ManagerEventArgs.php b/framework/library/Doctrine/Common/Persistence/Event/ManagerEventArgs.php deleted file mode 100644 index f139365..0000000 --- a/framework/library/Doctrine/Common/Persistence/Event/ManagerEventArgs.php +++ /dev/null @@ -1,59 +0,0 @@ -. -*/ - -namespace Doctrine\Common\Persistence\Event; - -use Doctrine\Common\Persistence\ObjectManager; - -/** - * Provides event arguments for the preFlush event. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.2 - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class ManagerEventArgs extends \Doctrine\Common\EventArgs -{ - /** - * @var ObjectManager - */ - private $objectManager; - - /** - * Constructor. - * - * @param ObjectManager $objectManager - */ - public function __construct(ObjectManager $objectManager) - { - $this->objectManager = $objectManager; - } - - /** - * Retrieve associated ObjectManager. - * - * @return ObjectManager - */ - public function getObjectManager() - { - return $this->objectManager; - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Event/OnClearEventArgs.php b/framework/library/Doctrine/Common/Persistence/Event/OnClearEventArgs.php deleted file mode 100644 index 18b6554..0000000 --- a/framework/library/Doctrine/Common/Persistence/Event/OnClearEventArgs.php +++ /dev/null @@ -1,84 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Event; - -/** - * Provides event arguments for the onClear event. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.2 - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class OnClearEventArgs extends \Doctrine\Common\EventArgs -{ - /** - * @var \Doctrine\Common\Persistence\ObjectManager - */ - private $objectManager; - - /** - * @var string - */ - private $entityClass; - - /** - * Constructor. - * - * @param \Doctrine\Common\Persistence\ObjectManager $objectManager - * @param string $entityClass Optional entity class - */ - public function __construct($objectManager, $entityClass = null) - { - $this->objectManager = $objectManager; - $this->entityClass = $entityClass; - } - - /** - * Retrieve associated ObjectManager. - * - * @return \Doctrine\Common\Persistence\ObjectManager - */ - public function getObjectManager() - { - return $this->objectManager; - } - - /** - * Name of the entity class that is cleared, or empty if all are cleared. - * - * @return string - */ - public function getEntityClass() - { - return $this->entityClass; - } - - /** - * Check if event clears all entities. - * - * @return bool - */ - public function clearsAllEntities() - { - return ($this->entityClass === null); - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php b/framework/library/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php deleted file mode 100644 index 86ac819..0000000 --- a/framework/library/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php +++ /dev/null @@ -1,133 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Event; - -use Doctrine\Common\EventArgs, - Doctrine\Common\Persistence\ObjectManager; - -/** - * Class that holds event arguments for a preUpdate event. - * - * @author Guilherme Blanco - * @author Roman Borschel - * @author Benjamin Eberlei - * @since 2.2 - */ -class PreUpdateEventArgs extends LifecycleEventArgs -{ - /** - * @var array - */ - private $entityChangeSet; - - /** - * Constructor. - * - * @param object $entity - * @param ObjectManager $objectManager - * @param array $changeSet - */ - public function __construct($entity, ObjectManager $objectManager, array &$changeSet) - { - parent::__construct($entity, $objectManager); - - $this->entityChangeSet = &$changeSet; - } - - /** - * Retrieve entity changeset. - * - * @return array - */ - public function getEntityChangeSet() - { - return $this->entityChangeSet; - } - - /** - * Check if field has a changeset. - * - * @param string $field - * - * @return boolean - */ - public function hasChangedField($field) - { - return isset($this->entityChangeSet[$field]); - } - - /** - * Get the old value of the changeset of the changed field. - * - * @param string $field - * @return mixed - */ - public function getOldValue($field) - { - $this->assertValidField($field); - - return $this->entityChangeSet[$field][0]; - } - - /** - * Get the new value of the changeset of the changed field. - * - * @param string $field - * @return mixed - */ - public function getNewValue($field) - { - $this->assertValidField($field); - - return $this->entityChangeSet[$field][1]; - } - - /** - * Set the new value of this field. - * - * @param string $field - * @param mixed $value - */ - public function setNewValue($field, $value) - { - $this->assertValidField($field); - - $this->entityChangeSet[$field][1] = $value; - } - - /** - * Assert the field exists in changeset. - * - * @param string $field - * - * @throws \InvalidArgumentException - */ - private function assertValidField($field) - { - if ( ! isset($this->entityChangeSet[$field])) { - throw new \InvalidArgumentException(sprintf( - 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.', - $field, - get_class($this->getEntity()) - )); - } - } -} - diff --git a/framework/library/Doctrine/Common/Persistence/ManagerRegistry.php b/framework/library/Doctrine/Common/Persistence/ManagerRegistry.php deleted file mode 100644 index bdb23bd..0000000 --- a/framework/library/Doctrine/Common/Persistence/ManagerRegistry.php +++ /dev/null @@ -1,112 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence; - -/** - * Contract covering object managers for a Doctrine persistence layer ManagerRegistry class to implement. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.2 - * @author Fabien Potencier - * @author Benjamin Eberlei - * @author Lukas Kahwe Smith - */ -interface ManagerRegistry extends ConnectionRegistry -{ - /** - * Gets the default object manager name. - * - * @return string The default object manager name - */ - function getDefaultManagerName(); - - /** - * Gets a named object manager. - * - * @param string $name The object manager name (null for the default one) - * - * @return \Doctrine\Common\Persistence\ObjectManager - */ - function getManager($name = null); - - /** - * Gets an array of all registered object managers - * - * @return \Doctrine\Common\Persistence\ObjectManager[] An array of ObjectManager instances - */ - function getManagers(); - - /** - * Resets a named object manager. - * - * This method is useful when an object manager has been closed - * because of a rollbacked transaction AND when you think that - * it makes sense to get a new one to replace the closed one. - * - * Be warned that you will get a brand new object manager as - * the existing one is not useable anymore. This means that any - * other object with a dependency on this object manager will - * hold an obsolete reference. You can inject the registry instead - * to avoid this problem. - * - * @param string $name The object manager name (null for the default one) - * - * @return \Doctrine\Common\Persistence\ObjectManager - */ - function resetManager($name = null); - - /** - * Resolves a registered namespace alias to the full namespace. - * - * This method looks for the alias in all registered object managers. - * - * @param string $alias The alias - * - * @return string The full namespace - */ - function getAliasNamespace($alias); - - /** - * Gets all connection names. - * - * @return array An array of connection names - */ - function getManagerNames(); - - /** - * Gets the ObjectRepository for an persistent object. - * - * @param string $persistentObject The name of the persistent object. - * @param string $persistentManagerName The object manager name (null for the default one) - * - * @return \Doctrine\Common\Persistence\ObjectRepository - */ - function getRepository($persistentObject, $persistentManagerName = null); - - /** - * Gets the object manager associated with a given class. - * - * @param string $class A persistent object class name - * - * @return \Doctrine\Common\Persistence\ObjectManager|null - */ - function getManagerForClass($class); -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php b/framework/library/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php deleted file mode 100644 index 1ace1cc..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php +++ /dev/null @@ -1,383 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping; - -use Doctrine\Common\Cache\Cache, - Doctrine\Common\Util\ClassUtils; - -/** - * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the - * metadata mapping informations of a class which describes how a class should be mapped - * to a relational database. - * - * This class was abstracted from the ORM ClassMetadataFactory - * - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -abstract class AbstractClassMetadataFactory implements ClassMetadataFactory -{ - /** - * Salt used by specific Object Manager implementation. - * - * @var string - */ - protected $cacheSalt = "\$CLASSMETADATA"; - - /** - * @var \Doctrine\Common\Cache\Cache - */ - private $cacheDriver; - - /** - * @var array - */ - private $loadedMetadata = array(); - - /** - * @var bool - */ - protected $initialized = false; - - /** - * @var ReflectionService - */ - private $reflectionService; - - /** - * Sets the cache driver used by the factory to cache ClassMetadata instances. - * - * @param Doctrine\Common\Cache\Cache $cacheDriver - */ - public function setCacheDriver(Cache $cacheDriver = null) - { - $this->cacheDriver = $cacheDriver; - } - - /** - * Gets the cache driver used by the factory to cache ClassMetadata instances. - * - * @return Doctrine\Common\Cache\Cache - */ - public function getCacheDriver() - { - return $this->cacheDriver; - } - - /** - * Return an array of all the loaded metadata currently in memory. - * - * @return array - */ - public function getLoadedMetadata() - { - return $this->loadedMetadata; - } - - /** - * Forces the factory to load the metadata of all classes known to the underlying - * mapping driver. - * - * @return array The ClassMetadata instances of all mapped classes. - */ - public function getAllMetadata() - { - if ( ! $this->initialized) { - $this->initialize(); - } - - $driver = $this->getDriver(); - $metadata = array(); - foreach ($driver->getAllClassNames() as $className) { - $metadata[] = $this->getMetadataFor($className); - } - - return $metadata; - } - - /** - * Lazy initialization of this stuff, especially the metadata driver, - * since these are not needed at all when a metadata cache is active. - * - * @return void - */ - abstract protected function initialize(); - - /** - * Get the fully qualified class-name from the namespace alias. - * - * @param string $namespaceAlias - * @param string $simpleClassName - * @return string - */ - abstract protected function getFqcnFromAlias($namespaceAlias, $simpleClassName); - - /** - * Return the mapping driver implementation. - * - * @return \Doctrine\Common\Persistence\Mapping\Driver\MappingDriver - */ - abstract protected function getDriver(); - - /** - * Wakeup reflection after ClassMetadata gets unserialized from cache. - * - * @param ClassMetadata $class - * @param ReflectionService $reflService - * @return void - */ - abstract protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService); - - /** - * Initialize Reflection after ClassMetadata was constructed. - * - * @param ClassMetadata $class - * @param ReflectionService $reflService - * @return void - */ - abstract protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService); - - /** - * Checks whether the class metadata is an entity. - * - * This method should false for mapped superclasses or - * embedded classes. - * - * @param ClassMetadata $class - * @return boolean - */ - abstract protected function isEntity(ClassMetadata $class); - - /** - * Gets the class metadata descriptor for a class. - * - * @param string $className The name of the class. - * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata - */ - public function getMetadataFor($className) - { - if (isset($this->loadedMetadata[$className])) { - return $this->loadedMetadata[$className]; - } - - $realClassName = $className; - - // Check for namespace alias - if (strpos($className, ':') !== false) { - list($namespaceAlias, $simpleClassName) = explode(':', $className); - $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); - } else { - $realClassName = ClassUtils::getRealClass($realClassName); - } - - if (isset($this->loadedMetadata[$realClassName])) { - // We do not have the alias name in the map, include it - $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; - - return $this->loadedMetadata[$realClassName]; - } - - if ($this->cacheDriver) { - if (($cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt)) !== false) { - $this->loadedMetadata[$realClassName] = $cached; - $this->wakeupReflection($cached, $this->getReflectionService()); - } else { - foreach ($this->loadMetadata($realClassName) as $loadedClassName) { - $this->cacheDriver->save( - $loadedClassName . $this->cacheSalt, $this->loadedMetadata[$loadedClassName], null - ); - } - } - } else { - $this->loadMetadata($realClassName); - } - - if ($className != $realClassName) { - // We do not have the alias name in the map, include it - $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; - } - - return $this->loadedMetadata[$className]; - } - - /** - * Checks whether the factory has the metadata for a class loaded already. - * - * @param string $className - * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. - */ - public function hasMetadataFor($className) - { - return isset($this->loadedMetadata[$className]); - } - - /** - * Sets the metadata descriptor for a specific class. - * - * NOTE: This is only useful in very special cases, like when generating proxy classes. - * - * @param string $className - * @param ClassMetadata $class - */ - public function setMetadataFor($className, $class) - { - $this->loadedMetadata[$className] = $class; - } - - /** - * Get array of parent classes for the given entity class - * - * @param string $name - * @return array $parentClasses - */ - protected function getParentClasses($name) - { - // Collect parent classes, ignoring transient (not-mapped) classes. - $parentClasses = array(); - foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) { - if ( ! $this->getDriver()->isTransient($parentClass)) { - $parentClasses[] = $parentClass; - } - } - return $parentClasses; - } - - /** - * Loads the metadata of the class in question and all it's ancestors whose metadata - * is still not loaded. - * - * @param string $name The name of the class for which the metadata should get loaded. - * - * @return array - */ - protected function loadMetadata($name) - { - if ( ! $this->initialized) { - $this->initialize(); - } - - $loaded = array(); - - $parentClasses = $this->getParentClasses($name); - $parentClasses[] = $name; - - // Move down the hierarchy of parent classes, starting from the topmost class - $parent = null; - $rootEntityFound = false; - $visited = array(); - $reflService = $this->getReflectionService(); - foreach ($parentClasses as $className) { - if (isset($this->loadedMetadata[$className])) { - $parent = $this->loadedMetadata[$className]; - if ($this->isEntity($parent)) { - $rootEntityFound = true; - array_unshift($visited, $className); - } - continue; - } - - $class = $this->newClassMetadataInstance($className); - $this->initializeReflection($class, $reflService); - - $this->doLoadMetadata($class, $parent, $rootEntityFound, $visited); - - $this->loadedMetadata[$className] = $class; - - $parent = $class; - - if ($this->isEntity($class)) { - $rootEntityFound = true; - array_unshift($visited, $className); - } - - $this->wakeupReflection($class, $reflService); - - $loaded[] = $className; - } - - return $loaded; - } - - /** - * Actually load the metadata from the underlying metadata - * - * @param ClassMetadata $class - * @param ClassMetadata|null $parent - * @param bool $rootEntityFound - * @param array $nonSuperclassParents classnames all parent classes that are not marked as mapped superclasses - * @return void - */ - abstract protected function doLoadMetadata($class, $parent, $rootEntityFound, array $nonSuperclassParents); - - /** - * Creates a new ClassMetadata instance for the given class name. - * - * @param string $className - * @return ClassMetadata - */ - abstract protected function newClassMetadataInstance($className); - - /** - * Check if this class is mapped by this Object Manager + ClassMetadata configuration - * - * @param $class - * @return bool - */ - public function isTransient($class) - { - if ( ! $this->initialized) { - $this->initialize(); - } - - // Check for namespace alias - if (strpos($class, ':') !== false) { - list($namespaceAlias, $simpleClassName) = explode(':', $class); - $class = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); - } - - return $this->getDriver()->isTransient($class); - } - - /** - * Set reflectionService. - * - * @param ReflectionService $reflectionService - */ - public function setReflectionService(ReflectionService $reflectionService) - { - $this->reflectionService = $reflectionService; - } - - /** - * Get the reflection service associated with this metadata factory. - * - * @return ReflectionService - */ - public function getReflectionService() - { - if ($this->reflectionService === null) { - $this->reflectionService = new RuntimeReflectionService(); - } - return $this->reflectionService; - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/ClassMetadata.php b/framework/library/Doctrine/Common/Persistence/Mapping/ClassMetadata.php deleted file mode 100644 index 4836bf8..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/ClassMetadata.php +++ /dev/null @@ -1,165 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping; - -/** - * Contract for a Doctrine persistence layer ClassMetadata class to implement. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.1 - * @author Benjamin Eberlei - * @author Jonathan Wage - */ -interface ClassMetadata -{ - /** - * Get fully-qualified class name of this persistent class. - * - * @return string - */ - function getName(); - - /** - * Gets the mapped identifier field name. - * - * The returned structure is an array of the identifier field names. - * - * @return array - */ - function getIdentifier(); - - /** - * Gets the ReflectionClass instance for this mapped class. - * - * @return \ReflectionClass - */ - function getReflectionClass(); - - /** - * Checks if the given field name is a mapped identifier for this class. - * - * @param string $fieldName - * @return boolean - */ - function isIdentifier($fieldName); - - /** - * Checks if the given field is a mapped property for this class. - * - * @param string $fieldName - * @return boolean - */ - function hasField($fieldName); - - /** - * Checks if the given field is a mapped association for this class. - * - * @param string $fieldName - * @return boolean - */ - function hasAssociation($fieldName); - - /** - * Checks if the given field is a mapped single valued association for this class. - * - * @param string $fieldName - * @return boolean - */ - function isSingleValuedAssociation($fieldName); - - /** - * Checks if the given field is a mapped collection valued association for this class. - * - * @param string $fieldName - * @return boolean - */ - function isCollectionValuedAssociation($fieldName); - - /** - * A numerically indexed list of field names of this persistent class. - * - * This array includes identifier fields if present on this class. - * - * @return array - */ - function getFieldNames(); - - /** - * Returns an array of identifier field names numerically indexed. - * - * @return array - */ - function getIdentifierFieldNames(); - - /** - * A numerically indexed list of association names of this persistent class. - * - * This array includes identifier associations if present on this class. - * - * @return array - */ - function getAssociationNames(); - - /** - * Returns a type name of this field. - * - * This type names can be implementation specific but should at least include the php types: - * integer, string, boolean, float/double, datetime. - * - * @param string $fieldName - * @return string - */ - function getTypeOfField($fieldName); - - /** - * Returns the target class name of the given association. - * - * @param string $assocName - * @return string - */ - function getAssociationTargetClass($assocName); - - /** - * Checks if the association is the inverse side of a bidirectional association - * - * @param string $assocName - * @return boolean - */ - function isAssociationInverseSide($assocName); - - /** - * Returns the target field of the owning side of the association - * - * @param string $assocName - * @return string - */ - function getAssociationMappedByTargetField($assocName); - - /** - * Return the identifier of this object as an array with field name as key. - * - * Has to return an empty array if no identifier isset. - * - * @param object $object - * @return array - */ - function getIdentifierValues($object); -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php b/framework/library/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php deleted file mode 100644 index 3fa39bc..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php +++ /dev/null @@ -1,74 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping; - -/** - * Contract for a Doctrine persistence layer ClassMetadata class to implement. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.1 - * @author Benjamin Eberlei - * @author Jonathan Wage - */ -interface ClassMetadataFactory -{ - /** - * Forces the factory to load the metadata of all classes known to the underlying - * mapping driver. - * - * @return array The ClassMetadata instances of all mapped classes. - */ - function getAllMetadata(); - - /** - * Gets the class metadata descriptor for a class. - * - * @param string $className The name of the class. - * @return ClassMetadata - */ - function getMetadataFor($className); - - /** - * Checks whether the factory has the metadata for a class loaded already. - * - * @param string $className - * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. - */ - function hasMetadataFor($className); - - /** - * Sets the metadata descriptor for a specific class. - * - * @param string $className - * @param ClassMetadata $class - */ - function setMetadataFor($className, $class); - - /** - * Whether the class with the specified name should have its metadata loaded. - * This is only the case if it is either mapped directly or as a - * MappedSuperclass. - * - * @param string $className - * @return boolean - */ - function isTransient($className); -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php b/framework/library/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php deleted file mode 100644 index 1131add..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php +++ /dev/null @@ -1,214 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping\Driver; - -use Doctrine\Common\Cache\ArrayCache, - Doctrine\Common\Annotations\AnnotationReader, - Doctrine\Common\Annotations\AnnotationRegistry, - Doctrine\Common\Persistence\Mapping\MappingException; - -/** - * The AnnotationDriver reads the mapping metadata from docblock annotations. - * - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan H. Wage - * @author Roman Borschel - */ -abstract class AnnotationDriver implements MappingDriver -{ - /** - * The AnnotationReader. - * - * @var AnnotationReader - */ - protected $reader; - - /** - * The paths where to look for mapping files. - * - * @var array - */ - protected $paths = array(); - - /** - * The file extension of mapping documents. - * - * @var string - */ - protected $fileExtension = '.php'; - - /** - * Cache for AnnotationDriver#getAllClassNames() - * - * @var array - */ - protected $classNames; - - /** - * Name of the entity annotations as keys - * - * @var array - */ - protected $entityAnnotationClasses = array(); - - /** - * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading - * docblock annotations. - * - * @param AnnotationReader $reader The AnnotationReader to use, duck-typed. - * @param string|array $paths One or multiple paths where mapping classes can be found. - */ - public function __construct($reader, $paths = null) - { - $this->reader = $reader; - if ($paths) { - $this->addPaths((array) $paths); - } - } - - /** - * Append lookup paths to metadata driver. - * - * @param array $paths - */ - public function addPaths(array $paths) - { - $this->paths = array_unique(array_merge($this->paths, $paths)); - } - - /** - * Retrieve the defined metadata lookup paths. - * - * @return array - */ - public function getPaths() - { - return $this->paths; - } - - /** - * Retrieve the current annotation reader - * - * @return AnnotationReader - */ - public function getReader() - { - return $this->reader; - } - - /** - * Get the file extension used to look for mapping files under - * - * @return string - */ - public function getFileExtension() - { - return $this->fileExtension; - } - - /** - * Set the file extension used to look for mapping files under - * - * @param string $fileExtension The file extension to set - * @return void - */ - public function setFileExtension($fileExtension) - { - $this->fileExtension = $fileExtension; - } - - /** - * Whether the class with the specified name is transient. Only non-transient - * classes, that is entities and mapped superclasses, should have their metadata loaded. - * - * A class is non-transient if it is annotated with an annotation - * from the {@see AnnotationDriver::entityAnnotationClasses}. - * - * @param string $className - * @return boolean - */ - public function isTransient($className) - { - $classAnnotations = $this->reader->getClassAnnotations(new \ReflectionClass($className)); - - foreach ($classAnnotations as $annot) { - if (isset($this->entityAnnotationClasses[get_class($annot)])) { - return false; - } - } - return true; - } - - /** - * {@inheritDoc} - */ - public function getAllClassNames() - { - if ($this->classNames !== null) { - return $this->classNames; - } - - if (!$this->paths) { - throw MappingException::pathRequired(); - } - - $classes = array(); - $includedFiles = array(); - - foreach ($this->paths as $path) { - if ( ! is_dir($path)) { - throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); - } - - $iterator = new \RegexIterator( - new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), - \RecursiveIteratorIterator::LEAVES_ONLY - ), - '/^.+' . str_replace('.', '\.', $this->fileExtension) . '$/i', - \RecursiveRegexIterator::GET_MATCH - ); - - foreach ($iterator as $file) { - $sourceFile = realpath($file[0]); - - require_once $sourceFile; - - $includedFiles[] = $sourceFile; - } - } - - $declared = get_declared_classes(); - - foreach ($declared as $className) { - $rc = new \ReflectionClass($className); - $sourceFile = $rc->getFileName(); - if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) { - $classes[] = $className; - } - } - - $this->classNames = $classes; - - return $classes; - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php b/framework/library/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php deleted file mode 100644 index 0d61174..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php +++ /dev/null @@ -1,170 +0,0 @@ -. -*/ - -namespace Doctrine\Common\Persistence\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\MappingException; - -/** - * Locate the file that contains the metadata information for a given class name. - * - * This behavior is inpependent of the actual content of the file. It just detects - * the file which is responsible for the given class name. - * - * @author Benjamin Eberlei - * @author Johannes M. Schmitt - */ -class DefaultFileLocator implements FileLocator -{ - /** - * The paths where to look for mapping files. - * - * @var array - */ - protected $paths = array(); - - /** - * The file extension of mapping documents. - * - * @var string - */ - protected $fileExtension; - - /** - * Initializes a new FileDriver that looks in the given path(s) for mapping - * documents and operates in the specified operating mode. - * - * @param string|array $paths One or multiple paths where mapping documents can be found. - * @param string|null $fileExtension - */ - public function __construct($paths, $fileExtension = null) - { - $this->addPaths((array) $paths); - $this->fileExtension = $fileExtension; - } - - /** - * Append lookup paths to metadata driver. - * - * @param array $paths - */ - public function addPaths(array $paths) - { - $this->paths = array_unique(array_merge($this->paths, $paths)); - } - - /** - * Retrieve the defined metadata lookup paths. - * - * @return array - */ - public function getPaths() - { - return $this->paths; - } - - /** - * Get the file extension used to look for mapping files under - * - * @return string - */ - public function getFileExtension() - { - return $this->fileExtension; - } - - /** - * Set the file extension used to look for mapping files under - * - * @param string $fileExtension The file extension to set - * @return void - */ - public function setFileExtension($fileExtension) - { - $this->fileExtension = $fileExtension; - } - - /** - * {@inheritDoc} - */ - public function findMappingFile($className) - { - $fileName = str_replace('\\', '.', $className) . $this->fileExtension; - - // Check whether file exists - foreach ($this->paths as $path) { - if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { - return $path . DIRECTORY_SEPARATOR . $fileName; - } - } - - throw MappingException::mappingFileNotFound($className, $fileName); - } - - /** - * {@inheritDoc} - */ - public function getAllClassNames($globalBasename) - { - $classes = array(); - - if ($this->paths) { - foreach ($this->paths as $path) { - if ( ! is_dir($path)) { - throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); - } - - $iterator = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator($path), - \RecursiveIteratorIterator::LEAVES_ONLY - ); - - foreach ($iterator as $file) { - $fileName = $file->getBasename($this->fileExtension); - - if ($fileName == $file->getBasename() || $fileName == $globalBasename) { - continue; - } - - // NOTE: All files found here means classes are not transient! - $classes[] = str_replace('.', '\\', $fileName); - } - } - } - - return $classes; - } - - /** - * {@inheritDoc} - */ - public function fileExists($className) - { - $fileName = str_replace('\\', '.', $className) . $this->fileExtension; - - // Check whether file exists - foreach ((array) $this->paths as $path) { - if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { - return true; - } - } - - return false; - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php b/framework/library/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php deleted file mode 100644 index b0a7685..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php +++ /dev/null @@ -1,214 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\MappingException; - -/** - * Base driver for file-based metadata drivers. - * - * A file driver operates in a mode where it loads the mapping files of individual - * classes on demand. This requires the user to adhere to the convention of 1 mapping - * file per class and the file names of the mapping files must correspond to the full - * class name, including namespace, with the namespace delimiters '\', replaced by dots '.'. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan H. Wage - * @author Roman Borschel - */ -abstract class FileDriver implements MappingDriver -{ - /** - * @var FileLocator - */ - protected $locator; - - /** - * @var array - */ - protected $classCache; - - /** - * @var string - */ - protected $globalBasename; - - /** - * Initializes a new FileDriver that looks in the given path(s) for mapping - * documents and operates in the specified operating mode. - * - * @param string|array|FileLocator $locator A FileLocator or one/multiple paths where mapping documents can be found. - * @param string $fileExtension - */ - public function __construct($locator, $fileExtension = null) - { - if ($locator instanceof FileLocator) { - $this->locator = $locator; - } else { - $this->locator = new DefaultFileLocator((array)$locator, $fileExtension); - } - } - - /** - * Set global basename - * - * @param string $file - */ - public function setGlobalBasename($file) - { - $this->globalBasename = $file; - } - - /** - * Retrieve global basename - * - * @return string - */ - public function getGlobalBasename() - { - return $this->globalBasename; - } - - /** - * Get the element of schema meta data for the class from the mapping file. - * This will lazily load the mapping file if it is not loaded yet - * - * @param string $className - * - * @throws MappingException - * @return array The element of schema meta data - */ - public function getElement($className) - { - if ($this->classCache === null) { - $this->initialize(); - } - - if (isset($this->classCache[$className])) { - return $this->classCache[$className]; - } - - $result = $this->loadMappingFile($this->locator->findMappingFile($className)); - if (!isset($result[$className])) { - throw MappingException::invalidMappingFile($className, str_replace('\\', '.', $className) . $this->locator->getFileExtension()); - } - - return $result[$className]; - } - - /** - * Whether the class with the specified name should have its metadata loaded. - * This is only the case if it is either mapped as an Entity or a - * MappedSuperclass. - * - * @param string $className - * @return boolean - */ - public function isTransient($className) - { - if ($this->classCache === null) { - $this->initialize(); - } - - if (isset($this->classCache[$className])) { - return false; - } - - return !$this->locator->fileExists($className); - } - - /** - * Gets the names of all mapped classes known to this driver. - * - * @return array The names of all mapped classes known to this driver. - */ - public function getAllClassNames() - { - if ($this->classCache === null) { - $this->initialize(); - } - - $classNames = (array)$this->locator->getAllClassNames($this->globalBasename); - if ($this->classCache) { - $classNames = array_merge(array_keys($this->classCache), $classNames); - } - return $classNames; - } - - /** - * Loads a mapping file with the given name and returns a map - * from class/entity names to their corresponding file driver elements. - * - * @param string $file The mapping file to load. - * @return array - */ - abstract protected function loadMappingFile($file); - - /** - * Initialize the class cache from all the global files. - * - * Using this feature adds a substantial performance hit to file drivers as - * more metadata has to be loaded into memory than might actually be - * necessary. This may not be relevant to scenarios where caching of - * metadata is in place, however hits very hard in scenarios where no - * caching is used. - * - * @return void - */ - protected function initialize() - { - $this->classCache = array(); - if (null !== $this->globalBasename) { - foreach ($this->locator->getPaths() as $path) { - $file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension(); - if (is_file($file)) { - $this->classCache = array_merge( - $this->classCache, - $this->loadMappingFile($file) - ); - } - } - } - } - - /** - * Retrieve the locator used to discover mapping files by className - * - * @return FileLocator - */ - public function getLocator() - { - return $this->locator; - } - - /** - * Set the locator used to discover mapping files by className - * - * @param FileLocator $locator - */ - public function setLocator(FileLocator $locator) - { - $this->locator = $locator; - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php b/framework/library/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php deleted file mode 100644 index ec2b606..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php +++ /dev/null @@ -1,71 +0,0 @@ -. -*/ - -namespace Doctrine\Common\Persistence\Mapping\Driver; - -/** - * Locate the file that contains the metadata information for a given class name. - * - * This behavior is independent of the actual content of the file. It just detects - * the file which is responsible for the given class name. - * - * @author Benjamin Eberlei - * @author Johannes M. Schmitt - */ -interface FileLocator -{ - /** - * Locate mapping file for the given class name. - * - * @param string $className - * @return string - */ - function findMappingFile($className); - - /** - * Get all class names that are found with this file locator. - * - * @param string $globalBasename Passed to allow excluding the basename - * @return array - */ - function getAllClassNames($globalBasename); - - /** - * Check if a file can be found for this class name. - * - * @param string $className - * - * @return bool - */ - function fileExists($className); - - /** - * Get all the paths that this file locator looks for mapping files. - * - * @return array - */ - function getPaths(); - - /** - * Get the file extension that mapping files are suffixed with. - * - * @return string - */ - function getFileExtension(); -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php b/framework/library/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php deleted file mode 100644 index 955d831..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php +++ /dev/null @@ -1,56 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\ClassMetadata; - -/** - * Contract for metadata drivers. - * - * @since 2.2 - * @author Jonathan H. Wage - */ -interface MappingDriver -{ - /** - * Loads the metadata for the specified class into the provided container. - * - * @param string $className - * @param ClassMetadata $metadata - */ - function loadMetadataForClass($className, ClassMetadata $metadata); - - /** - * Gets the names of all mapped classes known to this driver. - * - * @return array The names of all mapped classes known to this driver. - */ - function getAllClassNames(); - - /** - * Whether the class with the specified name should have its metadata loaded. - * This is only the case if it is either mapped as an Entity or a - * MappedSuperclass. - * - * @param string $className - * @return boolean - */ - function isTransient($className); -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php b/framework/library/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php deleted file mode 100644 index 3b1049d..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php +++ /dev/null @@ -1,168 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, - Doctrine\Common\Persistence\Mapping\ClassMetadata, - Doctrine\Common\Persistence\Mapping\MappingException; - -/** - * The DriverChain allows you to add multiple other mapping drivers for - * certain namespaces - * - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan H. Wage - * @author Roman Borschel - */ -class MappingDriverChain implements MappingDriver -{ - /** - * The default driver - * - * @var MappingDriver - */ - private $defaultDriver; - - /** - * @var array - */ - private $drivers = array(); - - /** - * Get the default driver. - * - * @return MappingDriver|null - */ - public function getDefaultDriver() - { - return $this->defaultDriver; - } - - /** - * Set the default driver. - * - * @param MappingDriver $driver - */ - public function setDefaultDriver(MappingDriver $driver) - { - $this->defaultDriver = $driver; - } - - /** - * Add a nested driver. - * - * @param MappingDriver $nestedDriver - * @param string $namespace - */ - public function addDriver(MappingDriver $nestedDriver, $namespace) - { - $this->drivers[$namespace] = $nestedDriver; - } - - /** - * Get the array of nested drivers. - * - * @return array $drivers - */ - public function getDrivers() - { - return $this->drivers; - } - - /** - * Loads the metadata for the specified class into the provided container. - * - * @param string $className - * @param ClassMetadata $metadata - * - * @throws MappingException - */ - public function loadMetadataForClass($className, ClassMetadata $metadata) - { - /* @var $driver MappingDriver */ - foreach ($this->drivers as $namespace => $driver) { - if (strpos($className, $namespace) === 0) { - $driver->loadMetadataForClass($className, $metadata); - return; - } - } - - if (null !== $this->defaultDriver) { - $this->defaultDriver->loadMetadataForClass($className, $metadata); - return; - } - - throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); - } - - /** - * Gets the names of all mapped classes known to this driver. - * - * @return array The names of all mapped classes known to this driver. - */ - public function getAllClassNames() - { - $classNames = array(); - $driverClasses = array(); - - /* @var $driver MappingDriver */ - foreach ($this->drivers AS $namespace => $driver) { - $oid = spl_object_hash($driver); - - if (!isset($driverClasses[$oid])) { - $driverClasses[$oid] = $driver->getAllClassNames(); - } - - foreach ($driverClasses[$oid] AS $className) { - if (strpos($className, $namespace) === 0) { - $classNames[$className] = true; - } - } - } - - return array_keys($classNames); - } - - /** - * Whether the class with the specified name should have its metadata loaded. - * - * This is only the case for non-transient classes either mapped as an Entity or MappedSuperclass. - * - * @param string $className - * @return boolean - */ - public function isTransient($className) - { - /* @var $driver MappingDriver */ - foreach ($this->drivers AS $namespace => $driver) { - if (strpos($className, $namespace) === 0) { - return $driver->isTransient($className); - } - } - - if ($this->defaultDriver !== null) { - return $this->defaultDriver->isTransient($className); - } - - return true; - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php b/framework/library/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php deleted file mode 100644 index e0c8611..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php +++ /dev/null @@ -1,72 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\ClassMetadata; - -/** - * The PHPDriver includes php files which just populate ClassMetadataInfo - * instances with plain php code - * - * @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 H. Wage - * @author Roman Borschel - */ -class PHPDriver extends FileDriver -{ - /** - * {@inheritdoc} - */ - protected $metadata; - - /** - * {@inheritDoc} - */ - public function __construct($locator, $fileExtension = null) - { - $fileExtension = ".php"; - parent::__construct($locator, $fileExtension); - } - - /** - * {@inheritdoc} - */ - public function loadMetadataForClass($className, ClassMetadata $metadata) - { - $this->metadata = $metadata; - $this->loadMappingFile($this->locator->findMappingFile($className)); - } - - /** - * {@inheritdoc} - */ - protected function loadMappingFile($file) - { - $metadata = $this->metadata; - include $file; - - return array($metadata->getName() => $metadata); - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php b/framework/library/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php deleted file mode 100644 index e3cea73..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php +++ /dev/null @@ -1,141 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\ClassMetadata; -use Doctrine\Common\Persistence\Mapping\MappingException; - -/** - * The StaticPHPDriver calls a static loadMetadata() method on your entity - * classes where you can manually populate the ClassMetadata instance. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan H. Wage - * @author Roman Borschel - */ -class StaticPHPDriver implements MappingDriver -{ - /** - * Paths of entity directories. - * - * @var array - */ - private $paths = array(); - - /** - * Map of all class names. - * - * @var array - */ - private $classNames; - - /** - * Constructor - * - * @param array|string $paths - */ - public function __construct($paths) - { - $this->addPaths((array) $paths); - } - - /** - * Add paths - * - * @param array $paths - */ - public function addPaths(array $paths) - { - $this->paths = array_unique(array_merge($this->paths, $paths)); - } - - /** - * {@inheritdoc} - */ - public function loadMetadataForClass($className, ClassMetadata $metadata) - { - $className::loadMetadata($metadata); - } - - /** - * {@inheritDoc} - * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it? - */ - public function getAllClassNames() - { - if ($this->classNames !== null) { - return $this->classNames; - } - - if (!$this->paths) { - throw MappingException::pathRequired(); - } - - $classes = array(); - $includedFiles = array(); - - foreach ($this->paths as $path) { - if (!is_dir($path)) { - throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); - } - - $iterator = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator($path), - \RecursiveIteratorIterator::LEAVES_ONLY - ); - - foreach ($iterator as $file) { - if ($file->getBasename('.php') == $file->getBasename()) { - continue; - } - - $sourceFile = realpath($file->getPathName()); - require_once $sourceFile; - $includedFiles[] = $sourceFile; - } - } - - $declared = get_declared_classes(); - - foreach ($declared as $className) { - $rc = new \ReflectionClass($className); - $sourceFile = $rc->getFileName(); - if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { - $classes[] = $className; - } - } - - $this->classNames = $classes; - - return $classes; - } - - /** - * {@inheritdoc} - */ - public function isTransient($className) - { - return ! method_exists($className, 'loadMetadata'); - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php b/framework/library/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php deleted file mode 100644 index 9095187..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php +++ /dev/null @@ -1,214 +0,0 @@ -. -*/ - -namespace Doctrine\Common\Persistence\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\MappingException; - -/** - * The Symfony File Locator makes a simplifying assumptions compared - * to the DefaultFileLocator. By assuming paths only contain entities of a certain - * namespace the mapping files consists of the short classname only. - * - * @author Fabien Potencier - * @author Benjamin Eberlei - * @license MIT - */ -class SymfonyFileLocator implements FileLocator -{ - /** - * The paths where to look for mapping files. - * - * @var array - */ - protected $paths = array(); - - /** - * A map of mapping directory path to namespace prefix used to expand class shortnames. - * - * @var array - */ - protected $prefixes = array(); - - /** - * File extension that is searched for. - * - * @var string - */ - protected $fileExtension; - - /** - * Constructor - * - * @param array $prefixes - * @param string|null $fileExtension - */ - public function __construct(array $prefixes, $fileExtension = null) - { - $this->addNamespacePrefixes($prefixes); - $this->fileExtension = $fileExtension; - } - - /** - * Add Namespace Prefixes - * - * @param array $prefixes - */ - public function addNamespacePrefixes(array $prefixes) - { - $this->prefixes = array_merge($this->prefixes, $prefixes); - $this->paths = array_merge($this->paths, array_keys($prefixes)); - } - - /** - * Get Namespace Prefixes - * - * @return array - */ - public function getNamespacePrefixes() - { - return $this->prefixes; - } - - /** - * {@inheritDoc} - */ - public function getPaths() - { - return $this->paths; - } - - /** - * {@inheritDoc} - */ - public function getFileExtension() - { - return $this->fileExtension; - } - - /** - * Set the file extension used to look for mapping files under - * - * @param string $fileExtension The file extension to set - * @return void - */ - public function setFileExtension($fileExtension) - { - $this->fileExtension = $fileExtension; - } - - /** - * {@inheritDoc} - */ - public function fileExists($className) - { - $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; - foreach ($this->paths as $path) { - if (!isset($this->prefixes[$path])) { - // global namespace class - if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { - return true; - } - - continue; - } - - $prefix = $this->prefixes[$path]; - - if (0 !== strpos($className, $prefix.'\\')) { - continue; - } - - $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; - return is_file($filename); - } - - return false; - } - - /** - * {@inheritDoc} - */ - public function getAllClassNames($globalBasename = null) - { - $classes = array(); - - if ($this->paths) { - foreach ((array) $this->paths as $path) { - if (!is_dir($path)) { - throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); - } - - $iterator = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator($path), - \RecursiveIteratorIterator::LEAVES_ONLY - ); - - foreach ($iterator as $file) { - $fileName = $file->getBasename($this->fileExtension); - - if ($fileName == $file->getBasename() || $fileName == $globalBasename) { - continue; - } - - // NOTE: All files found here means classes are not transient! - if (isset($this->prefixes[$path])) { - $classes[] = $this->prefixes[$path].'\\'.str_replace('.', '\\', $fileName); - } else { - $classes[] = str_replace('.', '\\', $fileName); - } - } - } - } - - return $classes; - } - - /** - * {@inheritDoc} - */ - public function findMappingFile($className) - { - $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; - foreach ($this->paths as $path) { - if (!isset($this->prefixes[$path])) { - if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { - return $path.DIRECTORY_SEPARATOR.$defaultFileName; - } - - continue; - } - - $prefix = $this->prefixes[$path]; - - if (0 !== strpos($className, $prefix.'\\')) { - continue; - } - - $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; - if (is_file($filename)) { - return $filename; - } - - throw MappingException::mappingFileNotFound($className, $filename); - } - - throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->fileExtension); - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/MappingException.php b/framework/library/Doctrine/Common/Persistence/Mapping/MappingException.php deleted file mode 100644 index c1e7ad5..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/MappingException.php +++ /dev/null @@ -1,86 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping; - -/** - * A MappingException indicates that something is wrong with the mapping setup. - * - * @since 2.2 - */ -class MappingException extends \Exception -{ - /** - * - * @param string $className - * @param array $namespaces - * - * @return MappingException - */ - public static function classNotFoundInNamespaces($className, $namespaces) - { - return new self("The class '" . $className . "' was not found in the ". - "chain configured namespaces " . implode(", ", $namespaces)); - } - - /** - * @return MappingException - */ - public static function pathRequired() - { - return new self("Specifying the paths to your entities is required ". - "in the AnnotationDriver to retrieve all class names."); - } - - /** - * @param string|null $path - * @return MappingException - */ - public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) - { - if ( ! empty($path)) { - $path = '[' . $path . ']'; - } - - return new self( - 'File mapping drivers must have a valid directory path, ' . - 'however the given path ' . $path . ' seems to be incorrect!' - ); - } - - /** - * @param string $entityName - * @param string $fileName - * @return MappingException - */ - public static function mappingFileNotFound($entityName, $fileName) - { - return new self("No mapping file found named '$fileName' for class '$entityName'."); - } - - /** - * @param string $entityName - * @param string $fileName - * @return MappingException - */ - public static function invalidMappingFile($entityName, $fileName) - { - return new self("Invalid mapping file '$fileName' for class '$entityName'."); - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/ReflectionService.php b/framework/library/Doctrine/Common/Persistence/Mapping/ReflectionService.php deleted file mode 100644 index 3db85d9..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/ReflectionService.php +++ /dev/null @@ -1,80 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping; - -/** - * Very simple reflection service abstraction. - * - * This is required inside metadata layers that may require either - * static or runtime reflection. - * - * @author Benjamin Eberlei - */ -interface ReflectionService -{ - /** - * Return an array of the parent classes (not interfaces) for the given class. - * - * @param string $class - * @return array - */ - function getParentClasses($class); - - /** - * Return the shortname of a class. - * - * @param string $class - * @return string - */ - function getClassShortName($class); - - /** - * @param string $class - * @return string - */ - function getClassNamespace($class); - - /** - * Return a reflection class instance or null - * - * @param string $class - * @return \ReflectionClass|null - */ - function getClass($class); - - /** - * Return an accessible property (setAccessible(true)) or null. - * - * @param string $class - * @param string $property - * @return \ReflectionProperty|null - */ - function getAccessibleProperty($class, $property); - - /** - * Check if the class have a public method with the given name. - * - * @param mixed $class - * @param mixed $method - * @return bool - */ - function hasPublicMethod($class, $method); -} - diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php b/framework/library/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php deleted file mode 100644 index 77b9e76..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php +++ /dev/null @@ -1,102 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping; - -use ReflectionClass; -use ReflectionProperty; - -/** - * PHP Runtime Reflection Service - * - * @author Benjamin Eberlei - */ -class RuntimeReflectionService implements ReflectionService -{ - /** - * Return an array of the parent classes (not interfaces) for the given class. - * - * @param string $class - * @return array - */ - public function getParentClasses($class) - { - return class_parents($class); - } - - /** - * Return the shortname of a class. - * - * @param string $class - * @return string - */ - public function getClassShortName($class) - { - $r = new ReflectionClass($class); - return $r->getShortName(); - } - - /** - * @param string $class - * @return string - */ - public function getClassNamespace($class) - { - $r = new ReflectionClass($class); - return $r->getNamespaceName(); - } - - /** - * Return a reflection class instance or null - * - * @param string $class - * @return ReflectionClass|null - */ - public function getClass($class) - { - return new ReflectionClass($class); - } - - /** - * Return an accessible property (setAccessible(true)) or null. - * - * @param string $class - * @param string $property - * @return ReflectionProperty|null - */ - public function getAccessibleProperty($class, $property) - { - $property = new ReflectionProperty($class, $property); - $property->setAccessible(true); - return $property; - } - - /** - * Check if the class have a public method with the given name. - * - * @param mixed $class - * @param mixed $method - * @return bool - */ - public function hasPublicMethod($class, $method) - { - return method_exists($class, $method) && is_callable(array($class, $method)); - } -} - diff --git a/framework/library/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php b/framework/library/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php deleted file mode 100644 index 4f6d1cf..0000000 --- a/framework/library/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php +++ /dev/null @@ -1,107 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence\Mapping; - -use ReflectionClass; -use ReflectionProperty; - -/** - * PHP Runtime Reflection Service - * - * @author Benjamin Eberlei - */ -class StaticReflectionService implements ReflectionService -{ - /** - * Return an array of the parent classes (not interfaces) for the given class. - * - * @param string $class - * @return array - */ - public function getParentClasses($class) - { - return array(); - } - - /** - * Return the shortname of a class. - * - * @param string $className - * @return string - */ - public function getClassShortName($className) - { - if (strpos($className, '\\') !== false) { - $className = substr($className, strrpos($className, "\\")+1); - } - return $className; - } - - /** - * Return the namespace of a class. - * - * @param string $className - * @return string - */ - public function getClassNamespace($className) - { - $namespace = ''; - if (strpos($className, '\\') !== false) { - $namespace = strrev(substr( strrev($className), strpos(strrev($className), '\\')+1 )); - } - return $namespace; - } - - /** - * Return a reflection class instance or null - * - * @param string $class - * @return ReflectionClass|null - */ - public function getClass($class) - { - return null; - } - - /** - * Return an accessible property (setAccessible(true)) or null. - * - * @param string $class - * @param string $property - * @return ReflectionProperty|null - */ - public function getAccessibleProperty($class, $property) - { - return null; - } - - /** - * Check if the class have a public method with the given name. - * - * @param mixed $class - * @param mixed $method - * @return bool - */ - public function hasPublicMethod($class, $method) - { - return method_exists($class, $method) && is_callable(array($class, $method)); - } -} - diff --git a/framework/library/Doctrine/Common/Persistence/ObjectManager.php b/framework/library/Doctrine/Common/Persistence/ObjectManager.php deleted file mode 100644 index 2bb8722..0000000 --- a/framework/library/Doctrine/Common/Persistence/ObjectManager.php +++ /dev/null @@ -1,152 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence; - -/** - * Contract for a Doctrine persistence layer ObjectManager class to implement. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.1 - * @author Benjamin Eberlei - * @author Jonathan Wage - */ -interface ObjectManager -{ - /** - * Finds a object by its identifier. - * - * This is just a convenient shortcut for getRepository($className)->find($id). - * - * @param string - * @param mixed - * @return object - */ - function find($className, $id); - - /** - * Tells the ObjectManager to make an instance managed and persistent. - * - * The object will be entered into the database as a result of the flush operation. - * - * NOTE: The persist operation always considers objects that are not yet known to - * this ObjectManager as NEW. Do not pass detached objects to the persist operation. - * - * @param object $object The instance to make managed and persistent. - */ - function persist($object); - - /** - * Removes an object instance. - * - * A removed object will be removed from the database as a result of the flush operation. - * - * @param object $object The object instance to remove. - */ - function remove($object); - - /** - * Merges the state of a detached object into the persistence context - * of this ObjectManager and returns the managed copy of the object. - * The object passed to merge will not become associated/managed with this ObjectManager. - * - * @param object $object - * @return object - */ - function merge($object); - - /** - * Clears the ObjectManager. All objects that are currently managed - * by this ObjectManager become detached. - * - * @param string $objectName if given, only objects of this type will get detached - */ - function clear($objectName = null); - - /** - * Detaches an object from the ObjectManager, causing a managed object to - * become detached. Unflushed changes made to the object if any - * (including removal of the object), will not be synchronized to the database. - * Objects which previously referenced the detached object will continue to - * reference it. - * - * @param object $object The object to detach. - */ - function detach($object); - - /** - * Refreshes the persistent state of an object from the database, - * overriding any local changes that have not yet been persisted. - * - * @param object $object The object to refresh. - */ - function refresh($object); - - /** - * Flushes all changes to objects that have been queued up to now to the database. - * This effectively synchronizes the in-memory state of managed objects with the - * database. - */ - function flush(); - - /** - * Gets the repository for a class. - * - * @param string $className - * @return \Doctrine\Common\Persistence\ObjectRepository - */ - function getRepository($className); - - /** - * Returns the ClassMetadata descriptor for a class. - * - * The class name must be the fully-qualified class name without a leading backslash - * (as it is returned by get_class($obj)). - * - * @param string $className - * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata - */ - function getClassMetadata($className); - - /** - * Gets the metadata factory used to gather the metadata of classes. - * - * @return \Doctrine\Common\Persistence\Mapping\ClassMetadataFactory - */ - function getMetadataFactory(); - - /** - * Helper method to initialize a lazy loading proxy or persistent collection. - * - * This method is a no-op for other objects. - * - * @param object $obj - */ - function initializeObject($obj); - - /** - * Check if the object is part of the current UnitOfWork and therefore - * managed. - * - * @param object $object - * @return bool - */ - function contains($object); -} diff --git a/framework/library/Doctrine/Common/Persistence/ObjectManagerAware.php b/framework/library/Doctrine/Common/Persistence/ObjectManagerAware.php deleted file mode 100644 index 69fba78..0000000 --- a/framework/library/Doctrine/Common/Persistence/ObjectManagerAware.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence; - -use Doctrine\Common\Persistence\Mapping\ClassMetadata; - -/** - * Makes a Persistent Objects aware of its own object-manager. - * - * Using this interface the managing object manager and class metadata instances - * are injected into the persistent object after construction. This allows - * you to implement ActiveRecord functionality on top of the persistance-ignorance - * that Doctrine propagates. - * - * Word of Warning: This is a very powerful hook to change how you can work with your domain models. - * Using this hook will break the Single Responsibility Principle inside your Domain Objects - * and increase the coupling of database and objects. - * - * Every ObjectManager has to implement this functionality itself. - * - * @author Benjamin Eberlei - */ -interface ObjectManagerAware -{ - /** - * Injects responsible ObjectManager and the ClassMetadata into this persistent object. - * - * @param ObjectManager $objectManager - * @param ClassMetadata $classMetadata - */ - public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata); -} diff --git a/framework/library/Doctrine/Common/Persistence/ObjectRepository.php b/framework/library/Doctrine/Common/Persistence/ObjectRepository.php deleted file mode 100644 index 9a3e5b6..0000000 --- a/framework/library/Doctrine/Common/Persistence/ObjectRepository.php +++ /dev/null @@ -1,78 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence; - -/** - * Contract for a Doctrine persistence layer ObjectRepository class to implement. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.1 - * @author Benjamin Eberlei - * @author Jonathan Wage - */ -interface ObjectRepository -{ - /** - * Finds an object by its primary key / identifier. - * - * @param int $id The identifier. - * @return object The object. - */ - function find($id); - - /** - * Finds all objects in the repository. - * - * @return mixed The objects. - */ - function findAll(); - - /** - * Finds objects by a set of criteria. - * - * Optionally sorting and limiting details can be passed. An implementation may throw - * an UnexpectedValueException if certain values of the sorting or limiting details are - * not supported. - * - * @throws \UnexpectedValueException - * @param array $criteria - * @param array|null $orderBy - * @param int|null $limit - * @param int|null $offset - * @return mixed The objects. - */ - function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null); - - /** - * Finds a single object by a set of criteria. - * - * @param array $criteria - * @return object The object. - */ - function findOneBy(array $criteria); - - /** - * Returns the class name of the object managed by the repository - * - * @return string - */ - function getClassName(); -} diff --git a/framework/library/Doctrine/Common/Persistence/PersistentObject.php b/framework/library/Doctrine/Common/Persistence/PersistentObject.php deleted file mode 100644 index 9fcc4cb..0000000 --- a/framework/library/Doctrine/Common/Persistence/PersistentObject.php +++ /dev/null @@ -1,244 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence; - -use Doctrine\Common\Persistence\Mapping\ClassMetadata; -use Doctrine\Common\Collections\ArrayCollection; -use Doctrine\Common\Collections\Collection; - -/** - * PersistentObject base class that implements getter/setter methods for all mapped fields and associations - * by overriding __call. - * - * This class is a forward compatible implementation of the PersistentObject trait. - * - * - * Limitations: - * - * 1. All persistent objects have to be associated with a single ObjectManager, multiple - * ObjectManagers are not supported. You can set the ObjectManager with `PersistentObject#setObjectManager()`. - * 2. Setters and getters only work if a ClassMetadata instance was injected into the PersistentObject. - * This is either done on `postLoad` of an object or by accessing the global object manager. - * 3. There are no hooks for setters/getters. Just implement the method yourself instead of relying on __call(). - * 4. Slower than handcoded implementations: An average of 7 method calls per access to a field and 11 for an association. - * 5. Only the inverse side associations get autoset on the owning side aswell. Setting objects on the owning side - * will not set the inverse side associations. - * - * @example - * - * PersistentObject::setObjectManager($em); - * - * class Foo extends PersistentObject - * { - * private $id; - * } - * - * $foo = new Foo(); - * $foo->getId(); // method exists through __call - * - * @author Benjamin Eberlei - */ -abstract class PersistentObject implements ObjectManagerAware -{ - /** - * @var ObjectManager - */ - private static $objectManager; - - /** - * @var ClassMetadata - */ - private $cm; - - /** - * Set the object manager responsible for all persistent object base classes. - * - * @param ObjectManager $objectManager - */ - static public function setObjectManager(ObjectManager $objectManager = null) - { - self::$objectManager = $objectManager; - } - - /** - * @return ObjectManager - */ - static public function getObjectManager() - { - return self::$objectManager; - } - - /** - * Inject Doctrine Object Manager - * - * @param ObjectManager $objectManager - * @param ClassMetadata $classMetadata - * - * @throws \RuntimeException - */ - public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) - { - if ($objectManager !== self::$objectManager) { - throw new \RuntimeException("Trying to use PersistentObject with different ObjectManager instances. " . - "Was PersistentObject::setObjectManager() called?"); - } - - $this->cm = $classMetadata; - } - - /** - * Sets a persistent fields value. - * - * @param string $field - * @param array $args - * - * @throws \BadMethodCallException - When no persistent field exists by that name. - * @throws \InvalidArgumentException - When the wrong target object type is passed to an association - * @return void - */ - private function set($field, $args) - { - $this->initializeDoctrine(); - - if ($this->cm->hasField($field) && !$this->cm->isIdentifier($field)) { - $this->$field = $args[0]; - } else if ($this->cm->hasAssociation($field) && $this->cm->isSingleValuedAssociation($field)) { - $targetClass = $this->cm->getAssociationTargetClass($field); - if (!($args[0] instanceof $targetClass) && $args[0] !== null) { - throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); - } - $this->$field = $args[0]; - $this->completeOwningSide($field, $targetClass, $args[0]); - } else { - throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); - } - } - - /** - * Get persistent field value. - * - * - * @param string $field - * - * @throws \BadMethodCallException - When no persistent field exists by that name. - * @return mixed - */ - private function get($field) - { - $this->initializeDoctrine(); - - if ( $this->cm->hasField($field) || $this->cm->hasAssociation($field) ) { - return $this->$field; - } else { - throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); - } - } - - /** - * If this is an inverse side association complete the owning side. - * - * @param string $field - * @param ClassMetadata $targetClass - * @param object $targetObject - */ - private function completeOwningSide($field, $targetClass, $targetObject) - { - // add this object on the owning side aswell, for obvious infinite recursion - // reasons this is only done when called on the inverse side. - if ($this->cm->isAssociationInverseSide($field)) { - $mappedByField = $this->cm->getAssociationMappedByTargetField($field); - $targetMetadata = self::$objectManager->getClassMetadata($targetClass); - - $setter = ($targetMetadata->isCollectionValuedAssociation($mappedByField) ? "add" : "set").$mappedByField; - $targetObject->$setter($this); - } - } - - /** - * Add an object to a collection - * - * @param string $field - * @param array $args - * - * @throws \BadMethodCallException - * @throws \InvalidArgumentException - */ - private function add($field, $args) - { - $this->initializeDoctrine(); - - if ($this->cm->hasAssociation($field) && $this->cm->isCollectionValuedAssociation($field)) { - $targetClass = $this->cm->getAssociationTargetClass($field); - if (!($args[0] instanceof $targetClass)) { - throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); - } - if (!($this->$field instanceof Collection)) { - $this->$field = new ArrayCollection($this->$field ?: array()); - } - $this->$field->add($args[0]); - $this->completeOwningSide($field, $targetClass, $args[0]); - } else { - throw new \BadMethodCallException("There is no method add".$field."() on ".$this->cm->getName()); - } - } - - /** - * Initialize Doctrine Metadata for this class. - * - * @throws \RuntimeException - * @return void - */ - private function initializeDoctrine() - { - if ($this->cm !== null) { - return; - } - - if (!self::$objectManager) { - throw new \RuntimeException("No runtime object manager set. Call PersistentObject#setObjectManager()."); - } - - $this->cm = self::$objectManager->getClassMetadata(get_class($this)); - } - - /** - * Magic method that implements - * - * @param string $method - * @param array $args - * - * @throws \BadMethodCallException - * @return mixed - */ - public function __call($method, $args) - { - $command = substr($method, 0, 3); - $field = lcfirst(substr($method, 3)); - if ($command == "set") { - $this->set($field, $args); - } else if ($command == "get") { - return $this->get($field); - } else if ($command == "add") { - $this->add($field, $args); - } else { - throw new \BadMethodCallException("There is no method ".$method." on ".$this->cm->getName()); - } - } -} diff --git a/framework/library/Doctrine/Common/Persistence/Proxy.php b/framework/library/Doctrine/Common/Persistence/Proxy.php deleted file mode 100644 index e25598c..0000000 --- a/framework/library/Doctrine/Common/Persistence/Proxy.php +++ /dev/null @@ -1,60 +0,0 @@ -. - */ - -namespace Doctrine\Common\Persistence; - -/** - * Interface for proxy classes. - * - * @author Roman Borschel - * @since 2.2 - */ -interface Proxy -{ - /** - * Marker for Proxy class names. - * - * @var string - */ - const MARKER = '__CG__'; - - /** - * Length of the proxy marker - * - * @var int - */ - const MARKER_LENGTH = 6; - - /** - * Initialize this proxy if its not yet initialized. - * - * Acts as a no-op if already initialized. - * - * @return void - */ - public function __load(); - - /** - * Is this proxy initialized or not. - * - * @return bool - */ - public function __isInitialized(); -} diff --git a/framework/library/Doctrine/Common/PropertyChangedListener.php b/framework/library/Doctrine/Common/PropertyChangedListener.php deleted file mode 100644 index 1171874..0000000 --- a/framework/library/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/framework/library/Doctrine/Common/Reflection/ClassFinderInterface.php b/framework/library/Doctrine/Common/Reflection/ClassFinderInterface.php deleted file mode 100644 index ae69607..0000000 --- a/framework/library/Doctrine/Common/Reflection/ClassFinderInterface.php +++ /dev/null @@ -1,38 +0,0 @@ -. - */ - -namespace Doctrine\Common\Reflection; - -/** - * Finds a class in a PSR-0 structure. - * - * @author Karoly Negyesi - */ -interface ClassFinderInterface -{ - /** - * Finds a class. - * - * @param string $class The name of the class. - * - * @return - * The name of the class or NULL if not found. - */ - public function findFile($class); -} diff --git a/framework/library/Doctrine/Common/Reflection/Psr0FindFile.php b/framework/library/Doctrine/Common/Reflection/Psr0FindFile.php deleted file mode 100644 index b6a5fd1..0000000 --- a/framework/library/Doctrine/Common/Reflection/Psr0FindFile.php +++ /dev/null @@ -1,83 +0,0 @@ -. - */ - -namespace Doctrine\Common\Reflection; - -/** - * Finds a class in a PSR-0 structure. - * - * @author Karoly Negyesi - */ -class Psr0FindFile implements ClassFinderInterface -{ - /** - * The PSR-0 prefixes. - * - * @var string - */ - protected $prefixes; - - /** - * @param string $prefixes - * An array of prefixes. Each key is a PHP namespace and each value is - * a list of directories. - */ - public function __construct($prefixes) - { - $this->prefixes = $prefixes; - } - - /** - * Finds a class. - * - * @param string $class The name of the class. - * - * @return - * The name of the class or NULL if not found. - */ - public function findFile($class) - { - $lastNsPos = strrpos($class, '\\'); - if ('\\' == $class[0]) { - $class = substr($class, 1); - } - - if (false !== $lastNsPos) { - // namespaced class name - $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $lastNsPos)) . DIRECTORY_SEPARATOR; - $className = substr($class, $lastNsPos + 1); - } else { - // PEAR-like class name - $classPath = null; - $className = $class; - } - - $classPath .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; - - foreach ($this->prefixes as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) { - return $dir . DIRECTORY_SEPARATOR . $classPath; - } - } - } - } - } -} diff --git a/framework/library/Doctrine/Common/Reflection/ReflectionProviderInterface.php b/framework/library/Doctrine/Common/Reflection/ReflectionProviderInterface.php deleted file mode 100644 index a436a2d..0000000 --- a/framework/library/Doctrine/Common/Reflection/ReflectionProviderInterface.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\Common\Reflection; - -interface ReflectionProviderInterface -{ - /** - * Get the ReflectionClass equivalent for this class. - * - * @return ReflectionClass - */ - public function getReflectionClass(); - - /** - * Get the ReflectionClass equivalent for this class. - * - * @return ReflectionMethod - */ - public function getReflectionMethod($name); - - /** - * Get the ReflectionClass equivalent for this class. - * - * @return ReflectionMethod - */ - public function getReflectionProperty($name); -} diff --git a/framework/library/Doctrine/Common/Reflection/StaticReflectionClass.php b/framework/library/Doctrine/Common/Reflection/StaticReflectionClass.php deleted file mode 100644 index 12e45d5..0000000 --- a/framework/library/Doctrine/Common/Reflection/StaticReflectionClass.php +++ /dev/null @@ -1,112 +0,0 @@ -. - */ - -namespace Doctrine\Common\Reflection; - -use ReflectionClass; -use ReflectionException; - -class StaticReflectionClass extends ReflectionClass -{ - /** - * The static reflection parser object. - * - * @var StaticReflectionParser - */ - private $staticReflectionParser; - - public function __construct(StaticReflectionParser $staticReflectionParser) - { - $this->staticReflectionParser = $staticReflectionParser; - } - - public function getName() - { - return $this->staticReflectionParser->getClassName(); - } - - public function getDocComment() - { - return $this->staticReflectionParser->getDocComment(); - } - - public function getNamespaceName() - { - return $this->staticReflectionParser->getNamespaceName(); - } - - public function getUseStatements() - { - return $this->staticReflectionParser->getUseStatements(); - } - - public function getMethod($name) - { - return $this->staticReflectionParser->getReflectionMethod($name); - } - - public function getProperty($name) - { - return $this->staticReflectionParser->getReflectionProperty($name); - } - - public static function export($argument, $return = false) { throw new ReflectionException('Method not implemented'); } - public function getConstant($name) { throw new ReflectionException('Method not implemented'); } - public function getConstants() { throw new ReflectionException('Method not implemented'); } - public function getConstructor() { throw new ReflectionException('Method not implemented'); } - public function getDefaultProperties() { throw new ReflectionException('Method not implemented'); } - public function getEndLine() { throw new ReflectionException('Method not implemented'); } - public function getExtension() { throw new ReflectionException('Method not implemented'); } - public function getExtensionName() { throw new ReflectionException('Method not implemented'); } - public function getFileName() { throw new ReflectionException('Method not implemented'); } - public function getInterfaceNames() { throw new ReflectionException('Method not implemented'); } - public function getInterfaces() { throw new ReflectionException('Method not implemented'); } - public function getMethods($filter = NULL) { throw new ReflectionException('Method not implemented'); } - public function getModifiers() { throw new ReflectionException('Method not implemented'); } - public function getParentClass() { throw new ReflectionException('Method not implemented'); } - public function getProperties($filter = NULL) { throw new ReflectionException('Method not implemented'); } - public function getShortName() { throw new ReflectionException('Method not implemented'); } - public function getStartLine() { throw new ReflectionException('Method not implemented'); } - public function getStaticProperties() { throw new ReflectionException('Method not implemented'); } - public function getStaticPropertyValue($name, $default = '') { throw new ReflectionException('Method not implemented'); } - public function getTraitAliases() { throw new ReflectionException('Method not implemented'); } - public function getTraitNames() { throw new ReflectionException('Method not implemented'); } - public function getTraits() { throw new ReflectionException('Method not implemented'); } - public function hasConstant($name) { throw new ReflectionException('Method not implemented'); } - public function hasMethod($name) { throw new ReflectionException('Method not implemented'); } - public function hasProperty($name) { throw new ReflectionException('Method not implemented'); } - public function implementsInterface($interface) { throw new ReflectionException('Method not implemented'); } - public function inNamespace() { throw new ReflectionException('Method not implemented'); } - public function isAbstract() { throw new ReflectionException('Method not implemented'); } - public function isCloneable() { throw new ReflectionException('Method not implemented'); } - public function isFinal() { throw new ReflectionException('Method not implemented'); } - public function isInstance($object) { throw new ReflectionException('Method not implemented'); } - public function isInstantiable() { throw new ReflectionException('Method not implemented'); } - public function isInterface() { throw new ReflectionException('Method not implemented'); } - public function isInternal() { throw new ReflectionException('Method not implemented'); } - public function isIterateable() { throw new ReflectionException('Method not implemented'); } - public function isSubclassOf($class) { throw new ReflectionException('Method not implemented'); } - public function isTrait() { throw new ReflectionException('Method not implemented'); } - public function isUserDefined() { throw new ReflectionException('Method not implemented'); } - public function newInstance($args) { throw new ReflectionException('Method not implemented'); } - public function newInstanceArgs(array $args = array()) { throw new ReflectionException('Method not implemented'); } - public function newInstanceWithoutConstructor() { throw new ReflectionException('Method not implemented'); } - public function setStaticPropertyValue($name, $value) { throw new ReflectionException('Method not implemented'); } - public function __toString() { throw new ReflectionException('Method not implemented'); } -} diff --git a/framework/library/Doctrine/Common/Reflection/StaticReflectionMethod.php b/framework/library/Doctrine/Common/Reflection/StaticReflectionMethod.php deleted file mode 100644 index 6482036..0000000 --- a/framework/library/Doctrine/Common/Reflection/StaticReflectionMethod.php +++ /dev/null @@ -1,103 +0,0 @@ -. - */ - -namespace Doctrine\Common\Reflection; - -use ReflectionMethod; -use ReflectionException; - -class StaticReflectionMethod extends ReflectionMethod -{ - /** - * The PSR-0 parser object. - * - * @var StaticReflectionParser - */ - protected $staticReflectionParser; - - /** - * The name of the method. - * - * @var string - */ - protected $methodName; - - public function __construct(StaticReflectionParser $staticReflectionParser, $methodName) - { - $this->staticReflectionParser = $staticReflectionParser; - $this->methodName = $methodName; - } - public function getName() - { - return $this->methodName; - } - protected function getStaticReflectionParser() - { - return $this->staticReflectionParser->getStaticReflectionParserForDeclaringClass('method', $this->methodName); - } - public function getDeclaringClass() - { - return $this->getStaticReflectionParser()->getReflectionClass(); - } - public function getNamespaceName() - { - return $this->getStaticReflectionParser()->getNamespaceName(); - } - public function getDocComment() - { - return $this->getStaticReflectionParser()->getDocComment('method', $this->methodName); - } - public function getUseStatements() - { - return $this->getStaticReflectionParser()->getUseStatements(); - } - public static function export($class, $name, $return = false) { throw new ReflectionException('Method not implemented'); } - public function getClosure($object) { throw new ReflectionException('Method not implemented'); } - public function getModifiers() { throw new ReflectionException('Method not implemented'); } - public function getPrototype() { throw new ReflectionException('Method not implemented'); } - public function invoke($object, $parameter = NULL) { throw new ReflectionException('Method not implemented'); } - public function invokeArgs($object, array $args) { throw new ReflectionException('Method not implemented'); } - public function isAbstract() { throw new ReflectionException('Method not implemented'); } - public function isConstructor() { throw new ReflectionException('Method not implemented'); } - public function isDestructor() { throw new ReflectionException('Method not implemented'); } - public function isFinal() { throw new ReflectionException('Method not implemented'); } - public function isPrivate() { throw new ReflectionException('Method not implemented'); } - public function isProtected() { throw new ReflectionException('Method not implemented'); } - public function isPublic() { throw new ReflectionException('Method not implemented'); } - public function isStatic() { throw new ReflectionException('Method not implemented'); } - public function setAccessible($accessible) { throw new ReflectionException('Method not implemented'); } - public function __toString() { throw new ReflectionException('Method not implemented'); } - public function getClosureThis() { throw new ReflectionException('Method not implemented'); } - public function getEndLine() { throw new ReflectionException('Method not implemented'); } - public function getExtension() { throw new ReflectionException('Method not implemented'); } - public function getExtensionName() { throw new ReflectionException('Method not implemented'); } - public function getFileName() { throw new ReflectionException('Method not implemented'); } - public function getNumberOfParameters() { throw new ReflectionException('Method not implemented'); } - public function getNumberOfRequiredParameters() { throw new ReflectionException('Method not implemented'); } - public function getParameters() { throw new ReflectionException('Method not implemented'); } - public function getShortName() { throw new ReflectionException('Method not implemented'); } - public function getStartLine() { throw new ReflectionException('Method not implemented'); } - public function getStaticVariables() { throw new ReflectionException('Method not implemented'); } - public function inNamespace() { throw new ReflectionException('Method not implemented'); } - public function isClosure() { throw new ReflectionException('Method not implemented'); } - public function isDeprecated() { throw new ReflectionException('Method not implemented'); } - public function isInternal() { throw new ReflectionException('Method not implemented'); } - public function isUserDefined() { throw new ReflectionException('Method not implemented'); } - public function returnsReference() { throw new ReflectionException('Method not implemented'); } -} diff --git a/framework/library/Doctrine/Common/Reflection/StaticReflectionParser.php b/framework/library/Doctrine/Common/Reflection/StaticReflectionParser.php deleted file mode 100644 index 7f3e41f..0000000 --- a/framework/library/Doctrine/Common/Reflection/StaticReflectionParser.php +++ /dev/null @@ -1,282 +0,0 @@ -. - */ - -namespace Doctrine\Common\Reflection; - -use ReflectionException; -use Doctrine\Common\Annotations\TokenParser; - -/** - * Parses a file for namespaces/use/class declarations. - * - * @author Karoly Negyesi - */ -class StaticReflectionParser implements ReflectionProviderInterface -{ - - /** - * The name of the class. - * - * @var string - */ - protected $className; - - /** - * TRUE if the caller only wants class annotations. - * - * @var boolean. - */ - protected $classAnnotationOptimize; - - /** - * TRUE when the parser has ran. - * - * @var boolean - */ - protected $parsed = false; - - /** - * The namespace of the class - * - * @var string - */ - protected $namespace = ''; - - /** - * The use statements of this class. - * - * @var array - */ - protected $useStatements = array(); - - /** - * The docComment of the class. - * - * @var string - */ - protected $docComment = array( - 'class' => '', - 'property' => array(), - 'method' => array(), - ); - - /** - * The name of the class this class extends, if any. - * - * @var string - */ - protected $parentClassName = ''; - - /** - * The parent PSR-0 Parser. - * - * @var \Doctrine\Common\Annotations\StaticReflectionParser - */ - protected $parentStaticReflectionParser; - - /** - * Parses a class residing in a PSR-0 hierarchy. - * - * @param string $class - * The full, namespaced class name. - * @param ClassFinder $finder - * A ClassFinder object which finds the class. - * @param boolean $classAnnotationOptimize - * Only retrieve the class docComment. Presumes there is only one - * statement per line. - */ - public function __construct($className, $finder, $classAnnotationOptimize = false) - { - $this->className = ltrim($className, '\\'); - if ($lastNsPos = strrpos($this->className, '\\')) { - $this->namespace = substr($this->className, 0, $lastNsPos); - } - $this->finder = $finder; - $this->classAnnotationOptimize = $classAnnotationOptimize; - } - - protected function parse() - { - if ($this->parsed || !$fileName = $this->finder->findFile($this->className)) { - return; - } - $this->parsed = true; - $contents = file_get_contents($fileName); - if ($this->classAnnotationOptimize) { - if (preg_match("/(\A.*)^\s+(abstract|final)?\s+class\s+$className\s+{/sm", $contents, $matches)) { - $contents = $matches[1]; - } - } - $tokenParser = new TokenParser($contents); - $docComment = ''; - while ($token = $tokenParser->next(false)) { - if (is_array($token)) { - switch ($token[0]) { - case T_USE: - $this->useStatements = array_merge($this->useStatements, $tokenParser->parseUseStatement()); - break; - case T_DOC_COMMENT: - $docComment = $token[1]; - break; - case T_CLASS: - $this->docComment['class'] = $docComment; - $docComment = ''; - break; - case T_VAR: - case T_PRIVATE: - case T_PROTECTED: - case T_PUBLIC: - $token = $tokenParser->next(); - if ($token[0] === T_VARIABLE) { - $propertyName = substr($token[1], 1); - $this->docComment['property'][$propertyName] = $docComment; - continue 2; - } - if ($token[0] !== T_FUNCTION) { - // For example, it can be T_FINAL. - continue 2; - } - // No break. - case T_FUNCTION: - // The next string after function is the name, but - // there can be & before the function name so find the - // string. - while (($token = $tokenParser->next()) && $token[0] !== T_STRING); - $methodName = $token[1]; - $this->docComment['method'][$methodName] = $docComment; - $docComment = ''; - break; - case T_EXTENDS: - $this->parentClassName = $tokenParser->parseClass(); - $nsPos = strpos($this->parentClassName, '\\'); - $fullySpecified = false; - if ($nsPos === 0) { - $fullySpecified = true; - } else { - if ($nsPos) { - $prefix = strtolower(substr($this->parentClassName, 0, $nsPos)); - $postfix = substr($this->parentClassName, $nsPos); - } else { - $prefix = strtolower($this->parentClassName); - $postfix = ''; - } - foreach ($this->useStatements as $alias => $use) { - if ($alias == $prefix) { - $this->parentClassName = '\\' . $use . $postfix; - $fullySpecified = true; - } - } - } - if (!$fullySpecified) { - $this->parentClassName = '\\' . $this->namespace . '\\' . $this->parentClassName; - } - break; - } - } - } - } - - protected function getParentStaticReflectionParser() - { - if (empty($this->parentStaticReflectionParser)) { - $this->parentStaticReflectionParser = new static($this->parentClassName, $this->finder); - } - - return $this->parentStaticReflectionParser; - } - - public function getClassName() - { - return $this->className; - } - - public function getNamespaceName() - { - return $this->namespace; - } - - /** - * Get the ReflectionClass equivalent for this file / class. - */ - public function getReflectionClass() - { - return new StaticReflectionClass($this); - } - - /** - * Get the ReflectionMethod equivalent for the method of this file / class. - */ - public function getReflectionMethod($methodName) - { - return new StaticReflectionMethod($this, $methodName); - } - - /** - * Get the ReflectionProperty equivalent for the method of this file / class. - */ - public function getReflectionProperty($propertyName) - { - return new StaticReflectionProperty($this, $propertyName); - } - - /** - * Get the use statements from this file. - */ - public function getUseStatements() - { - $this->parse(); - - return $this->useStatements; - } - - /** - * Get docComment. - * - * @param string $type class, property or method. - * @param string $name Name of the property or method, not needed for class. - * - * @return string the doc comment or empty string if none. - */ - public function getDocComment($type = 'class', $name = '') - { - $this->parse(); - - return $name ? $this->docComment[$type][$name] : $this->docComment[$type]; - } - - /** - * Get the PSR-0 parser for the declaring class. - * - * @param string $type property or method. - * @param string $name Name of the property or method. - * - * @return StaticReflectionParser A static reflection parser for the declaring class. - */ - public function getStaticReflectionParserForDeclaringClass($type, $name) - { - $this->parse(); - if (isset($this->docComment[$type][$name])) { - return $this; - } - if (!empty($this->parentClassName)) { - return $this->getParentStaticReflectionParser()->getStaticReflectionParserForDeclaringClass($type, $name); - } - throw new ReflectionException('Invalid ' . $type . ' "' . $name . '"'); - } -} diff --git a/framework/library/Doctrine/Common/Reflection/StaticReflectionProperty.php b/framework/library/Doctrine/Common/Reflection/StaticReflectionProperty.php deleted file mode 100644 index 7c6411a..0000000 --- a/framework/library/Doctrine/Common/Reflection/StaticReflectionProperty.php +++ /dev/null @@ -1,77 +0,0 @@ -. - */ - -namespace Doctrine\Common\Reflection; - -use ReflectionProperty; -use ReflectionException; - -class StaticReflectionProperty extends ReflectionProperty -{ - /** - * The PSR-0 parser object. - * - * @var StaticReflectionParser - */ - protected $staticReflectionParser; - - /** - * The name of the property. - * - * @var string - */ - protected $propertyName; - - public function __construct(StaticReflectionParser $staticReflectionParser, $propertyName) - { - $this->staticReflectionParser = $staticReflectionParser; - $this->propertyName = $propertyName; - } - public function getName() - { - return $this->propertyName; - } - protected function getStaticReflectionParser() - { - return $this->staticReflectionParser->getStaticReflectionParserForDeclaringClass('property', $this->propertyName); - } - public function getDeclaringClass() - { - return $this->getStaticReflectionParser()->getReflectionClass(); - } - public function getDocComment() - { - return $this->getStaticReflectionParser()->getDocComment('property', $this->propertyName); - } - public function getUseStatements() - { - return $this->getStaticReflectionParser()->getUseStatements(); - } - public static function export ($class, $name, $return = false) { throw new ReflectionException('Method not implemented'); } - public function getModifiers() { throw new ReflectionException('Method not implemented'); } - public function getValue($object = NULL) { throw new ReflectionException('Method not implemented'); } - public function isDefault() { throw new ReflectionException('Method not implemented'); } - public function isPrivate() { throw new ReflectionException('Method not implemented'); } - public function isProtected() { throw new ReflectionException('Method not implemented'); } - public function isPublic() { throw new ReflectionException('Method not implemented'); } - public function isStatic() { throw new ReflectionException('Method not implemented'); } - public function setAccessible ($accessible) { throw new ReflectionException('Method not implemented'); } - public function setValue ($object, $value = NULL) { throw new ReflectionException('Method not implemented'); } - public function __toString() { throw new ReflectionException('Method not implemented'); } -} diff --git a/framework/library/Doctrine/Common/Util/ClassUtils.php b/framework/library/Doctrine/Common/Util/ClassUtils.php deleted file mode 100644 index 078a8db..0000000 --- a/framework/library/Doctrine/Common/Util/ClassUtils.php +++ /dev/null @@ -1,103 +0,0 @@ -. - */ - -namespace Doctrine\Common\Util; - -use Doctrine\Common\Persistence\Proxy; - -/** - * Class and reflection related functionality for objects that - * might or not be proxy objects at the moment. - * - * @author Benjamin Eberlei - * @author Johannes Schmitt - */ -class ClassUtils -{ - /** - * Get the real class name of a class name that could be a proxy. - * - * @param string - * @return string - */ - public static function getRealClass($class) - { - if (false === $pos = strrpos($class, '\\'.Proxy::MARKER.'\\')) { - return $class; - } - - return substr($class, $pos + Proxy::MARKER_LENGTH + 2); - } - - /** - * Get the real class name of an object (even if its a proxy) - * - * @param object - * @return string - */ - public static function getClass($object) - { - return self::getRealClass(get_class($object)); - } - - /** - * Get the real parent class name of a class or object - * - * @param string - * @return string - */ - public static function getParentClass($className) - { - return get_parent_class( self::getRealClass( $className ) ); - } - - /** - * Create a new reflection class - * - * @param string - * @return \ReflectionClass - */ - public static function newReflectionClass($class) - { - return new \ReflectionClass( self::getRealClass( $class ) ); - } - - /** - * Create a new reflection object - * - * @param object - * @return \ReflectionObject - */ - public static function newReflectionObject($object) - { - return self::newReflectionClass( self::getClass( $object ) ); - } - - /** - * Given a class name and a proxy namespace return the proxy name. - * - * @param string $className - * @param string $proxyNamespace - * @return string - */ - public static function generateProxyClassName($className, $proxyNamespace) - { - return rtrim($proxyNamespace, '\\') . '\\'.Proxy::MARKER.'\\' . ltrim($className, '\\'); - } -} diff --git a/framework/library/Doctrine/Common/Util/Debug.php b/framework/library/Doctrine/Common/Util/Debug.php deleted file mode 100644 index 458e5c8..0000000 --- a/framework/library/Doctrine/Common/Util/Debug.php +++ /dev/null @@ -1,135 +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 - * @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. - * - * @link http://xdebug.org/ - * @param mixed $var - * @param integer $maxDepth Maximum nesting level for object properties - * @param boolean $stripTags Flag that indicate if output should strip HTML tags - */ - public static function dump($var, $maxDepth = 2, $stripTags = true) - { - 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 ($stripTags ? strip_tags(html_entity_decode($dump)) : $dump); - - ini_set('html_errors', 'Off'); - } - - /** - * Export - * - * @param mixed $var - * @param int $maxDepth - * @return mixed - */ - 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) { - $return = new \stdclass(); - if ($var instanceof \DateTime) { - $return->__CLASS__ = "DateTime"; - $return->date = $var->format('c'); - $return->timezone = $var->getTimeZone()->getName(); - } else { - $reflClass = ClassUtils::newReflectionObject($var); - $return->__CLASS__ = ClassUtils::getClass($var); - - if ($var instanceof \Doctrine\Common\Persistence\Proxy) { - $return->__IS_PROXY__ = true; - $return->__PROXY_INITIALIZED__ = $var->__isInitialized(); - } - - foreach ($reflClass->getProperties() as $reflProperty) { - $name = $reflProperty->getName(); - - $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; - } - - /** - * Convert to string - * - * @param object $obj - * @return string - */ - public static function toString($obj) - { - return method_exists('__toString', $obj) ? (string) $obj : get_class($obj) . '@' . spl_object_hash($obj); - } -} diff --git a/framework/library/Doctrine/Common/Util/Inflector.php b/framework/library/Doctrine/Common/Util/Inflector.php deleted file mode 100644 index 214ed57..0000000 --- a/framework/library/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)); - } -} diff --git a/framework/library/Doctrine/Common/Version.php b/framework/library/Doctrine/Common/Version.php deleted file mode 100644 index cca4894..0000000 --- a/framework/library/Doctrine/Common/Version.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ - -namespace Doctrine\Common; - -/** - * Class to store and retrieve the version of Doctrine - * - * @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 Version -{ - /** - * Current Doctrine Version - */ - const VERSION = '2.3.0'; - - /** - * Compares a Doctrine version with the current one. - * - * @param string $version Doctrine version to compare. - * @return int Returns -1 if older, 0 if it is the same, 1 if version - * passed as argument is newer. - */ - public static function compare($version) - { - $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); - $version = str_replace(' ', '', $version); - - return version_compare($version, $currentVersion); - } -} diff --git a/framework/library/Doctrine/DBAL/Cache/ArrayStatement.php b/framework/library/Doctrine/DBAL/Cache/ArrayStatement.php deleted file mode 100644 index 8ad167b..0000000 --- a/framework/library/Doctrine/DBAL/Cache/ArrayStatement.php +++ /dev/null @@ -1,103 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Cache; - -use Doctrine\DBAL\Driver\ResultStatement; -use PDO; - -class ArrayStatement implements \IteratorAggregate, ResultStatement -{ - private $data; - private $columnCount = 0; - private $num = 0; - private $defaultFetchMode = PDO::FETCH_BOTH; - - public function __construct(array $data) - { - $this->data = $data; - if (count($data)) { - $this->columnCount = count($data[0]); - } - } - - public function closeCursor() - { - unset ($this->data); - } - - public function columnCount() - { - return $this->columnCount; - } - - public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null) - { - if ($arg2 !== null || $arg3 !== null) { - throw new \InvalidArgumentException("Caching layer does not support 2nd/3rd argument to setFetchMode()"); - } - - $this->defaultFetchMode = $fetchMode; - } - - public function getIterator() - { - $data = $this->fetchAll(); - return new \ArrayIterator($data); - } - - public function fetch($fetchMode = null) - { - if (isset($this->data[$this->num])) { - $row = $this->data[$this->num++]; - $fetchMode = $fetchMode ?: $this->defaultFetchMode; - if ($fetchMode === PDO::FETCH_ASSOC) { - return $row; - } else if ($fetchMode === PDO::FETCH_NUM) { - return array_values($row); - } else if ($fetchMode === PDO::FETCH_BOTH) { - return array_merge($row, array_values($row)); - } else if ($fetchMode === PDO::FETCH_COLUMN) { - return reset($row); - } else { - throw new \InvalidArgumentException("Invalid fetch-style given for fetching result."); - } - } - return false; - } - - public function fetchAll($fetchMode = null) - { - $rows = array(); - while ($row = $this->fetch($fetchMode)) { - $rows[] = $row; - } - return $rows; - } - - public function fetchColumn($columnIndex = 0) - { - $row = $this->fetch(PDO::FETCH_NUM); - if (!isset($row[$columnIndex])) { - // TODO: verify this is correct behavior - return false; - } - return $row[$columnIndex]; - } -} diff --git a/framework/library/Doctrine/DBAL/Cache/CacheException.php b/framework/library/Doctrine/DBAL/Cache/CacheException.php deleted file mode 100644 index dd27477..0000000 --- a/framework/library/Doctrine/DBAL/Cache/CacheException.php +++ /dev/null @@ -1,37 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Cache; - -/** - * @author Benjamin Eberlei - * @since 2.2 - */ -class CacheException extends \Doctrine\DBAL\DBALException -{ - static public function noCacheKey() - { - return new self("No cache key was set."); - } - - static public function noResultDriverConfigured() - { - return new self("Trying to cache a query but no result driver is configured."); - } -} diff --git a/framework/library/Doctrine/DBAL/Cache/QueryCacheProfile.php b/framework/library/Doctrine/DBAL/Cache/QueryCacheProfile.php deleted file mode 100644 index 54c34b9..0000000 --- a/framework/library/Doctrine/DBAL/Cache/QueryCacheProfile.php +++ /dev/null @@ -1,131 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Cache; - -use Doctrine\Common\Cache\Cache; - -/** - * Query Cache Profile handles the data relevant for query caching. - * - * It is a value object, setter methods return NEW instances. - * - * @author Benjamin Eberlei - */ -class QueryCacheProfile -{ - /** - * @var Cache - */ - private $resultCacheDriver; - /** - * @var int - */ - private $lifetime = 0; - /** - * @var string - */ - private $cacheKey; - - /** - * @param int $lifetime - * @param string $cacheKey - * @param Cache $resultCache - */ - public function __construct($lifetime = 0, $cacheKey = null, Cache $resultCache = null) - { - $this->lifetime = $lifetime; - $this->cacheKey = $cacheKey; - $this->resultCacheDriver = $resultCache; - } - - /** - * @return Cache - */ - public function getResultCacheDriver() - { - return $this->resultCacheDriver; - } - - /** - * @return int - */ - public function getLifetime() - { - return $this->lifetime; - } - - /** - * @return string - */ - public function getCacheKey() - { - if ($this->cacheKey === null) { - throw CacheException::noCacheKey(); - } - return $this->cacheKey; - } - - /** - * Generate the real cache key from query, params and types. - * - * @param string $query - * @param array $params - * @param array $types - * @return array - */ - public function generateCacheKeys($query, $params, $types) - { - $realCacheKey = $query . "-" . serialize($params) . "-" . serialize($types); - // should the key be automatically generated using the inputs or is the cache key set? - if ($this->cacheKey === null) { - $cacheKey = sha1($realCacheKey); - } else { - $cacheKey = $this->cacheKey; - } - return array($cacheKey, $realCacheKey); - } - - /** - * @param Cache $cache - * @return QueryCacheProfile - */ - public function setResultCacheDriver(Cache $cache) - { - return new QueryCacheProfile($this->lifetime, $this->cacheKey, $cache); - } - - /** - * @param string|null $cacheKey - * @return QueryCacheProfile - */ - public function setCacheKey($cacheKey) - { - return new QueryCacheProfile($this->lifetime, $cacheKey, $this->resultCacheDriver); - } - - /** - * @param int $lifetime - * @return QueryCacheProfile - */ - public function setLifetime($lifetime) - { - return new QueryCacheProfile($lifetime, $this->cacheKey, $this->resultCacheDriver); - } -} diff --git a/framework/library/Doctrine/DBAL/Cache/ResultCacheStatement.php b/framework/library/Doctrine/DBAL/Cache/ResultCacheStatement.php deleted file mode 100644 index f118e7c..0000000 --- a/framework/library/Doctrine/DBAL/Cache/ResultCacheStatement.php +++ /dev/null @@ -1,239 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Cache; - -use Doctrine\DBAL\Driver\Statement; -use Doctrine\DBAL\Driver\ResultStatement; -use Doctrine\DBAL\Connection; -use Doctrine\Common\Cache\Cache; -use PDO; - -/** - * Cache statement for SQL results. - * - * A result is saved in multiple cache keys, there is the originally specified - * cache key which is just pointing to result rows by key. The following things - * have to be ensured: - * - * 1. lifetime of the original key has to be longer than that of all the individual rows keys - * 2. if any one row key is missing the query has to be re-executed. - * - * Also you have to realize that the cache will load the whole result into memory at once to ensure 2. - * This means that the memory usage for cached results might increase by using this feature. - */ -class ResultCacheStatement implements \IteratorAggregate, ResultStatement -{ - /** - * @var \Doctrine\Common\Cache\Cache - */ - private $resultCache; - - /** - * - * @var string - */ - private $cacheKey; - - /** - * @var string - */ - private $realKey; - - /** - * @var int - */ - private $lifetime; - - /** - * @var Doctrine\DBAL\Driver\Statement - */ - private $statement; - - /** - * Did we reach the end of the statement? - * - * @var bool - */ - private $emptied = false; - - /** - * @var array - */ - private $data; - - /** - * @var int - */ - private $defaultFetchMode = PDO::FETCH_BOTH; - - /** - * @param Statement $stmt - * @param Cache $resultCache - * @param string $cacheKey - * @param string $realKey - * @param int $lifetime - */ - public function __construct(Statement $stmt, Cache $resultCache, $cacheKey, $realKey, $lifetime) - { - $this->statement = $stmt; - $this->resultCache = $resultCache; - $this->cacheKey = $cacheKey; - $this->realKey = $realKey; - $this->lifetime = $lifetime; - } - - /** - * Closes the cursor, enabling the statement to be executed again. - * - * @return boolean Returns TRUE on success or FALSE on failure. - */ - public function closeCursor() - { - $this->statement->closeCursor(); - if ($this->emptied && $this->data !== null) { - $data = $this->resultCache->fetch($this->cacheKey); - if ( ! $data) { - $data = array(); - } - $data[$this->realKey] = $this->data; - - $this->resultCache->save($this->cacheKey, $data, $this->lifetime); - unset($this->data); - } - } - - /** - * 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. - */ - public function columnCount() - { - return $this->statement->columnCount(); - } - - public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null) - { - $this->defaultFetchMode = $fetchMode; - } - - public function getIterator() - { - $data = $this->fetchAll(); - return new \ArrayIterator($data); - } - - /** - * fetch - * - * @see Query::HYDRATE_* constants - * @param integer $fetchMode 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 - * - * @return mixed - */ - public function fetch($fetchMode = null) - { - if ($this->data === null) { - $this->data = array(); - } - - $row = $this->statement->fetch(PDO::FETCH_ASSOC); - if ($row) { - $this->data[] = $row; - - $fetchMode = $fetchMode ?: $this->defaultFetchMode; - - if ($fetchMode == PDO::FETCH_ASSOC) { - return $row; - } else if ($fetchMode == PDO::FETCH_NUM) { - return array_values($row); - } else if ($fetchMode == PDO::FETCH_BOTH) { - return array_merge($row, array_values($row)); - } else if ($fetchMode == PDO::FETCH_COLUMN) { - return reset($row); - } else { - throw new \InvalidArgumentException("Invalid fetch-style given for caching result."); - } - } - $this->emptied = true; - return false; - } - - /** - * Returns an array containing all of the result set rows - * - * @param integer $fetchMode 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 - * - * @return array - */ - public function fetchAll($fetchMode = null) - { - $rows = array(); - while ($row = $this->fetch($fetchMode)) { - $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. - */ - public function fetchColumn($columnIndex = 0) - { - $row = $this->fetch(PDO::FETCH_NUM); - if (!isset($row[$columnIndex])) { - // TODO: verify this is correct behavior - return false; - } - return $row[$columnIndex]; - } - - /** - * 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. - */ - public function rowCount() - { - return $this->statement->rowCount(); - } -} diff --git a/framework/library/Doctrine/DBAL/Configuration.php b/framework/library/Doctrine/DBAL/Configuration.php deleted file mode 100644 index 53f7b5e..0000000 --- a/framework/library/Doctrine/DBAL/Configuration.php +++ /dev/null @@ -1,113 +0,0 @@ -. - */ - -namespace Doctrine\DBAL; - -use Doctrine\DBAL\Logging\SQLLogger; -use Doctrine\Common\Cache\Cache; - -/** - * 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 = null) - { - $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; - } - - /** - * Gets the cache driver implementation that is used for query result caching. - * - * @return \Doctrine\Common\Cache\Cache - */ - public function getResultCacheImpl() - { - return isset($this->_attributes['resultCacheImpl']) ? - $this->_attributes['resultCacheImpl'] : null; - } - - /** - * Sets the cache driver implementation that is used for query result caching. - * - * @param \Doctrine\Common\Cache\Cache $cacheImpl - */ - public function setResultCacheImpl(Cache $cacheImpl) - { - $this->_attributes['resultCacheImpl'] = $cacheImpl; - } - - /** - * Filter schema assets expression. - * - * Only include tables/sequences matching the filter expression regexp in - * schema instances generated for the active connection when calling - * {AbstractSchemaManager#createSchema()}. - * - * @param string $filterExpression - */ - public function setFilterSchemaAssetsExpression($filterExpression) - { - $this->_attributes['filterSchemaAssetsExpression'] = $filterExpression; - } - - /** - * Return filter schema assets expression. - * - * @return string|null - */ - public function getFilterSchemaAssetsExpression() - { - if (isset($this->_attributes['filterSchemaAssetsExpression'])) { - return $this->_attributes['filterSchemaAssetsExpression']; - } - return null; - } -} diff --git a/framework/library/Doctrine/DBAL/Connection.php b/framework/library/Doctrine/DBAL/Connection.php deleted file mode 100644 index 80efa94..0000000 --- a/framework/library/Doctrine/DBAL/Connection.php +++ /dev/null @@ -1,1308 +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, - Doctrine\DBAL\Cache\ResultCacheStatement, - Doctrine\DBAL\Cache\QueryCacheProfile, - Doctrine\DBAL\Cache\ArrayStatement, - Doctrine\DBAL\Cache\CacheException; - -/** - * A wrapper around a Doctrine\DBAL\Driver\Connection that adds features like - * events, transaction isolation levels, configuration, emulated transaction nesting, - * lazy connecting and more. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Konsta Vesterinen - * @author Lukas Smith (MDB2 library) - * @author Benjamin Eberlei - */ -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; - - /** - * Represents an array of ints to be expanded by Doctrine SQL parsing. - * - * @var int - */ - const PARAM_INT_ARRAY = 101; - - /** - * Represents an array of strings to be expanded by Doctrine SQL parsing. - * - * @var int - */ - const PARAM_STR_ARRAY = 102; - - /** - * Offset by which PARAM_* constants are detected as arrays of the param type. - * - * @var int - */ - const ARRAY_PARAM_OFFSET = 100; - - /** - * The wrapped driver connection. - * - * @var \Doctrine\DBAL\Driver\Connection - */ - protected $_conn; - - /** - * @var \Doctrine\DBAL\Configuration - */ - protected $_config; - - /** - * @var \Doctrine\Common\EventManager - */ - protected $_eventManager; - - /** - * @var \Doctrine\DBAL\Query\Expression\ExpressionBuilder - */ - protected $_expr; - - /** - * 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; - - /** - * If nested transations should use savepoints - * - * @var integer - */ - private $_nestTransactionsWithSavepoints; - - /** - * 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\AbstractSchemaManager - */ - 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; - - private $_defaultFetchMode = PDO::FETCH_ASSOC; - - /** - * 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; - - $this->_expr = new Query\Expression\ExpressionBuilder($this); - - if ( ! isset($params['platform'])) { - $this->_platform = $driver->getDatabasePlatform(); - } else if ($params['platform'] instanceof Platforms\AbstractPlatform) { - $this->_platform = $params['platform']; - } else { - throw DBALException::invalidPlatformSpecified(); - } - - $this->_platform->setEventManager($eventManager); - - $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; - } - - /** - * Gets the ExpressionBuilder for the connection. - * - * @return \Doctrine\DBAL\Query\Expression\ExpressionBuilder - */ - public function getExpressionBuilder() - { - return $this->_expr; - } - - /** - * 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; - } - - /** - * setFetchMode - * - * @param integer $fetchMode - */ - public function setFetchMode($fetchMode) - { - $this->_defaultFetchMode = $fetchMode; - } - - /** - * 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 $tableName The name of the table on which to delete. - * @param array $identifier The deletion criteria. An associative 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. - * @return integer - */ - 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 $tableName The name of the table to update. - * @param array $data - * @param array $identifier The update criteria. An associative array containing column-value pairs. - * @param array $types Types of the merged $data and $identifier arrays in that order. - * @return integer The number of affected rows. - */ - public function update($tableName, array $data, array $identifier, array $types = array()) - { - $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, $types); - } - - /** - * Inserts a table row with specified data. - * - * @param string $tableName The name of the table to insert data into. - * @param array $data An associative array containing column-value pairs. - * @param array $types Types of the inserted data. - * @return integer The number of affected rows. - */ - public function insert($tableName, array $data, array $types = array()) - { - $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), $types); - } - - /** - * 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(); - - list($value, $bindingType) = $this->getBindingInfo($input, $type); - return $this->_conn->quote($value, $bindingType); - } - - /** - * 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(); - } - - /** - * 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(); - - try { - $stmt = new Statement($statement, $this); - } catch (\Exception $ex) { - throw DBALException::driverExceptionDuringQuery($ex, $statement); - } - - $stmt->setFetchMode($this->_defaultFetchMode); - - return $stmt; - } - - /** - * 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. - * @param array $types The types the previous parameters are in. - * @param QueryCacheProfile $qcp - * @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(), QueryCacheProfile $qcp = null) - { - if ($qcp !== null) { - return $this->executeCacheQuery($query, $params, $types, $qcp); - } - - $this->connect(); - - $logger = $this->_config->getSQLLogger(); - if ($logger) { - $logger->startQuery($query, $params, $types); - } - - try { - if ($params) { - list($query, $params, $types) = SQLParserUtils::expandListParameters($query, $params, $types); - - $stmt = $this->_conn->prepare($query); - if ($types) { - $this->_bindTypedValues($stmt, $params, $types); - $stmt->execute(); - } else { - $stmt->execute($params); - } - } else { - $stmt = $this->_conn->query($query); - } - } catch (\Exception $ex) { - throw DBALException::driverExceptionDuringQuery($ex, $query, $this->resolveParams($params, $types)); - } - - $stmt->setFetchMode($this->_defaultFetchMode); - - if ($logger) { - $logger->stopQuery(); - } - - return $stmt; - } - - /** - * Execute a caching query and - * - * @param string $query - * @param array $params - * @param array $types - * @param QueryCacheProfile $qcp - * @return \Doctrine\DBAL\Driver\ResultStatement - */ - public function executeCacheQuery($query, $params, $types, QueryCacheProfile $qcp) - { - $resultCache = $qcp->getResultCacheDriver() ?: $this->_config->getResultCacheImpl(); - if ( ! $resultCache) { - throw CacheException::noResultDriverConfigured(); - } - - list($cacheKey, $realKey) = $qcp->generateCacheKeys($query, $params, $types); - - // fetch the row pointers entry - if ($data = $resultCache->fetch($cacheKey)) { - // is the real key part of this row pointers map or is the cache only pointing to other cache keys? - if (isset($data[$realKey])) { - $stmt = new ArrayStatement($data[$realKey]); - } else if (array_key_exists($realKey, $data)) { - $stmt = new ArrayStatement(array()); - } - } - - if (!isset($stmt)) { - $stmt = new ResultCacheStatement($this->executeQuery($query, $params, $types), $resultCache, $cacheKey, $realKey, $qcp->getLifetime()); - } - - $stmt->setFetchMode($this->_defaultFetchMode); - - 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() - { - $this->connect(); - - $args = func_get_args(); - - $logger = $this->_config->getSQLLogger(); - if ($logger) { - $logger->startQuery($args[0]); - } - - try { - $statement = call_user_func_array(array($this->_conn, 'query'), $args); - } catch (\Exception $ex) { - throw DBALException::driverExceptionDuringQuery($ex, func_get_arg(0)); - } - - $statement->setFetchMode($this->_defaultFetchMode); - - if ($logger) { - $logger->stopQuery(); - } - - return $statement; - } - - /** - * 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(); - - $logger = $this->_config->getSQLLogger(); - if ($logger) { - $logger->startQuery($query, $params, $types); - } - - try { - if ($params) { - list($query, $params, $types) = SQLParserUtils::expandListParameters($query, $params, $types); - - $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); - } - } catch (\Exception $ex) { - throw DBALException::driverExceptionDuringQuery($ex, $query, $this->resolveParams($params, $types)); - } - - if ($logger) { - $logger->stopQuery(); - } - - 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(); - - $logger = $this->_config->getSQLLogger(); - if ($logger) { - $logger->startQuery($statement); - } - - try { - $result = $this->_conn->exec($statement); - } catch (\Exception $ex) { - throw DBALException::driverExceptionDuringQuery($ex, $statement); - } - - if ($logger) { - $logger->stopQuery(); - } - - return $result; - } - - /** - * 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; - } - } - - /** - * Set if nested transactions should use savepoints - * - * @param boolean $nestTransactionsWithSavepoints - * @return void - */ - public function setNestTransactionsWithSavepoints($nestTransactionsWithSavepoints) - { - if ($this->_transactionNestingLevel > 0) { - throw ConnectionException::mayNotAlterNestedTransactionWithSavepointsInTransaction(); - } - - if ( ! $this->_platform->supportsSavepoints()) { - throw ConnectionException::savepointsNotSupported(); - } - - $this->_nestTransactionsWithSavepoints = $nestTransactionsWithSavepoints; - } - - /** - * Get if nested transactions should use savepoints - * - * @return boolean - */ - public function getNestTransactionsWithSavepoints() - { - return $this->_nestTransactionsWithSavepoints; - } - - /** - * Returns the savepoint name to use for nested transactions are false if they are not supported - * "savepointFormat" parameter is not set - * - * @return mixed a string with the savepoint name or false - */ - protected function _getNestedTransactionSavePointName() - { - return 'DOCTRINE2_SAVEPOINT_'.$this->_transactionNestingLevel; - } - - /** - * Starts a transaction by suspending auto-commit mode. - * - * @return void - */ - public function beginTransaction() - { - $this->connect(); - - ++$this->_transactionNestingLevel; - - $logger = $this->_config->getSQLLogger(); - - if ($this->_transactionNestingLevel == 1) { - if ($logger) { - $logger->startQuery('"START TRANSACTION"'); - } - $this->_conn->beginTransaction(); - if ($logger) { - $logger->stopQuery(); - } - } else if ($this->_nestTransactionsWithSavepoints) { - if ($logger) { - $logger->startQuery('"SAVEPOINT"'); - } - $this->createSavepoint($this->_getNestedTransactionSavePointName()); - if ($logger) { - $logger->stopQuery(); - } - } - } - - /** - * 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(); - - $logger = $this->_config->getSQLLogger(); - - if ($this->_transactionNestingLevel == 1) { - if ($logger) { - $logger->startQuery('"COMMIT"'); - } - $this->_conn->commit(); - if ($logger) { - $logger->stopQuery(); - } - } else if ($this->_nestTransactionsWithSavepoints) { - if ($logger) { - $logger->startQuery('"RELEASE SAVEPOINT"'); - } - $this->releaseSavepoint($this->_getNestedTransactionSavePointName()); - if ($logger) { - $logger->stopQuery(); - } - } - - --$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(); - - $logger = $this->_config->getSQLLogger(); - - if ($this->_transactionNestingLevel == 1) { - if ($logger) { - $logger->startQuery('"ROLLBACK"'); - } - $this->_transactionNestingLevel = 0; - $this->_conn->rollback(); - $this->_isRollbackOnly = false; - if ($logger) { - $logger->stopQuery(); - } - } else if ($this->_nestTransactionsWithSavepoints) { - if ($logger) { - $logger->startQuery('"ROLLBACK TO SAVEPOINT"'); - } - $this->rollbackSavepoint($this->_getNestedTransactionSavePointName()); - --$this->_transactionNestingLevel; - if ($logger) { - $logger->stopQuery(); - } - } else { - $this->_isRollbackOnly = true; - --$this->_transactionNestingLevel; - } - } - - /** - * createSavepoint - * creates a new savepoint - * - * @param string $savepoint name of a savepoint to set - * @return void - */ - public function createSavepoint($savepoint) - { - if ( ! $this->_platform->supportsSavepoints()) { - throw ConnectionException::savepointsNotSupported(); - } - - $this->_conn->exec($this->_platform->createSavePoint($savepoint)); - } - - /** - * releaseSavePoint - * releases given savepoint - * - * @param string $savepoint name of a savepoint to release - * @return void - */ - public function releaseSavepoint($savepoint) - { - if ( ! $this->_platform->supportsSavepoints()) { - throw ConnectionException::savepointsNotSupported(); - } - - if ($this->_platform->supportsReleaseSavepoints()) { - $this->_conn->exec($this->_platform->releaseSavePoint($savepoint)); - } - } - - /** - * rollbackSavePoint - * releases given savepoint - * - * @param string $savepoint name of a savepoint to rollback to - * @return void - */ - public function rollbackSavepoint($savepoint) - { - if ( ! $this->_platform->supportsSavepoints()) { - throw ConnectionException::savepointsNotSupported(); - } - - $this->_conn->exec($this->_platform->rollbackSavePoint($savepoint)); - } - - /** - * 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\AbstractSchemaManager - */ - 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 string $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 = array_key_exists(0, $types) ? -1 : 0; - $bindIndex = 1; - foreach ($params as $value) { - $typeIndex = $bindIndex + $typeOffset; - if (isset($types[$typeIndex])) { - $type = $types[$typeIndex]; - list($value, $bindingType) = $this->getBindingInfo($value, $type); - $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]; - list($value, $bindingType) = $this->getBindingInfo($value, $type); - $stmt->bindValue($name, $value, $bindingType); - } else { - $stmt->bindValue($name, $value); - } - } - } - } - - /** - * Gets the binding type of a given type. The given type can be a PDO or DBAL mapping type. - * - * @param mixed $value The value to bind - * @param mixed $type The type to bind (PDO or DBAL) - * @return array [0] => the (escaped) value, [1] => the binding type - */ - private function getBindingInfo($value, $type) - { - 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 array($value, $bindingType); - } - - /** - * Resolves the parameters to a format which can be displayed. - * - * @internal This is a purely internal method. If you rely on this method, you are advised to - * copy/paste the code as this method may change, or be removed without prior notice. - * - * @param array $params - * @param array $types - * - * @return array - */ - public function resolveParams(array $params, array $types) - { - $resolvedParams = array(); - - // Check whether parameters are positional or named. Mixing is not allowed, just like in PDO. - if (is_int(key($params))) { - // Positional parameters - $typeOffset = array_key_exists(0, $types) ? -1 : 0; - $bindIndex = 1; - foreach ($params as $value) { - $typeIndex = $bindIndex + $typeOffset; - if (isset($types[$typeIndex])) { - $type = $types[$typeIndex]; - list($value,) = $this->getBindingInfo($value, $type); - $resolvedParams[$bindIndex] = $value; - } else { - $resolvedParams[$bindIndex] = $value; - } - ++$bindIndex; - } - } else { - // Named parameters - foreach ($params as $name => $value) { - if (isset($types[$name])) { - $type = $types[$name]; - list($value,) = $this->getBindingInfo($value, $type); - $resolvedParams[$name] = $value; - } else { - $resolvedParams[$name] = $value; - } - } - } - - return $resolvedParams; - } - - /** - * Create a new instance of a SQL query builder. - * - * @return \Doctrine\DBAL\Query\QueryBuilder - */ - public function createQueryBuilder() - { - return new Query\QueryBuilder($this); - } -} diff --git a/framework/library/Doctrine/DBAL/ConnectionException.php b/framework/library/Doctrine/DBAL/ConnectionException.php deleted file mode 100644 index 4b41ef2..0000000 --- a/framework/library/Doctrine/DBAL/ConnectionException.php +++ /dev/null @@ -1,54 +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\Connections; - - -use Doctrine\DBAL\Connection, - Doctrine\DBAL\Driver, - Doctrine\DBAL\Configuration, - Doctrine\Common\EventManager, - Doctrine\DBAL\Event\ConnectionEventArgs, - Doctrine\DBAL\Events; - -/** - * Master-Slave Connection - * - * Connection can be used with master-slave setups. - * - * Important for the understanding of this connection should be how and when - * it picks the slave or master. - * - * 1. Slave if master was never picked before and ONLY if 'getWrappedConnection' - * or 'executeQuery' is used. - * 2. Master picked when 'exec', 'executeUpdate', 'insert', 'delete', 'update', 'createSavepoint', - * 'releaseSavepoint', 'beginTransaction', 'rollback', 'commit', 'query' or - * 'prepare' is called. - * 3. If master was picked once during the lifetime of the connection it will always get picked afterwards. - * 4. One slave connection is randomly picked ONCE during a request. - * - * ATTENTION: You can write to the slave with this connection if you execute a write query without - * opening up a transaction. For example: - * - * $conn = DriverManager::getConnection(...); - * $conn->executeQuery("DELETE FROM table"); - * - * Be aware that Connection#executeQuery is a method specifically for READ - * operations only. - * - * This connection is limited to slave operations using the - * Connection#executeQuery operation only, because it wouldn't be compatible - * with the ORM or SchemaManager code otherwise. Both use all the other - * operations in a context where writes could happen to a slave, which makes - * this restricted approach necessary. - * - * You can manually connect to the master at any time by calling: - * - * $conn->connect('master'); - * - * Instantiation through the DriverManager looks like: - * - * @example - * - * $conn = DriverManager::getConnection(array( - * 'wrapperClass' => 'Doctrine\DBAL\Connections\MasterSlaveConnection', - * 'driver' => 'pdo_mysql', - * 'master' => array('user' => '', 'password' => '', 'host' => '', 'dbname' => ''), - * 'slaves' => array( - * array('user' => 'slave1', 'password', 'host' => '', 'dbname' => ''), - * array('user' => 'slave2', 'password', 'host' => '', 'dbname' => ''), - * ) - * )); - * - * You can also pass 'driverOptions' and any other documented option to each of this drivers to pass additional information. - * - * @author Lars Strojny - * @author Benjamin Eberlei - */ -class MasterSlaveConnection extends Connection -{ - /** - * Master and slave connection (one of the randomly picked slaves) - * - * @var Doctrine\DBAL\Driver\Connection[] - */ - protected $connections = array('master' => null, 'slave' => null); - - /** - * You can keep the slave connection and then switch back to it - * during the request if you know what you are doing. - * - * @var bool - */ - protected $keepSlave = false; - - /** - * Create Master Slave Connection - * - * @param array $params - * @param Driver $driver - * @param Configuration $config - * @param EventManager $eventManager - */ - public function __construct(array $params, Driver $driver, Configuration $config = null, EventManager $eventManager = null) - { - if ( !isset($params['slaves']) || !isset($params['master']) ) { - throw new \InvalidArgumentException('master or slaves configuration missing'); - } - if ( count($params['slaves']) == 0 ) { - throw new \InvalidArgumentException('You have to configure at least one slaves.'); - } - - $params['master']['driver'] = $params['driver']; - foreach ($params['slaves'] as $slaveKey => $slave) { - $params['slaves'][$slaveKey]['driver'] = $params['driver']; - } - - $this->keepSlave = isset($params['keepSlave']) ? (bool)$params['keepSlave'] : false; - - parent::__construct($params, $driver, $config, $eventManager); - } - - /** - * Check if the connection is currently towards the master or not. - * - * @return bool - */ - public function isConnectedToMaster() - { - return $this->_conn !== null && $this->_conn === $this->connections['master']; - } - - /** - * {@inheritDoc} - */ - public function connect($connectionName = null) - { - $requestedConnectionChange = ($connectionName !== null); - $connectionName = $connectionName ?: 'slave'; - - if ( $connectionName !== 'slave' && $connectionName !== 'master' ) { - throw new \InvalidArgumentException("Invalid option to connect(), only master or slave allowed."); - } - - // If we have a connection open, and this is not an explicit connection - // change request, then abort right here, because we are already done. - // This prevents writes to the slave in case of "keepSlave" option enabled. - if ($this->_conn && !$requestedConnectionChange) { - return false; - } - - $forceMasterAsSlave = false; - - if ($this->getTransactionNestingLevel() > 0) { - $connectionName = 'master'; - $forceMasterAsSlave = true; - } - - if ($this->connections[$connectionName]) { - if ($forceMasterAsSlave) { - $this->connections['slave'] = $this->_conn = $this->connections['master']; - } else { - $this->_conn = $this->connections[$connectionName]; - } - return false; - } - - if ($connectionName === 'master') { - // Set slave connection to master to avoid invalid reads - if ($this->connections['slave'] && ! $this->keepSlave) { - unset($this->connections['slave']); - } - - $this->connections['master'] = $this->_conn = $this->connectTo($connectionName); - - if ( ! $this->keepSlave) { - $this->connections['slave'] = $this->connections['master']; - } - } else { - $this->connections['slave'] = $this->_conn = $this->connectTo($connectionName); - } - - if ($this->_eventManager->hasListeners(Events::postConnect)) { - $eventArgs = new ConnectionEventArgs($this); - $this->_eventManager->dispatchEvent(Events::postConnect, $eventArgs); - } - - return true; - } - - /** - * Connect to a specific connection - * - * @param string $connectionName - * @return Driver - */ - protected function connectTo($connectionName) - { - $params = $this->getParams(); - - $driverOptions = isset($params['driverOptions']) ? $params['driverOptions'] : array(); - - $connectionParams = $this->chooseConnectionConfiguration($connectionName, $params); - - $user = isset($connectionParams['user']) ? $connectionParams['user'] : null; - $password = isset($connectionParams['password']) ? $connectionParams['password'] : null; - - return $this->_driver->connect($connectionParams, $user, $password, $driverOptions); - } - - protected function chooseConnectionConfiguration($connectionName, $params) - { - if ($connectionName === 'master') { - return $params['master']; - } - - return $params['slaves'][array_rand($params['slaves'])]; - } - - /** - * {@inheritDoc} - */ - public function executeUpdate($query, array $params = array(), array $types = array()) - { - $this->connect('master'); - return parent::executeUpdate($query, $params, $types); - } - - /** - * {@inheritDoc} - */ - public function beginTransaction() - { - $this->connect('master'); - return parent::beginTransaction(); - } - - /** - * {@inheritDoc} - */ - public function commit() - { - $this->connect('master'); - return parent::commit(); - } - - /** - * {@inheritDoc} - */ - public function rollBack() - { - $this->connect('master'); - return parent::rollBack(); - } - - /** - * {@inheritDoc} - */ - public function delete($tableName, array $identifier) - { - $this->connect('master'); - return parent::delete($tableName, $identifier); - } - - /** - * {@inheritDoc} - */ - public function update($tableName, array $data, array $identifier, array $types = array()) - { - $this->connect('master'); - return parent::update($tableName, $data, $identifier, $types); - } - - /** - * {@inheritDoc} - */ - public function insert($tableName, array $data, array $types = array()) - { - $this->connect('master'); - return parent::insert($tableName, $data, $types); - } - - /** - * {@inheritDoc} - */ - public function exec($statement) - { - $this->connect('master'); - return parent::exec($statement); - } - - /** - * {@inheritDoc} - */ - public function createSavepoint($savepoint) - { - $this->connect('master'); - - return parent::createSavepoint($savepoint); - } - - /** - * {@inheritDoc} - */ - public function releaseSavepoint($savepoint) - { - $this->connect('master'); - - return parent::releaseSavepoint($savepoint); - } - - /** - * {@inheritDoc} - */ - public function rollbackSavepoint($savepoint) - { - $this->connect('master'); - - return parent::rollbackSavepoint($savepoint); - } - - public function query() - { - $this->connect('master'); - - $args = func_get_args(); - - $logger = $this->getConfiguration()->getSQLLogger(); - if ($logger) { - $logger->startQuery($args[0]); - } - - $statement = call_user_func_array(array($this->_conn, 'query'), $args); - - if ($logger) { - $logger->stopQuery(); - } - - return $statement; - } - - public function prepare($statement) - { - $this->connect('master'); - - return parent::prepare($statement); - } -} diff --git a/framework/library/Doctrine/DBAL/DBALException.php b/framework/library/Doctrine/DBAL/DBALException.php deleted file mode 100644 index 2b4151e..0000000 --- a/framework/library/Doctrine/DBAL/DBALException.php +++ /dev/null @@ -1,128 +0,0 @@ -getMessage(); - - return new self($msg, 0, $driverEx); - } - - /** - * Returns a human-readable representation of an array of parameters. - * This properly handles binary data by returning a hex representation. - * - * @param array $params - * - * @return string - */ - private static function formatParameters(array $params) - { - return '[' . implode(', ', array_map(function($param) { - $json = @json_encode($param); - - if (! is_string($json) || $json == 'null' && is_string($param)) { - // JSON encoding failed, this is not a UTF-8 string. - return '"\x' . implode('\x', str_split(bin2hex($param), 2)) . '"'; - } - - return $json; - }, $params)) . ']'; - } - - public static function invalidWrapperClass($wrapperClass) - { - return new self("The given 'wrapperClass' ".$wrapperClass." has to be a ". - "subtype of \Doctrine\DBAL\Connection."); - } - - public static function invalidDriverClass($driverClass) - { - return new self("The given 'driverClass' ".$driverClass." has to implement the ". - "\Doctrine\DBAL\Driver interface."); - } - - /** - * @param string $tableName - * @return DBALException - */ - public static function invalidTableName($tableName) - { - return new self("Invalid table name specified: ".$tableName); - } - - /** - * @param string $tableName - * @return DBALException - */ - public static function noColumnsSpecifiedForTable($tableName) - { - return new self("No columns specified for table ".$tableName); - } - - public static function limitOffsetInvalid() - { - return new self("Invalid Offset in Limit Query, it has to be larger or equal to 0."); - } - - public static function typeExists($name) - { - return new self('Type '.$name.' already exists.'); - } - - public static function unknownColumnType($name) - { - return new self('Unknown column type "'.$name.'" requested. Any Doctrine type that you use has ' . - 'to be registered with \Doctrine\DBAL\Types\Type::addType(). You can get a list of all the ' . - 'known types with \Doctrine\DBAL\Types\Type::getTypeMap(). If this error occurs during database ' . - 'introspection then you might have forgot to register all database types for a Doctrine Type. Use ' . - 'AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement ' . - 'Type#getMappedDatabaseTypes(). If the type name is empty you might ' . - 'have a problem with the cache or forgot some mapping information.' - ); - } - - public static function typeNotFound($name) - { - return new self('Type to be overwritten '.$name.' does not exist.'); - } -} diff --git a/framework/library/Doctrine/DBAL/Driver.php b/framework/library/Doctrine/DBAL/Driver.php deleted file mode 100644 index 8364990..0000000 --- a/framework/library/Doctrine/DBAL/Driver.php +++ /dev/null @@ -1,72 +0,0 @@ -. - */ - -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\Schema\AbstractSchemaManager - */ - 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); -} diff --git a/framework/library/Doctrine/DBAL/Driver/Connection.php b/framework/library/Doctrine/DBAL/Driver/Connection.php deleted file mode 100644 index a618487..0000000 --- a/framework/library/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(); -} diff --git a/framework/library/Doctrine/DBAL/Driver/DrizzlePDOMySql/Connection.php b/framework/library/Doctrine/DBAL/Driver/DrizzlePDOMySql/Connection.php deleted file mode 100644 index 2b46c99..0000000 --- a/framework/library/Doctrine/DBAL/Driver/DrizzlePDOMySql/Connection.php +++ /dev/null @@ -1,41 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\DrizzlePDOMySql; - -/** - * @author Kim Hemsø Rasmussen - */ -class Connection extends \Doctrine\DBAL\Driver\PDOConnection -{ - /** - * {@inheritdoc} - */ - public function quote($value, $type=\PDO::PARAM_STR) - { - if (\PDO::PARAM_BOOL === $type) { - if ($value) { - return 'true'; - } else { - return 'false'; - } - } - return parent::quote($value, $type); - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/DrizzlePDOMySql/Driver.php b/framework/library/Doctrine/DBAL/Driver/DrizzlePDOMySql/Driver.php deleted file mode 100644 index 8030bbc..0000000 --- a/framework/library/Doctrine/DBAL/Driver/DrizzlePDOMySql/Driver.php +++ /dev/null @@ -1,99 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\DrizzlePDOMySql; - -/** - * Drizzle driver using PDO MySql. - * - * @author Kim Hemsø Rasmussen - */ -class Driver implements \Doctrine\DBAL\Driver -{ - /** - * {@inheritdoc} - */ - public function connect(array $params, $username = null, $password = null, array $driverOptions = array()) - { - $conn = new Connection( - $this->_constructPdoDsn($params), - $username, - $password, - $driverOptions - ); - return $conn; - } - - /** - * Constructs the Drizzle MySql PDO DSN. - * - * @return string The DSN. - */ - private function _constructPdoDsn(array $params) - { - $dsn = 'mysql:'; - if (isset($params['host']) && $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; - } - - /** - * {@inheritdoc} - */ - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\DrizzlePlatform(); - } - - /** - * {@inheritdoc} - */ - public function getSchemaManager(\Doctrine\DBAL\Connection $conn) - { - return new \Doctrine\DBAL\Schema\DrizzleSchemaManager($conn); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'drizzle_pdo_mysql'; - } - - /** - * {@inheritdoc} - */ - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return $params['dbname']; - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/IBMDB2/DB2Connection.php b/framework/library/Doctrine/DBAL/Driver/IBMDB2/DB2Connection.php deleted file mode 100644 index c1c2212..0000000 --- a/framework/library/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()); - } - } - - public function prepare($sql) - { - $stmt = @db2_prepare($this->_conn, $sql); - if ( ! $stmt) { - throw new DB2Exception(db2_stmt_errormsg()); - } - return new DB2Statement($stmt); - } - - public function query() - { - $args = func_get_args(); - $sql = $args[0]; - $stmt = $this->prepare($sql); - $stmt->execute(); - return $stmt; - } - - public function quote($input, $type=\PDO::PARAM_STR) - { - $input = db2_escape_string($input); - if ($type == \PDO::PARAM_INT ) { - return $input; - } else { - return "'".$input."'"; - } - } - - public function exec($statement) - { - $stmt = $this->prepare($statement); - $stmt->execute(); - return $stmt->rowCount(); - } - - public function lastInsertId($name = null) - { - return db2_last_insert_id($this->_conn); - } - - public function beginTransaction() - { - db2_autocommit($this->_conn, DB2_AUTOCOMMIT_OFF); - } - - public function commit() - { - if (!db2_commit($this->_conn)) { - throw new DB2Exception(db2_conn_errormsg($this->_conn)); - } - db2_autocommit($this->_conn, DB2_AUTOCOMMIT_ON); - } - - public function rollBack() - { - if (!db2_rollback($this->_conn)) { - throw new DB2Exception(db2_conn_errormsg($this->_conn)); - } - db2_autocommit($this->_conn, DB2_AUTOCOMMIT_ON); - } - - public function errorCode() - { - return db2_conn_error($this->_conn); - } - - public function errorInfo() - { - return array( - 0 => db2_conn_errormsg($this->_conn), - 1 => $this->errorCode(), - ); - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/IBMDB2/DB2Driver.php b/framework/library/Doctrine/DBAL/Driver/IBMDB2/DB2Driver.php deleted file mode 100644 index 82c71e5..0000000 --- a/framework/library/Doctrine/DBAL/Driver/IBMDB2/DB2Driver.php +++ /dev/null @@ -1,111 +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['protocol'])) { - $params['protocol'] = 'TCPIP'; - } - - 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'] . - ';PROTOCOL=' . $params['protocol'] . - ';UID=' . $username . - ';PWD=' . $password .';'; - if (isset($params['port'])) { - $params['dbname'] .= 'PORT=' . $params['port']; - } - - $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\Schema\DB2SchemaManager - */ - 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/framework/library/Doctrine/DBAL/Driver/IBMDB2/DB2Exception.php b/framework/library/Doctrine/DBAL/Driver/IBMDB2/DB2Exception.php deleted file mode 100644 index 3d07658..0000000 --- a/framework/library/Doctrine/DBAL/Driver/IBMDB2/DB2Exception.php +++ /dev/null @@ -1,27 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Driver\IBMDB2; - -class DB2Exception extends \Exception -{ - -} diff --git a/framework/library/Doctrine/DBAL/Driver/IBMDB2/DB2Statement.php b/framework/library/Doctrine/DBAL/Driver/IBMDB2/DB2Statement.php deleted file mode 100644 index 9a43f9f..0000000 --- a/framework/library/Doctrine/DBAL/Driver/IBMDB2/DB2Statement.php +++ /dev/null @@ -1,214 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Driver\IBMDB2; - -use \Doctrine\DBAL\Driver\Statement; - -class DB2Statement implements \IteratorAggregate, Statement -{ - private $_stmt = null; - - private $_bindParam = array(); - - private $_defaultFetchMode = \PDO::FETCH_BOTH; - - /** - * DB2_BINARY, DB2_CHAR, DB2_DOUBLE, or DB2_LONG - * @var array - */ - static private $_typeMap = array( - \PDO::PARAM_INT => DB2_LONG, - \PDO::PARAM_STR => DB2_CHAR, - ); - - public function __construct($stmt) - { - $this->_stmt = $stmt; - } - - /** - * {@inheritdoc} - */ - public function bindValue($param, $value, $type = null) - { - return $this->bindParam($param, $value, $type); - } - - /** - * {@inheritdoc} - */ - public function bindParam($column, &$variable, $type = null, $length = 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; - } - - /** - * {@inheritdoc} - */ - public 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; - } - - /** - * {@inheritdoc} - */ - public function columnCount() - { - if ( ! $this->_stmt) { - return false; - } - return db2_num_fields($this->_stmt); - } - - /** - * {@inheritdoc} - */ - public function errorCode() - { - return db2_stmt_error(); - } - - /** - * {@inheritdoc} - */ - public function errorInfo() - { - return array( - 0 => db2_stmt_errormsg(), - 1 => db2_stmt_error(), - ); - } - - /** - * {@inheritdoc} - */ - public 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; - } - - /** - * {@inheritdoc} - */ - public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null) - { - $this->_defaultFetchMode = $fetchMode; - } - - /** - * {@inheritdoc} - */ - public function getIterator() - { - $data = $this->fetchAll(); - return new \ArrayIterator($data); - } - - /** - * {@inheritdoc} - */ - public function fetch($fetchMode = null) - { - $fetchMode = $fetchMode ?: $this->_defaultFetchMode; - switch ($fetchMode) { - 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 " . $fetchMode . " is not supported."); - } - } - - /** - * {@inheritdoc} - */ - public function fetchAll($fetchMode = null) - { - $rows = array(); - while ($row = $this->fetch($fetchMode)) { - $rows[] = $row; - } - return $rows; - } - - /** - * {@inheritdoc} - */ - public function fetchColumn($columnIndex = 0) - { - $row = $this->fetch(\PDO::FETCH_NUM); - if ($row && isset($row[$columnIndex])) { - return $row[$columnIndex]; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function rowCount() - { - return (@db2_num_rows($this->_stmt))?:0; - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/Mysqli/Driver.php b/framework/library/Doctrine/DBAL/Driver/Mysqli/Driver.php deleted file mode 100644 index 60defba..0000000 --- a/framework/library/Doctrine/DBAL/Driver/Mysqli/Driver.php +++ /dev/null @@ -1,69 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\Mysqli; - -use Doctrine\DBAL\Driver as DriverInterface; - -/** - * @author Kim Hemsø Rasmussen - */ -class Driver implements DriverInterface -{ - /** - * {@inheritdoc} - */ - public function connect(array $params, $username = null, $password = null, array $driverOptions = array()) - { - return new MysqliConnection($params, $username, $password, $driverOptions); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'mysqli'; - } - - /** - * {@inheritdoc} - */ - public function getSchemaManager(\Doctrine\DBAL\Connection $conn) - { - return new \Doctrine\DBAL\Schema\MySqlSchemaManager($conn); - } - - /** - * {@inheritdoc} - */ - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\MySqlPlatform(); - } - - /** - * {@inheritdoc} - */ - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return $params['dbname']; - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/Mysqli/MysqliConnection.php b/framework/library/Doctrine/DBAL/Driver/Mysqli/MysqliConnection.php deleted file mode 100644 index 7ffa2ca..0000000 --- a/framework/library/Doctrine/DBAL/Driver/Mysqli/MysqliConnection.php +++ /dev/null @@ -1,146 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\Mysqli; - -use Doctrine\DBAL\Driver\Connection as Connection; - -/** - * @author Kim Hemsø Rasmussen - */ -class MysqliConnection implements Connection -{ - /** - * @var \mysqli - */ - private $_conn; - - public function __construct(array $params, $username, $password, array $driverOptions = array()) - { - $port = isset($params['port']) ? $params['port'] : ini_get('mysqli.default_port'); - $socket = isset($params['unix_socket']) ? $params['unix_socket'] : ini_get('mysqli.default_socket'); - - $this->_conn = mysqli_init(); - if ( ! $this->_conn->real_connect($params['host'], $username, $password, $params['dbname'], $port, $socket)) { - throw new MysqliException($this->_conn->connect_error, $this->_conn->connect_errno); - } - - if (isset($params['charset'])) { - $this->_conn->set_charset($params['charset']); - } - } - - /** - * Retrieve mysqli native resource handle. - * - * Could be used if part of your application is not using DBAL - * - * @return \mysqli - */ - public function getWrappedResourceHandle() - { - return $this->_conn; - } - - /** - * {@inheritdoc} - */ - public function prepare($prepareString) - { - return new MysqliStatement($this->_conn, $prepareString); - } - - /** - * {@inheritdoc} - */ - public function query() - { - $args = func_get_args(); - $sql = $args[0]; - $stmt = $this->prepare($sql); - $stmt->execute(); - return $stmt; - } - - /** - * {@inheritdoc} - */ - public function quote($input, $type=\PDO::PARAM_STR) - { - return "'". $this->_conn->escape_string($input) ."'"; - } - - /** - * {@inheritdoc} - */ - public function exec($statement) - { - $this->_conn->query($statement); - return $this->_conn->affected_rows; - } - - /** - * {@inheritdoc} - */ - public function lastInsertId($name = null) - { - return $this->_conn->insert_id; - } - - /** - * {@inheritdoc} - */ - public function beginTransaction() - { - $this->_conn->query('START TRANSACTION'); - return true; - } - - /** - * {@inheritdoc} - */ - public function commit() - { - return $this->_conn->commit(); - } - - /** - * {@inheritdoc}non-PHPdoc) - */ - public function rollBack() - { - return $this->_conn->rollback(); - } - - /** - * {@inheritdoc} - */ - public function errorCode() - { - return $this->_conn->errno; - } - - /** - * {@inheritdoc} - */ - public function errorInfo() - { - return $this->_conn->error; - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/Mysqli/MysqliException.php b/framework/library/Doctrine/DBAL/Driver/Mysqli/MysqliException.php deleted file mode 100644 index 139ce8f..0000000 --- a/framework/library/Doctrine/DBAL/Driver/Mysqli/MysqliException.php +++ /dev/null @@ -1,26 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Driver\Mysqli; - -/** - * @author Kim Hemsø Rasmussen - */ -class MysqliException extends \Exception -{} diff --git a/framework/library/Doctrine/DBAL/Driver/Mysqli/MysqliStatement.php b/framework/library/Doctrine/DBAL/Driver/Mysqli/MysqliStatement.php deleted file mode 100644 index 2eaa8fd..0000000 --- a/framework/library/Doctrine/DBAL/Driver/Mysqli/MysqliStatement.php +++ /dev/null @@ -1,342 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\Mysqli; - -use Doctrine\DBAL\Driver\Statement; -use PDO; - -/** - * @author Kim Hemsø Rasmussen - */ -class MysqliStatement implements \IteratorAggregate, Statement -{ - protected static $_paramTypeMap = array( - PDO::PARAM_STR => 's', - PDO::PARAM_BOOL => 'i', - PDO::PARAM_NULL => 's', - PDO::PARAM_INT => 'i', - PDO::PARAM_LOB => 's' // TODO Support LOB bigger then max package size. - ); - - protected $_conn; - protected $_stmt; - - /** - * @var null|false|array - */ - protected $_columnNames; - - /** - * @var null|array - */ - protected $_rowBindedValues; - - /** - * @var array - */ - protected $_bindedValues; - - /** - * Contains ref values for bindValue() - * - * @var array - */ - protected $_values = array(); - - protected $_defaultFetchMode = PDO::FETCH_BOTH; - - public function __construct(\mysqli $conn, $prepareString) - { - $this->_conn = $conn; - $this->_stmt = $conn->prepare($prepareString); - if (false === $this->_stmt) { - throw new MysqliException($this->_conn->error, $this->_conn->errno); - } - - $paramCount = $this->_stmt->param_count; - if (0 < $paramCount) { - // Index 0 is types - // Need to init the string else php think we are trying to access it as a array. - $bindedValues = array(0 => str_repeat('s', $paramCount)); - $null = null; - for ($i = 1; $i < $paramCount; $i++) { - $bindedValues[] =& $null; - } - $this->_bindedValues = $bindedValues; - } - } - - /** - * {@inheritdoc} - */ - public function bindParam($column, &$variable, $type = null, $length = null) - { - if (null === $type) { - $type = 's'; - } else { - if (isset(self::$_paramTypeMap[$type])) { - $type = self::$_paramTypeMap[$type]; - } else { - throw new MysqliException("Unkown type: '{$type}'"); - } - } - - $this->_bindedValues[$column] =& $variable; - $this->_bindedValues[0][$column - 1] = $type; - return true; - } - - /** - * {@inheritdoc} - */ - public function bindValue($param, $value, $type = null) - { - if (null === $type) { - $type = 's'; - } else { - if (isset(self::$_paramTypeMap[$type])) { - $type = self::$_paramTypeMap[$type]; - } else { - throw new MysqliException("Unknown type: '{$type}'"); - } - } - - $this->_values[$param] = $value; - $this->_bindedValues[$param] =& $this->_values[$param]; - $this->_bindedValues[0][$param - 1] = $type; - return true; - } - - /** - * {@inheritdoc} - */ - public function execute($params = null) - { - if (null !== $this->_bindedValues) { - if (null !== $params) { - if ( ! $this->_bindValues($params)) { - throw new MysqliException($this->_stmt->error, $this->_stmt->errno); - } - } else { - if (!call_user_func_array(array($this->_stmt, 'bind_param'), $this->_bindedValues)) { - throw new MysqliException($this->_stmt->error, $this->_stmt->errno); - } - } - } - - if ( ! $this->_stmt->execute()) { - throw new MysqliException($this->_stmt->error, $this->_stmt->errno); - } - - if (null === $this->_columnNames) { - $meta = $this->_stmt->result_metadata(); - if (false !== $meta) { - $columnNames = array(); - foreach ($meta->fetch_fields() as $col) { - $columnNames[] = $col->name; - } - $meta->free(); - - $this->_columnNames = $columnNames; - $this->_rowBindedValues = array_fill(0, count($columnNames), NULL); - - $refs = array(); - foreach ($this->_rowBindedValues as $key => &$value) { - $refs[$key] =& $value; - } - - if (!call_user_func_array(array($this->_stmt, 'bind_result'), $refs)) { - throw new MysqliException($this->_stmt->error, $this->_stmt->errno); - } - } else { - $this->_columnNames = false; - } - } - - // We have a result. - if (false !== $this->_columnNames) { - $this->_stmt->store_result(); - } - return true; - } - - /** - * Bind a array of values to bound parameters - * - * @param array $values - * @return boolean - */ - private function _bindValues($values) - { - $params = array(); - $types = str_repeat('s', count($values)); - $params[0] = $types; - - foreach ($values as &$v) { - $params[] =& $v; - } - return call_user_func_array(array($this->_stmt, 'bind_param'), $params); - } - - /** - * @return boolean|array - */ - private function _fetch() - { - $ret = $this->_stmt->fetch(); - - if (true === $ret) { - $values = array(); - foreach ($this->_rowBindedValues as $v) { - // Mysqli converts them to a scalar type it can fit in. - $values[] = null === $v ? null : (string)$v; - } - return $values; - } - return $ret; - } - - /** - * {@inheritdoc} - */ - public function fetch($fetchMode = null) - { - $values = $this->_fetch(); - if (null === $values) { - return null; - } - - if (false === $values) { - throw new MysqliException($this->_stmt->error, $this->_stmt->errno); - } - - $fetchMode = $fetchMode ?: $this->_defaultFetchMode; - - switch ($fetchMode) { - case PDO::FETCH_NUM: - return $values; - - case PDO::FETCH_ASSOC: - return array_combine($this->_columnNames, $values); - - case PDO::FETCH_BOTH: - $ret = array_combine($this->_columnNames, $values); - $ret += $values; - return $ret; - - default: - throw new MysqliException("Unknown fetch type '{$fetchMode}'"); - } - } - - /** - * {@inheritdoc} - */ - public function fetchAll($fetchMode = null) - { - $fetchMode = $fetchMode ?: $this->_defaultFetchMode; - - $rows = array(); - if (PDO::FETCH_COLUMN == $fetchMode) { - while (($row = $this->fetchColumn()) !== false) { - $rows[] = $row; - } - } else { - while (($row = $this->fetch($fetchMode)) !== null) { - $rows[] = $row; - } - } - - return $rows; - } - - /** - * {@inheritdoc} - */ - public function fetchColumn($columnIndex = 0) - { - $row = $this->fetch(PDO::FETCH_NUM); - if (null === $row) { - return false; - } - return $row[$columnIndex]; - } - - /** - * {@inheritdoc} - */ - public function errorCode() - { - return $this->_stmt->errno; - } - - /** - * {@inheritdoc} - */ - public function errorInfo() - { - return $this->_stmt->error; - } - - /** - * {@inheritdoc} - */ - public function closeCursor() - { - $this->_stmt->free_result(); - return true; - } - - /** - * {@inheritdoc} - */ - public function rowCount() - { - if (false === $this->_columnNames) { - return $this->_stmt->affected_rows; - } - return $this->_stmt->num_rows; - } - - /** - * {@inheritdoc} - */ - public function columnCount() - { - return $this->_stmt->field_count; - } - - /** - * {@inheritdoc} - */ - public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null) - { - $this->_defaultFetchMode = $fetchMode; - } - - /** - * {@inheritdoc} - */ - public function getIterator() - { - $data = $this->fetchAll(); - return new \ArrayIterator($data); - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/OCI8/Driver.php b/framework/library/Doctrine/DBAL/Driver/OCI8/Driver.php deleted file mode 100644 index d512610..0000000 --- a/framework/library/Doctrine/DBAL/Driver/OCI8/Driver.php +++ /dev/null @@ -1,99 +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), - isset($params['charset']) ? $params['charset'] : null, - isset($params['sessionMode']) ? $params['sessionMode'] : OCI_DEFAULT, - isset($params['persistent']) ? $params['persistent'] : false - ); - } - - /** - * Constructs the Oracle DSN. - * - * @return string The DSN. - */ - protected function _constructDsn(array $params) - { - $dsn = ''; - if (isset($params['host']) && $params['host'] != '') { - $dsn .= '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)' . - '(HOST=' . $params['host'] . ')'; - - if (isset($params['port'])) { - $dsn .= '(PORT=' . $params['port'] . ')'; - } else { - $dsn .= '(PORT=1521)'; - } - - if (isset($params['service']) && $params['service'] == true) { - $dsn .= '))(CONNECT_DATA=(SERVICE_NAME=' . $params['dbname'] . '))'; - } else { - $dsn .= '))(CONNECT_DATA=(SID=' . $params['dbname'] . '))'; - } - if (isset($params['pooled']) && $params['pooled'] == true) { - $dsn .= '(SERVER=POOLED)'; - } - $dsn .= ')'; - } else { - $dsn .= $params['dbname']; - } - 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']; - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/OCI8/OCI8Connection.php b/framework/library/Doctrine/DBAL/Driver/OCI8/OCI8Connection.php deleted file mode 100644 index bc74787..0000000 --- a/framework/library/Doctrine/DBAL/Driver/OCI8/OCI8Connection.php +++ /dev/null @@ -1,200 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\OCI8; - -use Doctrine\DBAL\Platforms\OraclePlatform; - -/** - * OCI8 implementation of the Connection interface. - * - * @since 2.0 - */ -class OCI8Connection implements \Doctrine\DBAL\Driver\Connection -{ - /** - * @var resource - */ - protected $dbh; - - /** - * @var int - */ - protected $executeMode = OCI_COMMIT_ON_SUCCESS; - - /** - * Create a Connection to an Oracle Database using oci8 extension. - * - * @param string $username - * @param string $password - * @param string $db - */ - public function __construct($username, $password, $db, $charset = null, $sessionMode = OCI_DEFAULT, $persistent = false) - { - if (!defined('OCI_NO_AUTO_COMMIT')) { - define('OCI_NO_AUTO_COMMIT', 0); - } - - $this->dbh = $persistent - ? @oci_pconnect($username, $password, $db, $charset, $sessionMode) - : @oci_connect($username, $password, $db, $charset, $sessionMode); - - if ( ! $this->dbh) { - throw OCI8Exception::fromErrorInfo(oci_error()); - } - } - - /** - * Create a non-executed prepared statement. - * - * @param string $prepareString - * @return OCI8Statement - */ - public function prepare($prepareString) - { - return new OCI8Statement($this->dbh, $prepareString, $this); - } - - /** - * @param string $sql - * @return OCI8Statement - */ - public function query() - { - $args = func_get_args(); - $sql = $args[0]; - //$fetchMode = $args[1]; - $stmt = $this->prepare($sql); - $stmt->execute(); - return $stmt; - } - - /** - * Quote input value. - * - * @param mixed $input - * @param int $type PDO::PARAM* - * @return mixed - */ - public function quote($value, $type=\PDO::PARAM_STR) - { - if (is_int($value) || is_float($value)) { - return $value; - } - $value = str_replace("'", "''", $value); - return "'" . addcslashes($value, "\000\n\r\\\032") . "'"; - } - - /** - * - * @param string $statement - * @return int - */ - public function exec($statement) - { - $stmt = $this->prepare($statement); - $stmt->execute(); - return $stmt->rowCount(); - } - - /** - * {@inheritDoc} - */ - public function lastInsertId($name = null) - { - if ($name === null) { - return false; - } - - OraclePlatform::assertValidIdentifier($name); - - $sql = 'SELECT ' . $name . '.CURRVAL FROM DUAL'; - $stmt = $this->query($sql); - $result = $stmt->fetch(\PDO::FETCH_ASSOC); - - if ($result === false || !isset($result['CURRVAL'])) { - throw new OCI8Exception("lastInsertId failed: Query was executed but no result was returned."); - } - - return (int) $result['CURRVAL']; - } - - /** - * Return the current execution mode. - */ - public function getExecuteMode() - { - return $this->executeMode; - } - - /** - * Start a transactiom - * - * Oracle has to explicitly set the autocommit mode off. That means - * after connection, a commit or rollback there is always automatically - * opened a new transaction. - * - * @return bool - */ - public function beginTransaction() - { - $this->executeMode = OCI_NO_AUTO_COMMIT; - return true; - } - - /** - * @throws OCI8Exception - * @return bool - */ - public function commit() - { - if (!oci_commit($this->dbh)) { - throw OCI8Exception::fromErrorInfo($this->errorInfo()); - } - $this->executeMode = OCI_COMMIT_ON_SUCCESS; - return true; - } - - /** - * @throws OCI8Exception - * @return bool - */ - public function rollBack() - { - if (!oci_rollback($this->dbh)) { - throw OCI8Exception::fromErrorInfo($this->errorInfo()); - } - $this->executeMode = OCI_COMMIT_ON_SUCCESS; - 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); - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/OCI8/OCI8Exception.php b/framework/library/Doctrine/DBAL/Driver/OCI8/OCI8Exception.php deleted file mode 100644 index adeb13f..0000000 --- a/framework/library/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/framework/library/Doctrine/DBAL/Driver/OCI8/OCI8Statement.php b/framework/library/Doctrine/DBAL/Driver/OCI8/OCI8Statement.php deleted file mode 100644 index 8bf3121..0000000 --- a/framework/library/Doctrine/DBAL/Driver/OCI8/OCI8Statement.php +++ /dev/null @@ -1,268 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\OCI8; - -use PDO; -use IteratorAggregate; -use Doctrine\DBAL\Driver\Statement; - -/** - * The OCI8 implementation of the Statement interface. - * - * @since 2.0 - * @author Roman Borschel - */ -class OCI8Statement implements \IteratorAggregate, Statement -{ - /** Statement handle. */ - protected $_dbh; - protected $_sth; - protected $_conn; - protected static $_PARAM = ':param'; - protected static $fetchModeMap = array( - PDO::FETCH_BOTH => OCI_BOTH, - PDO::FETCH_ASSOC => OCI_ASSOC, - PDO::FETCH_NUM => OCI_NUM, - PDO::PARAM_LOB => OCI_B_BLOB, - PDO::FETCH_COLUMN => OCI_NUM, - ); - protected $_defaultFetchMode = PDO::FETCH_BOTH; - protected $_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, OCI8Connection $conn) - { - list($statement, $paramMap) = self::convertPositionalToNamedPlaceholders($statement); - $this->_sth = oci_parse($dbh, $statement); - $this->_dbh = $dbh; - $this->_paramMap = $paramMap; - $this->_conn = $conn; - } - - /** - * Convert positional (?) into named placeholders (:param) - * - * 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. - * - * The algorithm uses a state machine with two possible states: InLiteral and NotInLiteral. - * Question marks inside literal strings are therefore handled correctly by this method. - * This comes at a cost, the whole sql statement has to be looped over. - * - * @todo extract into utility class in Doctrine\DBAL\Util namespace - * @todo review and test for lost spaces. we experienced missing spaces with oci8 in some sql statements. - * @param string $statement The SQL statement to convert. - * @return string - */ - static public function convertPositionalToNamedPlaceholders($statement) - { - $count = 1; - $inLiteral = false; // a valid query never starts with quotes - $stmtLen = strlen($statement); - $paramMap = array(); - for ($i = 0; $i < $stmtLen; $i++) { - if ($statement[$i] == '?' && !$inLiteral) { - // real positional parameter detected - $paramMap[$count] = ":param$count"; - $len = strlen($paramMap[$count]); - $statement = substr_replace($statement, ":param$count", $i, 1); - $i += $len-1; // jump ahead - $stmtLen = strlen($statement); // adjust statement length - ++$count; - } else if ($statement[$i] == "'" || $statement[$i] == '"') { - $inLiteral = ! $inLiteral; // switch state! - } - } - - return array($statement, $paramMap); - } - - /** - * {@inheritdoc} - */ - public function bindValue($param, $value, $type = null) - { - return $this->bindParam($param, $value, $type, null); - } - - /** - * {@inheritdoc} - */ - public function bindParam($column, &$variable, $type = null,$length = null) - { - $column = isset($this->_paramMap[$column]) ? $this->_paramMap[$column] : $column; - - if ($type == \PDO::PARAM_LOB) { - $lob = oci_new_descriptor($this->_dbh, OCI_D_LOB); - $lob->writeTemporary($variable, OCI_TEMP_BLOB); - - return oci_bind_by_name($this->_sth, $column, $lob, -1, OCI_B_BLOB); - } else { - 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 = array_key_exists(0, $params); - 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, $this->_conn->getExecuteMode()); - if ( ! $ret) { - throw OCI8Exception::fromErrorInfo($this->errorInfo()); - } - return $ret; - } - - /** - * {@inheritdoc} - */ - public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null) - { - $this->_defaultFetchMode = $fetchMode; - } - - /** - * {@inheritdoc} - */ - public function getIterator() - { - $data = $this->fetchAll(); - return new \ArrayIterator($data); - } - - /** - * {@inheritdoc} - */ - public function fetch($fetchMode = null) - { - $fetchMode = $fetchMode ?: $this->_defaultFetchMode; - if ( ! isset(self::$fetchModeMap[$fetchMode])) { - throw new \InvalidArgumentException("Invalid fetch style: " . $fetchMode); - } - - return oci_fetch_array($this->_sth, self::$fetchModeMap[$fetchMode] | OCI_RETURN_NULLS | OCI_RETURN_LOBS); - } - - /** - * {@inheritdoc} - */ - public function fetchAll($fetchMode = null) - { - $fetchMode = $fetchMode ?: $this->_defaultFetchMode; - if ( ! isset(self::$fetchModeMap[$fetchMode])) { - throw new \InvalidArgumentException("Invalid fetch style: " . $fetchMode); - } - - $result = array(); - if (self::$fetchModeMap[$fetchMode] === OCI_BOTH) { - while ($row = $this->fetch($fetchMode)) { - $result[] = $row; - } - } else { - $fetchStructure = OCI_FETCHSTATEMENT_BY_ROW; - if ($fetchMode == PDO::FETCH_COLUMN) { - $fetchStructure = OCI_FETCHSTATEMENT_BY_COLUMN; - } - - oci_fetch_all($this->_sth, $result, 0, -1, - self::$fetchModeMap[$fetchMode] | OCI_RETURN_NULLS | $fetchStructure | OCI_RETURN_LOBS); - - if ($fetchMode == PDO::FETCH_COLUMN) { - $result = $result[0]; - } - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function fetchColumn($columnIndex = 0) - { - $row = oci_fetch_array($this->_sth, OCI_NUM | OCI_RETURN_NULLS | OCI_RETURN_LOBS); - return isset($row[$columnIndex]) ? $row[$columnIndex] : false; - } - - /** - * {@inheritdoc} - */ - public function rowCount() - { - return oci_num_rows($this->_sth); - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/PDOConnection.php b/framework/library/Doctrine/DBAL/Driver/PDOConnection.php deleted file mode 100644 index 4595e5a..0000000 --- a/framework/library/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); - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/PDOIbm/Driver.php b/framework/library/Doctrine/DBAL/Driver/PDOIbm/Driver.php deleted file mode 100644 index de30757..0000000 --- a/framework/library/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\Schema\DB2SchemaManager - */ - 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']; - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/PDOMySql/Driver.php b/framework/library/Doctrine/DBAL/Driver/PDOMySql/Driver.php deleted file mode 100644 index eeb6727..0000000 --- a/framework/library/Doctrine/DBAL/Driver/PDOMySql/Driver.php +++ /dev/null @@ -1,102 +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']) && $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'] . ';'; - } - if (isset($params['charset'])) { - $dsn .= 'charset=' . $params['charset'] . ';'; - } - - 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(); - - if (isset($params['dbname'])) { - return $params['dbname']; - } - return $conn->query('SELECT DATABASE()')->fetchColumn(); - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/PDOOracle/Driver.php b/framework/library/Doctrine/DBAL/Driver/PDOOracle/Driver.php deleted file mode 100644 index cb2e6b0..0000000 --- a/framework/library/Doctrine/DBAL/Driver/PDOOracle/Driver.php +++ /dev/null @@ -1,98 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\PDOOracle; - -use Doctrine\DBAL\Platforms; - -/** - * PDO Oracle driver - * - * WARNING: This driver gives us segfauls in our testsuites on CLOB and other - * stuff. PDO Oracle is not maintained by Oracle or anyone in the PHP community, - * which leads us to the recommendation to use the "oci8" driver to connect - * to Oracle instead. - */ -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']) && $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)'; - } - - if (isset($params['service']) && $params['service'] == true) { - $dsn .= '))(CONNECT_DATA=(SERVICE_NAME=' . $params['dbname'] . ')))'; - } else { - $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']; - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/PDOPgSql/Driver.php b/framework/library/Doctrine/DBAL/Driver/PDOPgSql/Driver.php deleted file mode 100644 index 951406d..0000000 --- a/framework/library/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']) && $params['host'] != '') { - $dsn .= 'host=' . $params['host'] . ' '; - } - if (isset($params['port']) && $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']; - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/PDOSqlite/Driver.php b/framework/library/Doctrine/DBAL/Driver/PDOSqlite/Driver.php deleted file mode 100644 index 903d999..0000000 --- a/framework/library/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 \Doctrine\DBAL\Driver\PDOConnection - */ - 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; - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/PDOSqlsrv/Connection.php b/framework/library/Doctrine/DBAL/Driver/PDOSqlsrv/Connection.php deleted file mode 100644 index 01a5769..0000000 --- a/framework/library/Doctrine/DBAL/Driver/PDOSqlsrv/Connection.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\PDOSqlsrv; - -/** - * Sqlsrv Connection implementation. - * - * @since 2.0 - */ -class Connection extends \Doctrine\DBAL\Driver\PDOConnection implements \Doctrine\DBAL\Driver\Connection -{ - /** - * @override - */ - public function quote($value, $type=\PDO::PARAM_STR) - { - $val = parent::quote($value, $type); - - // Fix for a driver version terminating all values with null byte - if (strpos($val, "\0") !== false) { - $val = substr($val, 0, -1); - } - - return $val; - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/PDOSqlsrv/Driver.php b/framework/library/Doctrine/DBAL/Driver/PDOSqlsrv/Driver.php deleted file mode 100644 index 7072b5f..0000000 --- a/framework/library/Doctrine/DBAL/Driver/PDOSqlsrv/Driver.php +++ /dev/null @@ -1,87 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\PDOSqlsrv; - -/** - * The PDO-based Sqlsrv 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 Sqlsrv PDO DSN. - * - * @return string The DSN. - */ - private function _constructPdoDsn(array $params) - { - $dsn = 'sqlsrv:server='; - - if (isset($params['host'])) { - $dsn .= $params['host']; - } - - if (isset($params['port']) && !empty($params['port'])) { - $dsn .= ',' . $params['port']; - } - - if (isset($params['dbname'])) {; - $dsn .= ';Database=' . $params['dbname']; - } - - if (isset($params['MultipleActiveResultSets'])) { - $dsn .= '; MultipleActiveResultSets=' . ($params['MultipleActiveResultSets'] ? 'true' : 'false'); - } - - return $dsn; - } - - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\SQLServer2008Platform(); - } - - public function getSchemaManager(\Doctrine\DBAL\Connection $conn) - { - return new \Doctrine\DBAL\Schema\SQLServerSchemaManager($conn); - } - - public function getName() - { - return 'pdo_sqlsrv'; - } - - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return $params['dbname']; - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/PDOStatement.php b/framework/library/Doctrine/DBAL/Driver/PDOStatement.php deleted file mode 100644 index 2673ae9..0000000 --- a/framework/library/Doctrine/DBAL/Driver/PDOStatement.php +++ /dev/null @@ -1,50 +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() {} - - public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null) - { - // This thin wrapper is necessary to shield against the weird signature - // of PDOStatement::setFetchMode(): even if the second and third - // parameters are optional, PHP will not let us remove it from this - // declaration. - if ($arg2 === null && $arg3 === null) { - return parent::setFetchMode($fetchMode); - } - - if ($arg3 === null) { - return parent::setFetchMode($fetchMode, $arg2); - } - - return parent::setFetchMode($fetchMode, $arg2, $arg3); - } -} diff --git a/framework/library/Doctrine/DBAL/Driver/ResultStatement.php b/framework/library/Doctrine/DBAL/Driver/ResultStatement.php deleted file mode 100644 index 561dc35..0000000 --- a/framework/library/Doctrine/DBAL/Driver/ResultStatement.php +++ /dev/null @@ -1,93 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver; - -use PDO; - -/** - * Interface for the reading part of a prepare statement only. - * - * @author Benjamin Eberlei - */ -interface ResultStatement extends \Traversable -{ - /** - * 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(); - - /** - * setFetchMode - * Set the fetch mode to use while iterating this statement. - * - * @param integer $fetchMode - */ - function setFetchMode($fetchMode, $arg2 = null, $arg3 = null); - - /** - * fetch - * - * @see Query::HYDRATE_* constants - * @param integer $fetchMode 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 - * - * @return mixed - */ - function fetch($fetchMode = null); - - /** - * Returns an array containing all of the result set rows - * - * @param integer $fetchMode 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 - * - * @return array - */ - function fetchAll($fetchMode = null); - - /** - * 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); -} - diff --git a/framework/library/Doctrine/DBAL/Driver/SQLSrv/Driver.php b/framework/library/Doctrine/DBAL/Driver/SQLSrv/Driver.php deleted file mode 100644 index c7043cc..0000000 --- a/framework/library/Doctrine/DBAL/Driver/SQLSrv/Driver.php +++ /dev/null @@ -1,72 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\SQLSrv; - -/** - * Driver for ext/sqlsrv - */ -class Driver implements \Doctrine\DBAL\Driver -{ - public function connect(array $params, $username = null, $password = null, array $driverOptions = array()) - { - if (!isset($params['host'])) { - throw new SQLSrvException("Missing 'host' in configuration for sqlsrv driver."); - } - if (!isset($params['dbname'])) { - throw new SQLSrvException("Missing 'dbname' in configuration for sqlsrv driver."); - } - - $serverName = $params['host']; - if (isset($params['port'])) { - $serverName .= ', ' . $params['port']; - } - $driverOptions['Database'] = $params['dbname']; - $driverOptions['UID'] = $username; - $driverOptions['PWD'] = $password; - - if (!isset($driverOptions['ReturnDatesAsStrings'])) { - $driverOptions['ReturnDatesAsStrings'] = 1; - } - - return new SQLSrvConnection($serverName, $driverOptions); - } - - public function getDatabasePlatform() - { - return new \Doctrine\DBAL\Platforms\SQLServer2008Platform(); - } - - public function getSchemaManager(\Doctrine\DBAL\Connection $conn) - { - return new \Doctrine\DBAL\Schema\SQLServerSchemaManager($conn); - } - - public function getName() - { - return 'sqlsrv'; - } - - public function getDatabase(\Doctrine\DBAL\Connection $conn) - { - $params = $conn->getParams(); - return $params['dbname']; - } -} - diff --git a/framework/library/Doctrine/DBAL/Driver/SQLSrv/LastInsertId.php b/framework/library/Doctrine/DBAL/Driver/SQLSrv/LastInsertId.php deleted file mode 100644 index 421d071..0000000 --- a/framework/library/Doctrine/DBAL/Driver/SQLSrv/LastInsertId.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\SQLSrv; - -/** - * Last Id Data Container - * - * @since 2.3 - * @author Benjamin Eberlei - */ -class LastInsertId -{ - private $id; - - public function setId($id) - { - $this->id = $id; - } - - public function getId() - { - return $this->id; - } -} - diff --git a/framework/library/Doctrine/DBAL/Driver/SQLSrv/SQLSrvConnection.php b/framework/library/Doctrine/DBAL/Driver/SQLSrv/SQLSrvConnection.php deleted file mode 100644 index 82544ca..0000000 --- a/framework/library/Doctrine/DBAL/Driver/SQLSrv/SQLSrvConnection.php +++ /dev/null @@ -1,161 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\SQLSrv; - -/** - * SQL Server implementation for the Connection interface. - * - * @since 2.3 - * @author Benjamin Eberlei - */ -class SQLSrvConnection implements \Doctrine\DBAL\Driver\Connection -{ - /** - * @var resource - */ - protected $conn; - - /** - * @var LastInsertId - */ - protected $lastInsertId; - - - public function __construct($serverName, $connectionOptions) - { - $this->conn = sqlsrv_connect($serverName, $connectionOptions); - if ( ! $this->conn) { - throw SQLSrvException::fromSqlSrvErrors(); - } - $this->lastInsertId = new LastInsertId(); - } - - /** - * {@inheritDoc} - */ - public function prepare($sql) - { - return new SQLSrvStatement($this->conn, $sql, $this->lastInsertId); - } - - /** - * {@inheritDoc} - */ - public function query() - { - $args = func_get_args(); - $sql = $args[0]; - $stmt = $this->prepare($sql); - $stmt->execute(); - return $stmt; - } - - /** - * {@inheritDoc} - * @license New BSD, code from Zend Framework - */ - public function quote($value, $type=\PDO::PARAM_STR) - { - if (is_int($value)) { - return $value; - } else if (is_float($value)) { - return sprintf('%F', $value); - } - - return "'" . str_replace("'", "''", $value) . "'"; - } - - /** - * {@inheritDoc} - */ - public function exec($statement) - { - $stmt = $this->prepare($statement); - $stmt->execute(); - return $stmt->rowCount(); - } - - /** - * {@inheritDoc} - */ - public function lastInsertId($name = null) - { - if ($name !== null) { - $sql = "SELECT IDENT_CURRENT(".$this->quote($name).") AS LastInsertId"; - $stmt = $this->prepare($sql); - $stmt->execute(); - - return $stmt->fetchColumn(); - } - - return $this->lastInsertId->getId(); - } - - /** - * {@inheritDoc} - */ - public function beginTransaction() - { - if ( ! sqlsrv_begin_transaction($this->conn)) { - throw SQLSrvException::fromSqlSrvErrors(); - } - } - - /** - * {@inheritDoc} - */ - public function commit() - { - if ( ! sqlsrv_commit($this->conn)) { - throw SQLSrvException::fromSqlSrvErrors(); - } - } - - /** - * {@inheritDoc} - */ - public function rollBack() - { - if ( ! sqlsrv_rollback($this->conn)) { - throw SQLSrvException::fromSqlSrvErrors(); - } - } - - /** - * {@inheritDoc} - */ - public function errorCode() - { - $errors = sqlsrv_errors(SQLSRV_ERR_ERRORS); - if ($errors) { - return $errors[0]['code']; - } - return false; - } - - /** - * {@inheritDoc} - */ - public function errorInfo() - { - return sqlsrv_errors(SQLSRV_ERR_ERRORS); - } -} - diff --git a/framework/library/Doctrine/DBAL/Driver/SQLSrv/SQLSrvException.php b/framework/library/Doctrine/DBAL/Driver/SQLSrv/SQLSrvException.php deleted file mode 100644 index 6777877..0000000 --- a/framework/library/Doctrine/DBAL/Driver/SQLSrv/SQLSrvException.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\SQLSrv; - -class SQLSrvException extends \Doctrine\DBAL\DBALException -{ - /** - * Helper method to turn sql server errors into exception. - * - * @return SQLSrvException - */ - static public function fromSqlSrvErrors() - { - $errors = sqlsrv_errors(SQLSRV_ERR_ERRORS); - $message = ""; - foreach ($errors as $error) { - $message .= "SQLSTATE [".$error['SQLSTATE'].", ".$error['code']."]: ". $error['message']."\n"; - } - if ( ! $message) { - $message = "SQL Server error occured but no error message was retrieved from driver."; - } - - return new self(rtrim($message)); - } -} - diff --git a/framework/library/Doctrine/DBAL/Driver/SQLSrv/SQLSrvStatement.php b/framework/library/Doctrine/DBAL/Driver/SQLSrv/SQLSrvStatement.php deleted file mode 100644 index 76a156b..0000000 --- a/framework/library/Doctrine/DBAL/Driver/SQLSrv/SQLSrvStatement.php +++ /dev/null @@ -1,251 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Driver\SQLSrv; - -use PDO; -use IteratorAggregate; -use Doctrine\DBAL\Driver\Statement; - -/** - * SQL Server Statement - * - * @since 2.3 - * @author Benjamin Eberlei - */ -class SQLSrvStatement implements IteratorAggregate, Statement -{ - /** - * SQLSRV Resource - * - * @var resource - */ - private $conn; - - /** - * SQL Statement to execute - * - * @var string - */ - private $sql; - - /** - * SQLSRV Statement Resource - * - * @var resource - */ - private $stmt; - - /** - * Parameters to bind - * - * @var array - */ - private $params = array(); - - /** - * Translations - * - * @var array - */ - private static $fetchMap = array( - PDO::FETCH_BOTH => SQLSRV_FETCH_BOTH, - PDO::FETCH_ASSOC => SQLSRV_FETCH_ASSOC, - PDO::FETCH_NUM => SQLSRV_FETCH_NUMERIC, - ); - - /** - * Fetch Style - * - * @param int - */ - private $defaultFetchMode = PDO::FETCH_BOTH; - - /** - * @var int|null - */ - private $lastInsertId; - - /** - * Append to any INSERT query to retrieve the last insert id. - * - * @var string - */ - const LAST_INSERT_ID_SQL = ';SELECT SCOPE_IDENTITY() AS LastInsertId;'; - - public function __construct($conn, $sql, $lastInsertId = null) - { - $this->conn = $conn; - $this->sql = $sql; - - if (stripos($sql, 'INSERT INTO ') === 0) { - $this->sql .= self::LAST_INSERT_ID_SQL; - $this->lastInsertId = $lastInsertId; - } - } - - public function bindValue($param, $value, $type = null) - { - return $this->bindParam($param, $value, $type,null); - } - - /** - * {@inheritdoc} - */ - public function bindParam($column, &$variable, $type = null, $length = null) - { - if (!is_numeric($column)) { - throw new SQLSrvException("sqlsrv does not support named parameters to queries, use question mark (?) placeholders instead."); - } - - if ($type === \PDO::PARAM_LOB) { - $this->params[$column-1] = array($variable, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY), SQLSRV_SQLTYPE_VARBINARY('max')); - } else { - $this->params[$column-1] = $variable; - } - } - - public function closeCursor() - { - if ($this->stmt) { - sqlsrv_free_stmt($this->stmt); - } - } - - public function columnCount() - { - return sqlsrv_num_fields($this->stmt); - } - - /** - * {@inheritDoc} - */ - public function errorCode() - { - $errors = sqlsrv_errors(SQLSRV_ERR_ERRORS); - if ($errors) { - return $errors[0]['code']; - } - return false; - } - - /** - * {@inheritDoc} - */ - public function errorInfo() - { - return sqlsrv_errors(SQLSRV_ERR_ERRORS); - } - - public function execute($params = null) - { - if ($params) { - $hasZeroIndex = array_key_exists(0, $params); - foreach ($params as $key => $val) { - $key = ($hasZeroIndex && is_numeric($key)) ? $key + 1 : $key; - $this->bindValue($key, $val); - } - } - - $this->stmt = sqlsrv_query($this->conn, $this->sql, $this->params); - if ( ! $this->stmt) { - throw SQLSrvException::fromSqlSrvErrors(); - } - - if ($this->lastInsertId) { - sqlsrv_next_result($this->stmt); - sqlsrv_fetch($this->stmt); - $this->lastInsertId->setId( sqlsrv_get_field($this->stmt, 0) ); - } - } - - public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null) - { - $this->defaultFetchMode = $fetchMode; - } - - /** - * {@inheritdoc} - */ - public function getIterator() - { - $data = $this->fetchAll(); - return new \ArrayIterator($data); - } - - /** - * {@inheritdoc} - */ - public function fetch($fetchMode = null) - { - $fetchMode = $fetchMode ?: $this->defaultFetchMode; - if (isset(self::$fetchMap[$fetchMode])) { - return sqlsrv_fetch_array($this->stmt, self::$fetchMap[$fetchMode]); - } else if ($fetchMode == PDO::FETCH_OBJ || $fetchMode == PDO::FETCH_CLASS) { - $className = null; - $ctorArgs = null; - if (func_num_args() >= 2) { - $args = func_get_args(); - $className = $args[1]; - $ctorArgs = (isset($args[2])) ? $args[2] : array(); - } - return sqlsrv_fetch_object($this->stmt, $className, $ctorArgs); - } - - throw new SQLSrvException("Fetch mode is not supported!"); - } - - /** - * {@inheritdoc} - */ - public function fetchAll($fetchMode = null) - { - $className = null; - $ctorArgs = null; - if (func_num_args() >= 2) { - $args = func_get_args(); - $className = $args[1]; - $ctorArgs = (isset($args[2])) ? $args[2] : array(); - } - - $rows = array(); - while ($row = $this->fetch($fetchMode, $className, $ctorArgs)) { - $rows[] = $row; - } - return $rows; - } - - /** - * {@inheritdoc} - */ - public function fetchColumn($columnIndex = 0) - { - $row = $this->fetch(PDO::FETCH_NUM); - return $row[$columnIndex]; - } - - /** - * {@inheritdoc} - */ - public function rowCount() - { - return sqlsrv_rows_affected($this->stmt); - } -} - diff --git a/framework/library/Doctrine/DBAL/Driver/Statement.php b/framework/library/Doctrine/DBAL/Driver/Statement.php deleted file mode 100644 index 718614d..0000000 --- a/framework/library/Doctrine/DBAL/Driver/Statement.php +++ /dev/null @@ -1,125 +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 - */ -interface Statement extends ResultStatement -{ - /** - * 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 $column 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. - * @param integer $length You must specify maxlength when using an OUT bind so that PHP allocates enough memory to hold the returned value. - * @return boolean Returns TRUE on success or FALSE on failure. - */ - function bindParam($column, &$variable, $type = null, $length = null); - - /** - * 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); - - /** - * 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(); -} diff --git a/framework/library/Doctrine/DBAL/DriverManager.php b/framework/library/Doctrine/DBAL/DriverManager.php deleted file mode 100644 index 7cdde95..0000000 --- a/framework/library/Doctrine/DBAL/DriverManager.php +++ /dev/null @@ -1,176 +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. - * - * To add your own driver use the 'driverClass' parameter to - * {@link DriverManager::getConnection()}. - * - * @var array - */ - 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', - 'oci8' => 'Doctrine\DBAL\Driver\OCI8\Driver', - 'ibm_db2' => 'Doctrine\DBAL\Driver\IBMDB2\DB2Driver', - 'pdo_ibm' => 'Doctrine\DBAL\Driver\PDOIbm\Driver', - 'pdo_sqlsrv' => 'Doctrine\DBAL\Driver\PDOSqlsrv\Driver', - 'mysqli' => 'Doctrine\DBAL\Driver\Mysqli\Driver', - 'drizzle_pdo_mysql' => 'Doctrine\DBAL\Driver\DrizzlePDOMySql\Driver', - 'sqlsrv' => 'Doctrine\DBAL\Driver\SQLSrv\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_oci (unstable) - * pdo_sqlsrv - * pdo_ibm (unstable) - * pdo_sqlsrv - * mysqli - * sqlsrv - * ibm_db2 (unstable) - * drizzle_pdo_mysql - * - * 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. - * - * driverClass: - * The driver class to use. - * - * @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['pdo']->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - $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']); - } - } -} diff --git a/framework/library/Doctrine/DBAL/Event/ConnectionEventArgs.php b/framework/library/Doctrine/DBAL/Event/ConnectionEventArgs.php deleted file mode 100644 index f4cb1cd..0000000 --- a/framework/library/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/framework/library/Doctrine/DBAL/Event/Listeners/MysqlSessionInit.php b/framework/library/Doctrine/DBAL/Event/Listeners/MysqlSessionInit.php deleted file mode 100644 index fc22744..0000000 --- a/framework/library/Doctrine/DBAL/Event/Listeners/MysqlSessionInit.php +++ /dev/null @@ -1,74 +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 - * @deprecated Use "charset" option to PDO MySQL Connection instead. - */ -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); - } -} diff --git a/framework/library/Doctrine/DBAL/Event/Listeners/OracleSessionInit.php b/framework/library/Doctrine/DBAL/Event/Listeners/OracleSessionInit.php deleted file mode 100644 index 8355403..0000000 --- a/framework/library/Doctrine/DBAL/Event/Listeners/OracleSessionInit.php +++ /dev/null @@ -1,80 +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 HH24:MI:SS" - * 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 2.0 - * @author Benjamin Eberlei - */ -class OracleSessionInit implements EventSubscriber -{ - protected $_defaultSessionVars = array( - 'NLS_TIME_FORMAT' => "HH24:MI:SS", - 'NLS_DATE_FORMAT' => "YYYY-MM-DD HH24:MI:SS", - 'NLS_TIMESTAMP_FORMAT' => "YYYY-MM-DD HH24:MI:SS", - 'NLS_TIMESTAMP_TZ_FORMAT' => "YYYY-MM-DD HH24:MI:SS TZH:TZM", - 'NLS_NUMERIC_CHARACTERS' => ".,", - ); - - /** - * @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/framework/library/Doctrine/DBAL/Event/Listeners/SQLSessionInit.php b/framework/library/Doctrine/DBAL/Event/Listeners/SQLSessionInit.php deleted file mode 100644 index 8dfde62..0000000 --- a/framework/library/Doctrine/DBAL/Event/Listeners/SQLSessionInit.php +++ /dev/null @@ -1,63 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event\Listeners; - -use Doctrine\DBAL\Event\ConnectionEventArgs; -use Doctrine\DBAL\Events; -use Doctrine\Common\EventSubscriber; - -/** - * Session init listener for executing a single SQL statement right after a connection is opened. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Benjamin Eberlei - */ -class SQLSessionInit implements EventSubscriber -{ - /** - * @var string - */ - protected $sql; - - /** - * @param string $sql - */ - public function __construct($sql) - { - $this->sql = $sql; - } - - /** - * @param ConnectionEventArgs $args - * @return void - */ - public function postConnect(ConnectionEventArgs $args) - { - $conn = $args->getConnection(); - $conn->exec($this->sql); - } - - public function getSubscribedEvents() - { - return array(Events::postConnect); - } -} diff --git a/framework/library/Doctrine/DBAL/Event/SchemaAlterTableAddColumnEventArgs.php b/framework/library/Doctrine/DBAL/Event/SchemaAlterTableAddColumnEventArgs.php deleted file mode 100644 index 0200ce7..0000000 --- a/framework/library/Doctrine/DBAL/Event/SchemaAlterTableAddColumnEventArgs.php +++ /dev/null @@ -1,114 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\Schema\Column, - Doctrine\DBAL\Schema\TableDiff; - -/** - * Event Arguments used when SQL queries for adding table columns are generated inside Doctrine\DBAL\Platform\*Platform. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Jan Sorgalla - */ -class SchemaAlterTableAddColumnEventArgs extends SchemaEventArgs -{ - /** - * @var \Doctrine\DBAL\Schema\Column - */ - private $_column = null; - - /** - * @var \Doctrine\DBAL\Schema\TableDiff - */ - private $_tableDiff = null; - - /** - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $_platform = null; - - /** - * @var array - */ - private $_sql = array(); - - /** - * @param \Doctrine\DBAL\Schema\Column $column - * @param \Doctrine\DBAL\Schema\TableDiff $tableDiff - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - */ - public function __construct(Column $column, TableDiff $tableDiff, AbstractPlatform $platform) - { - $this->_column = $column; - $this->_tableDiff = $tableDiff; - $this->_platform = $platform; - } - - /** - * @return \Doctrine\DBAL\Schema\Column - */ - public function getColumn() - { - return $this->_column; - } - - /** - * @return \Doctrine\DBAL\Schema\TableDiff - */ - public function getTableDiff() - { - return $this->_tableDiff; - } - - /** - * @return \Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getPlatform() - { - return $this->_platform; - } - - /** - * @param string|array $sql - * @return \Doctrine\DBAL\Event\SchemaAlterTableAddColumnEventArgs - */ - public function addSql($sql) - { - if (is_array($sql)) { - $this->_sql = array_merge($this->_sql, $sql); - } else { - $this->_sql[] = $sql; - } - - return $this; - } - - /** - * @return array - */ - public function getSql() - { - return $this->_sql; - } -} diff --git a/framework/library/Doctrine/DBAL/Event/SchemaAlterTableChangeColumnEventArgs.php b/framework/library/Doctrine/DBAL/Event/SchemaAlterTableChangeColumnEventArgs.php deleted file mode 100644 index bd59d7d..0000000 --- a/framework/library/Doctrine/DBAL/Event/SchemaAlterTableChangeColumnEventArgs.php +++ /dev/null @@ -1,114 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\Schema\ColumnDiff, - Doctrine\DBAL\Schema\TableDiff; - -/** - * Event Arguments used when SQL queries for changing table columns are generated inside Doctrine\DBAL\Platform\*Platform. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Jan Sorgalla - */ -class SchemaAlterTableChangeColumnEventArgs extends SchemaEventArgs -{ - /** - * @var \Doctrine\DBAL\Schema\ColumnDiff - */ - private $_columnDiff = null; - - /** - * @var \Doctrine\DBAL\Schema\TableDiff - */ - private $_tableDiff = null; - - /** - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $_platform = null; - - /** - * @var array - */ - private $_sql = array(); - - /** - * @param \Doctrine\DBAL\Schema\ColumnDiff $columnDiff - * @param \Doctrine\DBAL\Schema\TableDiff $tableDiff - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - */ - public function __construct(ColumnDiff $columnDiff, TableDiff $tableDiff, AbstractPlatform $platform) - { - $this->_columnDiff = $columnDiff; - $this->_tableDiff = $tableDiff; - $this->_platform = $platform; - } - - /** - * @return \Doctrine\DBAL\Schema\ColumnDiff - */ - public function getColumnDiff() - { - return $this->_columnDiff; - } - - /** - * @return \Doctrine\DBAL\Schema\TableDiff - */ - public function getTableDiff() - { - return $this->_tableDiff; - } - - /** - * @return \Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getPlatform() - { - return $this->_platform; - } - - /** - * @param string|array $sql - * @return \Doctrine\DBAL\Event\SchemaAlterTableChangeColumnEventArgs - */ - public function addSql($sql) - { - if (is_array($sql)) { - $this->_sql = array_merge($this->_sql, $sql); - } else { - $this->_sql[] = $sql; - } - - return $this; - } - - /** - * @return array - */ - public function getSql() - { - return $this->_sql; - } -} diff --git a/framework/library/Doctrine/DBAL/Event/SchemaAlterTableEventArgs.php b/framework/library/Doctrine/DBAL/Event/SchemaAlterTableEventArgs.php deleted file mode 100644 index 9f85338..0000000 --- a/framework/library/Doctrine/DBAL/Event/SchemaAlterTableEventArgs.php +++ /dev/null @@ -1,99 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\Schema\Column, - Doctrine\DBAL\Schema\TableDiff; - -/** - * Event Arguments used when SQL queries for creating tables are generated inside Doctrine\DBAL\Platform\*Platform. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Jan Sorgalla - */ -class SchemaAlterTableEventArgs extends SchemaEventArgs -{ - /** - * @var \Doctrine\DBAL\Schema\TableDiff - */ - private $_tableDiff = null; - - /** - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $_platform = null; - - /** - * @var array - */ - private $_sql = array(); - - /** - * @param \Doctrine\DBAL\Schema\TableDiff $tableDiff - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - */ - public function __construct(TableDiff $tableDiff, AbstractPlatform $platform) - { - $this->_tableDiff = $tableDiff; - $this->_platform = $platform; - } - - /** - * @return \Doctrine\DBAL\Schema\TableDiff - */ - public function getTableDiff() - { - return $this->_tableDiff; - } - - /** - * @return \Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getPlatform() - { - return $this->_platform; - } - - /** - * @param string|array $sql - * @return \Doctrine\DBAL\Event\SchemaAlterTableEventArgs - */ - public function addSql($sql) - { - if (is_array($sql)) { - $this->_sql = array_merge($this->_sql, $sql); - } else { - $this->_sql[] = $sql; - } - - return $this; - } - - /** - * @return array - */ - public function getSql() - { - return $this->_sql; - } -} diff --git a/framework/library/Doctrine/DBAL/Event/SchemaAlterTableRemoveColumnEventArgs.php b/framework/library/Doctrine/DBAL/Event/SchemaAlterTableRemoveColumnEventArgs.php deleted file mode 100644 index 4b981f8..0000000 --- a/framework/library/Doctrine/DBAL/Event/SchemaAlterTableRemoveColumnEventArgs.php +++ /dev/null @@ -1,114 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\Schema\Column, - Doctrine\DBAL\Schema\TableDiff; - -/** - * Event Arguments used when SQL queries for removing table columns are generated inside Doctrine\DBAL\Platform\*Platform. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Jan Sorgalla - */ -class SchemaAlterTableRemoveColumnEventArgs extends SchemaEventArgs -{ - /** - * @var \Doctrine\DBAL\Schema\Column - */ - private $_column = null; - - /** - * @var \Doctrine\DBAL\Schema\TableDiff - */ - private $_tableDiff = null; - - /** - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $_platform = null; - - /** - * @var array - */ - private $_sql = array(); - - /** - * @param \Doctrine\DBAL\Schema\Column $column - * @param \Doctrine\DBAL\Schema\TableDiff $tableDiff - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - */ - public function __construct(Column $column, TableDiff $tableDiff, AbstractPlatform $platform) - { - $this->_column = $column; - $this->_tableDiff = $tableDiff; - $this->_platform = $platform; - } - - /** - * @return \Doctrine\DBAL\Schema\Column - */ - public function getColumn() - { - return $this->_column; - } - - /** - * @return \Doctrine\DBAL\Schema\TableDiff - */ - public function getTableDiff() - { - return $this->_tableDiff; - } - - /** - * @return \Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getPlatform() - { - return $this->_platform; - } - - /** - * @param string|array $sql - * @return \Doctrine\DBAL\Event\SchemaAlterTableRemoveColumnEventArgs - */ - public function addSql($sql) - { - if (is_array($sql)) { - $this->_sql = array_merge($this->_sql, $sql); - } else { - $this->_sql[] = $sql; - } - - return $this; - } - - /** - * @return array - */ - public function getSql() - { - return $this->_sql; - } -} diff --git a/framework/library/Doctrine/DBAL/Event/SchemaAlterTableRenameColumnEventArgs.php b/framework/library/Doctrine/DBAL/Event/SchemaAlterTableRenameColumnEventArgs.php deleted file mode 100644 index 90e6a38..0000000 --- a/framework/library/Doctrine/DBAL/Event/SchemaAlterTableRenameColumnEventArgs.php +++ /dev/null @@ -1,129 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\Schema\Column, - Doctrine\DBAL\Schema\TableDiff; - -/** - * Event Arguments used when SQL queries for renaming table columns are generated inside Doctrine\DBAL\Platform\*Platform. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Jan Sorgalla - */ -class SchemaAlterTableRenameColumnEventArgs extends SchemaEventArgs -{ - /** - * @var string - */ - private $_oldColumnName = null; - - /** - * @var \Doctrine\DBAL\Schema\Column - */ - private $_column = null; - - /** - * @var \Doctrine\DBAL\Schema\TableDiff - */ - private $_tableDiff = null; - - /** - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $_platform = null; - - /** - * @var array - */ - private $_sql = array(); - - /** - * @param string $oldColumnName - * @param \Doctrine\DBAL\Schema\Column $column - * @param \Doctrine\DBAL\Schema\TableDiff $tableDiff - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - */ - public function __construct($oldColumnName, Column $column, TableDiff $tableDiff, AbstractPlatform $platform) - { - $this->_oldColumnName = $oldColumnName; - $this->_column = $column; - $this->_tableDiff = $tableDiff; - $this->_platform = $platform; - } - - /** - * @return string - */ - public function getOldColumnName() - { - return $this->_oldColumnName; - } - - /** - * @return \Doctrine\DBAL\Schema\Column - */ - public function getColumn() - { - return $this->_column; - } - - /** - * @return \Doctrine\DBAL\Schema\TableDiff - */ - public function getTableDiff() - { - return $this->_tableDiff; - } - - /** - * @return \Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getPlatform() - { - return $this->_platform; - } - - /** - * @param string|array $sql - * @return \Doctrine\DBAL\Event\SchemaAlterTableRenameColumnEventArgs - */ - public function addSql($sql) - { - if (is_array($sql)) { - $this->_sql = array_merge($this->_sql, $sql); - } else { - $this->_sql[] = $sql; - } - - return $this; - } - - /** - * @return array - */ - public function getSql() - { - return $this->_sql; - } -} diff --git a/framework/library/Doctrine/DBAL/Event/SchemaColumnDefinitionEventArgs.php b/framework/library/Doctrine/DBAL/Event/SchemaColumnDefinitionEventArgs.php deleted file mode 100644 index fecb015..0000000 --- a/framework/library/Doctrine/DBAL/Event/SchemaColumnDefinitionEventArgs.php +++ /dev/null @@ -1,137 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\DBAL\Connection, - Doctrine\DBAL\Schema\Column; - -/** - * Event Arguments used when the portable column definition is generated inside Doctrine\DBAL\Schema\AbstractSchemaManager. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Jan Sorgalla - */ -class SchemaColumnDefinitionEventArgs extends SchemaEventArgs -{ - /** - * @var \Doctrine\DBAL\Schema\Column - */ - private $_column = null; - - /** - * Raw column data as fetched from the database - * - * @var array - */ - private $_tableColumn = null; - - /** - * @var string - */ - private $_table = null; - - /** - * @var string - */ - private $_database = null; - - /** - * @var \Doctrine\DBAL\Connection - */ - private $_connection = null; - - /** - * @param array $tableColumn - * @param string $table - * @param string $database - * @param \Doctrine\DBAL\Connection $conn - */ - public function __construct(array $tableColumn, $table, $database, Connection $connection) - { - $this->_tableColumn = $tableColumn; - $this->_table = $table; - $this->_database = $database; - $this->_connection = $connection; - } - - /** - * Allows to clear the column which means the column will be excluded from - * tables column list. - * - * @param null|\Doctrine\DBAL\Schema\Column $column - * @return SchemaColumnDefinitionEventArgs - */ - public function setColumn(Column $column = null) - { - $this->_column = $column; - - return $this; - } - - /** - * @return \Doctrine\DBAL\Schema\Column - */ - public function getColumn() - { - return $this->_column; - } - - /** - * @return array - */ - public function getTableColumn() - { - return $this->_tableColumn; - } - - /** - * @return string - */ - public function getTable() - { - return $this->_table; - } - - /** - * @return string - */ - public function getDatabase() - { - return $this->_database; - } - - /** - * @return \Doctrine\DBAL\Connection - */ - public function getConnection() - { - return $this->_connection; - } - - /** - * @return \Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getDatabasePlatform() - { - return $this->_connection->getDatabasePlatform(); - } -} diff --git a/framework/library/Doctrine/DBAL/Event/SchemaCreateTableColumnEventArgs.php b/framework/library/Doctrine/DBAL/Event/SchemaCreateTableColumnEventArgs.php deleted file mode 100644 index 5e7383c..0000000 --- a/framework/library/Doctrine/DBAL/Event/SchemaCreateTableColumnEventArgs.php +++ /dev/null @@ -1,114 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\Schema\Column, - Doctrine\DBAL\Schema\Table; - -/** - * Event Arguments used when SQL queries for creating table columns are generated inside Doctrine\DBAL\Platform\AbstractPlatform. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Jan Sorgalla - */ -class SchemaCreateTableColumnEventArgs extends SchemaEventArgs -{ - /** - * @var \Doctrine\DBAL\Schema\Column - */ - private $_column = null; - - /** - * @var \Doctrine\DBAL\Schema\Table - */ - private $_table = null; - - /** - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $_platform = null; - - /** - * @var array - */ - private $_sql = array(); - - /** - * @param \Doctrine\DBAL\Schema\Column $column - * @param \Doctrine\DBAL\Schema\Table $table - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - */ - public function __construct(Column $column, Table $table, AbstractPlatform $platform) - { - $this->_column = $column; - $this->_table = $table; - $this->_platform = $platform; - } - - /** - * @return \Doctrine\DBAL\Schema\Column - */ - public function getColumn() - { - return $this->_column; - } - - /** - * @return \Doctrine\DBAL\Schema\Table - */ - public function getTable() - { - return $this->_table; - } - - /** - * @return \Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getPlatform() - { - return $this->_platform; - } - - /** - * @param string|array $sql - * @return \Doctrine\DBAL\Event\SchemaCreateTableColumnEventArgs - */ - public function addSql($sql) - { - if (is_array($sql)) { - $this->_sql = array_merge($this->_sql, $sql); - } else { - $this->_sql[] = $sql; - } - - return $this; - } - - /** - * @return array - */ - public function getSql() - { - return $this->_sql; - } -} diff --git a/framework/library/Doctrine/DBAL/Event/SchemaCreateTableEventArgs.php b/framework/library/Doctrine/DBAL/Event/SchemaCreateTableEventArgs.php deleted file mode 100644 index 3149faa..0000000 --- a/framework/library/Doctrine/DBAL/Event/SchemaCreateTableEventArgs.php +++ /dev/null @@ -1,128 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\Schema\Table; - -/** - * Event Arguments used when SQL queries for creating tables are generated inside Doctrine\DBAL\Platform\AbstractPlatform. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Jan Sorgalla - */ -class SchemaCreateTableEventArgs extends SchemaEventArgs -{ - /** - * @var \Doctrine\DBAL\Schema\Table - */ - private $_table = null; - - /** - * @var array - */ - private $_columns = null; - - /** - * @var array - */ - private $_options = null; - - /** - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $_platform = null; - - /** - * @var array - */ - private $_sql = array(); - - /** - * @param \Doctrine\DBAL\Schema\Table $table - * @param array $columns - * @param array $options - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - */ - public function __construct(Table $table, array $columns, array $options, AbstractPlatform $platform) - { - $this->_table = $table; - $this->_columns = $columns; - $this->_options = $options; - $this->_platform = $platform; - } - - /** - * @return \Doctrine\DBAL\Schema\Table - */ - public function getTable() - { - return $this->_table; - } - - /** - * @return array - */ - public function getColumns() - { - return $this->_columns; - } - - /** - * @return array - */ - public function getOptions() - { - return $this->_options; - } - - /** - * @return \Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getPlatform() - { - return $this->_platform; - } - - /** - * @param string|array $sql - * @return \Doctrine\DBAL\Event\SchemaCreateTableEventArgs - */ - public function addSql($sql) - { - if (is_array($sql)) { - $this->_sql = array_merge($this->_sql, $sql); - } else { - $this->_sql[] = $sql; - } - - return $this; - } - - /** - * @return array - */ - public function getSql() - { - return $this->_sql; - } -} diff --git a/framework/library/Doctrine/DBAL/Event/SchemaDropTableEventArgs.php b/framework/library/Doctrine/DBAL/Event/SchemaDropTableEventArgs.php deleted file mode 100644 index 55133be..0000000 --- a/framework/library/Doctrine/DBAL/Event/SchemaDropTableEventArgs.php +++ /dev/null @@ -1,98 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\DBAL\Platforms\AbstractPlatform, - Doctrine\DBAL\Schema\Table; - -/** - * Event Arguments used when the SQL query for dropping tables are generated inside Doctrine\DBAL\Platform\AbstractPlatform. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Jan Sorgalla - */ -class SchemaDropTableEventArgs extends SchemaEventArgs -{ - /** - * @var string|\Doctrine\DBAL\Schema\Table - */ - private $_table = null; - - /** - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $_platform = null; - - /** - * @var string - */ - private $_sql = null; - - /** - * @param string|\Doctrine\DBAL\Schema\Table $table - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - */ - public function __construct($table, AbstractPlatform $platform) - { - if ( ! $table instanceof Table && !is_string($table)) { - throw new \InvalidArgumentException('SchemaCreateTableEventArgs expects $table parameter to be string or \Doctrine\DBAL\Schema\Table.'); - } - - $this->_table = $table; - $this->_platform = $platform; - } - - /** - * @return string|\Doctrine\DBAL\Schema\Table - */ - public function getTable() - { - return $this->_table; - } - - /** - * @return \Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getPlatform() - { - return $this->_platform; - } - - /** - * @param string $sql - * @return \Doctrine\DBAL\Event\SchemaDropTableEventArgs - */ - public function setSql($sql) - { - $this->_sql = $sql; - - return $this; - } - - /** - * @return string - */ - public function getSql() - { - return $this->_sql; - } -} diff --git a/framework/library/Doctrine/DBAL/Event/SchemaEventArgs.php b/framework/library/Doctrine/DBAL/Event/SchemaEventArgs.php deleted file mode 100644 index a3509fb..0000000 --- a/framework/library/Doctrine/DBAL/Event/SchemaEventArgs.php +++ /dev/null @@ -1,56 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\Common\EventArgs; - -/** - * Base class for schema related events. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Jan Sorgalla - */ -class SchemaEventArgs extends EventArgs -{ - /** - * @var boolean - */ - private $_preventDefault = false; - - /** - * @return \Doctrine\DBAL\Event\SchemaEventArgs - */ - public function preventDefault() - { - $this->_preventDefault = true; - - return $this; - } - - /** - * @return boolean - */ - public function isDefaultPrevented() - { - return $this->_preventDefault; - } -} diff --git a/framework/library/Doctrine/DBAL/Event/SchemaIndexDefinitionEventArgs.php b/framework/library/Doctrine/DBAL/Event/SchemaIndexDefinitionEventArgs.php deleted file mode 100644 index 248d43e..0000000 --- a/framework/library/Doctrine/DBAL/Event/SchemaIndexDefinitionEventArgs.php +++ /dev/null @@ -1,122 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Event; - -use Doctrine\DBAL\Connection, - Doctrine\DBAL\Schema\Index; - -/** - * Event Arguments used when the portable index definition is generated inside Doctrine\DBAL\Schema\AbstractSchemaManager. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Jan Sorgalla - */ -class SchemaIndexDefinitionEventArgs extends SchemaEventArgs -{ - /** - * @var \Doctrine\DBAL\Schema\Index - */ - private $_index = null; - - /** - * Raw index data as fetched from the database - * - * @var array - */ - private $_tableIndex = null; - - /** - * @var string - */ - private $_table = null; - - /** - * @var \Doctrine\DBAL\Connection - */ - private $_connection = null; - - /** - * @param array $tableIndex - * @param string $table - * @param \Doctrine\DBAL\Connection $conn - */ - public function __construct(array $tableIndex, $table, Connection $connection) - { - $this->_tableIndex = $tableIndex; - $this->_table = $table; - $this->_connection = $connection; - } - - /** - * Allows to clear the index which means the index will be excluded from - * tables index list. - * - * @param null|\Doctrine\DBAL\Schema\Index $index - * @return SchemaIndexDefinitionEventArgs - */ - public function setIndex(Index $index = null) - { - $this->_index = $index; - - return $this; - } - - /** - * @return \Doctrine\DBAL\Schema\Index - */ - public function getIndex() - { - return $this->_index; - } - - /** - * @return array - */ - public function getTableIndex() - { - return $this->_tableIndex; - } - - /** - * @return string - */ - public function getTable() - { - return $this->_table; - } - - /** - * @return \Doctrine\DBAL\Connection - */ - public function getConnection() - { - return $this->_connection; - } - - /** - * @return \Doctrine\DBAL\Platforms\AbstractPlatform - */ - public function getDatabasePlatform() - { - return $this->_connection->getDatabasePlatform(); - } -} diff --git a/framework/library/Doctrine/DBAL/Events.php b/framework/library/Doctrine/DBAL/Events.php deleted file mode 100644 index 0869dd9..0000000 --- a/framework/library/Doctrine/DBAL/Events.php +++ /dev/null @@ -1,48 +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 postConnect = 'postConnect'; - - const onSchemaCreateTable = 'onSchemaCreateTable'; - const onSchemaCreateTableColumn = 'onSchemaCreateTableColumn'; - const onSchemaDropTable = 'onSchemaDropTable'; - const onSchemaAlterTable = 'onSchemaAlterTable'; - const onSchemaAlterTableAddColumn = 'onSchemaAlterTableAddColumn'; - const onSchemaAlterTableRemoveColumn = 'onSchemaAlterTableRemoveColumn'; - const onSchemaAlterTableChangeColumn = 'onSchemaAlterTableChangeColumn'; - const onSchemaAlterTableRenameColumn = 'onSchemaAlterTableRenameColumn'; - const onSchemaColumnDefinition = 'onSchemaColumnDefinition'; - const onSchemaIndexDefinition = 'onSchemaIndexDefinition'; -} diff --git a/framework/library/Doctrine/DBAL/Id/TableGenerator.php b/framework/library/Doctrine/DBAL/Id/TableGenerator.php deleted file mode 100644 index c52a40b..0000000 --- a/framework/library/Doctrine/DBAL/Id/TableGenerator.php +++ /dev/null @@ -1,160 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Id; - -use Doctrine\DBAL\DriverManager; -use Doctrine\DBAL\Connection; - -/** - * Table ID Generator for those poor languages that are missing sequences. - * - * WARNING: The Table Id Generator clones a second independent database - * connection to work correctly. This means using the generator requests that - * generate IDs will have two open database connections. This is necessary to - * be safe from transaction failures in the main connection. Make sure to only - * ever use one TableGenerator otherwise you end up with many connections. - * - * TableID Generator does not work with SQLite. - * - * The TableGenerator does not take care of creating the SQL Table itself. You - * should look at the `TableGeneratorSchemaVisitor` to do this for you. - * Otherwise the schema for a table looks like: - * - * CREATE sequences ( - * sequence_name VARCHAR(255) NOT NULL, - * sequence_value INT NOT NULL DEFAULT '1', - * sequence_increment_by INT NOT NULL DEFAULT '1', - * PRIMARY KEY (table_name) - * ); - * - * Technically this generator works as follows: - * - * 1. Use a robust transaction serialization level. - * 2. Open transaction - * 3. Acquire a read lock on the table row (SELECT .. FOR UPDATE) - * 4. Increment current value by one and write back to database - * 5. Commit transaction - * - * If you are using a sequence_increment_by value that is larger than one the - * ID Generator will keep incrementing values until it hits the incrementation - * gap before issuing another query. - * - * If no row is present for a given sequence a new one will be created with the - * default values 'value' = 1 and 'increment_by' = 1 - * - * @author Benjamin Eberlei - */ -class TableGenerator -{ - /** - * @var \Doctrine\DBAL\Connection - */ - private $conn; - - /** - * @var string - */ - private $generatorTableName; - - /** - * @var array - */ - private $sequences = array(); - - /** - * @param Connection $conn - * @param string $generatorTableName - */ - public function __construct(Connection $conn, $generatorTableName = 'sequences') - { - $params = $conn->getParams(); - if ($params['driver'] == 'pdo_sqlite') { - throw new \Doctrine\DBAL\DBALException("Cannot use TableGenerator with SQLite."); - } - $this->conn = DriverManager::getConnection($params, $conn->getConfiguration(), $conn->getEventManager()); - $this->generatorTableName = $generatorTableName; - } - - /** - * Generate the next unused value for the given sequence name - * - * @param string - * @return int - */ - public function nextValue($sequenceName) - { - if (isset($this->sequences[$sequenceName])) { - $value = $this->sequences[$sequenceName]['value']; - $this->sequences[$sequenceName]['value']++; - if ($this->sequences[$sequenceName]['value'] >= $this->sequences[$sequenceName]['max']) { - unset ($this->sequences[$sequenceName]); - } - return $value; - } - - $this->conn->beginTransaction(); - - try { - $platform = $this->conn->getDatabasePlatform(); - $sql = "SELECT sequence_value, sequence_increment_by " . - "FROM " . $platform->appendLockHint($this->generatorTableName, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE) . " " . - "WHERE sequence_name = ? " . $platform->getWriteLockSQL(); - $stmt = $this->conn->executeQuery($sql, array($sequenceName)); - - if ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { - $row = array_change_key_case($row, CASE_LOWER); - - $value = $row['sequence_value']; - $value++; - - if ($row['sequence_increment_by'] > 1) { - $this->sequences[$sequenceName] = array( - 'value' => $value, - 'max' => $row['sequence_value'] + $row['sequence_increment_by'] - ); - } - - $sql = "UPDATE " . $this->generatorTableName . " ". - "SET sequence_value = sequence_value + sequence_increment_by " . - "WHERE sequence_name = ? AND sequence_value = ?"; - $rows = $this->conn->executeUpdate($sql, array($sequenceName, $row['sequence_value'])); - - if ($rows != 1) { - throw new \Doctrine\DBAL\DBALException("Race-condition detected while updating sequence. Aborting generation"); - } - } else { - $this->conn->insert( - $this->generatorTableName, - array('sequence_name' => $sequenceName, 'sequence_value' => 1, 'sequence_increment_by' => 1) - ); - $value = 1; - } - - $this->conn->commit(); - - } catch(\Exception $e) { - $this->conn->rollback(); - throw new \Doctrine\DBAL\DBALException("Error occured while generating ID with TableGenerator, aborted generation: " . $e->getMessage(), 0, $e); - } - - return $value; - } -} - diff --git a/framework/library/Doctrine/DBAL/Id/TableGeneratorSchemaVisitor.php b/framework/library/Doctrine/DBAL/Id/TableGeneratorSchemaVisitor.php deleted file mode 100644 index e340397..0000000 --- a/framework/library/Doctrine/DBAL/Id/TableGeneratorSchemaVisitor.php +++ /dev/null @@ -1,90 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Id; - -use 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 TableGeneratorSchemaVisitor implements \Doctrine\DBAL\Schema\Visitor\Visitor -{ - /** - * @var string - */ - private $generatorTableName; - - public function __construct($generatorTableName = 'sequences') - { - $this->generatorTableName = $generatorTableName; - } - - /** - * @param Schema $schema - */ - public function acceptSchema(Schema $schema) - { - $table = $schema->createTable($this->generatorTableName); - $table->addColumn('sequence_name', 'string'); - $table->addColumn('sequence_value', 'integer', array('default' => 1)); - $table->addColumn('sequence_increment_by', 'integer', array('default' => 1)); - } - - /** - * @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) - { - } -} - diff --git a/framework/library/Doctrine/DBAL/LockMode.php b/framework/library/Doctrine/DBAL/LockMode.php deleted file mode 100644 index 52d87d2..0000000 --- a/framework/library/Doctrine/DBAL/LockMode.php +++ /dev/null @@ -1,42 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL; - -/** - * Contains all DBAL 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() { } -} diff --git a/framework/library/Doctrine/DBAL/Logging/DebugStack.php b/framework/library/Doctrine/DBAL/Logging/DebugStack.php deleted file mode 100644 index 7d70b90..0000000 --- a/framework/library/Doctrine/DBAL/Logging/DebugStack.php +++ /dev/null @@ -1,69 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Logging; - -/** - * Includes executed SQLs in a Debug Stack - * - * - * @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; - - public $start = null; - - public $currentQuery = 0; - - /** - * {@inheritdoc} - */ - public function startQuery($sql, array $params = null, array $types = null) - { - if ($this->enabled) { - $this->start = microtime(true); - $this->queries[++$this->currentQuery] = array('sql' => $sql, 'params' => $params, 'types' => $types, 'executionMS' => 0); - } - } - - /** - * {@inheritdoc} - */ - public function stopQuery() - { - if ($this->enabled) { - $this->queries[$this->currentQuery]['executionMS'] = microtime(true) - $this->start; - } - } -} - diff --git a/framework/library/Doctrine/DBAL/Logging/EchoSQLLogger.php b/framework/library/Doctrine/DBAL/Logging/EchoSQLLogger.php deleted file mode 100644 index a332258..0000000 --- a/framework/library/Doctrine/DBAL/Logging/EchoSQLLogger.php +++ /dev/null @@ -1,61 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Logging; - -/** - * A SQL logger that logs to the standard output using echo/var_dump. - * - * - * @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 startQuery($sql, array $params = null, array $types = null) - { - echo $sql . PHP_EOL; - - if ($params) { - var_dump($params); - } - - if ($types) { - var_dump($types); - } - } - - /** - * {@inheritdoc} - */ - public function stopQuery() - { - - } -} diff --git a/framework/library/Doctrine/DBAL/Logging/LoggerChain.php b/framework/library/Doctrine/DBAL/Logging/LoggerChain.php deleted file mode 100644 index 6725cc5..0000000 --- a/framework/library/Doctrine/DBAL/Logging/LoggerChain.php +++ /dev/null @@ -1,64 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Logging; - -/** - * Chains multiple SQLLogger - * - * - * @link www.doctrine-project.org - * @since 2.2 - * @author Christophe Coevoet - */ -class LoggerChain implements SQLLogger -{ - private $loggers = array(); - - /** - * Adds a logger in the chain - * - * @param SQLLogger $logger - */ - public function addLogger(SQLLogger $logger) - { - $this->loggers[] = $logger; - } - - /** - * {@inheritdoc} - */ - public function startQuery($sql, array $params = null, array $types = null) - { - foreach ($this->loggers as $logger) { - $logger->startQuery($sql, $params, $types); - } - } - - /** - * {@inheritdoc} - */ - public function stopQuery() - { - foreach ($this->loggers as $logger) { - $logger->stopQuery(); - } - } -} - diff --git a/framework/library/Doctrine/DBAL/Logging/SQLLogger.php b/framework/library/Doctrine/DBAL/Logging/SQLLogger.php deleted file mode 100644 index 9564f4c..0000000 --- a/framework/library/Doctrine/DBAL/Logging/SQLLogger.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Logging; - -/** - * Interface for SQL loggers. - * - * - * @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. - * @param array $types The SQL parameter types. - * @return void - */ - public function startQuery($sql, array $params = null, array $types = null); - - /** - * Mark the last started query as stopped. This can be used for timing of queries. - * - * @return void - */ - public function stopQuery(); -} diff --git a/framework/library/Doctrine/DBAL/Platforms/AbstractPlatform.php b/framework/library/Doctrine/DBAL/Platforms/AbstractPlatform.php deleted file mode 100644 index e53b5f6..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/AbstractPlatform.php +++ /dev/null @@ -1,2857 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\DBALException, - Doctrine\DBAL\Connection, - Doctrine\DBAL\Types, - Doctrine\DBAL\Schema\Constraint, - Doctrine\DBAL\Schema\Sequence, - Doctrine\DBAL\Schema\Table, - Doctrine\DBAL\Schema\Index, - Doctrine\DBAL\Schema\ForeignKeyConstraint, - Doctrine\DBAL\Schema\TableDiff, - Doctrine\DBAL\Schema\Column, - Doctrine\DBAL\Schema\ColumnDiff, - Doctrine\DBAL\Types\Type, - Doctrine\DBAL\Events, - Doctrine\Common\EventManager, - Doctrine\DBAL\Event\SchemaCreateTableEventArgs, - Doctrine\DBAL\Event\SchemaCreateTableColumnEventArgs, - Doctrine\DBAL\Event\SchemaDropTableEventArgs, - Doctrine\DBAL\Event\SchemaAlterTableEventArgs, - Doctrine\DBAL\Event\SchemaAlterTableAddColumnEventArgs, - Doctrine\DBAL\Event\SchemaAlterTableRemoveColumnEventArgs, - Doctrine\DBAL\Event\SchemaAlterTableChangeColumnEventArgs, - Doctrine\DBAL\Event\SchemaAlterTableRenameColumnEventArgs; - -/** - * 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. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Lukas Smith (PEAR MDB2 library) - * @author Benjamin Eberlei - * @todo Remove any unnecessary methods. - */ -abstract class AbstractPlatform -{ - /** - * @var integer - */ - const CREATE_INDEXES = 1; - - /** - * @var integer - */ - const CREATE_FOREIGNKEYS = 2; - - /** - * @var integer - */ - const TRIM_UNSPECIFIED = 0; - - /** - * @var integer - */ - const TRIM_LEADING = 1; - - /** - * @var integer - */ - const TRIM_TRAILING = 2; - - /** - * @var integer - */ - const TRIM_BOTH = 3; - - /** - * @var array - */ - protected $doctrineTypeMapping = null; - - /** - * Contains a list of all columns that should generate parseable column comments for type-detection - * in reverse engineering scenarios. - * - * @var array - */ - protected $doctrineTypeComments = null; - - /** - * @var Doctrine\Common\EventManager - */ - protected $_eventManager; - - /** - * Holds the KeywordList instance for the current platform. - * - * @var \Doctrine\DBAL\Platforms\Keywords\KeywordList - */ - protected $_keywords; - - /** - * Constructor. - */ - public function __construct() {} - - /** - * Sets the EventManager used by the Platform. - * - * @param \Doctrine\Common\EventManager - */ - public function setEventManager(EventManager $eventManager) - { - $this->_eventManager = $eventManager; - } - - /** - * Gets the EventManager used by the Platform. - * - * @return \Doctrine\Common\EventManager - */ - public function getEventManager() - { - return $this->_eventManager; - } - - /** - * 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); - - /** - * Lazy load Doctrine Type Mappings - * - * @return void - */ - abstract protected function initializeDoctrineTypeMappings(); - - /** - * Initialize Doctrine Type Mappings with the platform defaults - * and with all additional type mappings. - */ - private function initializeAllDoctrineTypeMappings() - { - $this->initializeDoctrineTypeMappings(); - - foreach (Type::getTypesMap() as $typeName => $className) { - foreach (Type::getType($typeName)->getMappedDatabaseTypes($this) as $dbType) { - $this->doctrineTypeMapping[$dbType] = $typeName; - } - } - } - - /** - * Gets the SQL snippet used to declare a VARCHAR column type. - * - * @param array $field - * - * @return string - */ - public function getVarcharTypeDeclarationSQL(array $field) - { - if ( !isset($field['length'])) { - $field['length'] = $this->getVarcharDefaultLength(); - } - - $fixed = (isset($field['fixed'])) ? $field['fixed'] : false; - - if ($field['length'] > $this->getVarcharMaxLength()) { - return $this->getClobTypeDeclarationSQL($field); - } - - return $this->getVarcharTypeDeclarationSQLSnippet($field['length'], $fixed); - } - - /** - * Get the SQL Snippet to create a GUID/UUID field. - * - * By default this maps directly to a VARCHAR and only maps to more - * special datatypes when the underlying databases support this datatype. - * - * @param array $field - * - * @return string - */ - public function getGuidTypeDeclarationSQL(array $field) - { - return $this->getVarcharTypeDeclarationSQL($field); - } - - /** - * @param integer $length - * @param boolean $fixed - * - * @return string - * - * @throws \Doctrine\DBAL\DBALException - */ - protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) - { - throw DBALException::notSupported('VARCHARs not supported by Platform.'); - } - - /** - * Gets the SQL snippet used to declare a CLOB column type. - * - * @param array $field - * - * @return string - */ - abstract public function getClobTypeDeclarationSQL(array $field); - - /** - * Gets the SQL Snippet used to declare a BLOB column type. - * - * @param array $field - * - * @return string - */ - abstract public function getBlobTypeDeclarationSQL(array $field); - - /** - * Gets the name of the platform. - * - * @return string - */ - abstract public function getName(); - - /** - * Register a doctrine type to be used in conjunction with a column type of this platform. - * - * @param string $dbType - * @param string $doctrineType - * - * @throws \Doctrine\DBAL\DBALException if the type is not found - */ - public function registerDoctrineTypeMapping($dbType, $doctrineType) - { - if ($this->doctrineTypeMapping === null) { - $this->initializeAllDoctrineTypeMappings(); - } - - if (!Types\Type::hasType($doctrineType)) { - throw DBALException::typeNotFound($doctrineType); - } - - $dbType = strtolower($dbType); - $this->doctrineTypeMapping[$dbType] = $doctrineType; - } - - /** - * Get the Doctrine type that is mapped for the given database column type. - * - * @param string $dbType - * - * @return string - */ - public function getDoctrineTypeMapping($dbType) - { - if ($this->doctrineTypeMapping === null) { - $this->initializeAllDoctrineTypeMappings(); - } - - $dbType = strtolower($dbType); - - if (!isset($this->doctrineTypeMapping[$dbType])) { - throw new \Doctrine\DBAL\DBALException("Unknown database type ".$dbType." requested, " . get_class($this) . " may not support it."); - } - - return $this->doctrineTypeMapping[$dbType]; - } - - /** - * Check if a database type is currently supported by this platform. - * - * @param string $dbType - * - * @return boolean - */ - public function hasDoctrineTypeMappingFor($dbType) - { - if ($this->doctrineTypeMapping === null) { - $this->initializeAllDoctrineTypeMappings(); - } - - $dbType = strtolower($dbType); - return isset($this->doctrineTypeMapping[$dbType]); - } - - /** - * Initialize the Doctrine Type comments instance variable for in_array() checks. - * - * @return void - */ - protected function initializeCommentedDoctrineTypes() - { - $this->doctrineTypeComments = array(); - - foreach (Type::getTypesMap() as $typeName => $className) { - $type = Type::getType($typeName); - - if ($type->requiresSQLCommentHint($this)) { - $this->doctrineTypeComments[] = $typeName; - } - } - } - - /** - * Is it necessary for the platform to add a parsable type comment to allow reverse engineering the given type? - * - * @param Type $doctrineType - * - * @return boolean - */ - public function isCommentedDoctrineType(Type $doctrineType) - { - if ($this->doctrineTypeComments === null) { - $this->initializeCommentedDoctrineTypes(); - } - - return in_array($doctrineType->getName(), $this->doctrineTypeComments); - } - - /** - * Mark this type as to be commented in ALTER TABLE and CREATE TABLE statements. - * - * @param string|Type $doctrineType - * - * @return void - */ - public function markDoctrineTypeCommented($doctrineType) - { - if ($this->doctrineTypeComments === null) { - $this->initializeCommentedDoctrineTypes(); - } - - $this->doctrineTypeComments[] = $doctrineType instanceof Type ? $doctrineType->getName() : $doctrineType; - } - - /** - * Get the comment to append to a column comment that helps parsing this type in reverse engineering. - * - * @param Type $doctrineType - * @return string - */ - public function getDoctrineTypeComment(Type $doctrineType) - { - return '(DC2Type:' . $doctrineType->getName() . ')'; - } - - /** - * Return the comment of a passed column modified by potential doctrine type comment hints. - * - * @param Column $column - * @return string - */ - protected function getColumnComment(Column $column) - { - $comment = $column->getComment(); - - if ($this->isCommentedDoctrineType($column->getType())) { - $comment .= $this->getDoctrineTypeComment($column->getType()); - } - - return $comment; - } - - /** - * 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 4000; - } - - /** - * Gets the default length of a varchar field. - * - * @return integer - */ - public function getVarcharDefaultLength() - { - 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 global unique identifier - * - * @return string to get global unique identifier - */ - public function getGuidExpression() - { - 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 - * - * @param string $column - * @return string - */ - public function getMd5Expression($column) - { - return 'MD5(' . $column . ')'; - } - - /** - * Returns the length of a text field. - * - * @param string $column - * - * @return string - */ - public function getLengthExpression($column) - { - return 'LENGTH(' . $column . ')'; - } - - /** - * Returns the squared value of a column - * - * @param string $column the column to use - * - * @return string generated sql including an SQRT aggregate function - */ - public function getSqrtExpression($column) - { - return 'SQRT(' . $column . ')'; - } - - /** - * Rounds a numeric field to the number of decimals specified. - * - * @param string $column - * @param integer $decimals - * - * @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 integer $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 ' : ''; - - switch ($pos) { - case self::TRIM_LEADING: - $posStr = 'LEADING '.$trimChar; - break; - - case self::TRIM_TRAILING: - $posStr = 'TRAILING '.$trimChar; - break; - - case self::TRIM_BOTH: - $posStr = 'BOTH '.$trimChar; - break; - } - - 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 $str literal string - * @param string $substr literal string to find - * @param integer $startPos position to start at, beginning of string by default - * - * @return string - */ - 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 $length the substring portion length - * - * @return string - */ - public function getSubstringExpression($value, $from, $length = null) - { - if ($length === null) { - return 'SUBSTRING(' . $value . ' FROM ' . $from . ')'; - } - - return 'SUBSTRING(' . $value . ' FROM ' . $from . ' FOR ' . $length . ')'; - } - - /** - * 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 concatenated. - * - * @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')); - * - * - * @param string $expression - * - * @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 $values values that will be matched against $column - * - * @return string logical expression - */ - public function getInExpression($column, $values) - { - if ( ! is_array($values)) { - $values = array($values); - } - - // TODO: fix this code: the method does not exist - $values = $this->getIdentifiers($values); - - if (count($values) == 0) { - throw new \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 . ')'; - } - - /** - * Calculate the difference in days between the two passed dates. - * - * Computes diff = date1 - date2 - * - * @param string $date1 - * @param string $date2 - * - * @return string - */ - public function getDateDiffExpression($date1, $date2) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Add the number of given days to a date. - * - * @param string $date - * @param integer $days - * - * @return string - */ - public function getDateAddDaysExpression($date, $days) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Substract the number of given days to a date. - * - * @param string $date - * @param integer $days - * - * @return string - */ - public function getDateSubDaysExpression($date, $days) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Add the number of given months to a date. - * - * @param string $date - * @param integer $months - * - * @return string - */ - public function getDateAddMonthExpression($date, $months) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Substract the number of given months to a date. - * - * @param string $date - * @param integer $months - * - * @return string - */ - public function getDateSubMonthExpression($date, $months) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Gets SQL bit AND comparison expression - * - * @param string $value1 - * @param string $value2 - * - * @return string - */ - public function getBitAndComparisonExpression($value1, $value2) - { - return '(' . $value1 . ' & ' . $value2 . ')'; - } - - /** - * Gets SQL bit OR comparison expression - * - * @param string $value1 - * @param string $value2 - * - * @return string - */ - public function getBitOrComparisonExpression($value1, $value2) - { - return '(' . $value1 . ' | ' . $value2 . ')'; - } - - 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 integer $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(); - } - - /** - * Get the SQL snippet to drop an existing database - * - * @param string $database name of the database that should be dropped - * - * @return string - */ - public function getDropDatabaseSQL($database) - { - return 'DROP DATABASE ' . $database; - } - - /** - * Drop a Table - * - * @throws \InvalidArgumentException - * - * @param Table|string $table - * - * @return string - */ - public function getDropTableSQL($table) - { - $tableArg = $table; - - if ($table instanceof Table) { - $table = $table->getQuotedName($this); - } else if(!is_string($table)) { - throw new \InvalidArgumentException('getDropTableSQL() expects $table parameter to be string or \Doctrine\DBAL\Schema\Table.'); - } - - if (null !== $this->_eventManager && $this->_eventManager->hasListeners(Events::onSchemaDropTable)) { - $eventArgs = new SchemaDropTableEventArgs($tableArg, $this); - $this->_eventManager->dispatchEvent(Events::onSchemaDropTable, $eventArgs); - - if ($eventArgs->isDefaultPrevented()) { - return $eventArgs->getSql(); - } - } - - return 'DROP TABLE ' . $table; - } - - /** - * Get SQL to safely drop a temporary table WITHOUT implicitly committing an open transaction. - * - * @param Table|string $table - * - * @return string - */ - public function getDropTemporaryTableSQL($table) - { - return $this->getDropTableSQL($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 Index) { - $index = $index->getQuotedName($this); - } 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 Constraint) { - $constraint = $constraint->getQuotedName($this); - } - - if ($table instanceof Table) { - $table = $table->getQuotedName($this); - } - - 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 ForeignKeyConstraint) { - $foreignKey = $foreignKey->getQuotedName($this); - } - - if ($table instanceof Table) { - $table = $table->getQuotedName($this); - } - - 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 integer $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->getQuotedName($this); - $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()) { - $platform = $this; - $options['primary'] = array_map(function ($columnName) use ($table, $platform) { - return $table->getColumn($columnName)->getQuotedName($platform); - }, $index->getColumns()); - $options['primary_index'] = $index; - } else { - $options['indexes'][$index->getName()] = $index; - } - } - } - - $columnSql = array(); - $columns = array(); - - foreach ($table->getColumns() as $column) { - /* @var \Doctrine\DBAL\Schema\Column $column */ - - if (null !== $this->_eventManager && $this->_eventManager->hasListeners(Events::onSchemaCreateTableColumn)) { - $eventArgs = new SchemaCreateTableColumnEventArgs($column, $table, $this); - $this->_eventManager->dispatchEvent(Events::onSchemaCreateTableColumn, $eventArgs); - - $columnSql = array_merge($columnSql, $eventArgs->getSql()); - - if ($eventArgs->isDefaultPrevented()) { - continue; - } - } - - $columnData = array(); - $columnData['name'] = $column->getQuotedName($this); - $columnData['type'] = $column->getType(); - $columnData['length'] = $column->getLength(); - $columnData['notnull'] = $column->getNotNull(); - $columnData['fixed'] = $column->getFixed(); - $columnData['unique'] = false; // TODO: what do we do about this? - $columnData['version'] = $column->hasPlatformOption("version") ? $column->getPlatformOption('version') : false; - - if (strtolower($columnData['type']) == "string" && $columnData['length'] === null) { - $columnData['length'] = 255; - } - - $columnData['unsigned'] = $column->getUnsigned(); - $columnData['precision'] = $column->getPrecision(); - $columnData['scale'] = $column->getScale(); - $columnData['default'] = $column->getDefault(); - $columnData['columnDefinition'] = $column->getColumnDefinition(); - $columnData['autoincrement'] = $column->getAutoincrement(); - $columnData['comment'] = $this->getColumnComment($column); - - if (in_array($column->getName(), $options['primary'])) { - $columnData['primary'] = true; - } - - $columns[$columnData['name']] = $columnData; - } - - if (($createFlags&self::CREATE_FOREIGNKEYS) > 0) { - $options['foreignKeys'] = array(); - foreach ($table->getForeignKeys() as $fkConstraint) { - $options['foreignKeys'][] = $fkConstraint; - } - } - - if (null !== $this->_eventManager && $this->_eventManager->hasListeners(Events::onSchemaCreateTable)) { - $eventArgs = new SchemaCreateTableEventArgs($table, $columns, $options, $this); - $this->_eventManager->dispatchEvent(Events::onSchemaCreateTable, $eventArgs); - - if ($eventArgs->isDefaultPrevented()) { - return array_merge($eventArgs->getSql(), $columnSql); - } - } - - $sql = $this->_getCreateTableSQL($tableName, $columns, $options); - if ($this->supportsCommentOnStatement()) { - foreach ($table->getColumns() as $column) { - if ($this->getColumnComment($column)) { - $sql[] = $this->getCommentOnColumnSQL($tableName, $column->getName(), $this->getColumnComment($column)); - } - } - } - - return array_merge($sql, $columnSql); - } - - public function getCommentOnColumnSQL($tableName, $columnName, $comment) - { - return "COMMENT ON COLUMN " . $tableName . "." . $columnName . " IS '" . $comment . "'"; - } - - /** - * Gets the SQL used to create a table. - * - * @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 - * - * @return string - * - * @throws DBALException - */ - public function getCreateSequenceSQL(Sequence $sequence) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Gets the SQL statement to change a sequence on this platform. - * - * @param \Doctrine\DBAL\Schema\Sequence $sequence - * - * @return string - */ - public function getAlterSequenceSQL(Sequence $sequence) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Gets the SQL to create a constraint on a table on this platform. - * - * @param \Doctrine\DBAL\Schema\Constraint $constraint - * @param string|Table $table - * - * @return string - */ - public function getCreateConstraintSQL(Constraint $constraint, $table) - { - if ($table instanceof Table) { - $table = $table->getQuotedName($this); - } - - $query = 'ALTER TABLE ' . $table . ' ADD CONSTRAINT ' . $constraint->getQuotedName($this); - - $columns = array(); - foreach ($constraint->getColumns() as $column) { - $columns[] = $column; - } - $columnList = '('. implode(', ', $columns) . ')'; - - $referencesClause = ''; - if ($constraint instanceof 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 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->getQuotedName($this); - } - $name = $index->getQuotedName($this); - $columns = $index->getColumns(); - - if (count($columns) == 0) { - throw new \InvalidArgumentException("Incomplete definition. 'columns' required."); - } - - if ($index->isPrimary()) { - return $this->getCreatePrimaryKeySQL($index, $table); - } - - $query = 'CREATE ' . $this->getCreateIndexSQLFlags($index) . 'INDEX ' . $name . ' ON ' . $table; - $query .= ' (' . $this->getIndexFieldDeclarationListSQL($columns) . ')'; - - return $query; - } - - /** - * Adds additional flags for index generation - * - * @param Index $index - * - * @return string - */ - protected function getCreateIndexSQLFlags(Index $index) - { - return $index->isUnique() ? 'UNIQUE ' : ''; - } - - /** - * Get SQL to create an unnamed primary key constraint. - * - * @param Index $index - * @param string|Table $table - * - * @return string - */ - public function getCreatePrimaryKeySQL(Index $index, $table) - { - return 'ALTER TABLE ' . $table . ' ADD PRIMARY KEY (' . $this->getIndexFieldDeclarationListSQL($index->getColumns()) . ')'; - } - - /** - * 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. This also detects identifier - * chains separated by dot and quotes them independently. - * - * 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) - { - if (strpos($str, ".") !== false) { - $parts = array_map(array($this, "quoteIdentifier"), explode(".", $str)); - - return implode(".", $parts); - } - - return $this->quoteSingleIdentifier($str); - } - - /** - * Quote a single identifier (no dot chain separation) - * - * @param string $str - * - * @return string - */ - public function quoteSingleIdentifier($str) - { - $c = $this->getIdentifierQuoteCharacter(); - - return $c . str_replace($c, $c.$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 Table) { - $table = $table->getQuotedName($this); - } - - $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__); - } - - /** - * @param Column $column - * @param TableDiff $diff - * @param array $columnSql - * - * @return boolean - */ - protected function onSchemaAlterTableAddColumn(Column $column, TableDiff $diff, &$columnSql) - { - if (null === $this->_eventManager) { - return false; - } - - if ( ! $this->_eventManager->hasListeners(Events::onSchemaAlterTableAddColumn)) { - return false; - } - - $eventArgs = new SchemaAlterTableAddColumnEventArgs($column, $diff, $this); - $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableAddColumn, $eventArgs); - - $columnSql = array_merge($columnSql, $eventArgs->getSql()); - - return $eventArgs->isDefaultPrevented(); - } - - /** - * @param Column $column - * @param TableDiff $diff - * @param array $columnSql - * - * @return boolean - */ - protected function onSchemaAlterTableRemoveColumn(Column $column, TableDiff $diff, &$columnSql) - { - if (null === $this->_eventManager) { - return false; - } - - if ( ! $this->_eventManager->hasListeners(Events::onSchemaAlterTableRemoveColumn)) { - return false; - } - - $eventArgs = new SchemaAlterTableRemoveColumnEventArgs($column, $diff, $this); - $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableRemoveColumn, $eventArgs); - - $columnSql = array_merge($columnSql, $eventArgs->getSql()); - - return $eventArgs->isDefaultPrevented(); - } - - /** - * @param ColumnDiff $columnDiff - * @param TableDiff $diff - * @param array $columnSql - * - * @return boolean - */ - protected function onSchemaAlterTableChangeColumn(ColumnDiff $columnDiff, TableDiff $diff, &$columnSql) - { - if (null === $this->_eventManager) { - return false; - } - - if ( ! $this->_eventManager->hasListeners(Events::onSchemaAlterTableChangeColumn)) { - return false; - } - - $eventArgs = new SchemaAlterTableChangeColumnEventArgs($columnDiff, $diff, $this); - $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableChangeColumn, $eventArgs); - - $columnSql = array_merge($columnSql, $eventArgs->getSql()); - - return $eventArgs->isDefaultPrevented(); - } - - /** - * @param string $oldColumnName - * @param Column $column - * @param TableDiff $diff - * @param array $columnSql - * - * @return boolean - */ - protected function onSchemaAlterTableRenameColumn($oldColumnName, Column $column, TableDiff $diff, &$columnSql) - { - if (null === $this->_eventManager) { - return false; - } - - if ( ! $this->_eventManager->hasListeners(Events::onSchemaAlterTableRenameColumn)) { - return false; - } - - $eventArgs = new SchemaAlterTableRenameColumnEventArgs($oldColumnName, $column, $diff, $this); - $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableRenameColumn, $eventArgs); - - $columnSql = array_merge($columnSql, $eventArgs->getSql()); - - return $eventArgs->isDefaultPrevented(); - } - - /** - * @param TableDiff $diff - * @param array $sql - * - * @return boolean - */ - protected function onSchemaAlterTable(TableDiff $diff, &$sql) - { - if (null === $this->_eventManager) { - return false; - } - - if ( ! $this->_eventManager->hasListeners(Events::onSchemaAlterTable)) { - return false; - } - - $eventArgs = new SchemaAlterTableEventArgs($diff, $this); - $this->_eventManager->dispatchEvent(Events::onSchemaAlterTable, $eventArgs); - - $sql = array_merge($sql, $eventArgs->getSql()); - - return $eventArgs->isDefaultPrevented(); - } - - protected function getPreAlterTableIndexForeignKeySQL(TableDiff $diff) - { - $tableName = $diff->name; - - $sql = array(); - if ($this->supportsForeignKeyConstraints()) { - foreach ($diff->removedForeignKeys as $foreignKey) { - $sql[] = $this->getDropForeignKeySQL($foreignKey, $tableName); - } - foreach ($diff->changedForeignKeys as $foreignKey) { - $sql[] = $this->getDropForeignKeySQL($foreignKey, $tableName); - } - } - - foreach ($diff->removedIndexes as $index) { - $sql[] = $this->getDropIndexSQL($index, $tableName); - } - foreach ($diff->changedIndexes as $index) { - $sql[] = $this->getDropIndexSQL($index, $tableName); - } - - return $sql; - } - - protected function getPostAlterTableIndexForeignKeySQL(TableDiff $diff) - { - $tableName = false !== $diff->newName ? $diff->newName : $diff->name; - - $sql = array(); - if ($this->supportsForeignKeyConstraints()) { - foreach ($diff->addedForeignKeys as $foreignKey) { - $sql[] = $this->getCreateForeignKeySQL($foreignKey, $tableName); - } - foreach ($diff->changedForeignKeys as $foreignKey) { - $sql[] = $this->getCreateForeignKeySQL($foreignKey, $tableName); - } - } - - foreach ($diff->addedIndexes as $index) { - $sql[] = $this->getCreateIndexSQL($index, $tableName); - } - foreach ($diff->changedIndexes as $index) { - $sql[] = $this->getCreateIndexSQL($index, $tableName); - } - - return $sql; - } - - /** - * 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) - { - return array_merge($this->getPreAlterTableIndexForeignKeySQL($diff), $this->getPostAlterTableIndexForeignKeySQL($diff)); - } - - /** - * 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) { - $queryFields[] = $this->getColumnDeclarationSQL($fieldName, $field); - } - - 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; - } - - if ($this->supportsInlineColumnComments() && isset($field['comment']) && $field['comment']) { - $columnDef .= " COMMENT '" . $field['comment'] . "'"; - } - - 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'] . ')'; - } - - /** - * 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(); - } else if ((string) $field['type'] == 'Boolean') { - $default = " DEFAULT '" . $this->convertBooleans($field['default']) . "'"; - } - } - } - 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 new \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 new \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. - * - * @param array $columnDef - * - * @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. - * - * @param array $fields - * - * @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 \Doctrine\DBAL\Schema\ForeignKeyConstraint $foreignKey - * - * @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 \InvalidArgumentException if unknown referential action given - * - * @param string $action foreign key referential action - * - * @return string - */ - public function getForeignKeyReferentialActionSQL($action) - { - $upper = strtoupper($action); - switch ($upper) { - case 'CASCADE': - case 'SET NULL': - case 'NO ACTION': - case 'RESTRICT': - case 'SET DEFAULT': - return $upper; - default: - throw new \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->getQuotedName($this) . ' '; - } - $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->getQuotedForeignTableName($this) . ' (' - . 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 - * - * @return mixed - */ - 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 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 - * - * @return string - */ - 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, $database = null) - { - 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__); - } - - /** - * Get the list of indexes for the current database. - * - * The current database parameter is optional but will always be passed - * when using the SchemaManager API and is the database the given table is in. - * - * Attention: Some platforms only support currentDatabase when they - * are connected with that database. Cross-database information schema - * requests may be impossible. - * - * @param string $table - * @param string $currentDatabase - * - * @return string - */ - public function getListTableIndexesSQL($table, $currentDatabase = null) - { - 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__); - } - - /** - * Get the SQL snippet to drop an existing sequence - * - * @param \Doctrine\DBAL\Schema\Sequence $sequence - * - * @return string - */ - public function getDropSequenceSQL($sequence) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getSequenceNextValSQL($sequenceName) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * create a new database - * - * @param string $database name of the database that should be created - * - * @return string - */ - public function getCreateDatabaseSQL($database) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * Get sql to set the transaction isolation level - * - * @param integer $level - * - * @return string - */ - 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 datetime with timezone offset fields. - * - * @param array $fieldDeclaration - * - * @return string - */ - public function getDateTimeTzTypeDeclarationSQL(array $fieldDeclaration) - { - return $this->getDateTimeTypeDeclarationSQL($fieldDeclaration); - } - - - /** - * 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__); - } - - public function getFloatDeclarationSQL(array $fieldDeclaration) - { - return 'DOUBLE PRECISION'; - } - - /** - * 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*() methods */ - - /** - * 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; - } - - /** - * Whether the platform supports altering tables. - * - * @return boolean - */ - 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 releasing savepoints. - * - * @return boolean - */ - public function supportsReleaseSavepoints() - { - return $this->supportsSavepoints(); - } - - /** - * 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 boolean - */ - public function supportsForeignKeyOnUpdate() - { - return ($this->supportsForeignKeyConstraints() && true); - } - - /** - * Whether the platform supports database schemas. - * - * @return boolean - */ - public function supportsSchemas() - { - return false; - } - - /** - * Can this platform emulate schemas? - * - * Platforms that either support or emulate schemas don't automatically - * filter a schema for the namespaced elements in {@link - * AbstractManager#createSchema}. - * - * @return boolean - */ - public function canEmulateSchemas() - { - return false; - } - - /** - * Some databases don't allow to create and drop databases at all or only with certain tools. - * - * @return boolean - */ - public function supportsCreateDropDatabase() - { - return true; - } - - /** - * Whether the platform supports getting the affected rows of a recent - * update/delete type query. - * - * @return boolean - */ - public function supportsGettingAffectedRows() - { - return true; - } - - /** - * Does this plaform support to add inline column comments as postfix. - * - * @return boolean - */ - public function supportsInlineColumnComments() - { - return false; - } - - /** - * Does this platform support the propriortary synatx "COMMENT ON asset" - * - * @return boolean - */ - public function supportsCommentOnStatement() - { - return false; - } - - public function getIdentityColumnNullInsertSQL() - { - return ""; - } - - /** - * Does this platform views ? - * - * @return boolean - */ - public function supportsViews() - { - return true; - } - - /** - * 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. - */ - 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 datetime with timezone value of this platform. - * - * @return string The format string. - */ - public function getDateTimeTzFormatString() - { - 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'; - } - - /** - * Modify limit query - * - * @param string $query - * @param integer $limit - * @param integer $offset - * - * @return string - */ - final public function modifyLimitQuery($query, $limit, $offset = null) - { - if ($limit !== null) { - $limit = (int)$limit; - } - - if ($offset !== null) { - $offset = (int)$offset; - - if ($offset < 0) { - throw new DBALException("LIMIT argument offset=$offset is not valid"); - } - if ($offset > 0 && ! $this->supportsLimitOffset()) { - throw new DBALException(sprintf("Platform %s does not support offset values in limit queries.", $this->getName())); - } - } - - return $this->doModifyLimitQuery($query, $limit, $offset); - } - - /** - * Adds an driver-specific LIMIT clause to the query - * - * @param string $query - * @param integer $limit - * @param integer $offset - * - * @return string - */ - protected function doModifyLimitQuery($query, $limit, $offset) - { - if ($limit !== null) { - $query .= ' LIMIT ' . $limit; - } - - if ($offset !== null) { - $query .= ' OFFSET ' . $offset; - } - - return $query; - } - - /** - * Does the database platform support offsets in modify limit clauses? - * - * @return boolean - */ - public function supportsLimitOffset() - { - return true; - } - - /** - * 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 $schemaElementName - * - * @return string - */ - public function fixSchemaElementName($schemaElementName) - { - return $schemaElementName; - } - - /** - * Maximum length of any given databse identifier, like tables or column names. - * - * @return integer - */ - 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 boolean $cascade - * - * @return string - */ - public function getTruncateTableSQL($tableName, $cascade = false) - { - return 'TRUNCATE '.$tableName; - } - - /** - * This is for test reasons, many vendors have special requirements for dummy statements. - * - * @return string - */ - public function getDummySelectSQL() - { - return 'SELECT 1'; - } - - /** - * Generate SQL to create a new savepoint - * - * @param string $savepoint - * - * @return string - */ - public function createSavePoint($savepoint) - { - return 'SAVEPOINT ' . $savepoint; - } - - /** - * Generate SQL to release a savepoint - * - * @param string $savepoint - * - * @return string - */ - public function releaseSavePoint($savepoint) - { - return 'RELEASE SAVEPOINT ' . $savepoint; - } - - /** - * Generate SQL to rollback a savepoint - * - * @param string $savepoint - * - * @return string - */ - public function rollbackSavePoint($savepoint) - { - return 'ROLLBACK TO SAVEPOINT ' . $savepoint; - } - - /** - * Return the keyword list instance of this platform. - * - * Throws exception if no keyword list is specified. - * - * @throws DBALException - * - * @return \Doctrine\DBAL\Platforms\Keywords\KeywordList - */ - final public function getReservedKeywordsList() - { - // Check for an existing instantiation of the keywords class. - if ($this->_keywords) { - return $this->_keywords; - } - - $class = $this->getReservedKeywordsClass(); - $keywords = new $class; - if ( ! $keywords instanceof \Doctrine\DBAL\Platforms\Keywords\KeywordList) { - throw DBALException::notSupported(__METHOD__); - } - - // Store the instance so it doesn't need to be generated on every request. - $this->_keywords = $keywords; - - return $keywords; - } - - /** - * The class name of the reserved keywords list. - * - * @return string - */ - protected function getReservedKeywordsClass() - { - throw DBALException::notSupported(__METHOD__); - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/DB2Platform.php b/framework/library/Doctrine/DBAL/Platforms/DB2Platform.php deleted file mode 100644 index 114cd7d..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/DB2Platform.php +++ /dev/null @@ -1,545 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\DBALException; -use Doctrine\DBAL\Schema\Index; -use Doctrine\DBAL\Schema\TableDiff; - -class DB2Platform extends AbstractPlatform -{ - /** - * {@inheritDoc} - */ - public function getBlobTypeDeclarationSQL(array $field) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * {@inheritDoc} - */ - public function initializeDoctrineTypeMappings() - { - $this->doctrineTypeMapping = array( - 'smallint' => 'smallint', - 'bigint' => 'bigint', - 'integer' => 'integer', - 'time' => 'time', - 'date' => 'date', - 'varchar' => 'string', - 'character' => 'string', - 'clob' => 'text', - 'decimal' => 'decimal', - 'double' => 'float', - 'real' => 'float', - 'timestamp' => 'datetime', - ); - } - - /** - * {@inheritDoc} - */ - protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) - { - return $fixed ? ($length ? 'CHAR(' . $length . ')' : 'CHAR(255)') - : ($length ? 'VARCHAR(' . $length . ')' : 'VARCHAR(255)'); - } - - /** - * {@inheritDoc} - */ - public function getClobTypeDeclarationSQL(array $field) - { - // todo clob(n) with $field['length']; - return 'CLOB(1M)'; - } - - /** - * {@inheritDoc} - */ - public function getName() - { - return 'db2'; - } - - /** - * {@inheritDoc} - */ - public function getBooleanTypeDeclarationSQL(array $columnDef) - { - return 'SMALLINT'; - } - - /** - * {@inheritDoc} - */ - public function getIntegerTypeDeclarationSQL(array $columnDef) - { - return 'INTEGER' . $this->_getCommonIntegerTypeDeclarationSQL($columnDef); - } - - /** - * {@inheritDoc} - */ - public function getBigIntTypeDeclarationSQL(array $columnDef) - { - return 'BIGINT' . $this->_getCommonIntegerTypeDeclarationSQL($columnDef); - } - - /** - * {@inheritDoc} - */ - public function getSmallIntTypeDeclarationSQL(array $columnDef) - { - return 'SMALLINT' . $this->_getCommonIntegerTypeDeclarationSQL($columnDef); - } - - /** - * {@inheritDoc} - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - $autoinc = ''; - if ( ! empty($columnDef['autoincrement'])) { - $autoinc = ' GENERATED BY DEFAULT AS IDENTITY'; - } - - return $autoinc; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - if (isset($fieldDeclaration['version']) && $fieldDeclaration['version'] == true) { - return "TIMESTAMP(0) WITH DEFAULT"; - } - - return 'TIMESTAMP(0)'; - } - - /** - * {@inheritDoc} - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * {@inheritDoc} - */ - 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 - * @param string $database - * @return string - */ - public function getListTableColumnsSQL($table, $database = null) - { - 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__); - } - - /** - * {@inheritDoc} - */ - public function getListViewsSQL($database) - { - return "SELECT NAME, TEXT FROM SYSIBM.SYSVIEWS"; - } - - /** - * {@inheritDoc} - */ - public function getListTableIndexesSQL($table, $currentDatabase = null) - { - 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; - } - - /** - * {@inheritDoc} - */ - public function getDropSequenceSQL($sequence) - { - throw DBALException::notSupported(__METHOD__); - } - - public function getSequenceNextValSQL($sequenceName) - { - throw DBALException::notSupported(__METHOD__); - } - - /** - * {@inheritDoc} - */ - public function getCreateDatabaseSQL($database) - { - return "CREATE DATABASE ".$database; - } - - /** - * {@inheritDoc} - */ - public function getDropDatabaseSQL($database) - { - return "DROP DATABASE ".$database.";"; - } - - /** - * {@inheritDoc} - */ - public function supportsCreateDropDatabase() - { - return false; - } - - /** - * {@inheritDoc} - */ - public function supportsReleaseSavepoints() - { - return false; - } - - /** - * {@inheritDoc} - */ - public function getCurrentDateSQL() - { - return 'VALUES CURRENT DATE'; - } - - /** - * {@inheritDoc} - */ - public function getCurrentTimeSQL() - { - return 'VALUES CURRENT TIME'; - } - - /** - * {@inheritDoc} - */ - public function getCurrentTimestampSQL() - { - return "VALUES CURRENT TIMESTAMP"; - } - - /** - * {@inheritDoc} - */ - public function getIndexDeclarationSQL($name, Index $index) - { - return $this->getUniqueConstraintDeclarationSQL($name, $index); - } - - /** - * {@inheritDoc} - */ - 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 $definition) { - $sqls[] = $this->getCreateIndexSQL($definition, $tableName); - } - return $sqls; - } - - /** - * {@inheritDoc} - */ - public function getAlterTableSQL(TableDiff $diff) - { - $sql = array(); - $columnSql = array(); - - $queryParts = array(); - foreach ($diff->addedColumns as $column) { - if ($this->onSchemaAlterTableAddColumn($column, $diff, $columnSql)) { - continue; - } - - $queryParts[] = 'ADD COLUMN ' . $this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray()); - } - - foreach ($diff->removedColumns as $column) { - if ($this->onSchemaAlterTableRemoveColumn($column, $diff, $columnSql)) { - continue; - } - - $queryParts[] = 'DROP COLUMN ' . $column->getQuotedName($this); - } - - foreach ($diff->changedColumns as $columnDiff) { - if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { - continue; - } - - /* @var $columnDiff \Doctrine\DBAL\Schema\ColumnDiff */ - $column = $columnDiff->column; - $queryParts[] = 'ALTER ' . ($columnDiff->oldColumnName) . ' ' - . $this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray()); - } - - foreach ($diff->renamedColumns as $oldColumnName => $column) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) { - continue; - } - - $queryParts[] = 'RENAME ' . $oldColumnName . ' TO ' . $column->getQuotedName($this); - } - - $tableSql = array(); - - if ( ! $this->onSchemaAlterTable($diff, $tableSql)) { - 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 array_merge($sql, $tableSql, $columnSql); - } - - /** - * {@inheritDoc} - */ - 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); - } - - /** - * {@inheritDoc} - */ - public function getEmptyIdentityInsertSQL($tableName, $identifierColumnName) - { - return 'INSERT INTO ' . $tableName . ' (' . $identifierColumnName . ') VALUES (DEFAULT)'; - } - - public function getCreateTemporaryTableSnippetSQL() - { - return "DECLARE GLOBAL TEMPORARY TABLE"; - } - - /** - * {@inheritDoc} - */ - public function getTemporaryTableName($tableName) - { - return "SESSION." . $tableName; - } - - /** - * {@inheritDoc} - */ - protected function doModifyLimitQuery($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; - } - - /** - * {@inheritDoc} - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - if ($startPos == false) { - return 'LOCATE(' . $substr . ', ' . $str . ')'; - } - - return 'LOCATE(' . $substr . ', ' . $str . ', '.$startPos.')'; - } - - /** - * {@inheritDoc} - */ - public function getSubstringExpression($value, $from, $length = null) - { - if ($length === null) { - return 'SUBSTR(' . $value . ', ' . $from . ')'; - } - - return 'SUBSTR(' . $value . ', ' . $from . ', ' . $length . ')'; - } - - /** - * {@inheritDoc} - */ - public function supportsIdentityColumns() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function prefersIdentityColumns() - { - return true; - } - - /** - * {@inheritDoc} - * - * DB2 returns all column names in SQL result sets in uppercase. - */ - public function getSQLResultCasing($column) - { - return strtoupper($column); - } - - public function getForUpdateSQL() - { - return ' WITH RR USE AND KEEP UPDATE LOCKS'; - } - - /** - * {@inheritDoc} - */ - public function getDummySelectSQL() - { - return 'SELECT 1 FROM sysibm.sysdummy1'; - } - - /** - * {@inheritDoc} - * - * DB2 supports savepoints, but they work semantically different than on other vendor platforms. - * - * TODO: We have to investigate how to get DB2 up and running with savepoints. - */ - public function supportsSavepoints() - { - return false; - } - - /** - * {@inheritDoc} - */ - protected function getReservedKeywordsClass() - { - return 'Doctrine\DBAL\Platforms\Keywords\DB2Keywords'; - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/DrizzlePlatform.php b/framework/library/Doctrine/DBAL/Platforms/DrizzlePlatform.php deleted file mode 100644 index 47bb364..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/DrizzlePlatform.php +++ /dev/null @@ -1,495 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\DBALException, - Doctrine\DBAL\Schema\TableDiff, - Doctrine\DBAL\Schema\Index, - Doctrine\DBAL\Schema\Table; - -/** - * Drizzle platform - * - * @author Kim Hemsø Rasmussen - */ -class DrizzlePlatform extends AbstractPlatform -{ - /** - * {@inheritDoc} - */ - public function getName() - { - return 'drizzle'; - } - - /** - * {@inheritDoc} - */ - public function getIdentifierQuoteCharacter() - { - return '`'; - } - - - /** - * {@inheritDoc} - */ public function getConcatExpression() - { - $args = func_get_args(); - - return 'CONCAT(' . join(', ', (array) $args) . ')'; - } - - /** - * {@inheritDoc} - */ - public function getDateDiffExpression($date1, $date2) - { - return 'DATEDIFF(' . $date1 . ', ' . $date2 . ')'; - } - - /** - * {@inheritDoc} - */ - public function getDateAddDaysExpression($date, $days) - { - return 'DATE_ADD(' . $date . ', INTERVAL ' . $days . ' DAY)'; - } - - /** - * {@inheritDoc} - */ - public function getDateSubDaysExpression($date, $days) - { - return 'DATE_SUB(' . $date . ', INTERVAL ' . $days . ' DAY)'; - } - - /** - * {@inheritDoc} - */ - public function getDateAddMonthExpression($date, $months) - { - return 'DATE_ADD(' . $date . ', INTERVAL ' . $months . ' MONTH)'; - } - - /** - * {@inheritDoc} - */ - public function getDateSubMonthExpression($date, $months) - { - return 'DATE_SUB(' . $date . ', INTERVAL ' . $months . ' MONTH)'; - } - - /** - * {@inheritDoc} - */ - public function getBooleanTypeDeclarationSQL(array $field) - { - return 'BOOLEAN'; - } - - /** - * {@inheritDoc} - */ - public function getIntegerTypeDeclarationSQL(array $field) - { - return 'INT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - $autoinc = ''; - if ( ! empty($columnDef['autoincrement'])) { - $autoinc = ' AUTO_INCREMENT'; - } - return $autoinc; - } - - /** - * {@inheritDoc} - */ - public function getBigIntTypeDeclarationSQL(array $field) - { - return 'BIGINT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - public function getSmallIntTypeDeclarationSQL(array $field) - { - return 'INT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) - { - return $length ? 'VARCHAR(' . $length . ')' : 'VARCHAR(255)'; - } - - /** - * {@inheritDoc} - */ - protected function initializeDoctrineTypeMappings() - { - $this->doctrineTypeMapping = array( - 'boolean' => 'boolean', - 'varchar' => 'string', - 'integer' => 'integer', - 'blob' => 'text', - 'decimal' => 'decimal', - 'datetime' => 'datetime', - 'date' => 'date', - 'time' => 'time', - 'text' => 'text', - 'timestamp' => 'datetime', - 'double' => 'float', - 'bigint' => 'bigint', - ); - } - - /** - * {@inheritDoc} - */ - public function getClobTypeDeclarationSQL(array $field) - { - return 'TEXT'; - } - - /** - * {@inheritDoc} - */ - public function getBlobTypeDeclarationSQL(array $field) - { - return 'BLOB'; - } - - /** - * {@inheritDoc} - */ - public function getCreateDatabaseSQL($name) - { - return 'CREATE DATABASE ' . $name; - } - - /** - * {@inheritDoc} - */ - public function getDropDatabaseSQL($name) - { - return 'DROP DATABASE ' . $name; - } - - public function getListDatabasesSQL() - { - return "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE CATALOG_NAME='LOCAL'"; - } - - /** - * {@inheritDoc} - */ - protected function getReservedKeywordsClass() - { - return 'Doctrine\DBAL\Platforms\Keywords\DrizzleKeywords'; - } - - public function getListTablesSQL() - { - return "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE' AND TABLE_SCHEMA=DATABASE()"; - } - - public function getListTableColumnsSQL($table, $database = null) - { - if ($database) { - $database = "'" . $database . "'"; - } else { - $database = 'DATABASE()'; - } - - return "SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT, IS_NULLABLE, IS_AUTO_INCREMENT, CHARACTER_MAXIMUM_LENGTH, COLUMN_DEFAULT," . - " NUMERIC_PRECISION, NUMERIC_SCALE" . - " FROM DATA_DICTIONARY.COLUMNS" . - " WHERE TABLE_SCHEMA=" . $database . " AND TABLE_NAME = '" . $table . "'"; - } - - public function getListTableForeignKeysSQL($table, $database = null) - { - if ($database) { - $database = "'" . $database . "'"; - } else { - $database = 'DATABASE()'; - } - - return "SELECT CONSTRAINT_NAME, CONSTRAINT_COLUMNS, REFERENCED_TABLE_NAME, REFERENCED_TABLE_COLUMNS, UPDATE_RULE, DELETE_RULE" . - " FROM DATA_DICTIONARY.FOREIGN_KEYS" . - " WHERE CONSTRAINT_SCHEMA=" . $database . " AND CONSTRAINT_TABLE='" . $table . "'"; - } - - /** - * {@inheritDoc} - */ - public function getListTableIndexesSQL($table, $database = null) - { - if ($database) { - $database = "'" . $database . "'"; - } else { - $database = 'DATABASE()'; - } - - return "SELECT INDEX_NAME AS 'key_name', COLUMN_NAME AS 'column_name', IS_USED_IN_PRIMARY AS 'primary', IS_UNIQUE=0 AS 'non_unique'" . - " FROM DATA_DICTIONARY.INDEX_PARTS" . - " WHERE TABLE_SCHEMA=" . $database . " AND TABLE_NAME='" . $table . "'"; - } - - /** - * {@inheritDoc} - */ - public function prefersIdentityColumns() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function supportsIdentityColumns() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function supportsInlineColumnComments() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function supportsViews() - { - return false; - } - - /** - * {@inheritDoc} - */ - public function getDropIndexSQL($index, $table=null) - { - if ($index instanceof Index) { - $indexName = $index->getQuotedName($this); - } else if (is_string($index)) { - $indexName = $index; - } else { - throw new \InvalidArgumentException('DrizzlePlatform::getDropIndexSQL() expects $index parameter to be string or \Doctrine\DBAL\Schema\Index.'); - } - - if ($table instanceof Table) { - $table = $table->getQuotedName($this); - } else if(!is_string($table)) { - throw new \InvalidArgumentException('DrizzlePlatform::getDropIndexSQL() expects $table parameter to be string or \Doctrine\DBAL\Schema\Table.'); - } - - if ($index instanceof Index && $index->isPrimary()) { - // drizzle primary keys are always named "PRIMARY", - // so we cannot use them in statements because of them being keyword. - return $this->getDropPrimaryKeySQL($table); - } - - return 'DROP INDEX ' . $indexName . ' ON ' . $table; - } - - /** - * @param Index $index - * @param Table $table - * - * @return string - */ - protected function getDropPrimaryKeySQL($table) - { - return 'ALTER TABLE ' . $table . ' DROP PRIMARY KEY'; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - if (isset($fieldDeclaration['version']) && $fieldDeclaration['version'] == true) { - return 'TIMESTAMP'; - } - - return 'DATETIME'; - } - - /** - * {@inheritDoc} - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIME'; - } - - /** - * {@inheritDoc} - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * {@inheritDoc} - */ - public function getAlterTableSQL(TableDiff $diff) - { - $columnSql = array(); - $queryParts = array(); - - if ($diff->newName !== false) { - $queryParts[] = 'RENAME TO ' . $diff->newName; - } - - foreach ($diff->addedColumns as $column) { - if ($this->onSchemaAlterTableAddColumn($column, $diff, $columnSql)) { - continue; - } - - $columnArray = $column->toArray(); - $columnArray['comment'] = $this->getColumnComment($column); - $queryParts[] = 'ADD ' . $this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray); - } - - foreach ($diff->removedColumns as $column) { - if ($this->onSchemaAlterTableRemoveColumn($column, $diff, $columnSql)) { - continue; - } - - $queryParts[] = 'DROP ' . $column->getQuotedName($this); - } - - foreach ($diff->changedColumns as $columnDiff) { - if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { - continue; - } - - /* @var $columnDiff \Doctrine\DBAL\Schema\ColumnDiff */ - $column = $columnDiff->column; - $columnArray = $column->toArray(); - $columnArray['comment'] = $this->getColumnComment($column); - $queryParts[] = 'CHANGE ' . ($columnDiff->oldColumnName) . ' ' - . $this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray); - } - - foreach ($diff->renamedColumns as $oldColumnName => $column) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) { - continue; - } - - $columnArray = $column->toArray(); - $columnArray['comment'] = $this->getColumnComment($column); - $queryParts[] = 'CHANGE ' . $oldColumnName . ' ' - . $this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray); - } - - $sql = array(); - $tableSql = array(); - - if ( ! $this->onSchemaAlterTable($diff, $tableSql)) { - if (count($queryParts) > 0) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . implode(", ", $queryParts); - } - $sql = array_merge( - $this->getPreAlterTableIndexForeignKeySQL($diff), - $sql, - $this->getPostAlterTableIndexForeignKeySQL($diff) - ); - } - - return array_merge($sql, $tableSql, $columnSql); - } - - /** - * {@inheritDoc} - */ - public function getDropTemporaryTableSQL($table) - { - if ($table instanceof Table) { - $table = $table->getQuotedName($this); - } else if(!is_string($table)) { - throw new \InvalidArgumentException('getDropTableSQL() expects $table parameter to be string or \Doctrine\DBAL\Schema\Table.'); - } - - return 'DROP TEMPORARY TABLE ' . $table; - } - - /** - * {@inheritDoc} - */ - 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; - } - - /** - * {@inheritDoc} - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - if ($startPos == false) { - return 'LOCATE(' . $substr . ', ' . $str . ')'; - } - - return 'LOCATE(' . $substr . ', ' . $str . ', '.$startPos.')'; - } - - /** - * {@inheritDoc} - */ - public function getGuidExpression() - { - return 'UUID()'; - } - - /** - * {@inheritDoc} - */ - public function getRegexpExpression() - { - return 'RLIKE'; - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/Keywords/DB2Keywords.php b/framework/library/Doctrine/DBAL/Platforms/Keywords/DB2Keywords.php deleted file mode 100644 index 77c1c67..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/Keywords/DB2Keywords.php +++ /dev/null @@ -1,438 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Platforms\Keywords; - -/** - * DB2 Keywords - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - */ -class DB2Keywords extends KeywordList -{ - public function getName() - { - return 'DB2'; - } - - protected function getKeywords() - { - return array( - 'ACTIVATE', - 'ADD', - 'AFTER', - 'ALIAS', - 'ALL', - 'ALLOCATE', - 'DOCUMENT', - 'DOUBLE', - 'DROP', - 'DSSIZE', - 'DYNAMIC', - 'EACH', - 'LOCK', - 'LOCKMAX', - 'LOCKSIZE', - 'LONG', - 'LOOP', - 'MAINTAINED', - 'ROUND_CEILING', - 'ROUND_DOWN', - 'ROUND_FLOOR', - 'ROUND_HALF_DOWN', - 'ROUND_HALF_EVEN', - 'ROUND_HALF_UP', - 'ALLOW', - 'ALTER', - 'AND', - 'ANY', - 'AS', - 'ASENSITIVE', - 'ASSOCIATE', - 'ASUTIME', - 'AT', - 'ATTRIBUTES', - 'AUDIT', - 'AUTHORIZATION', - 'AUX', - 'AUXILIARY', - 'BEFORE', - 'BEGIN', - 'BETWEEN', - 'BINARY', - 'BUFFERPOOL', - 'BY', - 'CACHE', - 'CALL', - 'CALLED', - 'CAPTURE', - 'CARDINALITY', - 'CASCADED', - 'CASE', - 'CAST', - 'CCSID', - 'CHAR', - 'CHARACTER', - 'CHECK', - 'CLONE', - 'CLOSE', - 'CLUSTER', - 'COLLECTION', - 'COLLID', - 'COLUMN', - 'COMMENT', - 'COMMIT', - 'CONCAT', - 'CONDITION', - 'CONNECT', - 'CONNECTION', - 'CONSTRAINT', - 'CONTAINS', - 'CONTINUE', - 'COUNT', - 'COUNT_BIG', - 'CREATE', - 'CROSS', - 'CURRENT', - 'CURRENT_DATE', - 'CURRENT_LC_CTYPE', - 'CURRENT_PATH', - 'CURRENT_SCHEMA', - 'CURRENT_SERVER', - 'CURRENT_TIME', - 'CURRENT_TIMESTAMP', - 'CURRENT_TIMEZONE', - 'CURRENT_USER', - 'CURSOR', - 'CYCLE', - 'DATA', - 'DATABASE', - 'DATAPARTITIONNAME', - 'DATAPARTITIONNUM', - 'EDITPROC', - 'ELSE', - 'ELSEIF', - 'ENABLE', - 'ENCODING', - 'ENCRYPTION', - 'END', - 'END-EXEC', - 'ENDING', - 'ERASE', - 'ESCAPE', - 'EVERY', - 'EXCEPT', - 'EXCEPTION', - 'EXCLUDING', - 'EXCLUSIVE', - 'EXECUTE', - 'EXISTS', - 'EXIT', - 'EXPLAIN', - 'EXTERNAL', - 'EXTRACT', - 'FENCED', - 'FETCH', - 'FIELDPROC', - 'FILE', - 'FINAL', - 'FOR', - 'FOREIGN', - 'FREE', - 'FROM', - 'FULL', - 'FUNCTION', - 'GENERAL', - 'GENERATED', - 'GET', - 'GLOBAL', - 'GO', - 'GOTO', - 'GRANT', - 'GRAPHIC', - 'GROUP', - 'HANDLER', - 'HASH', - 'HASHED_VALUE', - 'HAVING', - 'HINT', - 'HOLD', - 'HOUR', - 'HOURS', - 'IDENTITY', - 'IF', - 'IMMEDIATE', - 'IN', - 'INCLUDING', - 'INCLUSIVE', - 'INCREMENT', - 'INDEX', - 'INDICATOR', - 'INF', - 'INFINITY', - 'INHERIT', - 'INNER', - 'INOUT', - 'INSENSITIVE', - 'INSERT', - 'INTEGRITY', - 'MATERIALIZED', - 'MAXVALUE', - 'MICROSECOND', - 'MICROSECONDS', - 'MINUTE', - 'MINUTES', - 'MINVALUE', - 'MODE', - 'MODIFIES', - 'MONTH', - 'MONTHS', - 'NAN', - 'NEW', - 'NEW_TABLE', - 'NEXTVAL', - 'NO', - 'NOCACHE', - 'NOCYCLE', - 'NODENAME', - 'NODENUMBER', - 'NOMAXVALUE', - 'NOMINVALUE', - 'NONE', - 'NOORDER', - 'NORMALIZED', - 'NOT', - 'NULL', - 'NULLS', - 'NUMPARTS', - 'OBID', - 'OF', - 'OLD', - 'OLD_TABLE', - 'ON', - 'OPEN', - 'OPTIMIZATION', - 'OPTIMIZE', - 'OPTION', - 'OR', - 'ORDER', - 'OUT', - 'OUTER', - 'OVER', - 'OVERRIDING', - 'PACKAGE', - 'PADDED', - 'PAGESIZE', - 'PARAMETER', - 'PART', - 'PARTITION', - 'PARTITIONED', - 'PARTITIONING', - 'PARTITIONS', - 'PASSWORD', - 'PATH', - 'PIECESIZE', - 'PLAN', - 'POSITION', - 'PRECISION', - 'PREPARE', - 'PREVVAL', - 'PRIMARY', - 'PRIQTY', - 'PRIVILEGES', - 'PROCEDURE', - 'PROGRAM', - 'PSID', - 'ROUND_UP', - 'ROUTINE', - 'ROW', - 'ROW_NUMBER', - 'ROWNUMBER', - 'ROWS', - 'ROWSET', - 'RRN', - 'RUN', - 'SAVEPOINT', - 'SCHEMA', - 'SCRATCHPAD', - 'SCROLL', - 'SEARCH', - 'SECOND', - 'SECONDS', - 'SECQTY', - 'SECURITY', - 'SELECT', - 'SENSITIVE', - 'SEQUENCE', - 'SESSION', - 'SESSION_USER', - 'SET', - 'SIGNAL', - 'SIMPLE', - 'SNAN', - 'SOME', - 'SOURCE', - 'SPECIFIC', - 'SQL', - 'SQLID', - 'STACKED', - 'STANDARD', - 'START', - 'STARTING', - 'STATEMENT', - 'STATIC', - 'STATMENT', - 'STAY', - 'STOGROUP', - 'STORES', - 'STYLE', - 'SUBSTRING', - 'SUMMARY', - 'SYNONYM', - 'SYSFUN', - 'SYSIBM', - 'SYSPROC', - 'SYSTEM', - 'SYSTEM_USER', - 'TABLE', - 'TABLESPACE', - 'THEN', - 'TIME', - 'TIMESTAMP', - 'TO', - 'TRANSACTION', - 'TRIGGER', - 'TRIM', - 'TRUNCATE', - 'TYPE', - 'UNDO', - 'UNION', - 'UNIQUE', - 'UNTIL', - 'UPDATE', - 'DATE', - 'DAY', - 'DAYS', - 'DB2GENERAL', - 'DB2GENRL', - 'DB2SQL', - 'DBINFO', - 'DBPARTITIONNAME', - 'DBPARTITIONNUM', - 'DEALLOCATE', - 'DECLARE', - 'DEFAULT', - 'DEFAULTS', - 'DEFINITION', - 'DELETE', - 'DENSE_RANK', - 'DENSERANK', - 'DESCRIBE', - 'DESCRIPTOR', - 'DETERMINISTIC', - 'DIAGNOSTICS', - 'DISABLE', - 'DISALLOW', - 'DISCONNECT', - 'DISTINCT', - 'DO', - 'INTERSECT', - 'PUBLIC', - 'USAGE', - 'INTO', - 'QUERY', - 'USER', - 'IS', - 'QUERYNO', - 'USING', - 'ISOBID', - 'RANGE', - 'VALIDPROC', - 'ISOLATION', - 'RANK', - 'VALUE', - 'ITERATE', - 'READ', - 'VALUES', - 'JAR', - 'READS', - 'VARIABLE', - 'JAVA', - 'RECOVERY', - 'VARIANT', - 'JOIN', - 'REFERENCES', - 'VCAT', - 'KEEP', - 'REFERENCING', - 'VERSION', - 'KEY', - 'REFRESH', - 'VIEW', - 'LABEL', - 'RELEASE', - 'VOLATILE', - 'LANGUAGE', - 'RENAME', - 'VOLUMES', - 'LATERAL', - 'REPEAT', - 'WHEN', - 'LC_CTYPE', - 'RESET', - 'WHENEVER', - 'LEAVE', - 'RESIGNAL', - 'WHERE', - 'LEFT', - 'RESTART', - 'WHILE', - 'LIKE', - 'RESTRICT', - 'WITH', - 'LINKTYPE', - 'RESULT', - 'WITHOUT', - 'LOCAL', - 'RESULT_SET_LOCATOR WLM', - 'LOCALDATE', - 'RETURN', - 'WRITE', - 'LOCALE', - 'RETURNS', - 'XMLELEMENT', - 'LOCALTIME', - 'REVOKE', - 'XMLEXISTS', - 'LOCALTIMESTAMP RIGHT', - 'XMLNAMESPACES', - 'LOCATOR', - 'ROLE', - 'YEAR', - 'LOCATORS', - 'ROLLBACK', - 'YEARS', - ); - } -} - diff --git a/framework/library/Doctrine/DBAL/Platforms/Keywords/DrizzleKeywords.php b/framework/library/Doctrine/DBAL/Platforms/Keywords/DrizzleKeywords.php deleted file mode 100644 index c6d3187..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/Keywords/DrizzleKeywords.php +++ /dev/null @@ -1,340 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Platforms\Keywords; - -/** - * Drizzle Keywordlist - * - * @author Kim Hemsø Rasmussen - */ -class DrizzleKeywords extends KeywordList -{ - public function getName() - { - return 'drizzle'; - } - - protected function getKeywords() - { - return array( - 'ABS', - 'ALL', - 'ALLOCATE', - 'ALTER', - 'AND', - 'ANY', - 'ARE', - 'ARRAY', - 'AS', - 'ASENSITIVE', - 'ASYMMETRIC', - 'AT', - 'ATOMIC', - 'AUTHORIZATION', - 'AVG', - 'BEGIN', - 'BETWEEN', - 'BIGINT', - 'BINARY', - 'BLOB', - 'BOOLEAN', - 'BOTH', - 'BY', - 'CALL', - 'CALLED', - 'CARDINALITY', - 'CASCADED', - 'CASE', - 'CAST', - 'CEIL', - 'CEILING', - 'CHAR', - 'CHARACTER', - 'CHARACTER_LENGTH', - 'CHAR_LENGTH', - 'CHECK', - 'CLOB', - 'CLOSE', - 'COALESCE', - 'COLLATE', - 'COLLECT', - 'COLUMN', - 'COMMIT', - 'CONDITION', - 'CONNECT', - 'CONSTRAINT', - 'CONVERT', - 'CORR', - 'CORRESPONDING', - 'COUNT', - 'COVAR_POP', - 'COVAR_SAMP', - 'CREATE', - 'CROSS', - 'CUBE', - 'CUME_DIST', - 'CURRENT', - 'CURRENT_DATE', - 'CURRENT_DEFAULT_TRANSFORM_GROUP', - 'CURRENT_PATH', - 'CURRENT_ROLE', - 'CURRENT_TIME', - 'CURRENT_TIMESTAMP', - 'CURRENT_TRANSFORM_GROUP_FOR_TYPE', - 'CURRENT_USER', - 'CURSOR', - 'CYCLE', - 'DATE', - 'DAY', - 'DEALLOCATE', - 'DEC', - 'DECIMAL', - 'DECLARE', - 'DEFAULT', - 'DELETE', - 'DENSE_RANK', - 'DEREF', - 'DESCRIBE', - 'DETERMINISTIC', - 'DISCONNECT', - 'DISTINCT', - 'DOUBLE', - 'DROP', - 'DYNAMIC', - 'EACH', - 'ELEMENT', - 'ELSE', - 'END', - 'ESCAPE', - 'EVERY', - 'EXCEPT', - 'EXEC', - 'EXECUTE', - 'EXISTS', - 'EXP', - 'EXTERNAL', - 'EXTRACT', - 'FALSE', - 'FETCH', - 'FILTER', - 'FLOAT', - 'FLOOR', - 'FOR', - 'FOREIGN', - 'FREE', - 'FROM', - 'FULL', - 'FUNCTION', - 'FUSION', - 'GET', - 'GLOBAL', - 'GRANT', - 'GROUP', - 'GROUPING', - 'HAVING', - 'HOLD', - 'HOUR', - 'IDENTITY', - 'IN', - 'INDICATOR', - 'INNER', - 'INOUT', - 'INSENSITIVE', - 'INSERT', - 'INT', - 'INTEGER', - 'INTERSECT', - 'INTERSECTION', - 'INTERVAL', - 'INTO', - 'IS', - 'JOIN', - 'LANGUAGE', - 'LARGE', - 'LATERAL', - 'LEADING', - 'LEFT', - 'LIKE', - 'LN', - 'LOCAL', - 'LOCALTIME', - 'LOCALTIMESTAMP', - 'LOWER', - 'MATCH', - 'MAX', - 'MEMBER', - 'MERGE', - 'METHOD', - 'MIN', - 'MINUTE', - 'MOD', - 'MODIFIES', - 'MODULE', - 'MONTH', - 'MULTISET', - 'NATIONAL', - 'NATURAL', - 'NCHAR', - 'NCLOB', - 'NEW', - 'NO', - 'NONE', - 'NORMALIZE', - 'NOT', - 'NULL_SYM', - 'NULLIF', - 'NUMERIC', - 'OCTET_LENGTH', - 'OF', - 'OLD', - 'ON', - 'ONLY', - 'OPEN', - 'OR', - 'ORDER', - 'OUT', - 'OUTER', - 'OVER', - 'OVERLAPS', - 'OVERLAY', - 'PARAMETER', - 'PARTITION', - 'PERCENTILE_CONT', - 'PERCENTILE_DISC', - 'PERCENT_RANK', - 'POSITION', - 'POWER', - 'PRECISION', - 'PREPARE', - 'PRIMARY', - 'PROCEDURE', - 'RANGE', - 'RANK', - 'READS', - 'REAL', - 'RECURSIVE', - 'REF', - 'REFERENCES', - 'REFERENCING', - 'REGR_AVGX', - 'REGR_AVGY', - 'REGR_COUNT', - 'REGR_INTERCEPT', - 'REGR_R2', - 'REGR_SLOPE', - 'REGR_SXX', - 'REGR_SXY', - 'REGR_SYY', - 'RELEASE', - 'RESULT', - 'RETURN', - 'RETURNS', - 'REVOKE', - 'RIGHT', - 'ROLLBACK', - 'ROLLUP', - 'ROW', - 'ROWS', - 'ROW_NUMBER', - 'SAVEPOINT', - 'SCOPE', - 'SCROLL', - 'SEARCH', - 'SECOND', - 'SELECT', - 'SENSITIVE', - 'SESSION_USER', - 'SET', - 'SIMILAR', - 'SMALLINT', - 'SOME', - 'SPECIFIC', - 'SPECIFICTYPE', - 'SQL', - 'SQLEXCEPTION', - 'SQLSTATE', - 'SQLWARNING', - 'SQRT', - 'START', - 'STATIC', - 'STDDEV_POP', - 'STDDEV_SAMP', - 'SUBMULTISET', - 'SUBSTRING', - 'SUM', - 'SYMMETRIC', - 'SYSTEM', - 'SYSTEM_USER', - 'TABLE', - 'TABLESAMPLE', - 'THEN', - 'TIME', - 'TIMESTAMP', - 'TIMEZONE_HOUR', - 'TIMEZONE_MINUTE', - 'TO', - 'TRAILING', - 'TRANSLATE', - 'TRANSLATION', - 'TREAT', - 'TRIGGER', - 'TRIM', - 'TRUE', - 'UESCAPE', - 'UNION', - 'UNIQUE', - 'UNKNOWN', - 'UNNEST', - 'UPDATE', - 'UPPER', - 'USER', - 'USING', - 'VALUE', - 'VALUES', - 'VARCHAR', - 'VARYING', - 'VAR_POP', - 'VAR_SAMP', - 'WHEN', - 'WHENEVER', - 'WHERE', - 'WIDTH_BUCKET', - 'WINDOW', - 'WITH', - 'WITHIN', - 'WITHOUT', - 'XML', - 'XMLAGG', - 'XMLATTRIBUTES', - 'XMLBINARY', - 'XMLCOMMENT', - 'XMLCONCAT', - 'XMLELEMENT', - 'XMLFOREST', - 'XMLNAMESPACES', - 'XMLPARSE', - 'XMLPI', - 'XMLROOT', - 'XMLSERIALIZE', - 'YEAR', - ); - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/Keywords/KeywordList.php b/framework/library/Doctrine/DBAL/Platforms/Keywords/KeywordList.php deleted file mode 100644 index f30bb36..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/Keywords/KeywordList.php +++ /dev/null @@ -1,63 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Platforms\Keywords; - -/** - * Abstract interface for a SQL reserved keyword dictionary. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - */ -abstract class KeywordList -{ - private $keywords = null; - - /** - * Check if the given word is a keyword of this dialect/vendor platform. - * - * @param string $word - * @return bool - */ - public function isKeyword($word) - { - if ($this->keywords === null) { - $this->initializeKeywords(); - } - - return isset($this->keywords[strtoupper($word)]); - } - - protected function initializeKeywords() - { - $this->keywords = array_flip(array_map('strtoupper', $this->getKeywords())); - } - - abstract protected function getKeywords(); - - /** - * Name of this keyword list. - * - * @return string - */ - abstract public function getName(); -} diff --git a/framework/library/Doctrine/DBAL/Platforms/Keywords/MsSQLKeywords.php b/framework/library/Doctrine/DBAL/Platforms/Keywords/MsSQLKeywords.php deleted file mode 100644 index 8adac11..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/Keywords/MsSQLKeywords.php +++ /dev/null @@ -1,243 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Platforms\Keywords; - -/** - * MsSQL Keywordlist - * - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - * @author David Coallier - */ -class MsSQLKeywords extends KeywordList -{ - public function getName() - { - return 'MsSQL'; - } - - protected function getKeywords() - { - return array( - 'ADD', - 'CURRENT_TIMESTAMP', - 'GROUP', - 'OPENQUERY', - 'SERIALIZABLE', - 'ALL', - 'CURRENT_USER', - 'HAVING', - 'OPENROWSET', - 'SESSION_USER', - 'ALTER', - 'CURSOR', - 'HOLDLOCK', - 'OPTION', - 'SET', - 'AND', - 'DATABASE', - 'IDENTITY', - 'OR', - 'SETUSER', - 'ANY', - 'DBCC', - 'IDENTITYCOL', - 'ORDER', - 'SHUTDOWN', - 'AS', - 'DEALLOCATE', - 'IDENTITY_INSERT', - 'OUTER', - 'SOME', - 'ASC', - 'DECLARE', - 'IF', - 'OVER', - 'STATISTICS', - 'AUTHORIZATION', - 'DEFAULT', - 'IN', - 'PERCENT', - 'SUM', - 'AVG', - 'DELETE', - 'INDEX', - 'PERM', - 'SYSTEM_USER', - 'BACKUP', - 'DENY', - 'INNER', - 'PERMANENT', - 'TABLE', - 'BEGIN', - 'DESC', - 'INSERT', - 'PIPE', - 'TAPE', - 'BETWEEN', - 'DISK', - 'INTERSECT', - 'PLAN', - 'TEMP', - 'BREAK', - 'DISTINCT', - 'INTO', - 'PRECISION', - 'TEMPORARY', - 'BROWSE', - 'DISTRIBUTED', - 'IS', - 'PREPARE', - 'TEXTSIZE', - 'BULK', - 'DOUBLE', - 'ISOLATION', - 'PRIMARY', - 'THEN', - 'BY', - 'DROP', - 'JOIN', - 'PRINT', - 'TO', - 'CASCADE', - 'DUMMY', - 'KEY', - 'PRIVILEGES', - 'TOP', - 'CASE', - 'DUMP', - 'KILL', - 'PROC', - 'TRAN', - 'CHECK', - 'ELSE', - 'LEFT', - 'PROCEDURE', - 'TRANSACTION', - 'CHECKPOINT', - 'END', - 'LEVEL', - 'PROCESSEXIT', - 'TRIGGER', - 'CLOSE', - 'ERRLVL', - 'LIKE', - 'PUBLIC', - 'TRUNCATE', - 'CLUSTERED', - 'ERROREXIT', - 'LINENO', - 'RAISERROR', - 'TSEQUAL', - 'COALESCE', - 'ESCAPE', - 'LOAD', - 'READ', - 'UNCOMMITTED', - 'COLUMN', - 'EXCEPT', - 'MAX', - 'READTEXT', - 'UNION', - 'COMMIT', - 'EXEC', - 'MIN', - 'RECONFIGURE', - 'UNIQUE', - 'COMMITTED', - 'EXECUTE', - 'MIRROREXIT', - 'REFERENCES', - 'UPDATE', - 'COMPUTE', - 'EXISTS', - 'NATIONAL', - 'REPEATABLE', - 'UPDATETEXT', - 'CONFIRM', - 'EXIT', - 'NOCHECK', - 'REPLICATION', - 'USE', - 'CONSTRAINT', - 'FETCH', - 'NONCLUSTERED', - 'RESTORE', - 'USER', - 'CONTAINS', - 'FILE', - 'NOT', - 'RESTRICT', - 'VALUES', - 'CONTAINSTABLE', - 'FILLFACTOR', - 'NULL', - 'RETURN', - 'VARYING', - 'CONTINUE', - 'FLOPPY', - 'NULLIF', - 'REVOKE', - 'VIEW', - 'CONTROLROW', - 'FOR', - 'OF', - 'RIGHT', - 'WAITFOR', - 'CONVERT', - 'FOREIGN', - 'OFF', - 'ROLLBACK', - 'WHEN', - 'COUNT', - 'FREETEXT', - 'OFFSETS', - 'ROWCOUNT', - 'WHERE', - 'CREATE', - 'FREETEXTTABLE', - 'ON', - 'ROWGUIDCOL', - 'WHILE', - 'CROSS', - 'FROM', - 'ONCE', - 'RULE', - 'WITH', - 'CURRENT', - 'FULL', - 'ONLY', - 'SAVE', - 'WORK', - 'CURRENT_DATE', - 'GOTO', - 'OPEN', - 'SCHEMA', - 'WRITETEXT', - 'CURRENT_TIME', - 'GRANT', - 'OPENDATASOURCE', - 'SELECT', - ); - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/Keywords/MySQLKeywords.php b/framework/library/Doctrine/DBAL/Platforms/Keywords/MySQLKeywords.php deleted file mode 100644 index c4ad5d6..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/Keywords/MySQLKeywords.php +++ /dev/null @@ -1,269 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Platforms\Keywords; - -/** - * MySQL Keywordlist - * - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - * @author David Coallier - */ -class MySQLKeywords extends KeywordList -{ - public function getName() - { - return 'MySQL'; - } - - protected function getKeywords() - { - return array( - 'ADD', - 'ALL', - 'ALTER', - 'ANALYZE', - 'AND', - 'AS', - 'ASC', - 'ASENSITIVE', - 'BEFORE', - 'BETWEEN', - 'BIGINT', - 'BINARY', - 'BLOB', - 'BOTH', - 'BY', - 'CALL', - 'CASCADE', - 'CASE', - 'CHANGE', - 'CHAR', - 'CHARACTER', - 'CHECK', - 'COLLATE', - 'COLUMN', - 'CONDITION', - 'CONNECTION', - 'CONSTRAINT', - 'CONTINUE', - 'CONVERT', - 'CREATE', - 'CROSS', - 'CURRENT_DATE', - 'CURRENT_TIME', - 'CURRENT_TIMESTAMP', - 'CURRENT_USER', - 'CURSOR', - 'DATABASE', - 'DATABASES', - 'DAY_HOUR', - 'DAY_MICROSECOND', - 'DAY_MINUTE', - 'DAY_SECOND', - 'DEC', - 'DECIMAL', - 'DECLARE', - 'DEFAULT', - 'DELAYED', - 'DELETE', - 'DESC', - 'DESCRIBE', - 'DETERMINISTIC', - 'DISTINCT', - 'DISTINCTROW', - 'DIV', - 'DOUBLE', - 'DROP', - 'DUAL', - 'EACH', - 'ELSE', - 'ELSEIF', - 'ENCLOSED', - 'ESCAPED', - 'EXISTS', - 'EXIT', - 'EXPLAIN', - 'FALSE', - 'FETCH', - 'FLOAT', - 'FLOAT4', - 'FLOAT8', - 'FOR', - 'FORCE', - 'FOREIGN', - 'FROM', - 'FULLTEXT', - 'GOTO', - 'GRANT', - 'GROUP', - 'HAVING', - 'HIGH_PRIORITY', - 'HOUR_MICROSECOND', - 'HOUR_MINUTE', - 'HOUR_SECOND', - 'IF', - 'IGNORE', - 'IN', - 'INDEX', - 'INFILE', - 'INNER', - 'INOUT', - 'INSENSITIVE', - 'INSERT', - 'INT', - 'INT1', - 'INT2', - 'INT3', - 'INT4', - 'INT8', - 'INTEGER', - 'INTERVAL', - 'INTO', - 'IS', - 'ITERATE', - 'JOIN', - 'KEY', - 'KEYS', - 'KILL', - 'LABEL', - 'LEADING', - 'LEAVE', - 'LEFT', - 'LIKE', - 'LIMIT', - 'LINES', - 'LOAD', - 'LOCALTIME', - 'LOCALTIMESTAMP', - 'LOCK', - 'LONG', - 'LONGBLOB', - 'LONGTEXT', - 'LOOP', - 'LOW_PRIORITY', - 'MATCH', - 'MEDIUMBLOB', - 'MEDIUMINT', - 'MEDIUMTEXT', - 'MIDDLEINT', - 'MINUTE_MICROSECOND', - 'MINUTE_SECOND', - 'MOD', - 'MODIFIES', - 'NATURAL', - 'NOT', - 'NO_WRITE_TO_BINLOG', - 'NULL', - 'NUMERIC', - 'ON', - 'OPTIMIZE', - 'OPTION', - 'OPTIONALLY', - 'OR', - 'ORDER', - 'OUT', - 'OUTER', - 'OUTFILE', - 'PRECISION', - 'PRIMARY', - 'PROCEDURE', - 'PURGE', - 'RAID0', - 'RANGE', - 'READ', - 'READS', - 'REAL', - 'REFERENCES', - 'REGEXP', - 'RELEASE', - 'RENAME', - 'REPEAT', - 'REPLACE', - 'REQUIRE', - 'RESTRICT', - 'RETURN', - 'REVOKE', - 'RIGHT', - 'RLIKE', - 'SCHEMA', - 'SCHEMAS', - 'SECOND_MICROSECOND', - 'SELECT', - 'SENSITIVE', - 'SEPARATOR', - 'SET', - 'SHOW', - 'SMALLINT', - 'SONAME', - 'SPATIAL', - 'SPECIFIC', - 'SQL', - 'SQLEXCEPTION', - 'SQLSTATE', - 'SQLWARNING', - 'SQL_BIG_RESULT', - 'SQL_CALC_FOUND_ROWS', - 'SQL_SMALL_RESULT', - 'SSL', - 'STARTING', - 'STRAIGHT_JOIN', - 'TABLE', - 'TERMINATED', - 'THEN', - 'TINYBLOB', - 'TINYINT', - 'TINYTEXT', - 'TO', - 'TRAILING', - 'TRIGGER', - 'TRUE', - 'UNDO', - 'UNION', - 'UNIQUE', - 'UNLOCK', - 'UNSIGNED', - 'UPDATE', - 'USAGE', - 'USE', - 'USING', - 'UTC_DATE', - 'UTC_TIME', - 'UTC_TIMESTAMP', - 'VALUES', - 'VARBINARY', - 'VARCHAR', - 'VARCHARACTER', - 'VARYING', - 'WHEN', - 'WHERE', - 'WHILE', - 'WITH', - 'WRITE', - 'X509', - 'XOR', - 'YEAR_MONTH', - 'ZEROFILL', - ); - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/Keywords/OracleKeywords.php b/framework/library/Doctrine/DBAL/Platforms/Keywords/OracleKeywords.php deleted file mode 100644 index 9f34ba6..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/Keywords/OracleKeywords.php +++ /dev/null @@ -1,157 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Platforms\Keywords; - -/** - * Oracle Keywordlist - * - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - * @author David Coallier - */ -class OracleKeywords extends KeywordList -{ - public function getName() - { - return 'Oracle'; - } - - protected function getKeywords() - { - return array( - 'ACCESS', - 'ELSE', - 'MODIFY', - 'START', - 'ADD', - 'EXCLUSIVE', - 'NOAUDIT', - 'SELECT', - 'ALL', - 'EXISTS', - 'NOCOMPRESS', - 'SESSION', - 'ALTER', - 'FILE', - 'NOT', - 'SET', - 'AND', - 'FLOAT', - 'NOTFOUND ', - 'SHARE', - 'ANY', - 'FOR', - 'NOWAIT', - 'SIZE', - 'ARRAYLEN', - 'FROM', - 'NULL', - 'SMALLINT', - 'AS', - 'GRANT', - 'NUMBER', - 'SQLBUF', - 'ASC', - 'GROUP', - 'OF', - 'SUCCESSFUL', - 'AUDIT', - 'HAVING', - 'OFFLINE ', - 'SYNONYM', - 'BETWEEN', - 'IDENTIFIED', - 'ON', - 'SYSDATE', - 'BY', - 'IMMEDIATE', - 'ONLINE', - 'TABLE', - 'CHAR', - 'IN', - 'OPTION', - 'THEN', - 'CHECK', - 'INCREMENT', - 'OR', - 'TO', - 'CLUSTER', - 'INDEX', - 'ORDER', - 'TRIGGER', - 'COLUMN', - 'INITIAL', - 'PCTFREE', - 'UID', - 'COMMENT', - 'INSERT', - 'PRIOR', - 'UNION', - 'COMPRESS', - 'INTEGER', - 'PRIVILEGES', - 'UNIQUE', - 'CONNECT', - 'INTERSECT', - 'PUBLIC', - 'UPDATE', - 'CREATE', - 'INTO', - 'RAW', - 'USER', - 'CURRENT', - 'IS', - 'RENAME', - 'VALIDATE', - 'DATE', - 'LEVEL', - 'RESOURCE', - 'VALUES', - 'DECIMAL', - 'LIKE', - 'REVOKE', - 'VARCHAR', - 'DEFAULT', - 'LOCK', - 'ROW', - 'VARCHAR2', - 'DELETE', - 'LONG', - 'ROWID', - 'VIEW', - 'DESC', - 'MAXEXTENTS', - 'ROWLABEL', - 'WHENEVER', - 'DISTINCT', - 'MINUS', - 'ROWNUM', - 'WHERE', - 'DROP', - 'MODE', - 'ROWS', - 'WITH', - 'RANGE', - ); - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/Keywords/PostgreSQLKeywords.php b/framework/library/Doctrine/DBAL/Platforms/Keywords/PostgreSQLKeywords.php deleted file mode 100644 index 7950f6a..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/Keywords/PostgreSQLKeywords.php +++ /dev/null @@ -1,131 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Platforms\Keywords; - -/** - * PostgreSQL Keywordlist - * - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - * @author Marcelo Santos Araujo - */ -class PostgreSQLKeywords extends KeywordList -{ - public function getName() - { - return 'PostgreSQL'; - } - - protected function getKeywords() - { - return array( - 'ALL', - 'ANALYSE', - 'ANALYZE', - 'AND', - 'ANY', - 'AS', - 'ASC', - 'AUTHORIZATION', - 'BETWEEN', - 'BINARY', - 'BOTH', - 'CASE', - 'CAST', - 'CHECK', - 'COLLATE', - 'COLUMN', - 'CONSTRAINT', - 'CREATE', - 'CURRENT_DATE', - 'CURRENT_TIME', - 'CURRENT_TIMESTAMP', - 'CURRENT_USER', - 'DEFAULT', - 'DEFERRABLE', - 'DESC', - 'DISTINCT', - 'DO', - 'ELSE', - 'END', - 'EXCEPT', - 'FALSE', - 'FOR', - 'FOREIGN', - 'FREEZE', - 'FROM', - 'FULL', - 'GRANT', - 'GROUP', - 'HAVING', - 'ILIKE', - 'IN', - 'INITIALLY', - 'INNER', - 'INTERSECT', - 'INTO', - 'IS', - 'ISNULL', - 'JOIN', - 'LEADING', - 'LEFT', - 'LIKE', - 'LIMIT', - 'LOCALTIME', - 'LOCALTIMESTAMP', - 'NATURAL', - 'NEW', - 'NOT', - 'NOTNULL', - 'NULL', - 'OFF', - 'OFFSET', - 'OLD', - 'ON', - 'ONLY', - 'OR', - 'ORDER', - 'OUTER', - 'OVERLAPS', - 'PLACING', - 'PRIMARY', - 'REFERENCES', - 'SELECT', - 'SESSION_USER', - 'SIMILAR', - 'SOME', - 'TABLE', - 'THEN', - 'TO', - 'TRAILING', - 'TRUE', - 'UNION', - 'UNIQUE', - 'USER', - 'USING', - 'VERBOSE', - 'WHEN', - 'WHERE' - ); - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/Keywords/ReservedKeywordsValidator.php b/framework/library/Doctrine/DBAL/Platforms/Keywords/ReservedKeywordsValidator.php deleted file mode 100644 index a61922b..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/Keywords/ReservedKeywordsValidator.php +++ /dev/null @@ -1,116 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Platforms\Keywords; - -use Doctrine\DBAL\Schema\Visitor\Visitor; -use Doctrine\DBAL\Schema\Table; -use Doctrine\DBAL\Schema\Column; -use Doctrine\DBAL\Schema\ForeignKeyConstraint; -use Doctrine\DBAL\Schema\Schema; -use Doctrine\DBAL\Schema\Sequence; -use Doctrine\DBAL\Schema\Index; - -class ReservedKeywordsValidator implements Visitor -{ - /** - * @var KeywordList[] - */ - private $keywordLists = array(); - - /** - * @var array - */ - private $violations = array(); - - public function __construct(array $keywordLists) - { - $this->keywordLists = $keywordLists; - } - - public function getViolations() - { - return $this->violations; - } - - /** - * @param string $word - * @return array - */ - private function isReservedWord($word) - { - if ($word[0] == "`") { - $word = str_replace('`', '', $word); - } - - $keywordLists = array(); - foreach ($this->keywordLists as $keywordList) { - if ($keywordList->isKeyword($word)) { - $keywordLists[] = $keywordList->getName(); - } - } - return $keywordLists; - } - - private function addViolation($asset, $violatedPlatforms) - { - if ( ! $violatedPlatforms) { - return; - } - - $this->violations[] = $asset . ' keyword violations: ' . implode(', ', $violatedPlatforms); - } - - public function acceptColumn(Table $table, Column $column) - { - $this->addViolation( - 'Table ' . $table->getName() . ' column ' . $column->getName(), - $this->isReservedWord($column->getName()) - ); - } - - public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) - { - - } - - public function acceptIndex(Table $table, Index $index) - { - - } - - public function acceptSchema(Schema $schema) - { - - } - - public function acceptSequence(Sequence $sequence) - { - - } - - public function acceptTable(Table $table) - { - $this->addViolation( - 'Table ' . $table->getName(), - $this->isReservedWord($table->getName()) - ); - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/Keywords/SQLiteKeywords.php b/framework/library/Doctrine/DBAL/Platforms/Keywords/SQLiteKeywords.php deleted file mode 100644 index d45b994..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/Keywords/SQLiteKeywords.php +++ /dev/null @@ -1,164 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Platforms\Keywords; - -/** - * SQLite Keywords - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - */ -class SQLiteKeywords extends KeywordList -{ - public function getName() - { - return 'SQLite'; - } - - protected function getKeywords() - { - return array( - 'ABORT', - 'ACTION', - 'ADD', - 'AFTER', - 'ALL', - 'ALTER', - 'ANALYZE', - 'AND', - 'AS', - 'ASC', - 'ATTACH', - 'AUTOINCREMENT', - 'BEFORE', - 'BEGIN', - 'BETWEEN', - 'BY', - 'CASCADE', - 'CASE', - 'CAST', - 'CHECK', - 'COLLATE', - 'COLUMN', - 'COMMIT', - 'CONFLICT', - 'CONSTRAINT', - 'CREATE', - 'CROSS', - 'CURRENT_DATE', - 'CURRENT_TIME', - 'CURRENT_TIMESTAMP', - 'DATABASE', - 'DEFAULT', - 'DEFERRABLE', - 'DEFERRED', - 'DELETE', - 'DESC', - 'DETACH', - 'DISTINCT', - 'DROP', - 'EACH', - 'ELSE', - 'END', - 'ESCAPE', - 'EXCEPT', - 'EXCLUSIVE', - 'EXISTS', - 'EXPLAIN', - 'FAIL', - 'FOR', - 'FOREIGN', - 'FROM', - 'FULL', - 'GLOB', - 'GROUP', - 'HAVING', - 'IF', - 'IGNORE', - 'IMMEDIATE', - 'IN', - 'INDEX', - 'INDEXED', - 'INITIALLY', - 'INNER', - 'INSERT', - 'INSTEAD', - 'INTERSECT', - 'INTO', - 'IS', - 'ISNULL', - 'JOIN', - 'KEY', - 'LEFT', - 'LIKE', - 'LIMIT', - 'MATCH', - 'NATURAL', - 'NO', - 'NOT', - 'NOTNULL', - 'NULL', - 'OF', - 'OFFSET', - 'ON', - 'OR', - 'ORDER', - 'OUTER', - 'PLAN', - 'PRAGMA', - 'PRIMARY', - 'QUERY', - 'RAISE', - 'REFERENCES', - 'REGEXP', - 'REINDEX', - 'RELEASE', - 'RENAME', - 'REPLACE', - 'RESTRICT', - 'RIGHT', - 'ROLLBACK', - 'ROW', - 'SAVEPOINT', - 'SELECT', - 'SET', - 'TABLE', - 'TEMP', - 'TEMPORARY', - 'THEN', - 'TO', - 'TRANSACTION', - 'TRIGGER', - 'UNION', - 'UNIQUE', - 'UPDATE', - 'USING', - 'VACUUM', - 'VALUES', - 'VIEW', - 'VIRTUAL', - 'WHEN', - 'WHERE' - ); - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/MySqlPlatform.php b/framework/library/Doctrine/DBAL/Platforms/MySqlPlatform.php deleted file mode 100644 index 2cf573f..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/MySqlPlatform.php +++ /dev/null @@ -1,722 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\DBALException, - Doctrine\DBAL\Schema\TableDiff, - Doctrine\DBAL\Schema\Index, - Doctrine\DBAL\Schema\Table; - -/** - * 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 -{ - /** - * {@inheritDoc} - */ - public function getIdentifierQuoteCharacter() - { - return '`'; - } - - /** - * {@inheritDoc} - */ - public function getRegexpExpression() - { - return 'RLIKE'; - } - - /** - * {@inheritDoc} - */ - public function getGuidExpression() - { - return 'UUID()'; - } - - /** - * {@inheritDoc} - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - if ($startPos == false) { - return 'LOCATE(' . $substr . ', ' . $str . ')'; - } - - return 'LOCATE(' . $substr . ', ' . $str . ', '.$startPos.')'; - } - - /** - * {@inheritDoc} - */ - public function getConcatExpression() - { - $args = func_get_args(); - return 'CONCAT(' . join(', ', (array) $args) . ')'; - } - - /** - * {@inheritDoc} - */ - public function getDateDiffExpression($date1, $date2) - { - return 'DATEDIFF(' . $date1 . ', ' . $date2 . ')'; - } - - /** - * {@inheritDoc} - */ - public function getDateAddDaysExpression($date, $days) - { - return 'DATE_ADD(' . $date . ', INTERVAL ' . $days . ' DAY)'; - } - - /** - * {@inheritDoc} - */ - public function getDateSubDaysExpression($date, $days) - { - return 'DATE_SUB(' . $date . ', INTERVAL ' . $days . ' DAY)'; - } - - /** - * {@inheritDoc} - */ - public function getDateAddMonthExpression($date, $months) - { - return 'DATE_ADD(' . $date . ', INTERVAL ' . $months . ' MONTH)'; - } - - /** - * {@inheritDoc} - */ - public function getDateSubMonthExpression($date, $months) - { - return 'DATE_SUB(' . $date . ', INTERVAL ' . $months . ' MONTH)'; - } - - public function getListDatabasesSQL() - { - return 'SHOW DATABASES'; - } - - public function getListTableConstraintsSQL($table) - { - return 'SHOW INDEX FROM ' . $table; - } - - /** - * {@inheritDoc} - * - * Two approaches to listing the table indexes. The information_schema is - * preferred, because it doesn't cause problems with SQL keywords such as "order" or "table". - * - * @param string $table - * @param string $currentDatabase - * @return string - */ - public function getListTableIndexesSQL($table, $currentDatabase = null) - { - if ($currentDatabase) { - return "SELECT TABLE_NAME AS `Table`, NON_UNIQUE AS Non_Unique, INDEX_NAME AS Key_name, ". - "SEQ_IN_INDEX AS Seq_in_index, COLUMN_NAME AS Column_Name, COLLATION AS Collation, ". - "CARDINALITY AS Cardinality, SUB_PART AS Sub_Part, PACKED AS Packed, " . - "NULLABLE AS `Null`, INDEX_TYPE AS Index_Type, COMMENT AS Comment " . - "FROM information_schema.STATISTICS WHERE TABLE_NAME = '" . $table . "' AND TABLE_SCHEMA = '" . $currentDatabase . "'"; - } - - 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 ". - " c.constraint_name = k.constraint_name AND ". - " c.table_name = '$table' */ WHERE k.table_name = '$table'"; - - if ($database) { - $sql .= " AND k.table_schema = '$database' /*!50116 AND c.constraint_schema = '$database' */"; - } - - $sql .= " AND k.`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; - } - - /** - * {@inheritDoc} - */ - protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) - { - return $fixed ? ($length ? 'CHAR(' . $length . ')' : 'CHAR(255)') - : ($length ? 'VARCHAR(' . $length . ')' : 'VARCHAR(255)'); - } - - /** - * {@inheritDoc} - */ - public function getClobTypeDeclarationSQL(array $field) - { - if ( ! empty($field['length']) && is_numeric($field['length'])) { - $length = $field['length']; - if ($length <= 255) { - return 'TINYTEXT'; - } - - if ($length <= 65532) { - return 'TEXT'; - } - - if ($length <= 16777215) { - return 'MEDIUMTEXT'; - } - } - - return 'LONGTEXT'; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - if (isset($fieldDeclaration['version']) && $fieldDeclaration['version'] == true) { - return 'TIMESTAMP'; - } - - return 'DATETIME'; - } - - /** - * {@inheritDoc} - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * {@inheritDoc} - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIME'; - } - - /** - * {@inheritDoc} - */ - 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; - } - - /** - * {@inheritDoc} - * - * MySql prefers "autoincrement" identity columns since sequences can only - * be emulated with a table. - */ - public function prefersIdentityColumns() - { - return true; - } - - /** - * {@inheritDoc} - * - * MySql supports this through AUTO_INCREMENT columns. - */ - public function supportsIdentityColumns() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function supportsInlineColumnComments() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function getShowDatabasesSQL() - { - return 'SHOW DATABASES'; - } - - public function getListTablesSQL() - { - return "SHOW FULL TABLES WHERE Table_type = 'BASE TABLE'"; - } - - public function getListTableColumnsSQL($table, $database = null) - { - if ($database) { - return "SELECT COLUMN_NAME AS Field, COLUMN_TYPE AS Type, IS_NULLABLE AS `Null`, ". - "COLUMN_KEY AS `Key`, COLUMN_DEFAULT AS `Default`, EXTRA AS Extra, COLUMN_COMMENT AS Comment, " . - "CHARACTER_SET_NAME AS CharacterSet, COLLATION_NAME AS CollactionName ". - "FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '" . $database . "' AND TABLE_NAME = '" . $table . "'"; - } - - return 'DESCRIBE ' . $table; - } - - /** - * {@inheritDoc} - */ - public function getCreateDatabaseSQL($name) - { - return 'CREATE DATABASE ' . $name; - } - - /** - * {@inheritDoc} - */ - public function getDropDatabaseSQL($name) - { - return 'DROP DATABASE ' . $name; - } - - /** - * {@inheritDoc} - */ - 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 . ') '; - - if (isset($options['comment'])) { - $comment = trim($options['comment'], " '"); - - $query .= sprintf("COMMENT = '%s' ", str_replace("'", "''", $comment)); - } - - if ( ! isset($options['charset'])) { - $options['charset'] = 'utf8'; - } - - if ( ! isset($options['collate'])) { - $options['collate'] = 'utf8_unicode_ci'; - } - - $query .= 'DEFAULT CHARACTER SET ' . $options['charset']; - $query .= ' COLLATE ' . $options['collate']; - - if ( ! isset($options['engine'])) { - $options['engine'] = 'InnoDB'; - } - $query .= ' ENGINE = ' . $options['engine']; - - $sql[] = $query; - - if (isset($options['foreignKeys'])) { - foreach ((array) $options['foreignKeys'] as $definition) { - $sql[] = $this->getCreateForeignKeySQL($definition, $tableName); - } - } - - return $sql; - } - - /** - * {@inheritDoc} - */ - public function getAlterTableSQL(TableDiff $diff) - { - $columnSql = array(); - $queryParts = array(); - if ($diff->newName !== false) { - $queryParts[] = 'RENAME TO ' . $diff->newName; - } - - foreach ($diff->addedColumns as $column) { - if ($this->onSchemaAlterTableAddColumn($column, $diff, $columnSql)) { - continue; - } - - $columnArray = $column->toArray(); - $columnArray['comment'] = $this->getColumnComment($column); - $queryParts[] = 'ADD ' . $this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray); - } - - foreach ($diff->removedColumns as $column) { - if ($this->onSchemaAlterTableRemoveColumn($column, $diff, $columnSql)) { - continue; - } - - $queryParts[] = 'DROP ' . $column->getQuotedName($this); - } - - foreach ($diff->changedColumns as $columnDiff) { - if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { - continue; - } - - /* @var $columnDiff \Doctrine\DBAL\Schema\ColumnDiff */ - $column = $columnDiff->column; - $columnArray = $column->toArray(); - $columnArray['comment'] = $this->getColumnComment($column); - $queryParts[] = 'CHANGE ' . ($columnDiff->oldColumnName) . ' ' - . $this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray); - } - - foreach ($diff->renamedColumns as $oldColumnName => $column) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) { - continue; - } - - $columnArray = $column->toArray(); - $columnArray['comment'] = $this->getColumnComment($column); - $queryParts[] = 'CHANGE ' . $oldColumnName . ' ' - . $this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray); - } - - $sql = array(); - $tableSql = array(); - - if ( ! $this->onSchemaAlterTable($diff, $tableSql)) { - if (count($queryParts) > 0) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . implode(", ", $queryParts); - } - $sql = array_merge( - $this->getPreAlterTableIndexForeignKeySQL($diff), - $sql, - $this->getPostAlterTableIndexForeignKeySQL($diff) - ); - } - - return array_merge($sql, $tableSql, $columnSql); - } - - /** - * {@inheritDoc} - */ - protected function getPreAlterTableIndexForeignKeySQL(TableDiff $diff) - { - $sql = array(); - $table = $diff->name; - - foreach ($diff->removedIndexes as $remKey => $remIndex) { - - foreach ($diff->addedIndexes as $addKey => $addIndex) { - if ($remIndex->getColumns() == $addIndex->getColumns()) { - - $columns = $addIndex->getColumns(); - $type = ''; - if ($addIndex->isUnique()) { - $type = 'UNIQUE '; - } - - $query = 'ALTER TABLE ' . $table . ' DROP INDEX ' . $remIndex->getName() . ', '; - $query .= 'ADD ' . $type . 'INDEX ' . $addIndex->getName(); - $query .= ' (' . $this->getIndexFieldDeclarationListSQL($columns) . ')'; - - $sql[] = $query; - - unset($diff->removedIndexes[$remKey]); - unset($diff->addedIndexes[$addKey]); - - break; - } - } - } - - $sql = array_merge($sql, parent::getPreAlterTableIndexForeignKeySQL($diff)); - - return $sql; - } - - /** - * {@inheritDoc} - */ - protected function getCreateIndexSQLFlags(Index $index) - { - $type = ''; - if ($index->isUnique()) { - $type .= 'UNIQUE '; - } else if ($index->hasFlag('fulltext')) { - $type .= 'FULLTEXT '; - } - - return $type; - } - - /** - * {@inheritDoc} - */ - public function getIntegerTypeDeclarationSQL(array $field) - { - return 'INT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - public function getBigIntTypeDeclarationSQL(array $field) - { - return 'BIGINT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - public function getSmallIntTypeDeclarationSQL(array $field) - { - return 'SMALLINT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - $autoinc = ''; - if ( ! empty($columnDef['autoincrement'])) { - $autoinc = ' AUTO_INCREMENT'; - } - $unsigned = (isset($columnDef['unsigned']) && $columnDef['unsigned']) ? ' UNSIGNED' : ''; - - return $unsigned . $autoinc; - } - - /** - * {@inheritDoc} - */ - public function getAdvancedForeignKeyOptionsSQL(\Doctrine\DBAL\Schema\ForeignKeyConstraint $foreignKey) - { - $query = ''; - if ($foreignKey->hasOption('match')) { - $query .= ' MATCH ' . $foreignKey->getOption('match'); - } - $query .= parent::getAdvancedForeignKeyOptionsSQL($foreignKey); - return $query; - } - - /** - * {@inheritDoc} - */ - public function getDropIndexSQL($index, $table=null) - { - if ($index instanceof Index) { - $indexName = $index->getQuotedName($this); - } else if(is_string($index)) { - $indexName = $index; - } else { - throw new \InvalidArgumentException('MysqlPlatform::getDropIndexSQL() expects $index parameter to be string or \Doctrine\DBAL\Schema\Index.'); - } - - if ($table instanceof Table) { - $table = $table->getQuotedName($this); - } else if(!is_string($table)) { - throw new \InvalidArgumentException('MysqlPlatform::getDropIndexSQL() expects $table parameter to be string or \Doctrine\DBAL\Schema\Table.'); - } - - if ($index instanceof Index && $index->isPrimary()) { - // mysql primary keys are always named "PRIMARY", - // so we cannot use them in statements because of them being keyword. - return $this->getDropPrimaryKeySQL($table); - } - - return 'DROP INDEX ' . $indexName . ' ON ' . $table; - } - - /** - * @param string $table - * - * @return string - */ - protected function getDropPrimaryKeySQL($table) - { - return 'ALTER TABLE ' . $table . ' DROP PRIMARY KEY'; - } - - /** - * {@inheritDoc} - */ - public function getSetTransactionIsolationSQL($level) - { - return 'SET SESSION TRANSACTION ISOLATION LEVEL ' . $this->_getTransactionIsolationLevelSQL($level); - } - - /** - * {@inheritDoc} - */ - public function getName() - { - return 'mysql'; - } - - /** - * {@inheritDoc} - */ - public function getReadLockSQL() - { - return 'LOCK IN SHARE MODE'; - } - - /** - * {@inheritDoc} - */ - protected function initializeDoctrineTypeMappings() - { - $this->doctrineTypeMapping = array( - 'tinyint' => 'boolean', - 'smallint' => 'smallint', - 'mediumint' => 'integer', - 'int' => 'integer', - 'integer' => 'integer', - 'bigint' => 'bigint', - 'tinytext' => 'text', - 'mediumtext' => 'text', - 'longtext' => 'text', - 'text' => 'text', - 'varchar' => 'string', - 'string' => 'string', - 'char' => 'string', - 'date' => 'date', - 'datetime' => 'datetime', - 'timestamp' => 'datetime', - 'time' => 'time', - 'float' => 'float', - 'double' => 'float', - 'real' => 'float', - 'decimal' => 'decimal', - 'numeric' => 'decimal', - 'year' => 'date', - 'longblob' => 'blob', - 'blob' => 'blob', - 'mediumblob' => 'blob', - 'tinyblob' => 'blob', - 'binary' => 'blob', - 'varbinary' => 'blob', - 'set' => 'simple_array', - ); - } - - /** - * {@inheritDoc} - */ - public function getVarcharMaxLength() - { - return 65535; - } - - /** - * {@inheritDoc} - */ - protected function getReservedKeywordsClass() - { - return 'Doctrine\DBAL\Platforms\Keywords\MySQLKeywords'; - } - - /** - * {@inheritDoc} - * - * MySQL commits a transaction implicitly when DROP TABLE is executed, however not - * if DROP TEMPORARY TABLE is executed. - */ - public function getDropTemporaryTableSQL($table) - { - if ($table instanceof Table) { - $table = $table->getQuotedName($this); - } else if(!is_string($table)) { - throw new \InvalidArgumentException('getDropTableSQL() expects $table parameter to be string or \Doctrine\DBAL\Schema\Table.'); - } - - return 'DROP TEMPORARY TABLE ' . $table; - } - - /** - * {@inheritDoc} - */ - public function getBlobTypeDeclarationSQL(array $field) - { - return 'LONGBLOB'; - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/OraclePlatform.php b/framework/library/Doctrine/DBAL/Platforms/OraclePlatform.php deleted file mode 100644 index cd5c774..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/OraclePlatform.php +++ /dev/null @@ -1,822 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\Schema\ForeignKeyConstraint; -use Doctrine\DBAL\Schema\Index; -use Doctrine\DBAL\Schema\Sequence; -use Doctrine\DBAL\Schema\Table; -use Doctrine\DBAL\Schema\TableDiff; -use Doctrine\DBAL\DBALException; - -/** - * OraclePlatform. - * - * @since 2.0 - * @author Roman Borschel - * @author Lukas Smith (PEAR MDB2 library) - * @author Benjamin Eberlei - */ -class OraclePlatform extends AbstractPlatform -{ - /** - * Assertion for Oracle identifiers - * - * @link http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements008.htm - * - * @param string - * - * @throws DBALException - */ - static public function assertValidIdentifier($identifier) - { - if ( ! preg_match('(^(([a-zA-Z]{1}[a-zA-Z0-9_$#]{0,})|("[^"]+"))$)', $identifier)) { - throw new DBALException("Invalid Oracle identifier"); - } - } - - /** - * {@inheritDoc} - */ - public function getSubstringExpression($value, $position, $length = null) - { - if ($length !== null) { - return "SUBSTR($value, $position, $length)"; - } - - return "SUBSTR($value, $position)"; - } - - /** - * {@inheritDoc} - */ - 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\')'; - } - } - - /** - * {@inheritDoc} - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - if ($startPos == false) { - return 'INSTR('.$str.', '.$substr.')'; - } - - return 'INSTR('.$str.', '.$substr.', '.$startPos.')'; - } - - /** - * {@inheritDoc} - */ - public function getGuidExpression() - { - return 'SYS_GUID()'; - } - - /** - * {@inheritDoc} - * - * Note: Since Oracle timestamp differences are calculated down to the microsecond we have to truncate - * them to the difference in days. This is obviously a restriction of the original functionality, but we - * need to make this a portable function. - */ - public function getDateDiffExpression($date1, $date2) - { - return "TRUNC(TO_NUMBER(SUBSTR((" . $date1 . "-" . $date2 . "), 1, INSTR(" . $date1 . "-" . $date2 .", ' '))))"; - } - - /** - * {@inheritDoc} - */ - public function getDateAddDaysExpression($date, $days) - { - return '(' . $date . '+' . $days . ')'; - } - - /** - * {@inheritDoc} - */ - public function getDateSubDaysExpression($date, $days) - { - return '(' . $date . '-' . $days . ')'; - } - - /** - * {@inheritDoc} - */ - public function getDateAddMonthExpression($date, $months) - { - return "ADD_MONTHS(" . $date . ", " . $months . ")"; - } - - /** - * {@inheritDoc} - */ - public function getDateSubMonthExpression($date, $months) - { - return "ADD_MONTHS(" . $date . ", -" . $months . ")"; - } - - /** - * {@inheritDoc} - */ - public function getBitAndComparisonExpression($value1, $value2) - { - return 'BITAND('.$value1 . ', ' . $value2 . ')'; - } - - /** - * {@inheritDoc} - */ - public function getBitOrComparisonExpression($value1, $value2) - { - return '(' . $value1 . '-' . - $this->getBitAndComparisonExpression($value1, $value2) - . '+' . $value2 . ')'; - } - - /** - * {@inheritDoc} - * - * 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()} - */ - public function getCreateSequenceSQL(Sequence $sequence) - { - return 'CREATE SEQUENCE ' . $sequence->getQuotedName($this) . - ' START WITH ' . $sequence->getInitialValue() . - ' MINVALUE ' . $sequence->getInitialValue() . - ' INCREMENT BY ' . $sequence->getAllocationSize(); - } - - /** - * {@inheritDoc} - */ - public function getAlterSequenceSQL(\Doctrine\DBAL\Schema\Sequence $sequence) - { - return 'ALTER SEQUENCE ' . $sequence->getQuotedName($this) . - ' INCREMENT BY ' . $sequence->getAllocationSize(); - } - - /** - * {@inheritDoc} - */ - public function getSequenceNextValSQL($sequenceName) - { - return 'SELECT ' . $sequenceName . '.nextval FROM DUAL'; - } - - /** - * {@inheritDoc} - */ - public function getSetTransactionIsolationSQL($level) - { - return 'SET TRANSACTION ISOLATION LEVEL ' . $this->_getTransactionIsolationLevelSQL($level); - } - - /** - * {@inheritDoc} - */ - 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); - } - } - - /** - * {@inheritDoc} - */ - public function getBooleanTypeDeclarationSQL(array $field) - { - return 'NUMBER(1)'; - } - - /** - * {@inheritDoc} - */ - public function getIntegerTypeDeclarationSQL(array $field) - { - return 'NUMBER(10)'; - } - - /** - * {@inheritDoc} - */ - public function getBigIntTypeDeclarationSQL(array $field) - { - return 'NUMBER(20)'; - } - - /** - * {@inheritDoc} - */ - public function getSmallIntTypeDeclarationSQL(array $field) - { - return 'NUMBER(5)'; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIMESTAMP(0)'; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTzTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIMESTAMP(0) WITH TIME ZONE'; - } - - /** - * {@inheritDoc} - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * {@inheritDoc} - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * {@inheritDoc} - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - return ''; - } - - /** - * {@inheritDoc} - */ - protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) - { - return $fixed ? ($length ? 'CHAR(' . $length . ')' : 'CHAR(2000)') - : ($length ? 'VARCHAR2(' . $length . ')' : 'VARCHAR2(4000)'); - } - - /** - * {@inheritDoc} - */ - 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)."'"; - } - - /** - * {@inheritDoc} - */ - 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 $index) { - $sql[] = $this->getCreateIndexSQL($index, $table); - } - } - - return $sql; - } - - /** - * {@inheritDoc} - * - * @license New BSD License - * @link http://ezcomponents.org/docs/api/trunk/DatabaseSchema/ezcDbSchemaOracleReader.html - */ - public function getListTableIndexesSQL($table, $currentDatabase = null) - { - $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'; - } - - /** - * {@inheritDoc} - */ - 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'; - - $idx = new 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 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'; - - $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 user_cons_columns cols -LEFT JOIN user_constraints alc - ON alc.constraint_name = cols.constraint_name -LEFT JOIN user_constraints r_alc - ON alc.r_constraint_name = r_alc.constraint_name -LEFT JOIN user_cons_columns r_cols - ON r_alc.constraint_name = r_cols.constraint_name - 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, $database = null) - { - $table = strtoupper($table); - - $tabColumnsTableName = "user_tab_columns"; - $ownerCondition = ''; - - if (null !== $database){ - $database = strtoupper($database); - $tabColumnsTableName = "all_tab_columns"; - $ownerCondition = "AND c.owner = '".$database."'"; - } - - return "SELECT c.*, d.comments FROM $tabColumnsTableName c ". - "INNER JOIN user_col_comments d ON d.TABLE_NAME = c.TABLE_NAME AND d.COLUMN_NAME = c.COLUMN_NAME ". - "WHERE c.table_name = '" . $table . "' ".$ownerCondition." ORDER BY c.column_name"; - } - - /** - * {@inheritDoc} - */ - public function getDropSequenceSQL($sequence) - { - if ($sequence instanceof Sequence) { - $sequence = $sequence->getQuotedName($this); - } - - return 'DROP SEQUENCE ' . $sequence; - } - - /** - * {@inheritDoc} - */ - public function getDropForeignKeySQL($foreignKey, $table) - { - if ($foreignKey instanceof ForeignKeyConstraint) { - $foreignKey = $foreignKey->getQuotedName($this); - } - - if ($table instanceof Table) { - $table = $table->getQuotedName($this); - } - - return 'ALTER TABLE ' . $table . ' DROP CONSTRAINT ' . $foreignKey; - } - - /** - * {@inheritDoc} - */ - public function getDropDatabaseSQL($database) - { - return 'DROP USER ' . $database . ' CASCADE'; - } - - /** - * {@inheritDoc} - */ - public function getAlterTableSQL(TableDiff $diff) - { - $sql = array(); - $commentsSQL = array(); - $columnSql = array(); - - $fields = array(); - - foreach ($diff->addedColumns as $column) { - if ($this->onSchemaAlterTableAddColumn($column, $diff, $columnSql)) { - continue; - } - - $fields[] = $this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray()); - if ($comment = $this->getColumnComment($column)) { - $commentsSQL[] = $this->getCommentOnColumnSQL($diff->name, $column->getName(), $comment); - } - } - - if (count($fields)) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' ADD (' . implode(', ', $fields) . ')'; - } - - $fields = array(); - foreach ($diff->changedColumns as $columnDiff) { - if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { - continue; - } - - $column = $columnDiff->column; - $fields[] = $column->getQuotedName($this). ' ' . $this->getColumnDeclarationSQL('', $column->toArray()); - if ($columnDiff->hasChanged('comment') && $comment = $this->getColumnComment($column)) { - $commentsSQL[] = $this->getCommentOnColumnSQL($diff->name, $column->getName(), $comment); - } - } - - if (count($fields)) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' MODIFY (' . implode(', ', $fields) . ')'; - } - - foreach ($diff->renamedColumns as $oldColumnName => $column) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) { - continue; - } - - $sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME COLUMN ' . $oldColumnName .' TO ' . $column->getQuotedName($this); - } - - $fields = array(); - foreach ($diff->removedColumns as $column) { - if ($this->onSchemaAlterTableRemoveColumn($column, $diff, $columnSql)) { - continue; - } - - $fields[] = $column->getQuotedName($this); - } - - if (count($fields)) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' DROP (' . implode(', ', $fields).')'; - } - - $tableSql = array(); - - if ( ! $this->onSchemaAlterTable($diff, $tableSql)) { - if ($diff->newName !== false) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME TO ' . $diff->newName; - } - - $sql = array_merge($sql, $this->_getAlterTableIndexForeignKeySQL($diff), $commentsSQL); - } - - return array_merge($sql, $tableSql, $columnSql); - } - - /** - * {@inheritDoc} - */ - public function prefersSequences() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function supportsCommentOnStatement() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function getName() - { - return 'oracle'; - } - - /** - * {@inheritDoc} - */ - protected function doModifyLimitQuery($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 * FROM (SELECT a.' . $column . ', rownum AS doctrine_rownum FROM (' . - $query . - ') a WHERE rownum <= ' . $max . ') WHERE doctrine_rownum >= ' . $min; - } else { - $query = 'SELECT a.' . $column . ' FROM (' . $query . ') a WHERE ROWNUM <= ' . $max; - } - } - } - - return $query; - } - - /** - * {@inheritDoc} - * - * Oracle returns all column names in SQL result sets in uppercase. - */ - public function getSQLResultCasing($column) - { - return strtoupper($column); - } - - public function getCreateTemporaryTableSnippetSQL() - { - return "CREATE GLOBAL TEMPORARY TABLE"; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTzFormatString() - { - return 'Y-m-d H:i:sP'; - } - - /** - * {@inheritDoc} - */ - public function getDateFormatString() - { - return 'Y-m-d 00:00:00'; - } - - /** - * {@inheritDoc} - */ - public function getTimeFormatString() - { - return '1900-01-01 H:i:s'; - } - - /** - * {@inheritDoc} - */ - public function fixSchemaElementName($schemaElementName) - { - if (strlen($schemaElementName) > 30) { - // Trim it - return substr($schemaElementName, 0, 30); - } - - return $schemaElementName; - } - - /** - * {@inheritDoc} - */ - public function getMaxIdentifierLength() - { - return 30; - } - - /** - * {@inheritDoc} - */ - public function supportsSequences() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function supportsForeignKeyOnUpdate() - { - return false; - } - - /** - * {@inheritDoc} - */ - public function supportsReleaseSavepoints() - { - return false; - } - - /** - * {@inheritDoc} - */ - public function getTruncateTableSQL($tableName, $cascade = false) - { - return 'TRUNCATE TABLE '.$tableName; - } - - /** - * {@inheritDoc} - */ - public function getDummySelectSQL() - { - return 'SELECT 1 FROM DUAL'; - } - - /** - * {@inheritDoc} - */ - protected function initializeDoctrineTypeMappings() - { - $this->doctrineTypeMapping = array( - 'integer' => 'integer', - 'number' => 'integer', - 'pls_integer' => 'boolean', - 'binary_integer' => 'boolean', - 'varchar' => 'string', - 'varchar2' => 'string', - 'nvarchar2' => 'string', - 'char' => 'string', - 'nchar' => 'string', - 'date' => 'datetime', - 'timestamp' => 'datetime', - 'timestamptz' => 'datetimetz', - 'float' => 'float', - 'long' => 'string', - 'clob' => 'text', - 'nclob' => 'text', - 'raw' => 'text', - 'long raw' => 'text', - 'rowid' => 'string', - 'urowid' => 'string', - 'blob' => 'blob', - ); - } - - /** - * {@inheritDoc} - */ - public function releaseSavePoint($savepoint) - { - return ''; - } - - /** - * {@inheritDoc} - */ - protected function getReservedKeywordsClass() - { - return 'Doctrine\DBAL\Platforms\Keywords\OracleKeywords'; - } - - /** - * {@inheritDoc} - */ - public function getBlobTypeDeclarationSQL(array $field) - { - return 'BLOB'; - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/PostgreSqlPlatform.php b/framework/library/Doctrine/DBAL/Platforms/PostgreSqlPlatform.php deleted file mode 100644 index 2f907a2..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/PostgreSqlPlatform.php +++ /dev/null @@ -1,767 +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 -{ - /** - * {@inheritDoc} - */ - public function getSubstringExpression($value, $from, $length = null) - { - if ($length === null) { - return 'SUBSTR(' . $value . ', ' . $from . ')'; - } - - return 'SUBSTR(' . $value . ', ' . $from . ', ' . $length . ')'; - } - - /** - * {@inheritDoc} - */ - public function getNowExpression() - { - return 'LOCALTIMESTAMP(0)'; - } - - /** - * {@inheritDoc} - */ - public function getRegexpExpression() - { - return 'SIMILAR TO'; - } - - /** - * {@inheritDoc} - */ - 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'; - } - - return 'POSITION('.$substr.' IN '.$str.')'; - } - - /** - * {@inheritDoc} - */ - public function getDateDiffExpression($date1, $date2) - { - return '(DATE(' . $date1 . ')-DATE(' . $date2 . '))'; - } - - /** - * {@inheritDoc} - */ - public function getDateAddDaysExpression($date, $days) - { - return "(" . $date ." + (" . $days . " || ' day')::interval)"; - } - - /** - * {@inheritDoc} - */ - public function getDateSubDaysExpression($date, $days) - { - return "(" . $date ." - (" . $days . " || ' day')::interval)"; - } - - /** - * {@inheritDoc} - */ - public function getDateAddMonthExpression($date, $months) - { - return "(" . $date ." + (" . $months . " || ' month')::interval)"; - } - - /** - * {@inheritDoc} - */ - public function getDateSubMonthExpression($date, $months) - { - return "(" . $date ." - (" . $months . " || ' month')::interval)"; - } - - /** - * {@inheritDoc} - */ - public function supportsSequences() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function supportsSchemas() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function supportsIdentityColumns() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function supportsCommentOnStatement() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function prefersSequences() - { - return true; - } - - public function getListDatabasesSQL() - { - return 'SELECT datname FROM pg_database'; - } - - public function getListSequencesSQL($database) - { - return "SELECT - c.relname, n.nspname AS schemaname - FROM - pg_class c, pg_namespace n - WHERE relkind = 'S' AND n.oid = c.relnamespace AND - (n.nspname NOT LIKE 'pg_%' AND n.nspname != 'information_schema')"; - } - - public function getListTablesSQL() - { - return "SELECT tablename AS table_name, schemaname AS schema_name - FROM pg_tables WHERE schemaname NOT LIKE 'pg_%' AND schemaname != 'information_schema' AND tablename != 'geometry_columns' AND tablename != 'spatial_ref_sys'"; - } - - /** - * {@inheritDoc} - */ - 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, pg_catalog.pg_namespace n - WHERE " .$this->getTableWhereClause($table) ." AND n.oid = c.relnamespace - ) - 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') - )"; - } - - /** - * {@inheritDoc} - * - * @license New BSD License - * @link http://ezcomponents.org/docs/api/trunk/DatabaseSchema/ezcDbSchemaPgsqlReader.html - */ - public function getListTableIndexesSQL($table, $currentDatabase = null) - { - 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 si, pg_class sc, pg_namespace sn - WHERE " . $this->getTableWhereClause($table, 'sc', 'sn')." AND sc.oid=si.indrelid AND sc.relnamespace = sn.oid - ) AND pg_index.indexrelid = oid"; - } - - /** - * @param string $table - * @param string $classAlias - * @param string $namespaceAlias - * - * @return string - */ - private function getTableWhereClause($table, $classAlias = 'c', $namespaceAlias = 'n') - { - $whereClause = $namespaceAlias.".nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast') AND "; - if (strpos($table, ".") !== false) { - list($schema, $table) = explode(".", $table); - $schema = "'" . $schema . "'"; - } else { - $schema = "ANY(string_to_array((select replace(setting,'\"\$user\"',user) from pg_catalog.pg_settings where name = 'search_path'),','))"; - } - $whereClause .= "$classAlias.relname = '" . $table . "' AND $namespaceAlias.nspname = $schema"; - - return $whereClause; - } - - public function getListTableColumnsSQL($table, $database = null) - { - return "SELECT - a.attnum, - a.attname AS field, - t.typname AS type, - format_type(a.atttypid, a.atttypmod) AS complete_type, - (SELECT t1.typname FROM pg_catalog.pg_type t1 WHERE t1.oid = t.typbasetype) AS domain_type, - (SELECT format_type(t2.typbasetype, t2.typtypmod) FROM - pg_catalog.pg_type t2 WHERE t2.typtype = 'd' AND t2.oid = a.atttypid) AS domain_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, - (SELECT pg_description.description - FROM pg_description WHERE pg_description.objoid = c.oid AND a.attnum = pg_description.objsubid - ) AS comment - FROM pg_attribute a, pg_class c, pg_type t, pg_namespace n - WHERE ".$this->getTableWhereClause($table, 'c', 'n') ." - AND a.attnum > 0 - AND a.attrelid = c.oid - AND a.atttypid = t.oid - AND n.oid = c.relnamespace - ORDER BY a.attnum"; - } - - /** - * {@inheritDoc} - */ - public function getCreateDatabaseSQL($name) - { - return 'CREATE DATABASE ' . $name; - } - - /** - * {@inheritDoc} - */ - 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; - } - - /** - * {@inheritDoc} - */ - public function getAlterTableSQL(TableDiff $diff) - { - $sql = array(); - $commentsSQL = array(); - $columnSql = array(); - - foreach ($diff->addedColumns as $column) { - if ($this->onSchemaAlterTableAddColumn($column, $diff, $columnSql)) { - continue; - } - - $query = 'ADD ' . $this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray()); - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query; - if ($comment = $this->getColumnComment($column)) { - $commentsSQL[] = $this->getCommentOnColumnSQL($diff->name, $column->getName(), $comment); - } - } - - foreach ($diff->removedColumns as $column) { - if ($this->onSchemaAlterTableRemoveColumn($column, $diff, $columnSql)) { - continue; - } - - $query = 'DROP ' . $column->getQuotedName($this); - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query; - } - - foreach ($diff->changedColumns as $columnDiff) { - /** @var $columnDiff \Doctrine\DBAL\Schema\ColumnDiff */ - if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { - continue; - } - - $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; - } - - if ($columnDiff->hasChanged('autoincrement')) { - if ($column->getAutoincrement()) { - // add autoincrement - $seqName = $diff->name . '_' . $oldColumnName . '_seq'; - - $sql[] = "CREATE SEQUENCE " . $seqName; - $sql[] = "SELECT setval('" . $seqName . "', (SELECT MAX(" . $oldColumnName . ") FROM " . $diff->name . "))"; - $query = "ALTER " . $oldColumnName . " SET DEFAULT nextval('" . $seqName . "')"; - $sql[] = "ALTER TABLE " . $diff->name . " " . $query; - } else { - // Drop autoincrement, but do NOT drop the sequence. It might be re-used by other tables or have - $query = "ALTER " . $oldColumnName . " " . "DROP DEFAULT"; - $sql[] = "ALTER TABLE " . $diff->name . " " . $query; - } - } - - if ($columnDiff->hasChanged('comment') && $comment = $this->getColumnComment($column)) { - $commentsSQL[] = $this->getCommentOnColumnSQL($diff->name, $column->getName(), $comment); - } - - if ($columnDiff->hasChanged('length')) { - $query = 'ALTER ' . $column->getName() . ' TYPE ' . $column->getType()->getSqlDeclaration($column->toArray(), $this); - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query; - } - } - - foreach ($diff->renamedColumns as $oldColumnName => $column) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) { - continue; - } - - $sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME COLUMN ' . $oldColumnName . ' TO ' . $column->getQuotedName($this); - } - - $tableSql = array(); - - if ( ! $this->onSchemaAlterTable($diff, $tableSql)) { - if ($diff->newName !== false) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME TO ' . $diff->newName; - } - - $sql = array_merge($sql, $this->_getAlterTableIndexForeignKeySQL($diff), $commentsSQL); - } - - return array_merge($sql, $tableSql, $columnSql); - } - - /** - * {@inheritDoc} - */ - public function getCreateSequenceSQL(\Doctrine\DBAL\Schema\Sequence $sequence) - { - return 'CREATE SEQUENCE ' . $sequence->getQuotedName($this) . - ' INCREMENT BY ' . $sequence->getAllocationSize() . - ' MINVALUE ' . $sequence->getInitialValue() . - ' START ' . $sequence->getInitialValue(); - } - - /** - * {@inheritDoc} - */ - public function getAlterSequenceSQL(\Doctrine\DBAL\Schema\Sequence $sequence) - { - return 'ALTER SEQUENCE ' . $sequence->getQuotedName($this) . - ' INCREMENT BY ' . $sequence->getAllocationSize(); - } - - /** - * {@inheritDoc} - */ - public function getDropSequenceSQL($sequence) - { - if ($sequence instanceof \Doctrine\DBAL\Schema\Sequence) { - $sequence = $sequence->getQuotedName($this); - } - return 'DROP SEQUENCE ' . $sequence . ' CASCADE'; - } - - /** - * {@inheritDoc} - */ - public function getDropForeignKeySQL($foreignKey, $table) - { - return $this->getDropConstraintSQL($foreignKey, $table); - } - - /** - * {@inheritDoc} - */ - 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; - } - - /** - * {@inheritDoc} - * - * Postgres wants boolean values converted to the strings 'true'/'false'. - */ - 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 . "')"; - } - - /** - * {@inheritDoc} - */ - public function getSetTransactionIsolationSQL($level) - { - return 'SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL ' - . $this->_getTransactionIsolationLevelSQL($level); - } - - /** - * {@inheritDoc} - */ - public function getBooleanTypeDeclarationSQL(array $field) - { - return 'BOOLEAN'; - } - - /** - * {@inheritDoc} - */ - public function getIntegerTypeDeclarationSQL(array $field) - { - if ( ! empty($field['autoincrement'])) { - return 'SERIAL'; - } - - return 'INT'; - } - - /** - * {@inheritDoc} - */ - public function getBigIntTypeDeclarationSQL(array $field) - { - if ( ! empty($field['autoincrement'])) { - return 'BIGSERIAL'; - } - return 'BIGINT'; - } - - /** - * {@inheritDoc} - */ - public function getSmallIntTypeDeclarationSQL(array $field) - { - return 'SMALLINT'; - } - - /** - * {@inheritDoc} - */ - public function getGuidTypeDeclarationSQL(array $field) - { - return 'UUID'; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIMESTAMP(0) WITHOUT TIME ZONE'; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTzTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIMESTAMP(0) WITH TIME ZONE'; - } - - /** - * {@inheritDoc} - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * {@inheritDoc} - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIME(0) WITHOUT TIME ZONE'; - } - - /** - * {@inheritDoc} - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - return ''; - } - - /** - * {@inheritDoc} - */ - protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) - { - return $fixed ? ($length ? 'CHAR(' . $length . ')' : 'CHAR(255)') - : ($length ? 'VARCHAR(' . $length . ')' : 'VARCHAR(255)'); - } - - /** - * {@inheritDoc} - */ - public function getClobTypeDeclarationSQL(array $field) - { - return 'TEXT'; - } - - /** - * {@inheritDoc} - */ - public function getName() - { - return 'postgresql'; - } - - /** - * {@inheritDoc} - * - * PostgreSQL returns all column names in SQL result sets in lowercase. - */ - public function getSQLResultCasing($column) - { - return strtolower($column); - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTzFormatString() - { - return 'Y-m-d H:i:sO'; - } - - /** - * {@inheritDoc} - */ - public function getEmptyIdentityInsertSQL($quotedTableName, $quotedIdentifierColumnName) - { - return 'INSERT INTO ' . $quotedTableName . ' (' . $quotedIdentifierColumnName . ') VALUES (DEFAULT)'; - } - - /** - * {@inheritDoc} - */ - public function getTruncateTableSQL($tableName, $cascade = false) - { - return 'TRUNCATE '.$tableName.' '.(($cascade)?'CASCADE':''); - } - - /** - * {@inheritDoc} - */ - public function getReadLockSQL() - { - return 'FOR SHARE'; - } - - /** - * {@inheritDoc} - */ - protected function initializeDoctrineTypeMappings() - { - $this->doctrineTypeMapping = array( - 'smallint' => 'smallint', - 'int2' => 'smallint', - 'serial' => 'integer', - 'serial4' => 'integer', - 'int' => 'integer', - 'int4' => 'integer', - 'integer' => 'integer', - 'bigserial' => 'bigint', - 'serial8' => 'bigint', - 'bigint' => 'bigint', - 'int8' => 'bigint', - 'bool' => 'boolean', - 'boolean' => 'boolean', - 'text' => 'text', - 'varchar' => 'string', - 'interval' => 'string', - '_varchar' => 'string', - 'char' => 'string', - 'bpchar' => 'string', - 'date' => 'date', - 'datetime' => 'datetime', - 'timestamp' => 'datetime', - 'timestamptz' => 'datetimetz', - 'time' => 'time', - 'timetz' => 'time', - 'float' => 'float', - 'float4' => 'float', - 'float8' => 'float', - 'double' => 'float', - 'double precision' => 'float', - 'real' => 'float', - 'decimal' => 'decimal', - 'money' => 'decimal', - 'numeric' => 'decimal', - 'year' => 'date', - 'uuid' => 'guid', - 'bytea' => 'blob', - ); - } - - /** - * {@inheritDoc} - */ - public function getVarcharMaxLength() - { - return 65535; - } - - /** - * {@inheritDoc} - */ - protected function getReservedKeywordsClass() - { - return 'Doctrine\DBAL\Platforms\Keywords\PostgreSQLKeywords'; - } - - /** - * {@inheritDoc} - */ - public function getBlobTypeDeclarationSQL(array $field) - { - return 'BYTEA'; - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/SQLAzurePlatform.php b/framework/library/Doctrine/DBAL/Platforms/SQLAzurePlatform.php deleted file mode 100644 index 238e54f..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/SQLAzurePlatform.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\Schema\Table; - -/** - * Platform to ensure compatibility of Doctrine with SQL Azure - * - * On top of SQL Server 2008 the following functionality is added: - * - * - Create tables with the FEDERATED ON syntax. - */ -class SQLAzurePlatform extends SQLServer2008Platform -{ - /** - * {@inheritDoc} - */ - public function getCreateTableSQL(Table $table, $createFlags=self::CREATE_INDEXES) - { - $sql = parent::getCreateTableSQL($table, $createFlags); - - if ($table->hasOption('azure.federatedOnColumnName')) { - $distributionName = $table->getOption('azure.federatedOnDistributionName'); - $columnName = $table->getOption('azure.federatedOnColumnName'); - $stmt = ' FEDERATED ON (' . $distributionName . ' = ' . $columnName . ')'; - - $sql[0] = $sql[0] . $stmt; - } - - return $sql; - } -} - diff --git a/framework/library/Doctrine/DBAL/Platforms/SQLServer2005Platform.php b/framework/library/Doctrine/DBAL/Platforms/SQLServer2005Platform.php deleted file mode 100644 index be3725b..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/SQLServer2005Platform.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -/** - * Platform to ensure compatibility of Doctrine with SQLServer2005 version and - * higher. - * - * Differences to SQL Server 2008 are: - * - * - DATETIME2 datatype does not exist, only DATETIME which has a precision of - * 3. This is not supported by PHP DateTime, so we are emulating it by - * setting .000 manually. - * - Starting with SQLServer2005 VARCHAR(MAX), VARBINARY(MAX) and - * NVARCHAR(max) replace the old TEXT, NTEXT and IMAGE types. See - * {@link http://www.sql-server-helper.com/faq/sql-server-2005-varchar-max-p01.aspx} - * for more information. - */ -class SQLServer2005Platform extends SQLServerPlatform -{ - /** - * {@inheritDoc} - */ - public function supportsLimitOffset() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function getClobTypeDeclarationSQL(array $field) - { - return 'VARCHAR(MAX)'; - } -} - diff --git a/framework/library/Doctrine/DBAL/Platforms/SQLServer2008Platform.php b/framework/library/Doctrine/DBAL/Platforms/SQLServer2008Platform.php deleted file mode 100644 index 909ab84..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/SQLServer2008Platform.php +++ /dev/null @@ -1,100 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -/** - * Platform to ensure compatibility of Doctrine with SQLServer2008 version. - * - * Differences to SQL Server 2005 and before are that a new DATETIME2 type was - * introduced that has a higher precision. - */ -class SQLServer2008Platform extends SQLServer2005Platform -{ - /** - * {@inheritDoc} - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - // 3 - microseconds precision length - // http://msdn.microsoft.com/en-us/library/ms187819.aspx - return 'DATETIME2(6)'; - } - - /** - * {@inheritDoc} - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * {@inheritDoc} - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIME(0)'; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeFormatString() - { - return 'Y-m-d H:i:s.u'; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTzFormatString() - { - return 'Y-m-d H:i:s.u P'; - } - - /** - * {@inheritDoc} - */ - public function getDateFormatString() - { - return 'Y-m-d'; - } - - /** - * {@inheritDoc} - */ - public function getTimeFormatString() - { - return 'H:i:s'; - } - - /** - * {@inheritDoc} - * - * Adding Datetime2 Type - */ - protected function initializeDoctrineTypeMappings() - { - parent::initializeDoctrineTypeMappings(); - $this->doctrineTypeMapping['datetime2'] = 'datetime'; - $this->doctrineTypeMapping['date'] = 'date'; - $this->doctrineTypeMapping['time'] = 'time'; - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/SQLServerPlatform.php b/framework/library/Doctrine/DBAL/Platforms/SQLServerPlatform.php deleted file mode 100644 index c0b31c7..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/SQLServerPlatform.php +++ /dev/null @@ -1,927 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Platforms; - -use Doctrine\DBAL\Schema\TableDiff; -use Doctrine\DBAL\DBALException; -use Doctrine\DBAL\Schema\ForeignKeyConstraint; -use Doctrine\DBAL\Schema\Index; -use Doctrine\DBAL\Schema\Table; - -/** - * The SQLServerPlatform provides the behavior, features and SQL dialect of the - * Microsoft SQL Server database platform. - * - * @since 2.0 - * @author Roman Borschel - * @author Jonathan H. Wage - * @author Benjamin Eberlei - */ -class SQLServerPlatform extends AbstractPlatform -{ - /** - * {@inheritDoc} - */ - public function getDateDiffExpression($date1, $date2) - { - return 'DATEDIFF(day, ' . $date2 . ',' . $date1 . ')'; - } - - /** - * {@inheritDoc} - */ - public function getDateAddDaysExpression($date, $days) - { - return 'DATEADD(day, ' . $days . ', ' . $date . ')'; - } - - /** - * {@inheritDoc} - */ - public function getDateSubDaysExpression($date, $days) - { - return 'DATEADD(day, -1 * ' . $days . ', ' . $date . ')'; - } - - /** - * {@inheritDoc} - */ - public function getDateAddMonthExpression($date, $months) - { - return 'DATEADD(month, ' . $months . ', ' . $date . ')'; - } - - /** - * {@inheritDoc} - */ - public function getDateSubMonthExpression($date, $months) - { - return 'DATEADD(month, -1 * ' . $months . ', ' . $date . ')'; - } - - /** - * {@inheritDoc} - * - * MsSql prefers "autoincrement" identity columns since sequences can only - * be emulated with a table. - */ - public function prefersIdentityColumns() - { - return true; - } - - /** - * {@inheritDoc} - * - * MsSql supports this through AUTO_INCREMENT columns. - */ - public function supportsIdentityColumns() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function supportsReleaseSavepoints() - { - return false; - } - - /** - * {@inheritDoc} - */ - public function getCreateDatabaseSQL($name) - { - return 'CREATE DATABASE ' . $name; - } - - /** - * {@inheritDoc} - */ - public function getDropDatabaseSQL($name) - { - return 'DROP DATABASE ' . $name; - } - - /** - * {@inheritDoc} - */ - public function supportsCreateDropDatabase() - { - return false; - } - - /** - * {@inheritDoc} - */ - public function getDropForeignKeySQL($foreignKey, $table) - { - if ($foreignKey instanceof ForeignKeyConstraint) { - $foreignKey = $foreignKey->getQuotedName($this); - } - - if ($table instanceof Table) { - $table = $table->getQuotedName($this); - } - - return 'ALTER TABLE ' . $table . ' DROP CONSTRAINT ' . $foreignKey; - } - - /** - * {@inheritDoc} - */ - public function getDropIndexSQL($index, $table = null) - { - if ($index instanceof Index) { - $index = $index->getQuotedName($this); - } else if (!is_string($index)) { - throw new \InvalidArgumentException('AbstractPlatform::getDropIndexSQL() expects $index parameter to be string or \Doctrine\DBAL\Schema\Index.'); - } - - if (!isset($table)) { - return 'DROP INDEX ' . $index; - } - - if ($table instanceof Table) { - $table = $table->getQuotedName($this); - } - - return "IF EXISTS (SELECT * FROM sysobjects WHERE name = '$index') - ALTER TABLE " . $table . " DROP CONSTRAINT " . $index . " - ELSE - DROP INDEX " . $index . " ON " . $table; - } - - /** - * {@inheritDoc} - */ - protected function _getCreateTableSQL($tableName, array $columns, array $options = array()) - { - // @todo does other code breaks because of this? - // force primary keys to be not null - foreach ($columns as &$column) { - if (isset($column['primary']) && $column['primary']) { - $column['notnull'] = true; - } - } - - $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'])) { - $flags = ''; - if (isset($options['primary_index']) && $options['primary_index']->hasFlag('nonclustered')) { - $flags = ' NONCLUSTERED'; - } - $columnListSql .= ', PRIMARY KEY' . $flags . ' (' . implode(', ', array_unique(array_values($options['primary']))) . ')'; - } - - $query = 'CREATE TABLE ' . $tableName . ' (' . $columnListSql; - - $check = $this->getCheckDeclarationSQL($columns); - if (!empty($check)) { - $query .= ', ' . $check; - } - $query .= ')'; - - $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; - } - - /** - * {@inheritDoc} - */ - public function getCreatePrimaryKeySQL(Index $index, $table) - { - $flags = ''; - if ($index->hasFlag('nonclustered')) { - $flags = ' NONCLUSTERED'; - } - return 'ALTER TABLE ' . $table . ' ADD PRIMARY KEY' . $flags . ' (' . $this->getIndexFieldDeclarationListSQL($index->getColumns()) . ')'; - } - - /** - * {@inheritDoc} - */ - public function getUniqueConstraintDeclarationSQL($name, Index $index) - { - $constraint = parent::getUniqueConstraintDeclarationSQL($name, $index); - - $constraint = $this->_appendUniqueConstraintDefinition($constraint, $index); - - return $constraint; - } - - /** - * {@inheritDoc} - */ - public function getCreateIndexSQL(Index $index, $table) - { - $constraint = parent::getCreateIndexSQL($index, $table); - - if ($index->isUnique() && !$index->isPrimary()) { - $constraint = $this->_appendUniqueConstraintDefinition($constraint, $index); - } - - return $constraint; - } - - /** - * {@inheritDoc} - */ - protected function getCreateIndexSQLFlags(Index $index) - { - $type = ''; - if ($index->isUnique()) { - $type .= 'UNIQUE '; - } - - if ($index->hasFlag('clustered')) { - $type .= 'CLUSTERED '; - } else if ($index->hasFlag('nonclustered')) { - $type .= 'NONCLUSTERED '; - } - - return $type; - } - - /** - * Extend unique key constraint with required filters - * - * @param string $sql - * @param Index $index - * - * @return string - */ - private function _appendUniqueConstraintDefinition($sql, Index $index) - { - $fields = array(); - foreach ($index->getColumns() as $field => $definition) { - if (!is_array($definition)) { - $field = $definition; - } - - $fields[] = $field . ' IS NOT NULL'; - } - - return $sql . ' WHERE ' . implode(' AND ', $fields); - } - - /** - * {@inheritDoc} - */ - public function getAlterTableSQL(TableDiff $diff) - { - $queryParts = array(); - $sql = array(); - $columnSql = array(); - - foreach ($diff->addedColumns as $column) { - if ($this->onSchemaAlterTableAddColumn($column, $diff, $columnSql)) { - continue; - } - - $queryParts[] = 'ADD ' . $this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray()); - } - - foreach ($diff->removedColumns as $column) { - if ($this->onSchemaAlterTableRemoveColumn($column, $diff, $columnSql)) { - continue; - } - - $queryParts[] = 'DROP COLUMN ' . $column->getQuotedName($this); - } - - foreach ($diff->changedColumns as $columnDiff) { - if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { - continue; - } - - /* @var $columnDiff \Doctrine\DBAL\Schema\ColumnDiff */ - $column = $columnDiff->column; - $queryParts[] = 'ALTER COLUMN ' . - $this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray()); - } - - foreach ($diff->renamedColumns as $oldColumnName => $column) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) { - continue; - } - - $sql[] = "sp_RENAME '". $diff->name. ".". $oldColumnName . "' , '".$column->getQuotedName($this)."', 'COLUMN'"; - $queryParts[] = 'ALTER COLUMN ' . - $this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray()); - } - - $tableSql = array(); - - if ($this->onSchemaAlterTable($diff, $tableSql)) { - return array_merge($tableSql, $columnSql); - } - - foreach ($queryParts as $query) { - $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query; - } - - $sql = array_merge($sql, $this->_getAlterTableIndexForeignKeySQL($diff)); - - if ($diff->newName !== false) { - $sql[] = "sp_RENAME '" . $diff->name . "', '" . $diff->newName . "'"; - } - - return array_merge($sql, $tableSql, $columnSql); - } - - /** - * {@inheritDoc} - */ - public function getEmptyIdentityInsertSQL($quotedTableName, $quotedIdentifierColumnName) - { - return 'INSERT INTO ' . $quotedTableName . ' DEFAULT VALUES'; - } - - /** - * {@inheritDoc} - */ - public function getShowDatabasesSQL() - { - return 'SHOW DATABASES'; - } - - /** - * {@inheritDoc} - */ - public function getListTablesSQL() - { - // "sysdiagrams" table must be ignored as it's internal SQL Server table for Database Diagrams - return "SELECT name FROM sysobjects WHERE type = 'U' AND name != 'sysdiagrams' ORDER BY name"; - } - - /** - * {@inheritDoc} - */ - public function getListTableColumnsSQL($table, $database = null) - { - return "exec sp_columns @table_name = '" . $table . "'"; - } - - /** - * {@inheritDoc} - */ - public function getListTableForeignKeysSQL($table, $database = null) - { - return "SELECT f.name AS ForeignKey, - SCHEMA_NAME (f.SCHEMA_ID) AS SchemaName, - OBJECT_NAME (f.parent_object_id) AS TableName, - COL_NAME (fc.parent_object_id,fc.parent_column_id) AS ColumnName, - SCHEMA_NAME (o.SCHEMA_ID) ReferenceSchemaName, - OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, - COL_NAME(fc.referenced_object_id,fc.referenced_column_id) AS ReferenceColumnName, - f.delete_referential_action_desc, - f.update_referential_action_desc - FROM sys.foreign_keys AS f - INNER JOIN sys.foreign_key_columns AS fc - INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id - ON f.OBJECT_ID = fc.constraint_object_id - WHERE OBJECT_NAME (f.parent_object_id) = '" . $table . "'"; - } - - /** - * {@inheritDoc} - */ - public function getListTableIndexesSQL($table, $currentDatabase = null) - { - return "exec sp_helpindex '" . $table . "'"; - } - - /** - * {@inheritDoc} - */ - public function getCreateViewSQL($name, $sql) - { - return 'CREATE VIEW ' . $name . ' AS ' . $sql; - } - - /** - * {@inheritDoc} - */ - public function getListViewsSQL($database) - { - return "SELECT name FROM sysobjects WHERE type = 'V' ORDER BY name"; - } - - /** - * {@inheritDoc} - */ - public function getDropViewSQL($name) - { - return 'DROP VIEW ' . $name; - } - - /** - * {@inheritDoc} - */ - public function getRegexpExpression() - { - return 'RLIKE'; - } - - /** - * {@inheritDoc} - */ - public function getGuidExpression() - { - return 'UUID()'; - } - - /** - * {@inheritDoc} - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - if ($startPos == false) { - return 'CHARINDEX(' . $substr . ', ' . $str . ')'; - } - - return 'CHARINDEX(' . $substr . ', ' . $str . ', ' . $startPos . ')'; - } - - /** - * {@inheritDoc} - */ - public function getModExpression($expression1, $expression2) - { - return $expression1 . ' % ' . $expression2; - } - - /** - * {@inheritDoc} - */ - public function getTrimExpression($str, $pos = self::TRIM_UNSPECIFIED, $char = false) - { - if ( ! $char) { - switch ($pos) { - case self::TRIM_LEADING: - $trimFn = 'LTRIM'; - break; - - case self::TRIM_TRAILING: - $trimFn = 'RTRIM'; - break; - - default: - return 'LTRIM(RTRIM(' . $str . '))'; - } - - return $trimFn . '(' . $str . ')'; - } - - /** Original query used to get those expressions - declare @c varchar(100) = 'xxxBarxxx', @trim_char char(1) = 'x'; - declare @pat varchar(10) = '%[^' + @trim_char + ']%'; - select @c as string - , @trim_char as trim_char - , stuff(@c, 1, patindex(@pat, @c) - 1, null) as trim_leading - , reverse(stuff(reverse(@c), 1, patindex(@pat, reverse(@c)) - 1, null)) as trim_trailing - , reverse(stuff(reverse(stuff(@c, 1, patindex(@pat, @c) - 1, null)), 1, patindex(@pat, reverse(stuff(@c, 1, patindex(@pat, @c) - 1, null))) - 1, null)) as trim_both; - */ - $pattern = "'%[^' + $char + ']%'"; - - if ($pos == self::TRIM_LEADING) { - return 'stuff(' . $str . ', 1, patindex(' . $pattern . ', ' . $str . ') - 1, null)'; - } - - if ($pos == self::TRIM_TRAILING) { - return 'reverse(stuff(reverse(' . $str . '), 1, patindex(' . $pattern . ', reverse(' . $str . ')) - 1, null))'; - } - - return 'reverse(stuff(reverse(stuff(' . $str . ', 1, patindex(' . $pattern . ', ' . $str . ') - 1, null)), 1, patindex(' . $pattern . ', reverse(stuff(' . $str . ', 1, patindex(' . $pattern . ', ' . $str . ') - 1, null))) - 1, null))'; - } - - /** - * {@inheritDoc} - */ - public function getConcatExpression() - { - $args = func_get_args(); - - return '(' . implode(' + ', $args) . ')'; - } - - public function getListDatabasesSQL() - { - return 'SELECT * FROM SYS.DATABASES'; - } - - /** - * {@inheritDoc} - */ - public function getSubstringExpression($value, $from, $length = null) - { - if (!is_null($length)) { - return 'SUBSTRING(' . $value . ', ' . $from . ', ' . $length . ')'; - } - - return 'SUBSTRING(' . $value . ', ' . $from . ', LEN(' . $value . ') - ' . $from . ' + 1)'; - } - - /** - * {@inheritDoc} - */ - public function getLengthExpression($column) - { - return 'LEN(' . $column . ')'; - } - - /** - * {@inheritDoc} - */ - public function getSetTransactionIsolationSQL($level) - { - return 'SET TRANSACTION ISOLATION LEVEL ' . $this->_getTransactionIsolationLevelSQL($level); - } - - /** - * {@inheritDoc} - */ - public function getIntegerTypeDeclarationSQL(array $field) - { - return 'INT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - public function getBigIntTypeDeclarationSQL(array $field) - { - return 'BIGINT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - public function getSmallIntTypeDeclarationSQL(array $field) - { - return 'SMALLINT' . $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - public function getGuidTypeDeclarationSQL(array $field) - { - return 'UNIQUEIDENTIFIER'; - } - - /** - * {@inheritDoc} - */ - protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) - { - return $fixed ? ($length ? 'NCHAR(' . $length . ')' : 'CHAR(255)') : ($length ? 'NVARCHAR(' . $length . ')' : 'NVARCHAR(255)'); - } - - /** - * {@inheritDoc} - */ - public function getClobTypeDeclarationSQL(array $field) - { - return 'TEXT'; - } - - /** - * {@inheritDoc} - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - return (!empty($columnDef['autoincrement'])) ? ' IDENTITY' : ''; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATETIME'; - } - - /** - * {@inheritDoc} - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATETIME'; - } - - /** - * {@inheritDoc} - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATETIME'; - } - - /** - * {@inheritDoc} - */ - public function getBooleanTypeDeclarationSQL(array $field) - { - return 'BIT'; - } - - /** - * {@inheritDoc} - * - * @link http://lists.bestpractical.com/pipermail/rt-devel/2005-June/007339.html - */ - protected function doModifyLimitQuery($query, $limit, $offset = null) - { - if ($limit > 0) { - if ($offset == 0) { - $query = preg_replace('/^(SELECT\s(DISTINCT\s)?)/i', '\1TOP ' . $limit . ' ', $query); - } else { - $orderby = stristr($query, 'ORDER BY'); - - if ( ! $orderby) { - $over = 'ORDER BY (SELECT 0)'; - } else { - $over = preg_replace('/\"[^,]*\".\"([^,]*)\"/i', '"inner_tbl"."$1"', $orderby); - } - - // Remove ORDER BY clause from $query - $query = preg_replace('/\s+ORDER BY(.*)/', '', $query); - $query = preg_replace('/\sFROM/i', ", ROW_NUMBER() OVER ($over) AS doctrine_rownum FROM", $query); - - $start = $offset + 1; - $end = $offset + $limit; - - $query = "SELECT * FROM ($query) AS doctrine_tbl WHERE doctrine_rownum BETWEEN $start AND $end"; - } - } - - return $query; - } - - /** - * {@inheritDoc} - */ - public function supportsLimitOffset() - { - return false; - } - - /** - * {@inheritDoc} - */ - public function convertBooleans($item) - { - if (is_array($item)) { - foreach ($item as $key => $value) { - if (is_bool($value) || is_numeric($item)) { - $item[$key] = ($value) ? 1 : 0; - } - } - } else if (is_bool($item) || is_numeric($item)) { - $item = ($item) ? 1 : 0; - } - - return $item; - } - - /** - * {@inheritDoc} - */ - public function getCreateTemporaryTableSnippetSQL() - { - return "CREATE TABLE"; - } - - /** - * {@inheritDoc} - */ - public function getTemporaryTableName($tableName) - { - return '#' . $tableName; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeFormatString() - { - return 'Y-m-d H:i:s.000'; - } - - /** - * {@inheritDoc} - */ - public function getDateFormatString() - { - return 'Y-m-d H:i:s.000'; - } - - /** - * {@inheritDoc} - */ - public function getTimeFormatString() - { - return 'Y-m-d H:i:s.000'; - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTzFormatString() - { - return $this->getDateTimeFormatString(); - } - - /** - * {@inheritDoc} - */ - public function getName() - { - return 'mssql'; - } - - /** - * {@inheritDoc} - */ - protected function initializeDoctrineTypeMappings() - { - $this->doctrineTypeMapping = array( - 'bigint' => 'bigint', - 'numeric' => 'decimal', - 'bit' => 'boolean', - 'smallint' => 'smallint', - 'decimal' => 'decimal', - 'smallmoney' => 'integer', - 'int' => 'integer', - 'tinyint' => 'smallint', - 'money' => 'integer', - 'float' => 'float', - 'real' => 'float', - 'double' => 'float', - 'double precision' => 'float', - 'datetimeoffset' => 'datetimetz', - 'smalldatetime' => 'datetime', - 'datetime' => 'datetime', - 'char' => 'string', - 'varchar' => 'string', - 'text' => 'text', - 'nchar' => 'string', - 'nvarchar' => 'string', - 'ntext' => 'text', - 'binary' => 'text', - 'varbinary' => 'blob', - 'image' => 'text', - 'uniqueidentifier' => 'guid', - ); - } - - /** - * {@inheritDoc} - */ - public function createSavePoint($savepoint) - { - return 'SAVE TRANSACTION ' . $savepoint; - } - - /** - * {@inheritDoc} - */ - public function releaseSavePoint($savepoint) - { - return ''; - } - - /** - * {@inheritDoc} - */ - public function rollbackSavePoint($savepoint) - { - return 'ROLLBACK TRANSACTION ' . $savepoint; - } - - /** - * {@inheritDoc} - */ - public function appendLockHint($fromClause, $lockMode) - { - // @todo coorect - if ($lockMode == \Doctrine\DBAL\LockMode::PESSIMISTIC_READ) { - return $fromClause . ' WITH (tablockx)'; - } - - if ($lockMode == \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE) { - return $fromClause . ' WITH (tablockx)'; - } - - return $fromClause; - } - - /** - * {@inheritDoc} - */ - public function getForUpdateSQL() - { - return ' '; - } - - /** - * {@inheritDoc} - */ - protected function getReservedKeywordsClass() - { - return 'Doctrine\DBAL\Platforms\Keywords\MsSQLKeywords'; - } - - /** - * {@inheritDoc} - */ - public function quoteSingleIdentifier($str) - { - return "[" . str_replace("]", "][", $str) . "]"; - } - - /** - * {@inheritDoc} - */ - public function getTruncateTableSQL($tableName, $cascade = false) - { - return 'TRUNCATE TABLE '.$tableName; - } - - /** - * {@inheritDoc} - */ - public function getBlobTypeDeclarationSQL(array $field) - { - return 'VARBINARY(MAX)'; - } - - /** - * {@inheritDoc} - */ - public function getDefaultValueDeclarationSQL($field) - { - if ( ! isset($field['default'])) { - return empty($field['notnull']) ? ' NULL' : ''; - } - - if ( ! isset($field['type'])) { - return " DEFAULT '" . $field['default'] . "'"; - } - - if (in_array((string) $field['type'], array('Integer', 'BigInteger', 'SmallInteger'))) { - return " DEFAULT " . $field['default']; - } - - if ((string) $field['type'] == 'DateTime' && $field['default'] == $this->getCurrentTimestampSQL()) { - return " DEFAULT " . $this->getCurrentTimestampSQL(); - } - - if ((string) $field['type'] == 'Boolean') { - return " DEFAULT '" . $this->convertBooleans($field['default']) . "'"; - } - - return " DEFAULT '" . $field['default'] . "'"; - } -} diff --git a/framework/library/Doctrine/DBAL/Platforms/SqlitePlatform.php b/framework/library/Doctrine/DBAL/Platforms/SqlitePlatform.php deleted file mode 100644 index 6fba88d..0000000 --- a/framework/library/Doctrine/DBAL/Platforms/SqlitePlatform.php +++ /dev/null @@ -1,530 +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 -{ - /** - * {@inheritDoc} - */ - public function getRegexpExpression() - { - return 'RLIKE'; - } - - /** - * {@inheritDoc} - */ - public function getNowExpression($type = 'timestamp') - { - switch ($type) { - case 'time': - return 'time(\'now\')'; - case 'date': - return 'date(\'now\')'; - case 'timestamp': - default: - return 'datetime(\'now\')'; - } - } - - /** - * {@inheritDoc} - */ - public function getTrimExpression($str, $pos = self::TRIM_UNSPECIFIED, $char = false) - { - $trimChar = ($char != false) ? (', ' . $char) : ''; - - switch ($pos) { - case self::TRIM_LEADING: - $trimFn = 'LTRIM'; - break; - - case self::TRIM_TRAILING: - $trimFn = 'RTRIM'; - break; - - default: - $trimFn = 'TRIM'; - } - - return $trimFn . '(' . $str . $trimChar . ')'; - } - - /** - * {@inheritDoc} - * - * SQLite only supports the 2 parameter variant of this function - */ - public function getSubstringExpression($value, $position, $length = null) - { - if ($length !== null) { - return 'SUBSTR(' . $value . ', ' . $position . ', ' . $length . ')'; - } - - return 'SUBSTR(' . $value . ', ' . $position . ', LENGTH(' . $value . '))'; - } - - /** - * {@inheritDoc} - */ - public function getLocateExpression($str, $substr, $startPos = false) - { - if ($startPos == false) { - return 'LOCATE('.$str.', '.$substr.')'; - } - - return 'LOCATE('.$str.', '.$substr.', '.$startPos.')'; - } - - /** - * {@inheritDoc} - */ - public function getDateDiffExpression($date1, $date2) - { - return 'ROUND(JULIANDAY('.$date1 . ')-JULIANDAY('.$date2.'))'; - } - - /** - * {@inheritDoc} - */ - public function getDateAddDaysExpression($date, $days) - { - return "DATE(" . $date . ",'+". $days . " day')"; - } - - /** - * {@inheritDoc} - */ - public function getDateSubDaysExpression($date, $days) - { - return "DATE(" . $date . ",'-". $days . " day')"; - } - - /** - * {@inheritDoc} - */ - public function getDateAddMonthExpression($date, $months) - { - return "DATE(" . $date . ",'+". $months . " month')"; - } - - /** - * {@inheritDoc} - */ - public function getDateSubMonthExpression($date, $months) - { - return "DATE(" . $date . ",'-". $months . " month')"; - } - - /** - * {@inheritDoc} - */ - 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); - } - } - - /** - * {@inheritDoc} - */ - public function getSetTransactionIsolationSQL($level) - { - return 'PRAGMA read_uncommitted = ' . $this->_getTransactionIsolationLevelSQL($level); - } - - /** - * {@inheritDoc} - */ - public function prefersIdentityColumns() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function getBooleanTypeDeclarationSQL(array $field) - { - return 'BOOLEAN'; - } - - /** - * {@inheritDoc} - */ - public function getIntegerTypeDeclarationSQL(array $field) - { - return $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - public function getBigIntTypeDeclarationSQL(array $field) - { - return $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - public function getTinyIntTypeDeclarationSql(array $field) - { - return $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - public function getSmallIntTypeDeclarationSQL(array $field) - { - return $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - public function getMediumIntTypeDeclarationSql(array $field) - { - return $this->_getCommonIntegerTypeDeclarationSQL($field); - } - - /** - * {@inheritDoc} - */ - public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATETIME'; - } - - /** - * {@inheritDoc} - */ - public function getDateTypeDeclarationSQL(array $fieldDeclaration) - { - return 'DATE'; - } - - /** - * {@inheritDoc} - */ - public function getTimeTypeDeclarationSQL(array $fieldDeclaration) - { - return 'TIME'; - } - - /** - * {@inheritDoc} - */ - protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef) - { - return 'INTEGER'; - } - - /** - * {@inheritDoc} - */ - protected function _getCreateTableSQL($name, array $columns, array $options = array()) - { - $name = str_replace(".", "__", $name); - $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 ' . $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} - */ - protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) - { - return $fixed ? ($length ? 'CHAR(' . $length . ')' : 'CHAR(255)') - : ($length ? 'VARCHAR(' . $length . ')' : 'TEXT'); - } - - /** - * {@inheritDoc} - */ - public function getClobTypeDeclarationSQL(array $field) - { - return 'CLOB'; - } - - public function getListTableConstraintsSQL($table) - { - $table = str_replace(".", "__", $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, $currentDatabase = null) - { - $table = str_replace(".", "__", $table); - - return "PRAGMA table_info($table)"; - } - - /** - * {@inheritDoc} - */ - public function getListTableIndexesSQL($table, $currentDatabase = null) - { - $table = str_replace(".", "__", $table); - - return "PRAGMA index_list($table)"; - } - - public function getListTablesSQL() - { - return "SELECT name FROM sqlite_master WHERE type = 'table' AND name != 'sqlite_sequence' AND name != 'geometry_columns' AND name != 'spatial_ref_sys' " - . "UNION ALL SELECT name FROM sqlite_temp_master " - . "WHERE type = 'table' ORDER BY name"; - } - - /** - * {@inheritDoc} - */ - 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; - } - - /** - * {@inheritDoc} - * - * 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... - */ - public function supportsForeignKeyConstraints() - { - return false; - } - - /** - * {@inheritDoc} - */ - public function supportsAlterTable() - { - return false; - } - - /** - * {@inheritDoc} - */ - public function supportsIdentityColumns() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function getName() - { - return 'sqlite'; - } - - /** - * {@inheritDoc} - */ - public function getTruncateTableSQL($tableName, $cascade = false) - { - $tableName = str_replace(".", "__", $tableName); - 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) - * - * @param integer $a - * @param integer $b - * - * @return integer - */ - static public function udfMod($a, $b) - { - return ($a % $b); - } - - /** - * @param string $str - * @param string $substr - * @param integer $offset - * - * @return integer - */ - 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 ''; - } - - /** - * {@inheritDoc} - */ - protected function initializeDoctrineTypeMappings() - { - $this->doctrineTypeMapping = array( - 'boolean' => 'boolean', - 'tinyint' => 'boolean', - 'smallint' => 'smallint', - 'mediumint' => 'integer', - 'int' => 'integer', - 'integer' => 'integer', - 'serial' => 'integer', - 'bigint' => 'bigint', - 'bigserial' => 'bigint', - 'clob' => 'text', - 'tinytext' => 'text', - 'mediumtext' => 'text', - 'longtext' => 'text', - 'text' => 'text', - 'varchar' => 'string', - 'longvarchar' => 'string', - 'varchar2' => 'string', - 'nvarchar' => 'string', - 'image' => 'string', - 'ntext' => 'string', - 'char' => 'string', - 'date' => 'date', - 'datetime' => 'datetime', - 'timestamp' => 'datetime', - 'time' => 'time', - 'float' => 'float', - 'double' => 'float', - 'double precision' => 'float', - 'real' => 'float', - 'decimal' => 'decimal', - 'numeric' => 'decimal', - 'blob' => 'blob', - 'integer unsigned' => 'integer', - ); - } - - /** - * {@inheritDoc} - */ - protected function getReservedKeywordsClass() - { - return 'Doctrine\DBAL\Platforms\Keywords\SQLiteKeywords'; - } - - /** - * {@inheritDoc} - */ - public function getBlobTypeDeclarationSQL(array $field) - { - return 'BLOB'; - } - - /** - * {@inheritDoc} - */ - public function getTemporaryTableName($tableName) - { - $tableName = str_replace(".", "__", $tableName); - - return $tableName; - } - - /** - * {@inheritDoc} - * - * Sqlite Platform emulates schema by underscoring each dot and generating tables - * into the default database. - * - * This hack is implemented to be able to use SQLite as testdriver when - * using schema supporting databases. - */ - public function canEmulateSchemas() - { - return true; - } -} diff --git a/framework/library/Doctrine/DBAL/Portability/Connection.php b/framework/library/Doctrine/DBAL/Portability/Connection.php deleted file mode 100644 index 410fa82..0000000 --- a/framework/library/Doctrine/DBAL/Portability/Connection.php +++ /dev/null @@ -1,119 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Portability; - -use Doctrine\Common\EventManager; -use Doctrine\DBAL\Configuration; -use Doctrine\DBAL\Driver; -use Doctrine\DBAL\Cache\QueryCacheProfile; - -class Connection extends \Doctrine\DBAL\Connection -{ - const PORTABILITY_ALL = 255; - const PORTABILITY_NONE = 0; - const PORTABILITY_RTRIM = 1; - const PORTABILITY_EMPTY_TO_NULL = 4; - const PORTABILITY_FIX_CASE = 8; - - const PORTABILITY_ORACLE = 9; - const PORTABILITY_POSTGRESQL = 13; - const PORTABILITY_SQLITE = 13; - const PORTABILITY_OTHERVENDORS = 12; - const PORTABILITY_DRIZZLE = 13; - const PORTABILITY_SQLSRV = 13; - - /** - * @var int - */ - private $portability = self::PORTABILITY_NONE; - - /** - * @var int - */ - private $case; - - public function connect() - { - $ret = parent::connect(); - if ($ret) { - $params = $this->getParams(); - if (isset($params['portability'])) { - if ($this->_platform->getName() === "oracle") { - $params['portability'] = $params['portability'] & self::PORTABILITY_ORACLE; - } else if ($this->_platform->getName() === "postgresql") { - $params['portability'] = $params['portability'] & self::PORTABILITY_POSTGRESQL; - } else if ($this->_platform->getName() === "sqlite") { - $params['portability'] = $params['portability'] & self::PORTABILITY_SQLITE; - } else if ($this->_platform->getName() === "drizzle") { - $params['portability'] = self::PORTABILITY_DRIZZLE; - } else if ($this->_platform->getName() === 'sqlsrv') { - $params['portability'] = $params['portabililty'] & self::PORTABILITY_SQLSRV; - } else { - $params['portability'] = $params['portability'] & self::PORTABILITY_OTHERVENDORS; - } - $this->portability = $params['portability']; - } - if (isset($params['fetch_case']) && $this->portability & self::PORTABILITY_FIX_CASE) { - if ($this->_conn instanceof \Doctrine\DBAL\Driver\PDOConnection) { - // make use of c-level support for case handling - $this->_conn->setAttribute(\PDO::ATTR_CASE, $params['fetch_case']); - } else { - $this->case = ($params['fetch_case'] == \PDO::CASE_LOWER) ? CASE_LOWER : CASE_UPPER; - } - } - } - return $ret; - } - - public function getPortability() - { - return $this->portability; - } - - public function getFetchCase() - { - return $this->case; - } - - public function executeQuery($query, array $params = array(), $types = array(), QueryCacheProfile $qcp = null) - { - return new Statement(parent::executeQuery($query, $params, $types, $qcp), $this); - } - - /** - * Prepares an SQL statement. - * - * @param string $statement The SQL statement to prepare. - * @return \Doctrine\DBAL\Driver\Statement The prepared statement. - */ - public function prepare($statement) - { - return new Statement(parent::prepare($statement), $this); - } - - public function query() - { - $this->connect(); - - $stmt = call_user_func_array(array($this->_conn, 'query'), func_get_args()); - return new Statement($stmt, $this); - } -} diff --git a/framework/library/Doctrine/DBAL/Portability/Statement.php b/framework/library/Doctrine/DBAL/Portability/Statement.php deleted file mode 100644 index 98076bd..0000000 --- a/framework/library/Doctrine/DBAL/Portability/Statement.php +++ /dev/null @@ -1,195 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Portability; - -use PDO; - -/** - * Portability Wrapper for a Statement - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - */ -class Statement implements \IteratorAggregate, \Doctrine\DBAL\Driver\Statement -{ - - /** - * @var int - */ - private $portability; - - /** - * @var \Doctrine\DBAL\Driver\Statement - */ - private $stmt; - - /** - * @var int - */ - private $case; - - /** - * @var int - */ - private $defaultFetchMode = PDO::FETCH_BOTH; - - /** - * Wraps Statement and applies portability measures - * - * @param \Doctrine\DBAL\Driver\Statement $stmt - * @param \Doctrine\DBAL\Connection $conn - */ - public function __construct($stmt, Connection $conn) - { - $this->stmt = $stmt; - $this->portability = $conn->getPortability(); - $this->case = $conn->getFetchCase(); - } - - public function bindParam($column, &$variable, $type = null,$length = null) - { - return $this->stmt->bindParam($column, $variable, $type); - } - - public function bindValue($param, $value, $type = null) - { - return $this->stmt->bindValue($param, $value, $type); - } - - public function closeCursor() - { - return $this->stmt->closeCursor(); - } - - public function columnCount() - { - return $this->stmt->columnCount(); - } - - public function errorCode() - { - return $this->stmt->errorCode(); - } - - public function errorInfo() - { - return $this->stmt->errorInfo(); - } - - public function execute($params = null) - { - return $this->stmt->execute($params); - } - - public function setFetchMode($fetchMode, $arg1 = null, $arg2 = null) - { - $this->defaultFetchMode = $fetchMode; - $this->stmt->setFetchMode($fetchMode, $arg1, $arg2); - } - - public function getIterator() - { - $data = $this->fetchAll(); - return new \ArrayIterator($data); - } - - public function fetch($fetchMode = null) - { - $fetchMode = $fetchMode ?: $this->defaultFetchMode; - - $row = $this->stmt->fetch($fetchMode); - - $row = $this->fixRow($row, - $this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL|Connection::PORTABILITY_RTRIM), - !is_null($this->case) && ($fetchMode == PDO::FETCH_ASSOC || $fetchMode == PDO::FETCH_BOTH) && ($this->portability & Connection::PORTABILITY_FIX_CASE) - ); - - return $row; - } - - public function fetchAll($fetchMode = null, $columnIndex = 0) - { - $fetchMode = $fetchMode ?: $this->defaultFetchMode; - - if ($columnIndex != 0) { - $rows = $this->stmt->fetchAll($fetchMode, $columnIndex); - } else { - $rows = $this->stmt->fetchAll($fetchMode); - } - - $iterateRow = $this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL|Connection::PORTABILITY_RTRIM); - $fixCase = !is_null($this->case) && ($fetchMode == PDO::FETCH_ASSOC || $fetchMode == PDO::FETCH_BOTH) && ($this->portability & Connection::PORTABILITY_FIX_CASE); - if ( ! $iterateRow && !$fixCase) { - return $rows; - } - - foreach ($rows as $num => $row) { - $rows[$num] = $this->fixRow($row, $iterateRow, $fixCase); - } - - return $rows; - } - - protected function fixRow($row, $iterateRow, $fixCase) - { - if ( ! $row) { - return $row; - } - - if ($fixCase) { - $row = array_change_key_case($row, $this->case); - } - - if ($iterateRow) { - foreach ($row as $k => $v) { - if (($this->portability & Connection::PORTABILITY_EMPTY_TO_NULL) && $v === '') { - $row[$k] = null; - } else if (($this->portability & Connection::PORTABILITY_RTRIM) && is_string($v)) { - $row[$k] = rtrim($v); - } - } - } - return $row; - } - - public function fetchColumn($columnIndex = 0) - { - $value = $this->stmt->fetchColumn($columnIndex); - - if ($this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL|Connection::PORTABILITY_RTRIM)) { - if (($this->portability & Connection::PORTABILITY_EMPTY_TO_NULL) && $value === '') { - $value = null; - } else if (($this->portability & Connection::PORTABILITY_RTRIM) && is_string($value)) { - $value = rtrim($value); - } - } - - return $value; - } - - public function rowCount() - { - return $this->stmt->rowCount(); - } - -} diff --git a/framework/library/Doctrine/DBAL/Query/Expression/CompositeExpression.php b/framework/library/Doctrine/DBAL/Query/Expression/CompositeExpression.php deleted file mode 100644 index 5d55b22..0000000 --- a/framework/library/Doctrine/DBAL/Query/Expression/CompositeExpression.php +++ /dev/null @@ -1,130 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Query\Expression; - -/** - * Composite expression is responsible to build a group of similar expression. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.1 - * @author Guilherme Blanco - * @author Benjamin Eberlei - */ -class CompositeExpression implements \Countable -{ - /** - * Constant that represents an AND composite expression - */ - const TYPE_AND = 'AND'; - - /** - * Constant that represents an OR composite expression - */ - const TYPE_OR = 'OR'; - - /** - * @var string Holds the instance type of composite expression - */ - private $type; - - /** - * @var array Each expression part of the composite expression - */ - private $parts = array(); - - /** - * Constructor. - * - * @param string $type Instance type of composite expression - * @param array $parts Composition of expressions to be joined on composite expression - */ - public function __construct($type, array $parts = array()) - { - $this->type = $type; - - $this->addMultiple($parts); - } - - /** - * Adds multiple parts to composite expression. - * - * @param array $parts - * - * @return CompositeExpression - */ - public function addMultiple(array $parts = array()) - { - foreach ((array) $parts as $part) { - $this->add($part); - } - - return $this; - } - - /** - * Adds an expression to composite expression. - * - * @param mixed $part - * @return CompositeExpression - */ - public function add($part) - { - if ( ! empty($part) || ($part instanceof self && $part->count() > 0)) { - $this->parts[] = $part; - } - - return $this; - } - - /** - * Retrieves the amount of expressions on composite expression. - * - * @return integer - */ - public function count() - { - return count($this->parts); - } - - /** - * Retrieve the string representation of this composite expression. - * - * @return string - */ - public function __toString() - { - if (count($this->parts) === 1) { - return (string) $this->parts[0]; - } - - return '(' . implode(') ' . $this->type . ' (', $this->parts) . ')'; - } - - /** - * Return type of this composite expression (AND/OR) - * - * @return string - */ - public function getType() - { - return $this->type; - } -} diff --git a/framework/library/Doctrine/DBAL/Query/Expression/ExpressionBuilder.php b/framework/library/Doctrine/DBAL/Query/Expression/ExpressionBuilder.php deleted file mode 100644 index 4f50232..0000000 --- a/framework/library/Doctrine/DBAL/Query/Expression/ExpressionBuilder.php +++ /dev/null @@ -1,264 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Query\Expression; - -use Doctrine\DBAL\Connection; - -/** - * ExpressionBuilder class is responsible to dynamically create SQL query parts. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.1 - * @author Guilherme Blanco - * @author Benjamin Eberlei - */ -class ExpressionBuilder -{ - const EQ = '='; - const NEQ = '<>'; - const LT = '<'; - const LTE = '<='; - const GT = '>'; - const GTE = '>='; - - /** - * @var Doctrine\DBAL\Connection DBAL Connection - */ - private $connection = null; - - /** - * Initializes a new ExpressionBuilder. - * - * @param \Doctrine\DBAL\Connection $connection DBAL Connection - */ - public function __construct(Connection $connection) - { - $this->connection = $connection; - } - - /** - * Creates a conjunction of the given boolean expressions. - * - * Example: - * - * [php] - * // (u.type = ?) AND (u.role = ?) - * $expr->andX('u.type = ?', 'u.role = ?')); - * - * @param mixed $x Optional clause. Defaults = null, but requires - * at least one defined when converting to string. - * @return CompositeExpression - */ - public function andX($x = null) - { - return new CompositeExpression(CompositeExpression::TYPE_AND, func_get_args()); - } - - /** - * Creates a disjunction of the given boolean expressions. - * - * Example: - * - * [php] - * // (u.type = ?) OR (u.role = ?) - * $qb->where($qb->expr()->orX('u.type = ?', 'u.role = ?')); - * - * @param mixed $x Optional clause. Defaults = null, but requires - * at least one defined when converting to string. - * @return CompositeExpression - */ - public function orX($x = null) - { - return new CompositeExpression(CompositeExpression::TYPE_OR, func_get_args()); - } - - /** - * Creates a comparison expression. - * - * @param mixed $x Left expression - * @param string $operator One of the ExpressionBuilder::* constants. - * @param mixed $y Right expression - * @return string - */ - public function comparison($x, $operator, $y) - { - return $x . ' ' . $operator . ' ' . $y; - } - - /** - * 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: - * - * [php] - * // u.id = ? - * $expr->eq('u.id', '?'); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return string - */ - public function eq($x, $y) - { - return $this->comparison($x, self::EQ, $y); - } - - /** - * Creates a non 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: - * - * [php] - * // u.id <> 1 - * $q->where($q->expr()->neq('u.id', '1')); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return string - */ - public function neq($x, $y) - { - return $this->comparison($x, self::NEQ, $y); - } - - /** - * Creates a lower-than 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: - * - * [php] - * // u.id < ? - * $q->where($q->expr()->lt('u.id', '?')); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return string - */ - public function lt($x, $y) - { - return $this->comparison($x, self::LT, $y); - } - - /** - * Creates a lower-than-equal 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: - * - * [php] - * // u.id <= ? - * $q->where($q->expr()->lte('u.id', '?')); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return string - */ - public function lte($x, $y) - { - return $this->comparison($x, self::LTE, $y); - } - - /** - * Creates a greater-than 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: - * - * [php] - * // u.id > ? - * $q->where($q->expr()->gt('u.id', '?')); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return string - */ - public function gt($x, $y) - { - return $this->comparison($x, self::GT, $y); - } - - /** - * Creates a greater-than-equal 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: - * - * [php] - * // u.id >= ? - * $q->where($q->expr()->gte('u.id', '?')); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return string - */ - public function gte($x, $y) - { - return $this->comparison($x, self::GTE, $y); - } - - /** - * Creates an IS NULL expression with the given arguments. - * - * @param string $x Field in string format to be restricted by IS NULL - * - * @return string - */ - public function isNull($x) - { - return $x . ' IS NULL'; - } - - /** - * Creates an IS NOT NULL expression with the given arguments. - * - * @param string $x Field in string format to be restricted by IS NOT NULL - * - * @return string - */ - public function isNotNull($x) - { - return $x . ' IS NOT NULL'; - } - - /** - * Creates a LIKE() comparison expression with the given arguments. - * - * @param string $x Field in string format to be inspected by LIKE() comparison. - * @param mixed $y Argument to be used in LIKE() comparison. - * - * @return string - */ - public function like($x, $y) - { - return $this->comparison($x, 'LIKE', $y); - } - - /** - * Quotes a given input parameter. - * - * @param mixed $input Parameter to be quoted. - * @param string $type Type of the parameter. - * - * @return string - */ - public function literal($input, $type = null) - { - return $this->connection->quote($input, $type); - } -} diff --git a/framework/library/Doctrine/DBAL/Query/QueryBuilder.php b/framework/library/Doctrine/DBAL/Query/QueryBuilder.php deleted file mode 100644 index 3d803d5..0000000 --- a/framework/library/Doctrine/DBAL/Query/QueryBuilder.php +++ /dev/null @@ -1,1095 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Query; - -use Doctrine\DBAL\Query\Expression\CompositeExpression, - Doctrine\DBAL\Connection; - -/** - * QueryBuilder class is responsible to dynamically create SQL queries. - * - * Important: Verify that every feature you use will work with your database vendor. - * SQL Query Builder does not attempt to validate the generated SQL at all. - * - * The query builder does no validation whatsoever if certain features even work with the - * underlying database vendor. Limit queries and joins are NOT applied to UPDATE and DELETE statements - * even if some vendors such as MySQL support it. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.1 - * @author Guilherme Blanco - * @author Benjamin Eberlei - */ -class QueryBuilder -{ - /* The query types. */ - const SELECT = 0; - const DELETE = 1; - const UPDATE = 2; - - /** The builder states. */ - const STATE_DIRTY = 0; - const STATE_CLEAN = 1; - - /** - * @var Doctrine\DBAL\Connection DBAL Connection - */ - private $connection = null; - - /** - * @var array The array of SQL parts collected. - */ - private $sqlParts = array( - 'select' => array(), - 'from' => array(), - 'join' => array(), - 'set' => array(), - 'where' => null, - 'groupBy' => array(), - 'having' => null, - 'orderBy' => array() - ); - - /** - * @var string The complete SQL string for this query. - */ - private $sql; - - /** - * @var array The query parameters. - */ - private $params = array(); - - /** - * @var array The parameter type map of this query. - */ - private $paramTypes = array(); - - /** - * @var integer The type of query this is. Can be select, update or delete. - */ - private $type = self::SELECT; - - /** - * @var integer The state of the query object. Can be dirty or clean. - */ - private $state = self::STATE_CLEAN; - - /** - * @var integer The index of the first result to retrieve. - */ - private $firstResult = null; - - /** - * @var integer The maximum number of results to retrieve. - */ - private $maxResults = null; - - /** - * The counter of bound parameters used with {@see bindValue) - * - * @var int - */ - private $boundCounter = 0; - - /** - * Initializes a new QueryBuilder. - * - * @param \Doctrine\DBAL\Connection $connection DBAL Connection - */ - public function __construct(Connection $connection) - { - $this->connection = $connection; - } - - /** - * Gets an ExpressionBuilder used for object-oriented construction of query expressions. - * This producer method is intended for convenient inline usage. Example: - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u') - * ->from('users', 'u') - * ->where($qb->expr()->eq('u.id', 1)); - * - * - * For more complex expression construction, consider storing the expression - * builder object in a local variable. - * - * @return \Doctrine\DBAL\Query\Expression\ExpressionBuilder - */ - public function expr() - { - return $this->connection->getExpressionBuilder(); - } - - /** - * Get the type of the currently built query. - * - * @return integer - */ - public function getType() - { - return $this->type; - } - - /** - * Get the associated DBAL Connection for this query builder. - * - * @return \Doctrine\DBAL\Connection - */ - public function getConnection() - { - return $this->connection; - } - - /** - * Get the state of this query builder instance. - * - * @return integer Either QueryBuilder::STATE_DIRTY or QueryBuilder::STATE_CLEAN. - */ - public function getState() - { - return $this->state; - } - - /** - * Execute this query using the bound parameters and their types. - * - * Uses {@see Connection::executeQuery} for select statements and {@see Connection::executeUpdate} - * for insert, update and delete statements. - * - * @return mixed - */ - public function execute() - { - if ($this->type == self::SELECT) { - return $this->connection->executeQuery($this->getSQL(), $this->params, $this->paramTypes); - } else { - return $this->connection->executeUpdate($this->getSQL(), $this->params, $this->paramTypes); - } - } - - /** - * Get the complete SQL string formed by the current specifications of this QueryBuilder. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * echo $qb->getSQL(); // SELECT u FROM User u - * - * - * @return string The sql query string. - */ - public function getSQL() - { - if ($this->sql !== null && $this->state === self::STATE_CLEAN) { - return $this->sql; - } - - $sql = ''; - - switch ($this->type) { - case self::DELETE: - $sql = $this->getSQLForDelete(); - break; - - case self::UPDATE: - $sql = $this->getSQLForUpdate(); - break; - - case self::SELECT: - default: - $sql = $this->getSQLForSelect(); - break; - } - - $this->state = self::STATE_CLEAN; - $this->sql = $sql; - - return $sql; - } - - /** - * Sets a query parameter for the query being constructed. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u') - * ->from('users', 'u') - * ->where('u.id = :user_id') - * ->setParameter(':user_id', 1); - * - * - * @param string|integer $key The parameter position or name. - * @param mixed $value The parameter value. - * @param string|null $type PDO::PARAM_* - * @return QueryBuilder This QueryBuilder instance. - */ - public function setParameter($key, $value, $type = null) - { - if ($type !== null) { - $this->paramTypes[$key] = $type; - } - - $this->params[$key] = $value; - - return $this; - } - - /** - * Sets a collection of query parameters for the query being constructed. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u') - * ->from('users', 'u') - * ->where('u.id = :user_id1 OR u.id = :user_id2') - * ->setParameters(array( - * ':user_id1' => 1, - * ':user_id2' => 2 - * )); - * - * - * @param array $params The query parameters to set. - * @param array $types The query parameters types to set. - * @return QueryBuilder This QueryBuilder instance. - */ - public function setParameters(array $params, array $types = array()) - { - $this->paramTypes = $types; - $this->params = $params; - - return $this; - } - - /** - * Gets all defined query parameters for the query being constructed. - * - * @return array The currently defined query parameters. - */ - public function getParameters() - { - return $this->params; - } - - /** - * Gets a (previously set) query parameter of the query being constructed. - * - * @param mixed $key The key (index or name) of the bound parameter. - * @return mixed The value of the bound parameter. - */ - public function getParameter($key) - { - return isset($this->params[$key]) ? $this->params[$key] : null; - } - - /** - * Sets the position of the first result to retrieve (the "offset"). - * - * @param integer $firstResult The first result to return. - * @return \Doctrine\DBAL\Query\QueryBuilder This QueryBuilder instance. - */ - public function setFirstResult($firstResult) - { - $this->state = self::STATE_DIRTY; - $this->firstResult = $firstResult; - return $this; - } - - /** - * Gets the position of the first result the query object was set to retrieve (the "offset"). - * Returns NULL if {@link setFirstResult} was not applied to this QueryBuilder. - * - * @return integer The position of the first result. - */ - public function getFirstResult() - { - return $this->firstResult; - } - - /** - * Sets the maximum number of results to retrieve (the "limit"). - * - * @param integer $maxResults The maximum number of results to retrieve. - * @return \Doctrine\DBAL\Query\QueryBuilder This QueryBuilder instance. - */ - public function setMaxResults($maxResults) - { - $this->state = self::STATE_DIRTY; - $this->maxResults = $maxResults; - return $this; - } - - /** - * Gets the maximum number of results the query object was set to retrieve (the "limit"). - * Returns NULL if {@link setMaxResults} was not applied to this query builder. - * - * @return integer Maximum number of results. - */ - public function getMaxResults() - { - return $this->maxResults; - } - - /** - * Either appends to or replaces a single, generic query part. - * - * The available parts are: 'select', 'from', 'set', 'where', - * 'groupBy', 'having' and 'orderBy'. - * - * @param string $sqlPartName - * @param string $sqlPart - * @param boolean $append - * @return \Doctrine\DBAL\Query\QueryBuilder This QueryBuilder instance. - */ - public function add($sqlPartName, $sqlPart, $append = false) - { - $isArray = is_array($sqlPart); - $isMultiple = is_array($this->sqlParts[$sqlPartName]); - - if ($isMultiple && !$isArray) { - $sqlPart = array($sqlPart); - } - - $this->state = self::STATE_DIRTY; - - if ($append) { - if ($sqlPartName == "orderBy" || $sqlPartName == "groupBy" || $sqlPartName == "select" || $sqlPartName == "set") { - foreach ($sqlPart as $part) { - $this->sqlParts[$sqlPartName][] = $part; - } - } else if ($isArray && is_array($sqlPart[key($sqlPart)])) { - $key = key($sqlPart); - $this->sqlParts[$sqlPartName][$key][] = $sqlPart[$key]; - } else if ($isMultiple) { - $this->sqlParts[$sqlPartName][] = $sqlPart; - } else { - $this->sqlParts[$sqlPartName] = $sqlPart; - } - - return $this; - } - - $this->sqlParts[$sqlPartName] = $sqlPart; - - return $this; - } - - /** - * Specifies an item that is to be returned in the query result. - * Replaces any previously specified selections, if any. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u.id', 'p.id') - * ->from('users', 'u') - * ->leftJoin('u', 'phonenumbers', 'p', 'u.id = p.user_id'); - * - * - * @param mixed $select The selection expressions. - * @return QueryBuilder This QueryBuilder instance. - */ - public function select($select = null) - { - $this->type = self::SELECT; - - if (empty($select)) { - return $this; - } - - $selects = is_array($select) ? $select : func_get_args(); - - return $this->add('select', $selects, false); - } - - /** - * Adds an item that is to be returned in the query result. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u.id') - * ->addSelect('p.id') - * ->from('users', 'u') - * ->leftJoin('u', 'phonenumbers', 'u.id = p.user_id'); - * - * - * @param mixed $select The selection expression. - * @return QueryBuilder This QueryBuilder instance. - */ - public function addSelect($select = null) - { - $this->type = self::SELECT; - - if (empty($select)) { - return $this; - } - - $selects = is_array($select) ? $select : func_get_args(); - - return $this->add('select', $selects, true); - } - - /** - * Turns the query being built into a bulk delete query that ranges over - * a certain table. - * - * - * $qb = $conn->createQueryBuilder() - * ->delete('users', 'u') - * ->where('u.id = :user_id'); - * ->setParameter(':user_id', 1); - * - * - * @param string $delete The table whose rows are subject to the deletion. - * @param string $alias The table alias used in the constructed query. - * @return QueryBuilder This QueryBuilder instance. - */ - public function delete($delete = null, $alias = null) - { - $this->type = self::DELETE; - - if ( ! $delete) { - return $this; - } - - return $this->add('from', array( - 'table' => $delete, - 'alias' => $alias - )); - } - - /** - * Turns the query being built into a bulk update query that ranges over - * a certain table - * - * - * $qb = $conn->createQueryBuilder() - * ->update('users', 'u') - * ->set('u.password', md5('password')) - * ->where('u.id = ?'); - * - * - * @param string $update The table whose rows are subject to the update. - * @param string $alias The table alias used in the constructed query. - * @return QueryBuilder This QueryBuilder instance. - */ - public function update($update = null, $alias = null) - { - $this->type = self::UPDATE; - - if ( ! $update) { - return $this; - } - - return $this->add('from', array( - 'table' => $update, - 'alias' => $alias - )); - } - - /** - * Create and add a query root corresponding to the table identified by the - * given alias, forming a cartesian product with any existing query roots. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u.id') - * ->from('users', 'u') - * - * - * @param string $from The table - * @param string $alias The alias of the table - * @return QueryBuilder This QueryBuilder instance. - */ - public function from($from, $alias) - { - return $this->add('from', array( - 'table' => $from, - 'alias' => $alias - ), true); - } - - /** - * Creates and adds a join to the query. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u.name') - * ->from('users', 'u') - * ->join('u', 'phonenumbers', 'p', 'p.is_primary = 1'); - * - * - * @param string $fromAlias The alias that points to a from clause - * @param string $join The table name to join - * @param string $alias The alias of the join table - * @param string $condition The condition for the join - * @return QueryBuilder This QueryBuilder instance. - */ - public function join($fromAlias, $join, $alias, $condition = null) - { - return $this->innerJoin($fromAlias, $join, $alias, $condition); - } - - /** - * Creates and adds a join to the query. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u.name') - * ->from('users', 'u') - * ->innerJoin('u', 'phonenumbers', 'p', 'p.is_primary = 1'); - * - * - * @param string $fromAlias The alias that points to a from clause - * @param string $join The table name to join - * @param string $alias The alias of the join table - * @param string $condition The condition for the join - * @return QueryBuilder This QueryBuilder instance. - */ - public function innerJoin($fromAlias, $join, $alias, $condition = null) - { - return $this->add('join', array( - $fromAlias => array( - 'joinType' => 'inner', - 'joinTable' => $join, - 'joinAlias' => $alias, - 'joinCondition' => $condition - ) - ), true); - } - - /** - * Creates and adds a left join to the query. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u.name') - * ->from('users', 'u') - * ->leftJoin('u', 'phonenumbers', 'p', 'p.is_primary = 1'); - * - * - * @param string $fromAlias The alias that points to a from clause - * @param string $join The table name to join - * @param string $alias The alias of the join table - * @param string $condition The condition for the join - * @return QueryBuilder This QueryBuilder instance. - */ - public function leftJoin($fromAlias, $join, $alias, $condition = null) - { - return $this->add('join', array( - $fromAlias => array( - 'joinType' => 'left', - 'joinTable' => $join, - 'joinAlias' => $alias, - 'joinCondition' => $condition - ) - ), true); - } - - /** - * Creates and adds a right join to the query. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u.name') - * ->from('users', 'u') - * ->rightJoin('u', 'phonenumbers', 'p', 'p.is_primary = 1'); - * - * - * @param string $fromAlias The alias that points to a from clause - * @param string $join The table name to join - * @param string $alias The alias of the join table - * @param string $condition The condition for the join - * @return QueryBuilder This QueryBuilder instance. - */ - public function rightJoin($fromAlias, $join, $alias, $condition = null) - { - return $this->add('join', array( - $fromAlias => array( - 'joinType' => 'right', - 'joinTable' => $join, - 'joinAlias' => $alias, - 'joinCondition' => $condition - ) - ), true); - } - - /** - * Sets a new value for a column in a bulk update query. - * - * - * $qb = $conn->createQueryBuilder() - * ->update('users', 'u') - * ->set('u.password', md5('password')) - * ->where('u.id = ?'); - * - * - * @param string $key The column to set. - * @param string $value The value, expression, placeholder, etc. - * @return QueryBuilder This QueryBuilder instance. - */ - public function set($key, $value) - { - return $this->add('set', $key .' = ' . $value, true); - } - - /** - * Specifies one or more restrictions to the query result. - * Replaces any previously specified restrictions, if any. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u.name') - * ->from('users', 'u') - * ->where('u.id = ?'); - * - * // You can optionally programatically build and/or expressions - * $qb = $conn->createQueryBuilder(); - * - * $or = $qb->expr()->orx(); - * $or->add($qb->expr()->eq('u.id', 1)); - * $or->add($qb->expr()->eq('u.id', 2)); - * - * $qb->update('users', 'u') - * ->set('u.password', md5('password')) - * ->where($or); - * - * - * @param mixed $predicates The restriction predicates. - * @return QueryBuilder This QueryBuilder instance. - */ - public function where($predicates) - { - if ( ! (func_num_args() == 1 && $predicates instanceof CompositeExpression) ) { - $predicates = new CompositeExpression(CompositeExpression::TYPE_AND, func_get_args()); - } - - return $this->add('where', $predicates); - } - - /** - * Adds one or more restrictions to the query results, forming a logical - * conjunction with any previously specified restrictions. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u') - * ->from('users', 'u') - * ->where('u.username LIKE ?') - * ->andWhere('u.is_active = 1'); - * - * - * @param mixed $where The query restrictions. - * @return QueryBuilder This QueryBuilder instance. - * @see where() - */ - public function andWhere($where) - { - $where = $this->getQueryPart('where'); - $args = func_get_args(); - - if ($where instanceof CompositeExpression && $where->getType() === CompositeExpression::TYPE_AND) { - $where->addMultiple($args); - } else { - array_unshift($args, $where); - $where = new CompositeExpression(CompositeExpression::TYPE_AND, $args); - } - - return $this->add('where', $where, true); - } - - /** - * Adds one or more restrictions to the query results, forming a logical - * disjunction with any previously specified restrictions. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u.name') - * ->from('users', 'u') - * ->where('u.id = 1') - * ->orWhere('u.id = 2'); - * - * - * @param mixed $where The WHERE statement - * @return QueryBuilder $qb - * @see where() - */ - public function orWhere($where) - { - $where = $this->getQueryPart('where'); - $args = func_get_args(); - - if ($where instanceof CompositeExpression && $where->getType() === CompositeExpression::TYPE_OR) { - $where->addMultiple($args); - } else { - array_unshift($args, $where); - $where = new CompositeExpression(CompositeExpression::TYPE_OR, $args); - } - - return $this->add('where', $where, true); - } - - /** - * Specifies a grouping over the results of the query. - * Replaces any previously specified groupings, if any. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u.name') - * ->from('users', 'u') - * ->groupBy('u.id'); - * - * - * @param mixed $groupBy The grouping expression. - * @return QueryBuilder This QueryBuilder instance. - */ - public function groupBy($groupBy) - { - if (empty($groupBy)) { - return $this; - } - - $groupBy = is_array($groupBy) ? $groupBy : func_get_args(); - - return $this->add('groupBy', $groupBy, false); - } - - - /** - * Adds a grouping expression to the query. - * - * - * $qb = $conn->createQueryBuilder() - * ->select('u.name') - * ->from('users', 'u') - * ->groupBy('u.lastLogin'); - * ->addGroupBy('u.createdAt') - * - * - * @param mixed $groupBy The grouping expression. - * @return QueryBuilder This QueryBuilder instance. - */ - public function addGroupBy($groupBy) - { - if (empty($groupBy)) { - return $this; - } - - $groupBy = is_array($groupBy) ? $groupBy : func_get_args(); - - return $this->add('groupBy', $groupBy, true); - } - - /** - * Specifies a restriction over the groups of the query. - * Replaces any previous having restrictions, if any. - * - * @param mixed $having The restriction over the groups. - * @return QueryBuilder This QueryBuilder instance. - */ - public function having($having) - { - if ( ! (func_num_args() == 1 && $having instanceof CompositeExpression)) { - $having = new CompositeExpression(CompositeExpression::TYPE_AND, func_get_args()); - } - - return $this->add('having', $having); - } - - /** - * Adds a restriction over the groups of the query, forming a logical - * conjunction with any existing having restrictions. - * - * @param mixed $having The restriction to append. - * @return QueryBuilder This QueryBuilder instance. - */ - public function andHaving($having) - { - $having = $this->getQueryPart('having'); - $args = func_get_args(); - - if ($having instanceof CompositeExpression && $having->getType() === CompositeExpression::TYPE_AND) { - $having->addMultiple($args); - } else { - array_unshift($args, $having); - $having = new CompositeExpression(CompositeExpression::TYPE_AND, $args); - } - - return $this->add('having', $having); - } - - /** - * Adds a restriction over the groups of the query, forming a logical - * disjunction with any existing having restrictions. - * - * @param mixed $having The restriction to add. - * @return QueryBuilder This QueryBuilder instance. - */ - public function orHaving($having) - { - $having = $this->getQueryPart('having'); - $args = func_get_args(); - - if ($having instanceof CompositeExpression && $having->getType() === CompositeExpression::TYPE_OR) { - $having->addMultiple($args); - } else { - array_unshift($args, $having); - $having = new CompositeExpression(CompositeExpression::TYPE_OR, $args); - } - - return $this->add('having', $having); - } - - /** - * Specifies an ordering for the query results. - * Replaces any previously specified orderings, if any. - * - * @param string $sort The ordering expression. - * @param string $order The ordering direction. - * @return QueryBuilder This QueryBuilder instance. - */ - public function orderBy($sort, $order = null) - { - return $this->add('orderBy', $sort . ' ' . (! $order ? 'ASC' : $order), false); - } - - /** - * Adds an ordering to the query results. - * - * @param string $sort The ordering expression. - * @param string $order The ordering direction. - * @return QueryBuilder This QueryBuilder instance. - */ - public function addOrderBy($sort, $order = null) - { - return $this->add('orderBy', $sort . ' ' . (! $order ? 'ASC' : $order), true); - } - - /** - * Get a query part by its name. - * - * @param string $queryPartName - * @return mixed $queryPart - */ - public function getQueryPart($queryPartName) - { - return $this->sqlParts[$queryPartName]; - } - - /** - * Get all query parts. - * - * @return array $sqlParts - */ - public function getQueryParts() - { - return $this->sqlParts; - } - - /** - * Reset SQL parts - * - * @param array $queryPartNames - * @return QueryBuilder - */ - public function resetQueryParts($queryPartNames = null) - { - if (is_null($queryPartNames)) { - $queryPartNames = array_keys($this->sqlParts); - } - - foreach ($queryPartNames as $queryPartName) { - $this->resetQueryPart($queryPartName); - } - - return $this; - } - - /** - * Reset single SQL part - * - * @param string $queryPartName - * @return QueryBuilder - */ - public function resetQueryPart($queryPartName) - { - $this->sqlParts[$queryPartName] = is_array($this->sqlParts[$queryPartName]) - ? array() : null; - - $this->state = self::STATE_DIRTY; - - return $this; - } - - private function getSQLForSelect() - { - $query = 'SELECT ' . implode(', ', $this->sqlParts['select']) . ' FROM '; - - $fromClauses = array(); - $joinsPending = true; - $joinAliases = array(); - - // Loop through all FROM clauses - foreach ($this->sqlParts['from'] as $from) { - $fromClause = $from['table'] . ' ' . $from['alias']; - - if ($joinsPending && isset($this->sqlParts['join'][$from['alias']])) { - foreach ($this->sqlParts['join'] as $joins) { - foreach ($joins as $join) { - $fromClause .= ' ' . strtoupper($join['joinType']) - . ' JOIN ' . $join['joinTable'] . ' ' . $join['joinAlias'] - . ' ON ' . ((string) $join['joinCondition']); - $joinAliases[$join['joinAlias']] = true; - } - } - $joinsPending = false; - } - - $fromClauses[$from['alias']] = $fromClause; - } - - // loop through all JOIN clauses for validation purpose - $knownAliases = array_merge($fromClauses,$joinAliases); - foreach ($this->sqlParts['join'] as $fromAlias => $joins) { - if ( ! isset($knownAliases[$fromAlias]) ) { - throw QueryException::unknownAlias($fromAlias, array_keys($knownAliases)); - } - } - - - $query .= implode(', ', $fromClauses) - . ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : '') - . ($this->sqlParts['groupBy'] ? ' GROUP BY ' . implode(', ', $this->sqlParts['groupBy']) : '') - . ($this->sqlParts['having'] !== null ? ' HAVING ' . ((string) $this->sqlParts['having']) : '') - . ($this->sqlParts['orderBy'] ? ' ORDER BY ' . implode(', ', $this->sqlParts['orderBy']) : ''); - - return ($this->maxResults === null && $this->firstResult == null) - ? $query - : $this->connection->getDatabasePlatform()->modifyLimitQuery($query, $this->maxResults, $this->firstResult); - } - - /** - * Converts this instance into an UPDATE string in SQL. - * - * @return string - */ - private function getSQLForUpdate() - { - $table = $this->sqlParts['from']['table'] . ($this->sqlParts['from']['alias'] ? ' ' . $this->sqlParts['from']['alias'] : ''); - $query = 'UPDATE ' . $table - . ' SET ' . implode(", ", $this->sqlParts['set']) - . ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : ''); - - return $query; - } - - /** - * Converts this instance into a DELETE string in SQL. - * - * @return string - */ - private function getSQLForDelete() - { - $table = $this->sqlParts['from']['table'] . ($this->sqlParts['from']['alias'] ? ' ' . $this->sqlParts['from']['alias'] : ''); - $query = 'DELETE FROM ' . $table . ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : ''); - - return $query; - } - - /** - * Gets a string representation of this QueryBuilder which corresponds to - * the final SQL query being constructed. - * - * @return string The string representation of this QueryBuilder. - */ - public function __toString() - { - return $this->getSQL(); - } - - /** - * Create a new named parameter and bind the value $value to it. - * - * This method provides a shortcut for PDOStatement::bindValue - * when using prepared statements. - * - * The parameter $value specifies the value that you want to bind. If - * $placeholder is not provided bindValue() will automatically create a - * placeholder for you. An automatic placeholder will be of the name - * ':dcValue1', ':dcValue2' etc. - * - * For more information see {@link http://php.net/pdostatement-bindparam} - * - * Example: - * - * $value = 2; - * $q->eq( 'id', $q->bindValue( $value ) ); - * $stmt = $q->executeQuery(); // executed with 'id = 2' - * - * - * @license New BSD License - * @link http://www.zetacomponents.org - * @param mixed $value - * @param mixed $type - * @param string $placeHolder the name to bind with. The string must start with a colon ':'. - * @return string the placeholder name used. - */ - public function createNamedParameter( $value, $type = \PDO::PARAM_STR, $placeHolder = null ) - { - if ( $placeHolder === null ) { - $this->boundCounter++; - $placeHolder = ":dcValue" . $this->boundCounter; - } - $this->setParameter(substr($placeHolder, 1), $value, $type); - - return $placeHolder; - } - - /** - * Create a new positional parameter and bind the given value to it. - * - * Attention: If you are using positional parameters with the query builder you have - * to be very careful to bind all parameters in the order they appear in the SQL - * statement , otherwise they get bound in the wrong order which can lead to serious - * bugs in your code. - * - * Example: - * - * $qb = $conn->createQueryBuilder(); - * $qb->select('u.*') - * ->from('users', 'u') - * ->where('u.username = ' . $qb->createPositionalParameter('Foo', PDO::PARAM_STR)) - * ->orWhere('u.username = ' . $qb->createPositionalParameter('Bar', PDO::PARAM_STR)) - * - * - * @param mixed $value - * @param mixed $type - * @return string - */ - public function createPositionalParameter($value, $type = \PDO::PARAM_STR) - { - $this->boundCounter++; - $this->setParameter($this->boundCounter, $value, $type); - return "?"; - } -} diff --git a/framework/library/Doctrine/DBAL/Query/QueryException.php b/framework/library/Doctrine/DBAL/Query/QueryException.php deleted file mode 100644 index e2c2b32..0000000 --- a/framework/library/Doctrine/DBAL/Query/QueryException.php +++ /dev/null @@ -1,38 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Query; - -use Doctrine\DBAL\DBALException; - -/** - * Driver interface. - * Interface that all DBAL drivers must implement. - * - * @since 2.1.4 - */ -class QueryException extends DBALException -{ - static public function unknownAlias($alias, $registeredAliases) - { - return new self("The given alias '" . $alias . "' is not part of " . - "any FROM or JOIN clause table. The currently registered " . - "aliases are: " . implode(", ", $registeredAliases) . "."); - } -} diff --git a/framework/library/Doctrine/DBAL/README.markdown b/framework/library/Doctrine/DBAL/README.markdown deleted file mode 100644 index e69de29..0000000 diff --git a/framework/library/Doctrine/DBAL/SQLParserUtils.php b/framework/library/Doctrine/DBAL/SQLParserUtils.php deleted file mode 100644 index 20cafa9..0000000 --- a/framework/library/Doctrine/DBAL/SQLParserUtils.php +++ /dev/null @@ -1,234 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL; - -use Doctrine\DBAL\Connection; - -/** - * Utility class that parses sql statements with regard to types and parameters. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - */ -class SQLParserUtils -{ - const POSITIONAL_TOKEN = '\?'; - const NAMED_TOKEN = '(? integer pair (indexed from zero) for a positional statement - * and a string => int[] pair for a named statement. - * - * @param string $statement - * @param bool $isPositional - * @return array - */ - static public function getPlaceholderPositions($statement, $isPositional = true) - { - $match = ($isPositional) ? '?' : ':'; - if (strpos($statement, $match) === false) { - return array(); - } - - $token = ($isPositional) ? self::POSITIONAL_TOKEN : self::NAMED_TOKEN; - $paramMap = array(); - - foreach (self::getUnquotedStatementFragments($statement) as $fragment) { - preg_match_all("/$token/", $fragment[0], $matches, PREG_OFFSET_CAPTURE); - foreach ($matches[0] as $placeholder) { - if ($isPositional) { - $paramMap[] = $placeholder[1] + $fragment[1]; - } else { - $pos = $placeholder[1] + $fragment[1]; - $paramMap[$pos] = substr($placeholder[0], 1, strlen($placeholder[0])); - } - } - } - - return $paramMap; - } - - /** - * For a positional query this method can rewrite the sql statement with regard to array parameters. - * - * @param string $query The SQL query to execute. - * @param array $params The parameters to bind to the query. - * @param array $types The types the previous parameters are in. - * - * @throws SQLParserUtilsException - * @return array - */ - static public function expandListParameters($query, $params, $types) - { - $isPositional = is_int(key($params)); - $arrayPositions = array(); - $bindIndex = -1; - - foreach ($types as $name => $type) { - ++$bindIndex; - - if ($type !== Connection::PARAM_INT_ARRAY && $type !== Connection::PARAM_STR_ARRAY) { - continue; - } - - if ($isPositional) { - $name = $bindIndex; - } - - $arrayPositions[$name] = false; - } - - if (( ! $arrayPositions && $isPositional)) { - return array($query, $params, $types); - } - - $paramPos = self::getPlaceholderPositions($query, $isPositional); - - if ($isPositional) { - $paramOffset = 0; - $queryOffset = 0; - - foreach ($paramPos as $needle => $needlePos) { - if ( ! isset($arrayPositions[$needle])) { - continue; - } - - $needle += $paramOffset; - $needlePos += $queryOffset; - $count = count($params[$needle]); - - $params = array_merge( - array_slice($params, 0, $needle), - $params[$needle], - array_slice($params, $needle + 1) - ); - - $types = array_merge( - array_slice($types, 0, $needle), - $count ? - array_fill(0, $count, $types[$needle] - Connection::ARRAY_PARAM_OFFSET) : // array needles are at PDO::PARAM_* + 100 - array(), - array_slice($types, $needle + 1) - ); - - $expandStr = implode(", ", array_fill(0, $count, "?")); - $query = substr($query, 0, $needlePos) . $expandStr . substr($query, $needlePos + 1); - - $paramOffset += ($count - 1); // Grows larger by number of parameters minus the replaced needle. - $queryOffset += (strlen($expandStr) - 1); - } - - return array($query, $params, $types); - } - - - $queryOffset = 0; - $typesOrd = array(); - $paramsOrd = array(); - - foreach ($paramPos as $pos => $paramName) { - $paramLen = strlen($paramName) + 1; - $value = static::extractParam($paramName, $params, true); - - if ( ! isset($arrayPositions[$paramName]) && ! isset($arrayPositions[':' . $paramName])) { - $pos += $queryOffset; - $queryOffset -= ($paramLen - 1); - $paramsOrd[] = $value; - $typesOrd[] = static::extractParam($paramName, $types, false, \PDO::PARAM_STR); - $query = substr($query, 0, $pos) . '?' . substr($query, ($pos + $paramLen)); - - continue; - } - - $count = count($value); - $expandStr = $count > 0 ? implode(', ', array_fill(0, $count, '?')) : '?'; - - foreach ($value as $val) { - $paramsOrd[] = $val; - $typesOrd[] = static::extractParam($paramName, $types, false) - Connection::ARRAY_PARAM_OFFSET; - } - - $pos += $queryOffset; - $queryOffset += (strlen($expandStr) - $paramLen); - $query = substr($query, 0, $pos) . $expandStr . substr($query, ($pos + $paramLen)); - } - - return array($query, $paramsOrd, $typesOrd); - } - - /** - * Slice the SQL statement around pairs of quotes and - * return string fragments of SQL outside of quoted literals. - * Each fragment is captured as a 2-element array: - * - * 0 => matched fragment string, - * 1 => offset of fragment in $statement - * - * @param string $statement - * @return array - */ - static private function getUnquotedStatementFragments($statement) - { - $literal = self::ESCAPED_SINGLE_QUOTED_TEXT . '|' . self::ESCAPED_DOUBLE_QUOTED_TEXT; - preg_match_all("/([^'\"]+)(?:$literal)?/s", $statement, $fragments, PREG_OFFSET_CAPTURE); - - return $fragments[1]; - } - - /** - * @param string $paramName The name of the parameter (without a colon in front) - * @param array $paramsOrTypes A hash of parameters or types - * @param bool $isParam - * @param mixed $defaultValue An optional default value. If omitted, an exception is thrown - * - * @throws SQLParserUtilsException - * @return mixed - */ - static private function extractParam($paramName, $paramsOrTypes, $isParam, $defaultValue = null) - { - if (isset($paramsOrTypes[$paramName])) { - return $paramsOrTypes[$paramName]; - } - - // Hash keys can be prefixed with a colon for compatibility - if (isset($paramsOrTypes[':' . $paramName])) { - return $paramsOrTypes[':' . $paramName]; - } - - if (null !== $defaultValue) { - return $defaultValue; - } - - if ($isParam) { - throw SQLParserUtilsException::missingParam($paramName); - } - - throw SQLParserUtilsException::missingType($paramName); - } -} diff --git a/framework/library/Doctrine/DBAL/SQLParserUtilsException.php b/framework/library/Doctrine/DBAL/SQLParserUtilsException.php deleted file mode 100644 index 4a74f6c..0000000 --- a/framework/library/Doctrine/DBAL/SQLParserUtilsException.php +++ /dev/null @@ -1,43 +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.4 - * @author Lars Strojny - */ -class SQLParserUtilsException extends DBALException -{ - public static function missingParam($paramName) - { - return new self(sprintf('Value for :%1$s not found in params array. Params array key should be "%1$s"', $paramName)); - } - - public static function missingType($typeName) - { - return new self(sprintf('Value for :%1$s not found in types array. Types array key should be "%1$s"', $typeName)); - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/AbstractAsset.php b/framework/library/Doctrine/DBAL/Schema/AbstractAsset.php deleted file mode 100644 index 17a9c0f..0000000 --- a/framework/library/Doctrine/DBAL/Schema/AbstractAsset.php +++ /dev/null @@ -1,214 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * 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 - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - */ -abstract class AbstractAsset -{ - /** - * @var string - */ - protected $_name; - - /** - * Namespace of the asset. If none isset the default namespace is assumed. - * - * @var string - */ - protected $_namespace; - - /** - * @var bool - */ - protected $_quoted = false; - - /** - * Set name of this asset - * - * @param string $name - */ - protected function _setName($name) - { - if ($this->isIdentifierQuoted($name)) { - $this->_quoted = true; - $name = $this->trimQuotes($name); - } - if (strpos($name, ".") !== false) { - $parts = explode(".", $name); - $this->_namespace = $parts[0]; - $name = $parts[1]; - } - $this->_name = $name; - } - - /** - * Is this asset in the default namespace? - * - * @param string $defaultNamespaceName - * @return bool - */ - public function isInDefaultNamespace($defaultNamespaceName) - { - return $this->_namespace == $defaultNamespaceName || $this->_namespace === null; - } - - /** - * Get namespace name of this asset. - * - * If NULL is returned this means the default namespace is used. - * - * @return string - */ - public function getNamespaceName() - { - return $this->_namespace; - } - - /** - * The shortest name is stripped of the default namespace. All other - * namespaced elements are returned as full-qualified names. - * - * @param string - * @return string - */ - public function getShortestName($defaultNamespaceName) - { - $shortestName = $this->getName(); - if ($this->_namespace == $defaultNamespaceName) { - $shortestName = $this->_name; - } - return strtolower($shortestName); - } - - /** - * The normalized name is full-qualified and lowerspaced. Lowerspacing is - * actually wrong, but we have to do it to keep our sanity. If you are - * using database objects that only differentiate in the casing (FOO vs - * Foo) then you will NOT be able to use Doctrine Schema abstraction. - * - * Every non-namespaced element is prefixed with the default namespace - * name which is passed as argument to this method. - * - * @return string - */ - public function getFullQualifiedName($defaultNamespaceName) - { - $name = $this->getName(); - if ( ! $this->_namespace) { - $name = $defaultNamespaceName . "." . $name; - } - return strtolower($name); - } - - /** - * Check if this asset's name is quoted - * - * @return bool - */ - public function isQuoted() - { - return $this->_quoted; - } - - /** - * Check if this identifier is quoted. - * - * @param string $identifier - * @return bool - */ - protected function isIdentifierQuoted($identifier) - { - return (isset($identifier[0]) && ($identifier[0] == '`' || $identifier[0] == '"')); - } - - /** - * Trim quotes from the identifier. - * - * @param string $identifier - * @return string - */ - protected function trimQuotes($identifier) - { - return str_replace(array('`', '"'), '', $identifier); - } - - /** - * Return name of this schema asset. - * - * @return string - */ - public function getName() - { - if ($this->_namespace) { - return $this->_namespace . "." . $this->_name; - } - return $this->_name; - } - - /** - * Get the quoted representation of this asset but only if it was defined with one. Otherwise - * return the plain unquoted value as inserted. - * - * @param AbstractPlatform $platform - * @return string - */ - public function getQuotedName(AbstractPlatform $platform) - { - $keywords = $platform->getReservedKeywordsList(); - $parts = explode(".", $this->getName()); - foreach ($parts as $k => $v) { - $parts[$k] = ($this->_quoted || $keywords->isKeyword($v)) ? $platform->quoteIdentifier($v) : $v; - } - - return implode(".", $parts); - } - - /** - * 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 $prefix - * @param int $maxSize - * @return string - */ - protected function _generateIdentifierName($columnNames, $prefix='', $maxSize=30) - { - $hash = implode("", array_map(function($column) { - return dechex(crc32($column)); - }, $columnNames)); - return substr(strtoupper($prefix . "_" . $hash), 0, $maxSize); - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/AbstractSchemaManager.php b/framework/library/Doctrine/DBAL/Schema/AbstractSchemaManager.php deleted file mode 100644 index 068d6b5..0000000 --- a/framework/library/Doctrine/DBAL/Schema/AbstractSchemaManager.php +++ /dev/null @@ -1,896 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Events; -use Doctrine\DBAL\Event\SchemaColumnDefinitionEventArgs; -use Doctrine\DBAL\Event\SchemaIndexDefinitionEventArgs; -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 - * @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, AbstractPlatform $platform = null) - { - $this->_conn = $conn; - $this->_platform = $platform ?: $this->_conn->getDatabasePlatform(); - } - - /** - * Return associated platform. - * - * @return \Doctrine\DBAL\Platforms\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->filterAssetNames($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. - * @param string $database - * @return Column[] - */ - public function listTableColumns($table, $database = null) - { - if ( ! $database) { - $database = $this->_conn->getDatabase(); - } - - $sql = $this->_platform->getListTableColumnsSQL($table, $database); - - $tableColumns = $this->_conn->fetchAll($sql); - - return $this->_getPortableTableColumnList($table, $database, $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, $this->_conn->getDatabase()); - - $tableIndexes = $this->_conn->fetchAll($sql); - - return $this->_getPortableTableIndexesList($tableIndexes, $table); - } - - /** - * Return true if all the given tables exist. - * - * @param array $tableNames - * @return bool - */ - public function tablesExist($tableNames) - { - $tableNames = array_map('strtolower', (array)$tableNames); - return count($tableNames) == count(\array_intersect($tableNames, array_map('strtolower', $this->listTableNames()))); - } - - /** - * Return a list of all tables in the current database - * - * @return array - */ - public function listTableNames() - { - $sql = $this->_platform->getListTablesSQL(); - - $tables = $this->_conn->fetchAll($sql); - $tableNames = $this->_getPortableTablesList($tables); - return $this->filterAssetNames($tableNames); - } - - /** - * Filter asset names if they are configured to return only a subset of all - * the found elements. - * - * @param array $assetNames - * @return array - */ - protected function filterAssetNames($assetNames) - { - $filterExpr = $this->getFilterSchemaAssetsExpression(); - if ( ! $filterExpr) { - return $assetNames; - } - return array_values ( - array_filter($assetNames, function ($assetName) use ($filterExpr) { - $assetName = ($assetName instanceof AbstractAsset) ? $assetName->getName() : $assetName; - return preg_match($filterExpr, $assetName); - }) - ); - } - - protected function getFilterSchemaAssetsExpression() - { - return $this->_conn->getConfiguration()->getFilterSchemaAssetsExpression(); - } - - /** - * 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); - - return new Table($tableName, $columns, $indexes, $foreignKeys, false, 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->getQuotedName($this->_platform); - } - - $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->getQuotedName($this->_platform), $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->getQuotedName($this->_platform), $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('dropSequence', $sequence->getQuotedName($this->_platform)); - $this->createSequence($sequence); - } - - /** - * Drop and create a new table. - * - * @param Table $table - */ - public function dropAndCreateTable(Table $table) - { - $this->tryMethod('dropTable', $table->getQuotedName($this->_platform)); - $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->getQuotedName($this->_platform)); - $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 $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 $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 $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 $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 string $table The name of the table. - * @param string $database - * @param array $tableColumns - * @return array - */ - protected function _getPortableTableColumnList($table, $database, $tableColumns) - { - $eventManager = $this->_platform->getEventManager(); - - $list = array(); - foreach ($tableColumns as $tableColumn) { - $column = null; - $defaultPrevented = false; - - if (null !== $eventManager && $eventManager->hasListeners(Events::onSchemaColumnDefinition)) { - $eventArgs = new SchemaColumnDefinitionEventArgs($tableColumn, $table, $database, $this->_conn); - $eventManager->dispatchEvent(Events::onSchemaColumnDefinition, $eventArgs); - - $defaultPrevented = $eventArgs->isDefaultPrevented(); - $column = $eventArgs->getColumn(); - } - - if ( ! $defaultPrevented) { - $column = $this->_getPortableTableColumnDefinition($tableColumn); - } - - if ($column) { - $name = strtolower($column->getQuotedName($this->_platform)); - $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'], - 'flags' => isset($tableIndex['flags']) ? $tableIndex['flags'] : array(), - ); - } else { - $result[$keyName]['columns'][] = $tableIndex['column_name']; - } - } - - $eventManager = $this->_platform->getEventManager(); - - $indexes = array(); - foreach($result as $indexKey => $data) { - $index = null; - $defaultPrevented = false; - - if (null !== $eventManager && $eventManager->hasListeners(Events::onSchemaIndexDefinition)) { - $eventArgs = new SchemaIndexDefinitionEventArgs($data, $tableName, $this->_conn); - $eventManager->dispatchEvent(Events::onSchemaIndexDefinition, $eventArgs); - - $defaultPrevented = $eventArgs->isDefaultPrevented(); - $index = $eventArgs->getIndex(); - } - - if ( ! $defaultPrevented) { - $index = new Index($data['name'], $data['columns'], $data['unique'], $data['primary'], $data['flags']); - } - - if ($index) { - $indexes[$indexKey] = $index; - } - } - - return $indexes; - } - - protected function _getPortableTablesList($tables) - { - $list = array(); - foreach ($tables as $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 $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 $value) { - if ($view = $this->_getPortableViewDefinition($value)) { - $viewName = strtolower($view->getQuotedName($this->_platform)); - $list[$viewName] = $view; - } - } - return $list; - } - - protected function _getPortableViewDefinition($view) - { - return false; - } - - protected function _getPortableTableForeignKeysList($tableForeignKeys) - { - $list = array(); - foreach ($tableForeignKeys as $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->setMaxIdentifierLength($this->_platform->getMaxIdentifierLength()); - - $searchPaths = $this->getSchemaSearchPaths(); - if (isset($searchPaths[0])) { - $schemaConfig->setName($searchPaths[0]); - } - - $params = $this->_conn->getParams(); - if (isset($params['defaultTableOptions'])) { - $schemaConfig->setDefaultTableOptions($params['defaultTableOptions']); - } - - return $schemaConfig; - } - - /** - * The search path for namespaces in the currently connected database. - * - * The first entry is usually the default namespace in the Schema. All - * further namespaces contain tables/sequences which can also be addressed - * with a short, not full-qualified name. - * - * For databases that don't support subschema/namespaces this method - * returns the name of the currently connected database. - * - * @return array - */ - public function getSchemaSearchPaths() - { - return array($this->_conn->getDatabase()); - } - - /** - * Given a table comment this method tries to extract a typehint for Doctrine Type, or returns - * the type given as default. - * - * @param string $comment - * @param string $currentType - * @return string - */ - public function extractDoctrineTypeFromComment($comment, $currentType) - { - if (preg_match("(\(DC2Type:([a-zA-Z0-9_]+)\))", $comment, $match)) { - $currentType = $match[1]; - } - return $currentType; - } - - public function removeDoctrineTypeFromComment($comment, $type) - { - return str_replace('(DC2Type:'.$type.')', '', $comment); - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/Column.php b/framework/library/Doctrine/DBAL/Schema/Column.php deleted file mode 100644 index fa6f70b..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Column.php +++ /dev/null @@ -1,423 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use \Doctrine\DBAL\Types\Type; -use Doctrine\DBAL\Schema\Visitor\Visitor; - -/** - * Object representation of a database column - * - * - * @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 = null; - - /** - * @var int - */ - protected $_precision = 10; - - /** - * @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 bool - */ - protected $_autoincrement = false; - - /** - * @var array - */ - protected $_platformOptions = array(); - - /** - * @var string - */ - protected $_columnDefinition = null; - - /** - * @var string - */ - protected $_comment = null; - - /** - * @var array - */ - protected $_customSchemaOptions = array(); - - /** - * 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) - { - if (!is_numeric($precision)) { - $precision = 10; // defaults to 10 when no valid precision is given. - } - - $this->_precision = (int)$precision; - return $this; - } - - /** - * @param int $scale - * @return Column - */ - public function setScale($scale) - { - if (!is_numeric($scale)) { - $scale = 0; - } - - $this->_scale = (int)$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; - } - - public function getAutoincrement() - { - return $this->_autoincrement; - } - - public function setAutoincrement($flag) - { - $this->_autoincrement = $flag; - return $this; - } - - public function setComment($comment) - { - $this->_comment = $comment; - return $this; - } - - public function getComment() - { - return $this->_comment; - } - - /** - * @param string $name - * @param mixed $value - * @return Column - */ - public function setCustomSchemaOption($name, $value) - { - $this->_customSchemaOptions[$name] = $value; - return $this; - } - - /** - * @param string $name - * @return boolean - */ - public function hasCustomSchemaOption($name) - { - return isset($this->_customSchemaOptions[$name]); - } - - /** - * @param string $name - * @return mixed - */ - public function getCustomSchemaOption($name) - { - return $this->_customSchemaOptions[$name]; - } - - /** - * @param array $customSchemaOptions - * @return Column - */ - public function setCustomSchemaOptions(array $customSchemaOptions) - { - $this->_customSchemaOptions = $customSchemaOptions; - return $this; - } - - /** - * @return array - */ - public function getCustomSchemaOptions() - { - return $this->_customSchemaOptions; - } - - /** - * @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, - 'autoincrement' => $this->_autoincrement, - 'columnDefinition' => $this->_columnDefinition, - 'comment' => $this->_comment, - ), $this->_platformOptions, $this->_customSchemaOptions); - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/ColumnDiff.php b/framework/library/Doctrine/DBAL/Schema/ColumnDiff.php deleted file mode 100644 index 4fc4b9c..0000000 --- a/framework/library/Doctrine/DBAL/Schema/ColumnDiff.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * Represent the change of a column - * - * - * @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); - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/Comparator.php b/framework/library/Doctrine/DBAL/Schema/Comparator.php deleted file mode 100644 index b61a69a..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Comparator.php +++ /dev/null @@ -1,433 +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 - * - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class Comparator -{ - /** - * @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 differences 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) - { - $diff = new SchemaDiff(); - - $foreignKeysToTable = array(); - - foreach ( $toSchema->getTables() as $table ) { - $tableName = $table->getShortestName($toSchema->getName()); - if ( ! $fromSchema->hasTable($tableName)) { - $diff->newTables[$tableName] = $toSchema->getTable($tableName); - } else { - $tableDifferences = $this->diffTable($fromSchema->getTable($tableName), $toSchema->getTable($tableName)); - if ($tableDifferences !== false) { - $diff->changedTables[$tableName] = $tableDifferences; - } - } - } - - /* Check if there are tables removed */ - foreach ($fromSchema->getTables() as $table) { - $tableName = $table->getShortestName($fromSchema->getName()); - - $table = $fromSchema->getTable($tableName); - 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]); - - // deleting duplicated foreign keys present on both on the orphanedForeignKey - // and the removedForeignKeys from changedTables - foreach ($foreignKeysToTable[$tableName] as $foreignKey) { - // strtolower the table name to make if compatible with getShortestName - $localTableName = strtolower($foreignKey->getLocalTableName()); - if (isset($diff->changedTables[$localTableName])) { - foreach ($diff->changedTables[$localTableName]->removedForeignKeys as $key => $removedForeignKey) { - unset($diff->changedTables[$localTableName]->removedForeignKeys[$key]); - } - } - } - } - } - - foreach ($toSchema->getSequences() as $sequence) { - $sequenceName = $sequence->getShortestName($toSchema->getName()); - if ( ! $fromSchema->hasSequence($sequenceName)) { - $diff->newSequences[] = $sequence; - } else { - if ($this->diffSequence($sequence, $fromSchema->getSequence($sequenceName))) { - $diff->changedSequences[] = $toSchema->getSequence($sequenceName); - } - } - } - - foreach ($fromSchema->getSequences() as $sequence) { - if ($this->isAutoIncrementSequenceInSchema($toSchema, $sequence)) { - continue; - } - - $sequenceName = $sequence->getShortestName($fromSchema->getName()); - - if ( ! $toSchema->hasSequence($sequenceName)) { - $diff->removedSequences[] = $sequence; - } - } - - return $diff; - } - - private function isAutoIncrementSequenceInSchema($schema, $sequence) - { - foreach ($schema->getTables() as $table) { - if ($sequence->isAutoIncrementsFor($table)) { - return true; - } - } - - return false; - } - - /** - * - * @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++; - } - } - } - - $this->detectColumnRenamings($tableDifferences); - - $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; - } - - /** - * Try to find columns that only changed their name, rename operations maybe cheaper than add/drop - * however ambiguities between different possibilities should not lead to renaming at all. - * - * @param TableDiff $tableDifferences - */ - private function detectColumnRenamings(TableDiff $tableDifferences) - { - $renameCandidates = array(); - foreach ($tableDifferences->addedColumns as $addedColumnName => $addedColumn) { - foreach ($tableDifferences->removedColumns as $removedColumnName => $removedColumn) { - if (count($this->diffColumn($addedColumn, $removedColumn)) == 0) { - $renameCandidates[$addedColumn->getName()][] = array($removedColumn, $addedColumn, $addedColumnName); - } - } - } - - foreach ($renameCandidates as $candidateColumns) { - if (count($candidateColumns) == 1) { - list($removedColumn, $addedColumn) = $candidateColumns[0]; - $removedColumnName = strtolower($removedColumn->getName()); - $addedColumnName = strtolower($addedColumn->getName()); - - if ( ! isset($tableDifferences->renamedColumns[$removedColumnName])) { - $tableDifferences->renamedColumns[$removedColumnName] = $addedColumn; - unset($tableDifferences->addedColumns[$addedColumnName]); - unset($tableDifferences->removedColumns[$removedColumnName]); - } - } - } - } - - /** - * @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->getUnqualifiedForeignTableName() !== $key2->getUnqualifiedForeignTableName()) { - 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) { - // check if value of length is set at all, default value assumed otherwise. - $length1 = $column1->getLength() ?: 255; - $length2 = $column2->getLength() ?: 255; - if ($length1 != $length2) { - $changedProperties[] = 'length'; - } - - if ($column1->getFixed() != $column2->getFixed()) { - $changedProperties[] = 'fixed'; - } - } - - if ($column1->getType() instanceof \Doctrine\DBAL\Types\DecimalType) { - if (($column1->getPrecision()?:10) != ($column2->getPrecision()?:10)) { - $changedProperties[] = 'precision'; - } - if ($column1->getScale() != $column2->getScale()) { - $changedProperties[] = 'scale'; - } - } - - if ($column1->getAutoincrement() != $column2->getAutoincrement()) { - $changedProperties[] = 'autoincrement'; - } - - // only allow to delete comment if its set to '' not to null. - if ($column1->getComment() !== null && $column1->getComment() != $column2->getComment()) { - $changedProperties[] = 'comment'; - } - - $options1 = $column1->getCustomSchemaOptions(); - $options2 = $column2->getCustomSchemaOptions(); - - $commonKeys = array_keys(array_intersect_key($options1, $options2)); - - foreach ($commonKeys as $key) { - if ($options1[$key] !== $options2[$key]) { - $changedProperties[] = $key; - } - } - - $diffKeys = array_keys(array_diff_key($options1, $options2) + array_diff_key($options2, $options1)); - - $changedProperties = array_merge($changedProperties, $diffKeys); - - 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->isFullfilledBy($index2) && $index2->isFullfilledBy($index1)) { - return false; - } - return true; - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/Constraint.php b/framework/library/Doctrine/DBAL/Schema/Constraint.php deleted file mode 100644 index f80410f..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Constraint.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Marker interface for contraints - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -interface Constraint -{ - public function getName(); - - public function getQuotedName(AbstractPlatform $platform); - - public function getColumns(); -} diff --git a/framework/library/Doctrine/DBAL/Schema/DB2SchemaManager.php b/framework/library/Doctrine/DBAL/Schema/DB2SchemaManager.php deleted file mode 100644 index e11c64c..0000000 --- a/framework/library/Doctrine/DBAL/Schema/DB2SchemaManager.php +++ /dev/null @@ -1,214 +0,0 @@ -. -*/ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Event\SchemaIndexDefinitionEventArgs; -use Doctrine\DBAL\Events; - -/** - * 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; - - $type = $this->_platform->getDoctrineTypeMapping($tableColumn['typename']); - - switch (strtolower($tableColumn['typename'])) { - case 'varchar': - $length = $tableColumn['length']; - $fixed = false; - break; - case 'character': - $length = $tableColumn['length']; - $fixed = true; - break; - case 'clob': - $length = $tableColumn['length']; - break; - case 'decimal': - case 'double': - case 'real': - $scale = $tableColumn['scale']; - $precision = $tableColumn['length']; - break; - } - - $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) - { - $eventManager = $this->_platform->getEventManager(); - - $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; - } - - $data = array( - 'name' => $indexName, - 'columns' => explode("+", ltrim($data['colnames'], '+')), - 'unique' => $unique, - 'primary' => $primary - ); - - $index = null; - $defaultPrevented = false; - - if (null !== $eventManager && $eventManager->hasListeners(Events::onSchemaIndexDefinition)) { - $eventArgs = new SchemaIndexDefinitionEventArgs($data, $tableName, $this->_conn); - $eventManager->dispatchEvent(Events::onSchemaIndexDefinition, $eventArgs); - - $defaultPrevented = $eventArgs->isDefaultPrevented(); - $index = $eventArgs->getIndex(); - } - - if ( ! $defaultPrevented) { - $index = new Index($data['name'], $data['columns'], $data['unique'], $data['primary']); - } - - if ($index) { - $indexes[$indexKey] = $index; - } - } - - 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); - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/DrizzleSchemaManager.php b/framework/library/Doctrine/DBAL/Schema/DrizzleSchemaManager.php deleted file mode 100644 index f73b223..0000000 --- a/framework/library/Doctrine/DBAL/Schema/DrizzleSchemaManager.php +++ /dev/null @@ -1,96 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * Schema manager for the Drizzle RDBMS. - * - * @author Kim Hemsø Rasmussen - */ -class DrizzleSchemaManager extends AbstractSchemaManager -{ - protected function _getPortableTableColumnDefinition($tableColumn) - { - $tableName = $tableColumn['COLUMN_NAME']; - $dbType = strtolower($tableColumn['DATA_TYPE']); - - $type = $this->_platform->getDoctrineTypeMapping($dbType); - $type = $this->extractDoctrineTypeFromComment($tableColumn['COLUMN_COMMENT'], $type); - $tableColumn['COLUMN_COMMENT'] = $this->removeDoctrineTypeFromComment($tableColumn['COLUMN_COMMENT'], $type); - - $options = array( - 'notnull' => !(bool)$tableColumn['IS_NULLABLE'], - 'length' => (int)$tableColumn['CHARACTER_MAXIMUM_LENGTH'], - 'default' => empty($tableColumn['COLUMN_DEFAULT']) ? null : $tableColumn['COLUMN_DEFAULT'], - 'autoincrement' => (bool)$tableColumn['IS_AUTO_INCREMENT'], - 'scale' => (int)$tableColumn['NUMERIC_SCALE'], - 'precision' => (int)$tableColumn['NUMERIC_PRECISION'], - 'comment' => (isset($tableColumn['COLUMN_COMMENT']) ? $tableColumn['COLUMN_COMMENT'] : null), - ); - - return new Column($tableName, \Doctrine\DBAL\Types\Type::getType($type), $options); - } - - protected function _getPortableDatabaseDefinition($database) - { - return $database['SCHEMA_NAME']; - } - - protected function _getPortableTableDefinition($table) - { - return $table['TABLE_NAME']; - } - - public function _getPortableTableForeignKeyDefinition($tableForeignKey) - { - $columns = array(); - foreach (explode(',', $tableForeignKey['CONSTRAINT_COLUMNS']) as $value) { - $columns[] = trim($value, ' `'); - } - - $ref_columns = array(); - foreach (explode(',', $tableForeignKey['REFERENCED_TABLE_COLUMNS']) as $value) { - $ref_columns[] = trim($value, ' `'); - } - - return new ForeignKeyConstraint( - $columns, - $tableForeignKey['REFERENCED_TABLE_NAME'], - $ref_columns, - $tableForeignKey['CONSTRAINT_NAME'], - array( - 'onUpdate' => $tableForeignKey['UPDATE_RULE'], - 'onDelete' => $tableForeignKey['DELETE_RULE'], - ) - ); - } - - protected function _getPortableTableIndexesList($tableIndexes, $tableName = null) - { - $indexes = array(); - foreach ($tableIndexes as $k) { - $k['primary'] = (boolean)$k['primary']; - $indexes[] = $k; - } - - return parent::_getPortableTableIndexesList($indexes, $tableName); - } -} - diff --git a/framework/library/Doctrine/DBAL/Schema/ForeignKeyConstraint.php b/framework/library/Doctrine/DBAL/Schema/ForeignKeyConstraint.php deleted file mode 100644 index 0375582..0000000 --- a/framework/library/Doctrine/DBAL/Schema/ForeignKeyConstraint.php +++ /dev/null @@ -1,204 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Schema\Visitor\Visitor; -use Doctrine\DBAL\Platforms\AbstractPlatform; - -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 the non-schema qualified foreign table name. - * - * @return string - */ - public function getUnqualifiedForeignTableName() - { - $parts = explode(".", $this->_foreignTableName); - return strtolower(end($parts)); - } - - /** - * Get the quoted representation of this asset but only if it was defined with one. Otherwise - * return the plain unquoted value as inserted. - * - * @param AbstractPlatform $platform - * @return string - */ - public function getQuotedForeignTableName(AbstractPlatform $platform) - { - $keywords = $platform->getReservedKeywordsList(); - $parts = explode(".", $this->getForeignTableName()); - foreach ($parts AS $k => $v) { - $parts[$k] = ($this->_quoted || $keywords->isKeyword($v)) ? $platform->quoteIdentifier($v) : $v; - } - - return implode(".", $parts); - } - - /** - * @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]; - } - - /** - * Gets the options associated with this constraint - * - * @return array - */ - public function getOptions() - { - return $this->_options; - } - - /** - * 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/framework/library/Doctrine/DBAL/Schema/Index.php b/framework/library/Doctrine/DBAL/Schema/Index.php deleted file mode 100644 index 56b9ea8..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Index.php +++ /dev/null @@ -1,242 +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; - - /** - * Platform specific flags for indexes. - * - * @var array - */ - protected $_flags = array(); - - /** - * @param string $indexName - * @param array $column - * @param bool $isUnique - * @param bool $isPrimary - */ - public function __construct($indexName, array $columns, $isUnique = false, $isPrimary = false, array $flags = array()) - { - $isUnique = ($isPrimary)?true:$isUnique; - - $this->_setName($indexName); - $this->_isUnique = $isUnique; - $this->_isPrimary = $isPrimary; - - foreach ($columns as $column) { - $this->_addColumn($column); - } - foreach ($flags as $flag) { - $this->addFlag($flag); - } - } - - /** - * @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 array - */ - public function getUnquotedColumns() - { - return array_map(array($this, 'trimQuotes'), $this->getColumns()); - } - - /** - * Is the index neither unique nor primary key? - * - * @return bool - */ - public function isSimpleIndex() - { - return !$this->_isPrimary && !$this->_isUnique; - } - - /** - * @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 = $this->trimQuotes(strtolower($columnName)); - $indexColumns = array_map('strtolower', $this->getUnquotedColumns()); - return array_search($columnName, $indexColumns) === $pos; - } - - /** - * Check if this index exactly spans the given column names in the correct order. - * - * @param array $columnNames - * @return boolean - */ - public function spansColumns(array $columnNames) - { - $sameColumns = true; - for ($i = 0; $i < count($this->_columns); $i++) { - if (!isset($columnNames[$i]) || $this->trimQuotes(strtolower($this->_columns[$i])) != $this->trimQuotes(strtolower($columnNames[$i]))) { - $sameColumns = false; - } - } - return $sameColumns; - } - - /** - * Check if the other index already fullfills all the indexing and constraint needs of the current one. - * - * @param Index $other - * @return bool - */ - public function isFullfilledBy(Index $other) - { - // allow the other index to be equally large only. It being larger is an option - // but it creates a problem with scenarios of the kind PRIMARY KEY(foo,bar) UNIQUE(foo) - if (count($other->getColumns()) != count($this->getColumns())) { - return false; - } - - // Check if columns are the same, and even in the same order - $sameColumns = $this->spansColumns($other->getColumns()); - - if ($sameColumns) { - if ( ! $this->isUnique() && !$this->isPrimary()) { - // this is a special case: If the current key is neither primary or unique, any uniqe or - // primary key will always have the same effect for the index and there cannot be any constraint - // overlaps. This means a primary or unique index can always fullfill the requirements of just an - // index that has no constraints. - return true; - } else if ($other->isPrimary() != $this->isPrimary()) { - return false; - } else if ($other->isUnique() != $this->isUnique()) { - return false; - } - return true; - } - return false; - } - - /** - * Detect if the other index is a non-unique, non primary index that can be overwritten by this one. - * - * @param Index $other - * @return bool - */ - public function overrules(Index $other) - { - if ($other->isPrimary()) { - return false; - } else if ($this->isSimpleIndex() && $other->isUnique()) { - return false; - } - - if ($this->spansColumns($other->getColumns()) && ($this->isPrimary() || $this->isUnique())) { - return true; - } - return false; - } - - /** - * Add Flag for an index that translates to platform specific handling. - * - * @example $index->addFlag('CLUSTERED') - * @param string $flag - * @return Index - */ - public function addFlag($flag) - { - $this->flags[strtolower($flag)] = true; - return $this; - } - - /** - * Does this index have a specific flag? - * - * @param string $flag - * @return bool - */ - public function hasFlag($flag) - { - return isset($this->flags[strtolower($flag)]); - } - - /** - * Remove a flag - * - * @param string $flag - * @return void - */ - public function removeFlag($flag) - { - unset($this->flags[strtolower($flag)]); - } -} - diff --git a/framework/library/Doctrine/DBAL/Schema/MySqlSchemaManager.php b/framework/library/Doctrine/DBAL/Schema/MySqlSchemaManager.php deleted file mode 100644 index a9a5964..0000000 --- a/framework/library/Doctrine/DBAL/Schema/MySqlSchemaManager.php +++ /dev/null @@ -1,208 +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; - } - if (strpos($v['index_type'], 'FULLTEXT') !== false) { - $v['flags'] = array('FULLTEXT'); - } - $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) - { - $tableColumn = array_change_key_case($tableColumn, CASE_LOWER); - - $dbType = strtolower($tableColumn['type']); - $dbType = strtok($dbType, '(), '); - if (isset($tableColumn['length'])) { - $length = $tableColumn['length']; - $decimal = ''; - } else { - $length = strtok('(), '); - $decimal = strtok('(), ') ? strtok('(), '):null; - } - $type = array(); - $fixed = null; - - if ( ! isset($tableColumn['name'])) { - $tableColumn['name'] = ''; - } - - $scale = null; - $precision = null; - - $type = $this->_platform->getDoctrineTypeMapping($dbType); - $type = $this->extractDoctrineTypeFromComment($tableColumn['comment'], $type); - $tableColumn['comment'] = $this->removeDoctrineTypeFromComment($tableColumn['comment'], $type); - - switch ($dbType) { - case 'char': - $fixed = true; - 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; - } - break; - case 'tinyint': - case 'smallint': - case 'mediumint': - case 'int': - case 'integer': - case 'bigint': - case 'tinyblob': - case 'mediumblob': - case 'longblob': - case 'blob': - case 'year': - $length = null; - break; - } - - $length = ((int) $length == 0) ? null : (int) $length; - - $options = array( - 'length' => $length, - 'unsigned' => (bool) (strpos($tableColumn['type'], 'unsigned') !== false), - 'fixed' => (bool) $fixed, - 'default' => isset($tableColumn['default']) ? $tableColumn['default'] : null, - 'notnull' => (bool) ($tableColumn['null'] != 'YES'), - 'scale' => null, - 'precision' => null, - 'autoincrement' => (bool) (strpos($tableColumn['extra'], 'auto_increment') !== false), - 'comment' => (isset($tableColumn['comment'])) ? $tableColumn['comment'] : null - ); - - if ($scale !== null && $precision !== null) { - $options['scale'] = $scale; - $options['precision'] = $precision; - } - - return new Column($tableColumn['field'], \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 (!isset($value['delete_rule']) || $value['delete_rule'] == "RESTRICT") { - $value['delete_rule'] = null; - } - if (!isset($value['update_rule']) || $value['update_rule'] == "RESTRICT") { - $value['update_rule'] = null; - } - - $list[$value['constraint_name']] = array( - 'name' => $value['constraint_name'], - 'local' => array(), - 'foreign' => array(), - 'foreignTable' => $value['referenced_table_name'], - 'onDelete' => $value['delete_rule'], - 'onUpdate' => $value['update_rule'], - ); - } - $list[$value['constraint_name']]['local'][] = $value['column_name']; - $list[$value['constraint_name']]['foreign'][] = $value['referenced_column_name']; - } - - $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'], - 'onUpdate' => $constraint['onUpdate'], - ) - ); - } - - return $result; - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/OracleSchemaManager.php b/framework/library/Doctrine/DBAL/Schema/OracleSchemaManager.php deleted file mode 100644 index 2a880d9..0000000 --- a/framework/library/Doctrine/DBAL/Schema/OracleSchemaManager.php +++ /dev/null @@ -1,286 +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) { - if (strpos($dbType, "WITH TIME ZONE")) { - $dbType = "timestamptz"; - } else { - $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; - - $type = $this->_platform->getDoctrineTypeMapping($dbType); - $type = $this->extractDoctrineTypeFromComment($tableColumn['comments'], $type); - $tableColumn['comments'] = $this->removeDoctrineTypeFromComment($tableColumn['comments'], $type); - - switch ($dbType) { - case 'number': - if ($tableColumn['data_precision'] == 20 && $tableColumn['data_scale'] == 0) { - $precision = 20; - $scale = 0; - $type = 'bigint'; - } elseif ($tableColumn['data_precision'] == 5 && $tableColumn['data_scale'] == 0) { - $type = 'smallint'; - $precision = 5; - $scale = 0; - } elseif ($tableColumn['data_precision'] == 1 && $tableColumn['data_scale'] == 0) { - $precision = 1; - $scale = 0; - $type = 'boolean'; - } elseif ($tableColumn['data_scale'] > 0) { - $precision = $tableColumn['data_precision']; - $scale = $tableColumn['data_scale']; - $type = 'decimal'; - } - $length = null; - break; - case 'pls_integer': - case 'binary_integer': - $length = null; - break; - case 'varchar': - case 'varchar2': - case 'nvarchar2': - $length = $tableColumn['char_length']; - $fixed = false; - break; - case 'char': - case 'nchar': - $length = $tableColumn['char_length']; - $fixed = true; - break; - case 'date': - case 'timestamp': - $length = null; - break; - case 'float': - $precision = $tableColumn['data_precision']; - $scale = $tableColumn['data_scale']; - $length = null; - break; - case 'clob': - case 'nclob': - $length = null; - break; - case 'blob': - case 'raw': - case 'long raw': - case 'bfile': - $length = null; - break; - case 'rowid': - case 'urowid': - default: - $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, - 'comment' => (isset($tableColumn['comments'])) ? $tableColumn['comments'] : null, - 'platformDetails' => array(), - ); - - return new Column($tableColumn['column_name'], \Doctrine\DBAL\Types\Type::getType($type), $options); - } - - protected function _getPortableTableForeignKeysList($tableForeignKeys) - { - $list = array(); - foreach ($tableForeignKeys as $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); - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php b/framework/library/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php deleted file mode 100644 index c67e8cd..0000000 --- a/framework/library/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php +++ /dev/null @@ -1,365 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * PostgreSQL Schema Manager - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @author Konsta Vesterinen - * @author Lukas Smith (PEAR MDB2 library) - * @author Benjamin Eberlei - * @since 2.0 - */ -class PostgreSqlSchemaManager extends AbstractSchemaManager -{ - /** - * @var array - */ - private $existingSchemaPaths; - - /** - * Get all the existing schema names. - * - * @return array - */ - public function getSchemaNames() - { - $rows = $this->_conn->fetchAll("SELECT nspname as schema_name FROM pg_namespace WHERE nspname !~ '^pg_.*' and nspname != 'information_schema'"); - return array_map(function($v) { return $v['schema_name']; }, $rows); - } - - /** - * Return an array of schema search paths - * - * This is a PostgreSQL only function. - * - * @return array - */ - public function getSchemaSearchPaths() - { - $params = $this->_conn->getParams(); - $schema = explode(",", $this->_conn->fetchColumn('SHOW search_path')); - - if (isset($params['user'])) { - $schema = str_replace('"$user"', $params['user'], $schema); - } - - return array_map('trim', $schema); - } - - /** - * Get names of all existing schemas in the current users search path. - * - * This is a PostgreSQL only function. - * - * @return array - */ - public function getExistingSchemaSearchPaths() - { - if ($this->existingSchemaPaths === null) { - $this->determineExistingSchemaSearchPaths(); - } - return $this->existingSchemaPaths; - } - - /** - * Use this to set or reset the order of the existing schemas in the current search path of the user - * - * This is a PostgreSQL only function. - * - * @return void - */ - public function determineExistingSchemaSearchPaths() - { - $names = $this->getSchemaNames(); - $paths = $this->getSchemaSearchPaths(); - - $this->existingSchemaPaths = array_filter($paths, function ($v) use ($names) { - return in_array($v, $names); - }); - } - - protected function _getPortableTableForeignKeyDefinition($tableForeignKey) - { - $onUpdate = null; - $onDelete = null; - - if (preg_match('(ON UPDATE ([a-zA-Z0-9]+( (NULL|ACTION|DEFAULT))?))', $tableForeignKey['condef'], $match)) { - $onUpdate = $match[1]; - } - if (preg_match('(ON DELETE ([a-zA-Z0-9]+( (NULL|ACTION|DEFAULT))?))', $tableForeignKey['condef'], $match)) { - $onDelete = $match[1]; - } - - if (preg_match('/FOREIGN KEY \((.+)\) REFERENCES (.+)\((.+)\)/', $tableForeignKey['condef'], $values)) { - // PostgreSQL returns identifiers that are keywords with quotes, we need them later, don't get - // the idea to trim them here. - $localColumns = array_map('trim', explode(",", $values[1])); - $foreignColumns = array_map('trim', 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) - { - $schemas = $this->getExistingSchemaSearchPaths(); - $firstSchema = array_shift($schemas); - - if ($table['schema_name'] == $firstSchema) { - return $table['table_name']; - } else { - return $table['schema_name'] . "." . $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' => trim($colRow['attname']), - 'non_unique' => !$row['indisunique'], - 'primary' => $row['indisprimary'] - ); - } - } - } - } - return parent::_getPortableTableIndexesList($buffer, $tableName); - } - - protected function _getPortableDatabaseDefinition($database) - { - return $database['datname']; - } - - protected function _getPortableSequenceDefinition($sequence) - { - if ($sequence['schemaname'] != 'public') { - $sequenceName = $sequence['schemaname'] . "." . $sequence['relname']; - } else { - $sequenceName = $sequence['relname']; - } - - $data = $this->_conn->fetchAll('SELECT min_value, increment_by FROM ' . $sequenceName); - return new Sequence($sequenceName, $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(); - - $autoincrement = false; - if (preg_match("/^nextval\('(.*)'(::.*)?\)$/", $tableColumn['default'], $matches)) { - $tableColumn['sequence'] = $matches[1]; - $tableColumn['default'] = null; - $autoincrement = true; - } - - if (preg_match("/^'(.*)'::.*$/", $tableColumn['default'], $matches)) { - $tableColumn['default'] = $matches[1]; - } - - if (stripos($tableColumn['default'], 'NULL') === 0) { - $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; - } - $fixed = null; - - if (!isset($tableColumn['name'])) { - $tableColumn['name'] = ''; - } - - $precision = null; - $scale = null; - - $dbType = strtolower($tableColumn['type']); - if (strlen($tableColumn['domain_type']) && !$this->_platform->hasDoctrineTypeMappingFor($tableColumn['type'])) { - $dbType = strtolower($tableColumn['domain_type']); - $tableColumn['complete_type'] = $tableColumn['domain_complete_type']; - } - - $type = $this->_platform->getDoctrineTypeMapping($dbType); - $type = $this->extractDoctrineTypeFromComment($tableColumn['comment'], $type); - $tableColumn['comment'] = $this->removeDoctrineTypeFromComment($tableColumn['comment'], $type); - - switch ($dbType) { - case 'smallint': - case 'int2': - $length = null; - break; - case 'int': - case 'int4': - case 'integer': - $length = null; - break; - case 'bigint': - case 'int8': - $length = null; - break; - case 'bool': - case 'boolean': - $length = null; - break; - case 'text': - $fixed = false; - break; - case 'varchar': - case 'interval': - case '_varchar': - $fixed = false; - break; - case 'char': - case 'bpchar': - $fixed = true; - 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; - } - break; - case 'year': - $length = null; - break; - } - - if ($tableColumn['default'] && preg_match("('([^']+)'::)", $tableColumn['default'], $match)) { - $tableColumn['default'] = $match[1]; - } - - $options = array( - 'length' => $length, - 'notnull' => (bool) $tableColumn['isnotnull'], - 'default' => $tableColumn['default'], - 'primary' => (bool) ($tableColumn['pri'] == 't'), - 'precision' => $precision, - 'scale' => $scale, - 'fixed' => $fixed, - 'unsigned' => false, - 'autoincrement' => $autoincrement, - 'comment' => $tableColumn['comment'], - ); - - return new Column($tableColumn['field'], \Doctrine\DBAL\Types\Type::getType($type), $options); - } - -} diff --git a/framework/library/Doctrine/DBAL/Schema/SQLServerSchemaManager.php b/framework/library/Doctrine/DBAL/Schema/SQLServerSchemaManager.php deleted file mode 100644 index 3075fc9..0000000 --- a/framework/library/Doctrine/DBAL/Schema/SQLServerSchemaManager.php +++ /dev/null @@ -1,265 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Events; -use Doctrine\DBAL\Event\SchemaIndexDefinitionEventArgs; -use Doctrine\DBAL\Driver\SQLSrv\SQLSrvException; - -/** - * SQL Server Schema Manager - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @author Konsta Vesterinen - * @author Lukas Smith (PEAR MDB2 library) - * @author Juozas Kaziukenas - * @since 2.0 - */ -class SQLServerSchemaManager extends AbstractSchemaManager -{ - /** - * @override - */ - protected function _getPortableTableColumnDefinition($tableColumn) - { - $dbType = strtolower($tableColumn['TYPE_NAME']); - - $autoincrement = false; - if (stripos($dbType, 'identity')) { - $dbType = trim(str_ireplace('identity', '', $dbType)); - $autoincrement = true; - } - - $dbType = strtok($dbType, '(), '); - - $type = array(); - $unsigned = $fixed = null; - - if (!isset($tableColumn['name'])) { - $tableColumn['name'] = ''; - } - - $default = $tableColumn['COLUMN_DEF']; - - while ($default != ($default2 = preg_replace("/^\((.*)\)$/", '$1', $default))) { - $default = trim($default2, "'"); - } - - $length = (int) $tableColumn['LENGTH']; - - $type = $this->_platform->getDoctrineTypeMapping($dbType); - switch ($type) { - case 'char': - if ($tableColumn['LENGTH'] == '1') { - $type = 'boolean'; - if (preg_match('/^(is|has)/', $tableColumn['name'])) { - $type = array_reverse($type); - } - } - $fixed = true; - break; - case 'text': - $fixed = false; - break; - } - switch ($dbType) { - case 'nchar': - case 'nvarchar': - case 'ntext': - // Unicode data requires 2 bytes per character - $length = $length / 2; - break; - } - - $options = array( - 'length' => ($length == 0 || !in_array($type, array('text', 'string'))) ? null : $length, - 'unsigned' => (bool) $unsigned, - 'fixed' => (bool) $fixed, - 'default' => $default !== 'NULL' ? $default : null, - 'notnull' => (bool) ($tableColumn['IS_NULLABLE'] != 'YES'), - 'scale' => $tableColumn['SCALE'], - 'precision' => $tableColumn['PRECISION'], - 'autoincrement' => $autoincrement, - ); - - return new Column($tableColumn['COLUMN_NAME'], \Doctrine\DBAL\Types\Type::getType($type), $options); - } - - /** - * @override - */ - protected function _getPortableTableIndexesList($tableIndexRows, $tableName=null) - { - // TODO: Remove code duplication with AbstractSchemaManager; - $result = array(); - foreach ($tableIndexRows as $tableIndex) { - $indexName = $keyName = $tableIndex['index_name']; - if (strpos($tableIndex['index_description'], 'primary key') !== false) { - $keyName = 'primary'; - } - $keyName = strtolower($keyName); - - $flags = array(); - if (strpos($tableIndex['index_description'], 'clustered') !== false) { - $flags[] = 'clustered'; - } else if (strpos($tableIndex['index_description'], 'nonclustered') !== false) { - $flags[] = 'nonclustered'; - } - - $result[$keyName] = array( - 'name' => $indexName, - 'columns' => explode(', ', $tableIndex['index_keys']), - 'unique' => strpos($tableIndex['index_description'], 'unique') !== false, - 'primary' => strpos($tableIndex['index_description'], 'primary key') !== false, - 'flags' => $flags, - ); - } - - $eventManager = $this->_platform->getEventManager(); - - $indexes = array(); - foreach ($result as $indexKey => $data) { - $index = null; - $defaultPrevented = false; - - if (null !== $eventManager && $eventManager->hasListeners(Events::onSchemaIndexDefinition)) { - $eventArgs = new SchemaIndexDefinitionEventArgs($data, $tableName, $this->_conn); - $eventManager->dispatchEvent(Events::onSchemaIndexDefinition, $eventArgs); - - $defaultPrevented = $eventArgs->isDefaultPrevented(); - $index = $eventArgs->getIndex(); - } - - if ( ! $defaultPrevented) { - $index = new Index($data['name'], $data['columns'], $data['unique'], $data['primary']); - } - - if ($index) { - $indexes[$indexKey] = $index; - } - } - - return $indexes; - } - - /** - * @override - */ - public function _getPortableTableForeignKeyDefinition($tableForeignKey) - { - return new ForeignKeyConstraint( - (array) $tableForeignKey['ColumnName'], - $tableForeignKey['ReferenceTableName'], - (array) $tableForeignKey['ReferenceColumnName'], - $tableForeignKey['ForeignKey'], - array( - 'onUpdate' => str_replace('_', ' ', $tableForeignKey['update_referential_action_desc']), - 'onDelete' => str_replace('_', ' ', $tableForeignKey['delete_referential_action_desc']), - ) - ); - } - - /** - * @override - */ - protected function _getPortableTableDefinition($table) - { - return $table['name']; - } - - /** - * @override - */ - protected function _getPortableDatabaseDefinition($database) - { - return $database['name']; - } - - /** - * @override - */ - protected function _getPortableViewDefinition($view) - { - // @todo - return new View($view['name'], null); - } - - /** - * 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, $this->_conn->getDatabase()); - - try { - $tableIndexes = $this->_conn->fetchAll($sql); - } catch(\PDOException $e) { - if ($e->getCode() == "IMSSP") { - return array(); - } else { - throw $e; - } - } catch(SQLSrvException $e) { - if (strpos($e->getMessage(), 'SQLSTATE [01000, 15472]') === 0) { - return array(); - } else { - throw $e; - } - } - - return $this->_getPortableTableIndexesList($tableIndexes, $table); - } - - /** - * @override - */ - public function alterTable(TableDiff $tableDiff) - { - if(count($tableDiff->removedColumns) > 0) { - foreach($tableDiff->removedColumns as $col){ - $columnConstraintSql = $this->getColumnConstraintSQL($tableDiff->name, $col->getName()); - foreach ($this->_conn->fetchAll($columnConstraintSql) as $constraint) { - $this->_conn->exec("ALTER TABLE $tableDiff->name DROP CONSTRAINT " . $constraint['Name']); - } - } - } - - return parent::alterTable($tableDiff); - } - - /** - * This function retrieves the constraints for a given column. - */ - private function getColumnConstraintSQL($table, $column) - { - return "SELECT SysObjects.[Name] - FROM SysObjects INNER JOIN (SELECT [Name],[ID] FROM SysObjects WHERE XType = 'U') AS Tab - ON Tab.[ID] = Sysobjects.[Parent_Obj] - INNER JOIN sys.default_constraints DefCons ON DefCons.[object_id] = Sysobjects.[ID] - INNER JOIN SysColumns Col ON Col.[ColID] = DefCons.[parent_column_id] AND Col.[ID] = Tab.[ID] - WHERE Col.[Name] = " . $this->_conn->quote($column) ." AND Tab.[Name] = " . $this->_conn->quote($table) . " - ORDER BY Col.[Name]"; - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/Schema.php b/framework/library/Doctrine/DBAL/Schema/Schema.php deleted file mode 100644 index 5a6ff75..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Schema.php +++ /dev/null @@ -1,373 +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 - * - * Different vendors have very inconsistent naming with regard to the concept - * of a "schema". Doctrine understands a schema as the entity that conceptually - * wraps a set of database objects such as tables, sequences, indexes and - * foreign keys that belong to each other into a namespace. A Doctrine Schema - * has nothing to do with the "SCHEMA" defined as in PostgreSQL, it is more - * related to the concept of "DATABASE" that exists in MySQL and PostgreSQL. - * - * Every asset in the doctrine schema has a name. A name consists of either a - * namespace.local name pair or just a local unqualified name. - * - * The abstraction layer that covers a PostgreSQL schema is the namespace of an - * database object (asset). A schema can have a name, which will be used as - * default namespace for the unqualified database objects that are created in - * the schema. - * - * In the case of MySQL where cross-database queries are allowed this leads to - * databases being "misinterpreted" as namespaces. This is intentional, however - * the CREATE/DROP SQL visitors will just filter this queries and do not - * execute them. Only the queries for the currently connected database are - * executed. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @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; - $this->_setName($schemaConfig->getName() ?: 'public'); - - 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 = $table->getFullQualifiedName($this->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 = $sequence->getFullQualifiedName($this->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 = $this->getFullQualifiedAssetName($tableName); - if (!isset($this->_tables[$tableName])) { - throw SchemaException::tableDoesNotExist($tableName); - } - - return $this->_tables[$tableName]; - } - - /** - * @return string - */ - private function getFullQualifiedAssetName($name) - { - if ($this->isIdentifierQuoted($name)) { - $name = $this->trimQuotes($name); - } - if (strpos($name, ".") === false) { - $name = $this->getName() . "." . $name; - } - return strtolower($name); - } - - /** - * Does this schema have a table with the given name? - * - * @param string $tableName - * @return Schema - */ - public function hasTable($tableName) - { - $tableName = $this->getFullQualifiedAssetName($tableName); - return isset($this->_tables[$tableName]); - } - - /** - * Get all table names, prefixed with a schema name, even the default one - * if present. - * - * @return array - */ - public function getTableNames() - { - return array_keys($this->_tables); - } - - public function hasSequence($sequenceName) - { - $sequenceName = $this->getFullQualifiedAssetName($sequenceName); - return isset($this->_sequences[$sequenceName]); - } - - /** - * @throws SchemaException - * @param string $sequenceName - * @return \Doctrine\DBAL\Schema\Sequence - */ - public function getSequence($sequenceName) - { - $sequenceName = $this->getFullQualifiedAssetName($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); - - foreach ($this->_schemaConfig->getDefaultTableOptions() as $name => $value) { - $table->addOption($name, $value); - } - - 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 = $this->getFullQualifiedAssetName($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 = $this->getFullQualifiedAssetName($sequenceName); - unset($this->_sequences[$sequenceName]); - return $this; - } - - /** - * Return an array of necessary sql queries to create the schema on the given platform. - * - * @param \Doctrine\DBAL\Platforms\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 \Doctrine\DBAL\Platforms\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 \Doctrine\DBAL\Platforms\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 \Doctrine\DBAL\Platforms\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/framework/library/Doctrine/DBAL/Schema/SchemaConfig.php b/framework/library/Doctrine/DBAL/Schema/SchemaConfig.php deleted file mode 100644 index d90da20..0000000 --- a/framework/library/Doctrine/DBAL/Schema/SchemaConfig.php +++ /dev/null @@ -1,119 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * Configuration for a Schema - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - */ -class SchemaConfig -{ - /** - * @var bool - */ - protected $hasExplicitForeignKeyIndexes = false; - - /** - * @var int - */ - protected $maxIdentifierLength = 63; - - /** - * @var string - */ - protected $name; - - /** - * @var array - */ - protected $defaultTableOptions = array(); - - /** - * @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; - } - - /** - * Get default namespace of schema objects. - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * set default namespace name of schema objects. - * - * @param string $name the value to set. - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Get the default options that are passed to Table instances created with - * Schema#createTable(). - * - * @return array - */ - public function getDefaultTableOptions() - { - return $this->defaultTableOptions; - } - - public function setDefaultTableOptions(array $defaultTableOptions) - { - $this->defaultTableOptions = $defaultTableOptions; - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/SchemaDiff.php b/framework/library/Doctrine/DBAL/Schema/SchemaDiff.php deleted file mode 100644 index ba0d9e6..0000000 --- a/framework/library/Doctrine/DBAL/Schema/SchemaDiff.php +++ /dev/null @@ -1,176 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use \Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Schema Diff - * - * - * @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->getAlterSequenceSQL($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) - ); - - if ($platform->supportsForeignKeyConstraints()) { - 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/framework/library/Doctrine/DBAL/Schema/SchemaException.php b/framework/library/Doctrine/DBAL/Schema/SchemaException.php deleted file mode 100644 index a8cb93d..0000000 --- a/framework/library/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/framework/library/Doctrine/DBAL/Schema/Sequence.php b/framework/library/Doctrine/DBAL/Schema/Sequence.php deleted file mode 100644 index 87ff0fa..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Sequence.php +++ /dev/null @@ -1,120 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -use Doctrine\DBAL\Schema\Visitor\Visitor; - -/** - * Sequence Structure - * - * - * @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; - } - - public function setAllocationSize($allocationSize) - { - $this->_allocationSize = (is_numeric($allocationSize))?$allocationSize:1; - } - - public function setInitialValue($initialValue) - { - $this->_initialValue = (is_numeric($initialValue))?$initialValue:1; - } - - /** - * Check if this sequence is an autoincrement sequence for a given table. - * - * This is used inside the comparator to not report sequences as missing, - * when the "from" schema implicitly creates the sequences. - * - * @param Table $table - * - * @return bool - */ - public function isAutoIncrementsFor(Table $table) - { - if ( ! $table->hasPrimaryKey()) { - return false; - } - - $pkColumns = $table->getPrimaryKey()->getColumns(); - - if (count($pkColumns) != 1) { - return false; - } - - $column = $table->getColumn($pkColumns[0]); - - if ( ! $column->getAutoincrement()) { - return false; - } - - $sequenceName = $this->getShortestName($table->getNamespaceName()); - $tableName = $table->getShortestName($table->getNamespaceName()); - $tableSequenceName = sprintf('%s_%s_seq', $tableName, $pkColumns[0]); - - return $tableSequenceName === $sequenceName; - } - - /** - * @param Visitor $visitor - */ - public function visit(Visitor $visitor) - { - $visitor->acceptSequence($this); - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/SqliteSchemaManager.php b/framework/library/Doctrine/DBAL/Schema/SqliteSchemaManager.php deleted file mode 100644 index f980f95..0000000 --- a/framework/library/Doctrine/DBAL/Schema/SqliteSchemaManager.php +++ /dev/null @@ -1,193 +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) { - // Ignore indexes with reserved names, e.g. autoindexes - if (strpos($tableIndex['name'], 'sqlite_') !== 0) { - $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 = $this->_platform->getDoctrineTypeMapping($dbType); - $default = $tableColumn['dflt_value']; - if ($default == 'NULL') { - $default = null; - } - if ($default !== null) { - // SQLite returns strings wrapped in single quotes, so we need to strip them - $default = preg_replace("/^'(.*)'$/", '\1', $default); - } - $notnull = (bool) $tableColumn['notnull']; - - if ( ! isset($tableColumn['name'])) { - $tableColumn['name'] = ''; - } - - $precision = null; - $scale = null; - - switch ($dbType) { - case 'char': - $fixed = true; - break; - case 'float': - case 'double': - case 'real': - case 'decimal': - case 'numeric': - if (isset($tableColumn['length'])) { - if (strpos($tableColumn['length'], ',') === false) { - $tableColumn['length'] .= ",0"; - } - list($precision, $scale) = array_map('trim', explode(',', $tableColumn['length'])); - } - $length = null; - break; - } - - $options = array( - 'length' => $length, - 'unsigned' => (bool) $unsigned, - 'fixed' => $fixed, - 'notnull' => $notnull, - 'default' => $default, - 'precision' => $precision, - 'scale' => $scale, - 'autoincrement' => false, - ); - - return new Column($tableColumn['name'], \Doctrine\DBAL\Types\Type::getType($type), $options); - } - - protected function _getPortableViewDefinition($view) - { - return new View($view['name'], $view['sql']); - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/Synchronizer/AbstractSchemaSynchronizer.php b/framework/library/Doctrine/DBAL/Schema/Synchronizer/AbstractSchemaSynchronizer.php deleted file mode 100644 index 16fb033..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Synchronizer/AbstractSchemaSynchronizer.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema\Synchronizer; - -use Doctrine\DBAL\Connection; - -/** - * Abstract schema synchronizer with methods for executing batches of SQL. - */ -abstract class AbstractSchemaSynchronizer implements SchemaSynchronizer -{ - /** - * @var Connection - */ - protected $conn; - - public function __construct(Connection $conn) - { - $this->conn = $conn; - } - - protected function processSqlSafely(array $sql) - { - foreach ($sql as $s) { - try { - $this->conn->exec($s); - } catch(\Exception $e) { - - } - } - } - - protected function processSql(array $sql) - { - foreach ($sql as $s) { - $this->conn->exec($s); - } - } - -} - diff --git a/framework/library/Doctrine/DBAL/Schema/Synchronizer/SchemaSynchronizer.php b/framework/library/Doctrine/DBAL/Schema/Synchronizer/SchemaSynchronizer.php deleted file mode 100644 index c249815..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Synchronizer/SchemaSynchronizer.php +++ /dev/null @@ -1,96 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema\Synchronizer; - -use Doctrine\DBAL\Schema\Schema; - -/** - * The synchronizer knows how to synchronize a schema with the configured - * database. - * - * @author Benjamin Eberlei - */ -interface SchemaSynchronizer -{ - /** - * Get the SQL statements that can be executed to create the schema. - * - * @param Schema $createSchema - * @return array - */ - function getCreateSchema(Schema $createSchema); - - /** - * Get the SQL Statements to update given schema with the underlying db. - * - * @param Schema $toSchema - * @param bool $noDrops - * @return array - */ - function getUpdateSchema(Schema $toSchema, $noDrops = false); - - /** - * Get the SQL Statements to drop the given schema from underlying db. - * - * @param Schema $dropSchema - * @return array - */ - function getDropSchema(Schema $dropSchema); - - /** - * Get the SQL statements to drop all schema assets from underlying db. - * - * @return array - */ - function getDropAllSchema(); - - /** - * Create the Schema - * - * @param Schema $createSchema - * @return void - */ - function createSchema(Schema $createSchema); - - /** - * Update the Schema to new schema version. - * - * @param Schema $toSchema - * @param bool $noDrops - * @return void - */ - function updateSchema(Schema $toSchema, $noDrops = false); - - /** - * Drop the given database schema from the underlying db. - * - * @param Schema $dropSchema - * @return void - */ - function dropSchema(Schema $dropSchema); - - /** - * Drop all assets from the underyling db. - * - * @return void - */ - function dropAllSchema(); -} - diff --git a/framework/library/Doctrine/DBAL/Schema/Synchronizer/SingleDatabaseSynchronizer.php b/framework/library/Doctrine/DBAL/Schema/Synchronizer/SingleDatabaseSynchronizer.php deleted file mode 100644 index 38ea53a..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Synchronizer/SingleDatabaseSynchronizer.php +++ /dev/null @@ -1,197 +0,0 @@ -. - */ -namespace Doctrine\DBAL\Schema\Synchronizer; - -use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Schema\Schema; -use Doctrine\DBAL\Schema\Comparator; -use Doctrine\DBAL\Schema\Visitor\DropSchemaSqlCollector; - -/** - * Schema Synchronizer for Default DBAL Connection - * - * @author Benjamin Eberlei - */ -class SingleDatabaseSynchronizer extends AbstractSchemaSynchronizer -{ - /** - * @var Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $platform; - - public function __construct(Connection $conn) - { - parent::__construct($conn); - $this->platform = $conn->getDatabasePlatform(); - } - - /** - * Get the SQL statements that can be executed to create the schema. - * - * @param Schema $createSchema - * @return array - */ - public function getCreateSchema(Schema $createSchema) - { - return $createSchema->toSql($this->platform); - } - - /** - * Get the SQL Statements to update given schema with the underlying db. - * - * @param Schema $toSchema - * @param bool $noDrops - * @return array - */ - public function getUpdateSchema(Schema $toSchema, $noDrops = false) - { - $comparator = new Comparator(); - $sm = $this->conn->getSchemaManager(); - - $fromSchema = $sm->createSchema(); - $schemaDiff = $comparator->compare($fromSchema, $toSchema); - - if ($noDrops) { - return $schemaDiff->toSaveSql($this->platform); - } - - return $schemaDiff->toSql($this->platform); - } - - /** - * Get the SQL Statements to drop the given schema from underlying db. - * - * @param Schema $dropSchema - * @return array - */ - public function getDropSchema(Schema $dropSchema) - { - $visitor = new DropSchemaSqlCollector($this->platform); - $sm = $this->conn->getSchemaManager(); - - $fullSchema = $sm->createSchema(); - - foreach ($fullSchema->getTables() as $table) { - if ( $dropSchema->hasTable($table->getName())) { - $visitor->acceptTable($table); - } - - foreach ($table->getForeignKeys() as $foreignKey) { - if ( ! $dropSchema->hasTable($table->getName())) { - continue; - } - - if ( ! $dropSchema->hasTable($foreignKey->getForeignTableName())) { - continue; - } - - $visitor->acceptForeignKey($table, $foreignKey); - } - } - - if ( ! $this->platform->supportsSequences()) { - return $visitor->getQueries(); - } - - foreach ($dropSchema->getSequences() as $sequence) { - $visitor->acceptSequence($sequence); - } - - foreach ($dropSchema->getTables() as $table) { - /* @var $sequence Table */ - if ( ! $table->hasPrimaryKey()) { - continue; - } - - $columns = $table->getPrimaryKey()->getColumns(); - if (count($columns) > 1) { - continue; - } - - $checkSequence = $table->getName() . "_" . $columns[0] . "_seq"; - if ($fullSchema->hasSequence($checkSequence)) { - $visitor->acceptSequence($fullSchema->getSequence($checkSequence)); - } - } - - return $visitor->getQueries(); - } - - /** - * Get the SQL statements to drop all schema assets from underlying db. - * - * @return array - */ - public function getDropAllSchema() - { - $sm = $this->conn->getSchemaManager(); - $visitor = new DropSchemaSqlCollector($this->platform); - - /* @var $schema \Doctrine\DBAL\Schema\Schema */ - $schema = $sm->createSchema(); - $schema->visit($visitor); - - return $visitor->getQueries(); - } - - /** - * Create the Schema - * - * @param Schema $createSchema - * @return void - */ - public function createSchema(Schema $createSchema) - { - $this->processSql($this->getCreateSchema($createSchema)); - } - - /** - * Update the Schema to new schema version. - * - * @param Schema $toSchema - * @param bool $noDrops - * @return void - */ - public function updateSchema(Schema $toSchema, $noDrops = false) - { - $this->processSql($this->getUpdateSchema($toSchema, $noDrops)); - } - - /** - * Drop the given database schema from the underlying db. - * - * @param Schema $dropSchema - * @return void - */ - public function dropSchema(Schema $dropSchema) - { - $this->processSqlSafely($this->getDropSchema($dropSchema)); - } - - /** - * Drop all assets from the underyling db. - * - * @return void - */ - public function dropAllSchema() - { - $this->processSql($this->getDropAllSchema()); - } -} - diff --git a/framework/library/Doctrine/DBAL/Schema/Table.php b/framework/library/Doctrine/DBAL/Schema/Table.php deleted file mode 100644 index d0763c5..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Table.php +++ /dev/null @@ -1,678 +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 - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - */ -class Table extends AbstractAsset -{ - /** - * @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 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 = 0, 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 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); - } - - /** - * Drop an index from this table. - * - * @param string $indexName - * @return void - */ - public function dropPrimaryKey() - { - $this->dropIndex($this->_primaryKeyName); - $this->_primaryKeyName = false; - } - - /** - * Drop an index from this table. - * - * @param string $indexName - * @return void - */ - public function dropIndex($indexName) - { - $indexName = strtolower($indexName); - if ( ! $this->hasIndex($indexName)) { - throw SchemaException::indexDoesNotExist($indexName, $this->_name); - } - unset($this->_indexes[$indexName]); - } - - /** - * - * @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) { - /* @var $index Index */ - if ($index->spansColumns($columnsNames)) { - 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->_name); - } - } - $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) - { - throw new DBALException("Table#renameColumn() was removed, because it drops and recreates " . - "the column instead. There is no fix available, because a schema diff cannot reliably detect if a " . - "column was renamed or one column was created and another one dropped."); - } - - /** - * 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 - * @param string $constraintName - * @return Table - */ - public function addForeignKeyConstraint($foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array(), $constraintName = null) - { - $constraintName = $constraintName ?: $this->_generateIdentifierName(array_merge((array)$this->getName(), $localColumnNames), "fk", $this->_getMaxIdentifierLength()); - return $this->addNamedForeignKeyConstraint($constraintName, $foreignTable, $localColumnNames, $foreignColumnNames, $options); - } - - /** - * Add a foreign key constraint - * - * Name is to be generated by the database itsself. - * - * @deprecated Use {@link addForeignKeyConstraint} - * @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->addForeignKeyConstraint($foreignTable, $localColumnNames, $foreignColumnNames, $options); - } - - /** - * Add a foreign key constraint with a given name - * - * @deprecated Use {@link addForeignKeyConstraint} - * @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, $foreignTable->getName()); - } - } - } else { - $foreignTableName = $foreignTable; - } - - foreach ($localColumnNames as $columnName) { - if ( ! $this->hasColumn($columnName)) { - throw SchemaException::columnDoesNotExist($columnName, $this->_name); - } - } - - $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 $indexCandidate - * @return Table - */ - protected function _addIndex(Index $indexCandidate) - { - // check for duplicates - foreach ($this->_indexes as $existingIndex) { - if ($indexCandidate->isFullfilledBy($existingIndex)) { - return $this; - } - } - - $indexName = $indexCandidate->getName(); - $indexName = strtolower($indexName); - - if (isset($this->_indexes[$indexName]) || ($this->_primaryKeyName != false && $indexCandidate->isPrimary())) { - throw SchemaException::indexAlreadyExists($indexName, $this->_name); - } - - // remove overruled indexes - foreach ($this->_indexes as $idxKey => $existingIndex) { - if ($indexCandidate->overrules($existingIndex)) { - unset($this->_indexes[$idxKey]); - } - } - - if ($indexCandidate->isPrimary()) { - $this->_primaryKeyName = $indexName; - } - - $this->_indexes[$indexName] = $indexCandidate; - 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; - // add an explicit index on the foreign key columns. If there is already an index that fullfils this requirements drop the request. - // In the case of __construct calling this method during hydration from schema-details all the explicitly added indexes - // lead to duplicates. This creates compuation overhead in this case, however no duplicate indexes are ever added (based on columns). - $this->addIndex($constraint->getColumns()); - } - - /** - * 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, $this->_name); - } - - return $this->_fkConstraints[$constraintName]; - } - - public function removeForeignKey($constraintName) - { - $constraintName = strtolower($constraintName); - if(!$this->hasForeignKey($constraintName)) { - throw SchemaException::foreignKeyDoesNotExist($constraintName, $this->_name); - } - - unset($this->_fkConstraints[$constraintName]); - } - - /** - * @return Column[] - */ - public function getColumns() - { - $columns = $this->_columns; - - $pkCols = array(); - $fkCols = array(); - - if ($this->hasPrimaryKey()) { - $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 = $this->trimQuotes(strtolower($columnName)); - return isset($this->_columns[$columnName]); - } - - /** - * Get a column instance - * - * @param string $columnName - * @return Column - */ - public function getColumn($columnName) - { - $columnName = strtolower($this->trimQuotes($columnName)); - if ( ! $this->hasColumn($columnName)) { - throw SchemaException::columnDoesNotExist($columnName, $this->_name); - } - - return $this->_columns[$columnName]; - } - - /** - * @return Index|null - */ - public function getPrimaryKey() - { - if ( ! $this->hasPrimaryKey()) { - return null; - } - return $this->getIndex($this->_primaryKeyName); - } - - public function getPrimaryKeyColumns() - { - if ( ! $this->hasPrimaryKey()) { - throw new DBALException("Table " . $this->getName() . " has no primary key."); - } - return $this->getPrimaryKey()->getColumns(); - } - - /** - * Check if this table has a primary key. - * - * @return bool - */ - public function hasPrimaryKey() - { - return ($this->_primaryKeyName && $this->hasIndex($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, $this->_name); - } - 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); - } - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/TableDiff.php b/framework/library/Doctrine/DBAL/Schema/TableDiff.php deleted file mode 100644 index 257a3bd..0000000 --- a/framework/library/Doctrine/DBAL/Schema/TableDiff.php +++ /dev/null @@ -1,136 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Schema; - -/** - * Table Diff - * - * - * @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 - * @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=>Column) - */ - 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; - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/View.php b/framework/library/Doctrine/DBAL/Schema/View.php deleted file mode 100644 index 8283d07..0000000 --- a/framework/library/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; - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/Visitor/CreateSchemaSqlCollector.php b/framework/library/Doctrine/DBAL/Schema/Visitor/CreateSchemaSqlCollector.php deleted file mode 100644 index 51228c1..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Visitor/CreateSchemaSqlCollector.php +++ /dev/null @@ -1,178 +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) - { - $namespace = $this->getNamespace($table); - - $this->_createTableQueries[$namespace] = array_merge( - $this->_createTableQueries[$namespace], - $this->_platform->getCreateTableSQL($table) - ); - } - - public function acceptColumn(Table $table, Column $column) - { - - } - - /** - * @param Table $localTable - * @param ForeignKeyConstraint $fkConstraint - */ - public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) - { - $namespace = $this->getNamespace($localTable); - - if ($this->_platform->supportsForeignKeyConstraints()) { - $this->_createFkConstraintQueries[$namespace] = array_merge( - $this->_createFkConstraintQueries[$namespace], - (array) $this->_platform->getCreateForeignKeySQL( - $fkConstraint, $localTable - ) - ); - } - } - - /** - * @param Table $table - * @param Index $index - */ - public function acceptIndex(Table $table, Index $index) - { - - } - - /** - * @param Sequence $sequence - */ - public function acceptSequence(Sequence $sequence) - { - $namespace = $this->getNamespace($sequence); - - $this->_createSequenceQueries[$namespace] = array_merge( - $this->_createSequenceQueries[$namespace], - (array)$this->_platform->getCreateSequenceSQL($sequence) - ); - } - - private function getNamespace($asset) - { - $namespace = $asset->getNamespaceName() ?: 'default'; - if ( !isset($this->_createTableQueries[$namespace])) { - $this->_createTableQueries[$namespace] = array(); - $this->_createSequenceQueries[$namespace] = array(); - $this->_createFkConstraintQueries[$namespace] = array(); - } - - return $namespace; - } - - /** - * @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() - { - $sql = array(); - foreach (array_keys($this->_createTableQueries) as $namespace) { - if ($this->_platform->supportsSchemas()) { - // TODO: Create Schema here - } - } - foreach ($this->_createTableQueries as $schemaSql) { - $sql = array_merge($sql, $schemaSql); - } - foreach ($this->_createSequenceQueries as $schemaSql) { - $sql = array_merge($sql, $schemaSql); - } - foreach ($this->_createFkConstraintQueries as $schemaSql) { - $sql = array_merge($sql, $schemaSql); - } - return $sql; - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/Visitor/DropSchemaSqlCollector.php b/framework/library/Doctrine/DBAL/Schema/Visitor/DropSchemaSqlCollector.php deleted file mode 100644 index 3d74cb9..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Visitor/DropSchemaSqlCollector.php +++ /dev/null @@ -1,160 +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\SchemaException, - Doctrine\DBAL\Schema\Index; - -/** - * Gather SQL statements that allow to completly drop the current schema. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - */ -class DropSchemaSqlCollector implements Visitor -{ - /** - * @var \SplObjectStorage - */ - private $constraints; - - /** - * @var \SplObjectStorage - */ - private $sequences; - - /** - * @var \SplObjectStorage - */ - private $tables; - - /** - * - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $platform; - - /** - * @param AbstractPlatform $platform - */ - public function __construct(AbstractPlatform $platform) - { - $this->platform = $platform; - $this->clearQueries(); - } - - /** - * @param Schema $schema - */ - public function acceptSchema(Schema $schema) - { - - } - - /** - * @param Table $table - */ - public function acceptTable(Table $table) - { - $this->tables->attach($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 (strlen($fkConstraint->getName()) == 0) { - throw SchemaException::namedForeignKeyRequired($localTable, $fkConstraint); - } - - $this->constraints->attach($fkConstraint); - $this->constraints[$fkConstraint] = $localTable; - } - - /** - * @param Table $table - * @param Index $index - */ - public function acceptIndex(Table $table, Index $index) - { - - } - - /** - * @param Sequence $sequence - */ - public function acceptSequence(Sequence $sequence) - { - $this->sequences->attach($sequence); - } - - /** - * @return void - */ - public function clearQueries() - { - $this->constraints = new \SplObjectStorage(); - $this->sequences = new \SplObjectStorage(); - $this->tables = new \SplObjectStorage(); - } - - /** - * @return array - */ - public function getQueries() - { - $sql = array(); - foreach ($this->constraints as $fkConstraint) { - $localTable = $this->constraints[$fkConstraint]; - $sql[] = $this->platform->getDropForeignKeySQL($fkConstraint, $localTable); - } - - foreach ($this->sequences as $sequence) { - $sql[] = $this->platform->getDropSequenceSQL($sequence); - } - - foreach ($this->tables as $table) { - $sql[] = $this->platform->getDropTableSQL($table); - } - - return $sql; - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/Visitor/Graphviz.php b/framework/library/Doctrine/DBAL/Schema/Visitor/Graphviz.php deleted file mode 100644 index 8ae69a2..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Visitor/Graphviz.php +++ /dev/null @@ -1,151 +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 Graphviz implements \Doctrine\DBAL\Schema\Visitor\Visitor -{ - private $output = ''; - - public function acceptColumn(Table $table, Column $column) - { - - } - - public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) - { - $this->output .= $this->createNodeRelation( - $fkConstraint->getLocalTableName() . ":col" . current($fkConstraint->getLocalColumns()).":se", - $fkConstraint->getForeignTableName() . ":col" . current($fkConstraint->getForeignColumns()).":se", - array( - 'dir' => 'back', - 'arrowtail' => 'dot', - 'arrowhead' => 'normal', - ) - ); - } - - public function acceptIndex(Table $table, Index $index) - { - - } - - public function acceptSchema(Schema $schema) - { - $this->output = 'digraph "' . sha1( mt_rand() ) . '" {' . "\n"; - $this->output .= 'splines = true;' . "\n"; - $this->output .= 'overlap = false;' . "\n"; - $this->output .= 'outputorder=edgesfirst;'."\n"; - $this->output .= 'mindist = 0.6;' . "\n"; - $this->output .= 'sep = .2;' . "\n"; - } - - public function acceptSequence(Sequence $sequence) - { - - } - - public function acceptTable(Table $table) - { - $this->output .= $this->createNode( - $table->getName(), - array( - 'label' => $this->createTableLabel( $table ), - 'shape' => 'plaintext', - ) - ); - } - - private function createTableLabel( Table $table ) - { - // Start the table - $label = '<'; - - // The title - $label .= ''; - - // The attributes block - foreach( $table->getColumns() as $column ) { - $columnLabel = $column->getName(); - - $label .= ''; - $label .= ''; - $label .= ''; - } - - // End the table - $label .= '
' . $table->getName() . '
'; - $label .= '' . $columnLabel . ''; - $label .= '' . strtolower($column->getType()) . ''; - if ($table->hasPrimaryKey() && in_array($column->getName(), $table->getPrimaryKey()->getColumns())) { - $label .= "\xe2\x9c\xb7"; - } - $label .= '
>'; - - return $label; - } - - private function createNode( $name, $options ) - { - $node = $name . " ["; - foreach( $options as $key => $value ) - { - $node .= $key . '=' . $value . ' '; - } - $node .= "]\n"; - return $node; - } - - private function createNodeRelation( $node1, $node2, $options ) - { - $relation = $node1 . ' -> ' . $node2 . ' ['; - foreach( $options as $key => $value ) - { - $relation .= $key . '=' . $value . ' '; - } - $relation .= "]\n"; - return $relation; - } - - /** - * Write dot language output to a file. This should usually be a *.dot file. - * - * You have to convert the output into a viewable format. For example use "neato" on linux systems - * and execute: - * - * neato -Tpng -o er.png er.dot - * - * @param string $filename - * @return void - */ - public function write($filename) - { - file_put_contents($filename, $this->output . "}"); - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/Visitor/RemoveNamespacedAssets.php b/framework/library/Doctrine/DBAL/Schema/Visitor/RemoveNamespacedAssets.php deleted file mode 100644 index 348b2b7..0000000 --- a/framework/library/Doctrine/DBAL/Schema/Visitor/RemoveNamespacedAssets.php +++ /dev/null @@ -1,113 +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; - -/** - * Remove assets from a schema that are not in the default namespace. - * - * Some databases such as MySQL support cross databases joins, but don't - * allow to call DDLs to a database from another connected database. - * Before a schema is serialized into SQL this visitor can cleanup schemas with - * non default namespaces. - * - * This visitor filters all these non-default namespaced tables and sequences - * and removes them from the SChema instance. - * - * @author Benjamin Eberlei - * @since 2.2 - */ -class RemoveNamespacedAssets implements Visitor -{ - /** - * @var Schema - */ - private $schema; - - /** - * @param Schema $schema - */ - public function acceptSchema(Schema $schema) - { - $this->schema = $schema; - } - - /** - * @param Table $table - */ - public function acceptTable(Table $table) - { - if ( ! $table->isInDefaultNamespace($this->schema->getName()) ) { - $this->schema->dropTable($table->getName()); - } - } - /** - * @param Sequence $sequence - */ - public function acceptSequence(Sequence $sequence) - { - if ( ! $sequence->isInDefaultNamespace($this->schema->getName()) ) { - $this->schema->dropSequence($sequence->getName()); - } - } - - /** - * @param Column $column - */ - public function acceptColumn(Table $table, Column $column) - { - } - - /** - * @param Table $localTable - * @param ForeignKeyConstraint $fkConstraint - */ - public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) - { - // The table may already be deleted in a previous - // RemoveNamespacedAssets#acceptTable call. Removing Foreign keys that - // point to nowhere. - if ( ! $this->schema->hasTable($fkConstraint->getForeignTableName())) { - $localTable->removeForeignKey($fkConstraint->getName()); - return; - } - - $foreignTable = $this->schema->getTable($fkConstraint->getForeignTableName()); - if ( ! $foreignTable->isInDefaultNamespace($this->schema->getName()) ) { - $localTable->removeForeignKey($fkConstraint->getName()); - } - } - - /** - * @param Table $table - * @param Index $index - */ - public function acceptIndex(Table $table, Index $index) - { - } -} diff --git a/framework/library/Doctrine/DBAL/Schema/Visitor/Visitor.php b/framework/library/Doctrine/DBAL/Schema/Visitor/Visitor.php deleted file mode 100644 index 45eff81..0000000 --- a/framework/library/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. - * - * - * @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); -} diff --git a/framework/library/Doctrine/DBAL/Sharding/PoolingShardConnection.php b/framework/library/Doctrine/DBAL/Sharding/PoolingShardConnection.php deleted file mode 100644 index 6453e63..0000000 --- a/framework/library/Doctrine/DBAL/Sharding/PoolingShardConnection.php +++ /dev/null @@ -1,201 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Sharding; - -use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Event\ConnectionEventArgs; -use Doctrine\DBAL\Events; -use Doctrine\DBAL\Driver; -use Doctrine\DBAL\Configuration; - -use Doctrine\Common\EventManager; - -use Doctrine\DBAL\Sharding\ShardChoser\ShardChoser; - -/** - * Sharding implementation that pools many different connections - * internally and serves data from the currently active connection. - * - * The internals of this class are: - * - * - All sharding clients are specified and given a shard-id during - * configuration. - * - By default, the global shard is selected. If no global shard is configured - * an exception is thrown on access. - * - Selecting a shard by distribution value delegates the mapping - * "distributionValue" => "client" to the ShardChooser interface. - * - An exception is thrown if trying to switch shards during an open - * transaction. - * - * Instantiation through the DriverManager looks like: - * - * @example - * - * $conn = DriverManager::getConnection(array( - * 'wrapperClass' => 'Doctrine\DBAL\Sharding\PoolingShardConnection', - * 'driver' => 'pdo_mysql', - * 'global' => array('user' => '', 'password' => '', 'host' => '', 'dbname' => ''), - * 'shards' => array( - * array('id' => 1, 'user' => 'slave1', 'password', 'host' => '', 'dbname' => ''), - * array('id' => 2, 'user' => 'slave2', 'password', 'host' => '', 'dbname' => ''), - * ), - * 'shardChoser' => 'Doctrine\DBAL\Sharding\ShardChoser\MultiTenantShardChoser', - * )); - * $shardManager = $conn->getShardManager(); - * $shardManager->selectGlobal(); - * $shardManager->selectShard($value); - * - * @author Benjamin Eberlei - */ -class PoolingShardConnection extends Connection -{ - /** - * @var array - */ - private $activeConnections; - - /** - * @var int - */ - private $activeShardId; - - /** - * @var array - */ - private $connections; - - /** - * @var ShardManager - */ - private $shardManager; - - public function __construct(array $params, Driver $driver, Configuration $config = null, EventManager $eventManager = null) - { - if ( !isset($params['global']) || !isset($params['shards'])) { - throw new \InvalidArgumentException("Connection Parameters require 'global' and 'shards' configurations."); - } - - if ( !isset($params['shardChoser'])) { - throw new \InvalidArgumentException("Missing Shard Choser configuration 'shardChoser'"); - } - - if (is_string($params['shardChoser'])) { - $params['shardChoser'] = new $params['shardChoser']; - } - - if ( ! ($params['shardChoser'] instanceof ShardChoser)) { - throw new \InvalidArgumentException("The 'shardChoser' configuration is not a valid instance of Doctrine\DBAL\Sharding\ShardChoser\ShardChoser"); - } - - $this->connections[0] = array_merge($params, $params['global']); - - foreach ($params['shards'] as $shard) { - if ( ! isset($shard['id'])) { - throw new \InvalidArgumentException("Missing 'id' for one configured shard. Please specificy a unique shard-id."); - } - - if ( !is_numeric($shard['id']) || $shard['id'] < 1) { - throw new \InvalidArgumentException("Shard Id has to be a non-negative number."); - } - - if (isset($this->connections[$shard['id']])) { - throw new \InvalidArgumentException("Shard " . $shard['id'] . " is duplicated in the configuration."); - } - - $this->connections[$shard['id']] = array_merge($params, $shard); - } - - parent::__construct($params, $driver, $config, $eventManager); - } - - /** - * Connect to a given shard - * - * @param mixed $shardId - * @return bool - */ - public function connect($shardId = null) - { - if ($shardId === null && $this->_conn) { - return false; - } - - if ($shardId !== null && $shardId === $this->activeShardId) { - return false; - } - - if ($this->getTransactionNestingLevel() > 0) { - throw new ShardingException("Cannot switch shard when transaction is active."); - } - - $this->activeShardId = (int)$shardId; - - if (isset($this->activeConnections[$this->activeShardId])) { - $this->_conn = $this->activeConnections[$this->activeShardId]; - return false; - } - - $this->_conn = $this->activeConnections[$this->activeShardId] = $this->connectTo($this->activeShardId); - - if ($this->_eventManager->hasListeners(Events::postConnect)) { - $eventArgs = new Event\ConnectionEventArgs($this); - $this->_eventManager->dispatchEvent(Events::postConnect, $eventArgs); - } - - return true; - } - - - /** - * Connect to a specific connection - * - * @param string $shardId - * @return Driver - */ - protected function connectTo($shardId) - { - $params = $this->getParams(); - - $driverOptions = isset($params['driverOptions']) ? $params['driverOptions'] : array(); - - $connectionParams = $this->connections[$shardId]; - - $user = isset($connectionParams['user']) ? $connectionParams['user'] : null; - $password = isset($connectionParams['password']) ? $connectionParams['password'] : null; - - return $this->_driver->connect($connectionParams, $user, $password, $driverOptions); - } - - public function isConnected($shardId = null) - { - if ($shardId === null) { - return $this->_conn !== null; - } - - return isset($this->activeConnections[$shardId]); - } - - public function close() - { - $this->_conn = null; - $this->activeConnections = null; - } -} - diff --git a/framework/library/Doctrine/DBAL/Sharding/PoolingShardManager.php b/framework/library/Doctrine/DBAL/Sharding/PoolingShardManager.php deleted file mode 100644 index 6f6c5d2..0000000 --- a/framework/library/Doctrine/DBAL/Sharding/PoolingShardManager.php +++ /dev/null @@ -1,98 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Sharding; - -use Doctrine\DBAL\Sharding\ShardChoser\ShardChoser; - -/** - * Shard Manager for the Connection Pooling Shard Strategy - * - * @author Benjamin Eberlei - */ -class PoolingShardManager implements ShardManager -{ - private $conn; - private $choser; - private $currentDistributionValue; - - public function __construct(PoolingShardConnection $conn) - { - $params = $conn->getParams(); - $this->conn = $conn; - $this->choser = $params['shardChoser']; - } - - public function selectGlobal() - { - $this->conn->connect(0); - $this->currentDistributionValue = null; - } - - public function selectShard($distributionValue) - { - $shardId = $this->choser->pickShard($distributionValue, $this->conn); - $this->conn->connect($shardId); - $this->currentDistributionValue = $distributionValue; - } - - public function getCurrentDistributionValue() - { - return $this->currentDistributionValue; - } - - public function getShards() - { - $params = $this->conn->getParams(); - $shards = array(); - - foreach ($params['shards'] as $shard) { - $shards[] = array('id' => $shard['id']); - } - - return $shards; - } - - public function queryAll($sql, array $params, array $types) - { - $shards = $this->getShards(); - if (!$shards) { - throw new \RuntimeException("No shards found."); - } - - $result = array(); - $oldDistribution = $this->getCurrentDistributionValue(); - - foreach ($shards as $shard) { - $this->selectShard($shard['id']); - foreach ($this->conn->fetchAll($sql, $params, $types) as $row) { - $result[] = $row; - } - } - - if ($oldDistribution === null) { - $this->selectGlobal(); - } else { - $this->selectShard($oldDistribution); - } - - return $result; - } -} - diff --git a/framework/library/Doctrine/DBAL/Sharding/SQLAzure/SQLAzureFederationsSynchronizer.php b/framework/library/Doctrine/DBAL/Sharding/SQLAzure/SQLAzureFederationsSynchronizer.php deleted file mode 100644 index 4001379..0000000 --- a/framework/library/Doctrine/DBAL/Sharding/SQLAzure/SQLAzureFederationsSynchronizer.php +++ /dev/null @@ -1,296 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Sharding\SQLAzure; - -use Doctrine\DBAL\Schema\Schema; -use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Types\Type; - -use Doctrine\DBAL\Schema\Synchronizer\AbstractSchemaSynchronizer; -use Doctrine\DBAL\Sharding\SingleDatabaseSynchronizer; - -/** - * SQL Azure Schema Synchronizer - * - * Will iterate over all shards when performing schema operations. This is done - * by partitioning the passed schema into subschemas for the federation and the - * global database and then applying the operations step by step using the - * {@see \Doctrine\DBAL\Sharding\SingleDatabaseSynchronizer}. - * - * @author Benjamin Eberlei - */ -class SQLAzureFederationsSynchronizer extends AbstractSchemaSynchronizer -{ - const FEDERATION_TABLE_FEDERATED = 'azure.federated'; - const FEDERATION_DISTRIBUTION_NAME = 'azure.federatedOnDistributionName'; - - - /** - * @var SQLAzureShardManager - */ - private $shardManager; - - /** - * @var SchemaSynchronizer - */ - private $synchronizer; - - public function __construct(Connection $conn, SQLAzureShardManager $shardManager, SchemaSynchronizer $sync = null) - { - parent::__construct($conn); - $this->shardManager = $shardManager; - $this->synchronizer = $sync ?: new SingleDatabaseSynchronizer($conn); - } - - /** - * Get the SQL statements that can be executed to create the schema. - * - * @param Schema $createSchema - * @return array - */ - public function getCreateSchema(Schema $createSchema) - { - $sql = array(); - - list($global, $federation) = $this->partitionSchema($createSchema); - - $globalSql = $this->synchronizer->getCreateSchema($global); - if ($globalSql) { - $sql[] = "-- Create Root Federation\n" . - "USE FEDERATION ROOT WITH RESET;"; - $sql = array_merge($sql, $globalSql); - } - - $federationSql = $this->synchronizer->getCreateSchema($federation); - - if ($federationSql) { - $defaultValue = $this->getFederationTypeDefaultValue(); - - $sql[] = $this->getCreateFederationStatement(); - $sql[] = "USE FEDERATION " . $this->shardManager->getFederationName() . " (" . $this->shardManager->getDistributionKey() . " = " . $defaultValue . ") WITH RESET, FILTERING = OFF;"; - $sql = array_merge($sql, $federationSql); - } - - return $sql; - } - - /** - * Get the SQL Statements to update given schema with the underlying db. - * - * @param Schema $toSchema - * @param bool $noDrops - * @return array - */ - public function getUpdateSchema(Schema $toSchema, $noDrops = false) - { - return $this->work($toSchema, function($synchronizer, $schema) use ($noDrops) { - return $synchronizer->getUpdateSchema($schema, $noDrops); - }); - } - - /** - * Get the SQL Statements to drop the given schema from underlying db. - * - * @param Schema $dropSchema - * @return array - */ - public function getDropSchema(Schema $dropSchema) - { - return $this->work($dropSchema, function($synchronizer, $schema) { - return $synchronizer->getDropSchema($schema); - }); - } - - /** - * Create the Schema - * - * @param Schema $createSchema - * @return void - */ - public function createSchema(Schema $createSchema) - { - $this->processSql($this->getCreateSchema($createSchema)); - } - - /** - * Update the Schema to new schema version. - * - * @param Schema $toSchema - * @return void - */ - public function updateSchema(Schema $toSchema, $noDrops = false) - { - $this->processSql($this->getUpdateSchema($toSchema, $noDrops)); - } - - /** - * Drop the given database schema from the underlying db. - * - * @param Schema $dropSchema - * @return void - */ - public function dropSchema(Schema $dropSchema) - { - $this->processSqlSafely($this->getDropSchema($dropSchema)); - } - - /** - * Get the SQL statements to drop all schema assets from underlying db. - * - * @return array - */ - public function getDropAllSchema() - { - $this->shardManager->selectGlobal(); - $globalSql = $this->synchronizer->getDropAllSchema(); - - if ($globalSql) { - $sql[] = "-- Work on Root Federation\nUSE FEDERATION ROOT WITH RESET;"; - $sql = array_merge($sql, $globalSql); - } - - $shards = $this->shardManager->getShards(); - foreach ($shards as $shard) { - $this->shardManager->selectShard($shard['rangeLow']); - - $federationSql = $this->synchronizer->getDropAllSchema(); - if ($federationSql) { - $sql[] = "-- Work on Federation ID " . $shard['id'] . "\n" . - "USE FEDERATION " . $this->shardManager->getFederationName() . " (" . $this->shardManager->getDistributionKey() . " = " . $shard['rangeLow'].") WITH RESET, FILTERING = OFF;"; - $sql = array_merge($sql, $federationSql); - } - } - - $sql[] = "USE FEDERATION ROOT WITH RESET;"; - $sql[] = "DROP FEDERATION " . $this->shardManager->getFederationName(); - - return $sql; - } - - /** - * Drop all assets from the underyling db. - * - * @return void - */ - public function dropAllSchema() - { - $this->processSqlSafely($this->getDropAllSchema()); - } - - private function partitionSchema(Schema $schema) - { - return array( - $this->extractSchemaFederation($schema, false), - $this->extractSchemaFederation($schema, true), - ); - } - - private function extractSchemaFederation(Schema $schema, $isFederation) - { - $partionedSchema = clone $schema; - - foreach ($partionedSchema->getTables() as $table) { - if ($isFederation) { - $table->addOption(self::FEDERATION_DISTRIBUTION_NAME, $this->shardManager->getDistributionKey()); - } - - if ( $table->hasOption(self::FEDERATION_TABLE_FEDERATED) !== $isFederation) { - $partionedSchema->dropTable($table->getName()); - } else { - foreach ($table->getForeignKeys() as $fk) { - $foreignTable = $schema->getTable($fk->getForeignTableName()); - if ($foreignTable->hasOption(self::FEDERATION_TABLE_FEDERATED) !== $isFederation) { - throw new \RuntimeException("Cannot have foreign key between global/federation."); - } - } - } - } - - return $partionedSchema; - } - - /** - * Work on the Global/Federation based on currently existing shards and - * perform the given operation on the underyling schema synchronizer given - * the different partioned schema instances. - * - * @param Schema $schema - * @param Closure $operation - * @return array - */ - private function work(Schema $schema, \Closure $operation) - { - list($global, $federation) = $this->partitionSchema($schema); - $sql = array(); - - $this->shardManager->selectGlobal(); - $globalSql = $operation($this->synchronizer, $global); - - if ($globalSql) { - $sql[] = "-- Work on Root Federation\nUSE FEDERATION ROOT WITH RESET;"; - $sql = array_merge($sql, $globalSql); - } - - $shards = $this->shardManager->getShards(); - - foreach ($shards as $shard) { - $this->shardManager->selectShard($shard['rangeLow']); - - $federationSql = $operation($this->synchronizer, $federation); - if ($federationSql) { - $sql[] = "-- Work on Federation ID " . $shard['id'] . "\n" . - "USE FEDERATION " . $this->shardManager->getFederationName() . " (" . $this->shardManager->getDistributionKey() . " = " . $shard['rangeLow'].") WITH RESET, FILTERING = OFF;"; - $sql = array_merge($sql, $federationSql); - } - } - - return $sql; - } - - private function getFederationTypeDefaultValue() - { - $federationType = Type::getType($this->shardManager->getDistributionType()); - - switch ($federationType->getName()) { - case Type::GUID: - $defaultValue = '00000000-0000-0000-0000-000000000000'; - break; - case Type::INTEGER: - case Type::SMALLINT: - case Type::BIGINT: - $defaultValue = '0'; - break; - default: - $defaultValue = ''; - break; - } - return $defaultValue; - } - - private function getCreateFederationStatement() - { - $federationType = Type::getType($this->shardManager->getDistributionType()); - $federationTypeSql = $federationType->getSqlDeclaration(array(), $this->conn->getDatabasePlatform()); - - return "--Create Federation\n" . - "CREATE FEDERATION " . $this->shardManager->getFederationName() . " (" . $this->shardManager->getDistributionKey() . " " . $federationTypeSql ." RANGE)"; - } -} - diff --git a/framework/library/Doctrine/DBAL/Sharding/SQLAzure/SQLAzureShardManager.php b/framework/library/Doctrine/DBAL/Sharding/SQLAzure/SQLAzureShardManager.php deleted file mode 100644 index 80ca3d9..0000000 --- a/framework/library/Doctrine/DBAL/Sharding/SQLAzure/SQLAzureShardManager.php +++ /dev/null @@ -1,238 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Sharding\SQLAzure; - -use Doctrine\DBAL\Sharding\ShardManager; -use Doctrine\DBAL\Sharding\ShardingException; -use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Types\Type; - -/** - * Sharding using the SQL Azure Federations support. - * - * @author Benjamin Eberlei - */ -class SQLAzureShardManager implements ShardManager -{ - /** - * @var string - */ - private $federationName; - - /** - * @var bool - */ - private $filteringEnabled; - - /** - * @var string - */ - private $distributionKey; - - /** - * @var string - */ - private $distributionType; - - /** - * @var Connection - */ - private $conn; - - /** - * @var string - */ - private $currentDistributionValue; - - /** - * @param Connection $conn - */ - public function __construct(Connection $conn) - { - $this->conn = $conn; - $params = $conn->getParams(); - - if ( ! isset($params['sharding']['federationName'])) { - throw ShardingException::missingDefaultFederationName(); - } - - if ( ! isset($params['sharding']['distributionKey'])) { - throw ShardingException::missingDefaultDistributionKey(); - } - - if ( ! isset($params['sharding']['distributionType'])) { - throw ShardingException::missingDistributionType(); - } - - $this->federationName = $params['sharding']['federationName']; - $this->distributionKey = $params['sharding']['distributionKey']; - $this->distributionType = $params['sharding']['distributionType']; - $this->filteringEnabled = (isset($params['sharding']['filteringEnabled'])) ? (bool)$params['sharding']['filteringEnabled'] : false; - } - - /** - * Get name of the federation - * - * @return string - */ - public function getFederationName() - { - return $this->federationName; - } - - /** - * Get the distribution key - * - * @return string - */ - public function getDistributionKey() - { - return $this->distributionKey; - } - - /** - * Get the Doctrine Type name used for the distribution - * - * @return string - */ - public function getDistributionType() - { - return $this->distributionType; - } - - /** - * Enabled/Disable filtering on the fly. - * - * @param bool $flag - * @return void - */ - public function setFilteringEnabled($flag) - { - $this->filteringEnabled = (bool)$flag; - } - - /** - * {@inheritDoc} - */ - public function selectGlobal() - { - if ($this->conn->isTransactionActive()) { - throw ShardingException::activeTransaction(); - } - - $sql = "USE FEDERATION ROOT WITH RESET"; - $this->conn->exec($sql); - $this->currentDistributionValue = null; - } - - /** - * {@inheritDoc} - */ - public function selectShard($distributionValue) - { - if ($this->conn->isTransactionActive()) { - throw ShardingException::activeTransaction(); - } - - if ($distributionValue === null || is_bool($distributionValue) || !is_scalar($distributionValue)) { - throw ShardingException::noShardDistributionValue(); - } - - $platform = $this->conn->getDatabasePlatform(); - $sql = sprintf( - "USE FEDERATION %s (%s = %s) WITH RESET, FILTERING = %s;", - $platform->quoteIdentifier($this->federationName), - $platform->quoteIdentifier($this->distributionKey), - $this->conn->quote($distributionValue), - ($this->filteringEnabled ? 'ON' : 'OFF') - ); - - $this->conn->exec($sql); - $this->currentDistributionValue = $distributionValue; - } - - /** - * {@inheritDoc} - */ - public function getCurrentDistributionValue() - { - return $this->currentDistributionValue; - } - - /** - * {@inheritDoc} - */ - public function getShards() - { - $sql = "SELECT member_id as id, - distribution_name as distribution_key, - CAST(range_low AS CHAR) AS rangeLow, - CAST(range_high AS CHAR) AS rangeHigh - FROM sys.federation_member_distributions d - INNER JOIN sys.federations f ON f.federation_id = d.federation_id - WHERE f.name = " . $this->conn->quote($this->federationName); - return $this->conn->fetchAll($sql); - } - - /** - * {@inheritDoc} - */ - public function queryAll($sql, array $params = array(), array $types = array()) - { - $shards = $this->getShards(); - if (!$shards) { - throw new \RuntimeException("No shards found for " . $this->federationName); - } - - $result = array(); - $oldDistribution = $this->getCurrentDistributionValue(); - - foreach ($shards as $shard) { - $this->selectShard($shard['rangeLow']); - foreach ($this->conn->fetchAll($sql, $params, $types) as $row) { - $result[] = $row; - } - } - - if ($oldDistribution === null) { - $this->selectGlobal(); - } else { - $this->selectShard($oldDistribution); - } - - return $result; - } - - /** - * Split Federation at a given distribution value. - * - * @param mixed $splitDistributionValue - */ - public function splitFederation($splitDistributionValue) - { - $type = Type::getType($this->distributionType); - - $sql = "ALTER FEDERATION " . $this->getFederationName() . " " . - "SPLIT AT (" . $this->getDistributionKey() . " = " . - $this->conn->quote($splitDistributionValue, $type->getBindingType()) . ")"; - $this->conn->exec($sql); - } -} - diff --git a/framework/library/Doctrine/DBAL/Sharding/SQLAzure/Schema/MultiTenantVisitor.php b/framework/library/Doctrine/DBAL/Sharding/SQLAzure/Schema/MultiTenantVisitor.php deleted file mode 100644 index 2b2b457..0000000 --- a/framework/library/Doctrine/DBAL/Sharding/SQLAzure/Schema/MultiTenantVisitor.php +++ /dev/null @@ -1,161 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Sharding\SQLAzure\Schema; - -use Doctrine\DBAL\Schema\Visitor\Visitor, - 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; - -/** - * Converts a single tenant schema into a multi-tenant schema for SQL Azure - * Federations under the following assumptions: - * - * - Every table is part of the multi-tenant application, only explicitly - * excluded tables are non-federated. The behavior of the tables being in - * global or federated database is undefined. It depends on you selecting a - * federation before DDL statements or not. - * - Every Primary key of a federated table is extended by another column - * 'tenant_id' with a default value of the SQLAzure function - * `federation_filtering_value('tenant_id')`. - * - You always have to work with `filtering=On` when using federations with this - * multi-tenant approach. - * - Primary keys are either using globally unique ids (GUID, Table Generator) - * or you explicitly add the tenent_id in every UPDATE or DELETE statement - * (otherwise they will affect the same-id rows from other tenents as well). - * SQLAzure throws errors when you try to create IDENTIY columns on federated - * tables. - * - * @author Benjamin Eberlei - */ -class MultiTenantVisitor implements Visitor -{ - /** - * @var array - */ - private $excludedTables = array(); - - /** - * @var string - */ - private $tenantColumnName; - - /** - * @var string - */ - private $tenantColumnType = 'integer'; - - /** - * Name of the federation distribution, defaulting to the tenantColumnName - * if not specified. - * - * @var string - */ - private $distributionName; - - public function __construct(array $excludedTables = array(), $tenantColumnName = 'tenant_id', $distributionName = null) - { - $this->excludedTables = $excludedTables; - $this->tenantColumnName = $tenantColumnName; - $this->distributionName = $distributionName ?: $tenantColumnName; - } - - /** - * @param Table $table - */ - public function acceptTable(Table $table) - { - if (in_array($table->getName(), $this->excludedTables)) { - return; - } - - $table->addColumn($this->tenantColumnName, $this->tenantColumnType, array( - 'default' => "federation_filtering_value('". $this->distributionName ."')", - )); - - $clusteredIndex = $this->getClusteredIndex($table); - - $indexColumns = $clusteredIndex->getColumns(); - $indexColumns[] = $this->tenantColumnName; - - if ($clusteredIndex->isPrimary()) { - $table->dropPrimaryKey(); - $table->setPrimaryKey($indexColumns); - } else { - $table->dropIndex($clusteredIndex->getName()); - $table->addIndex($indexColumns, $clusteredIndex->getName()); - $table->getIndex($clusteredIndex->getName())->addFlag('clustered'); - } - } - - private function getClusteredIndex($table) - { - foreach ($table->getIndexes() as $index) { - if ($index->isPrimary() && ! $index->hasFlag('nonclustered')) { - return $index; - } else if ($index->hasFlag('clustered')) { - return $index; - } - } - throw new \RuntimeException("No clustered index found on table " . $table->getName()); - } - - /** - * @param Schema $schema - */ - public function acceptSchema(Schema $schema) - { - } - - /** - * @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) - { - } -} - diff --git a/framework/library/Doctrine/DBAL/Sharding/ShardChoser/MultiTenantShardChoser.php b/framework/library/Doctrine/DBAL/Sharding/ShardChoser/MultiTenantShardChoser.php deleted file mode 100644 index c6cdabf..0000000 --- a/framework/library/Doctrine/DBAL/Sharding/ShardChoser/MultiTenantShardChoser.php +++ /dev/null @@ -1,37 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Sharding\ShardChoser; - -use Doctrine\DBAL\Sharding\PoolingShardConnection; - -/** - * The MultiTenant Shard choser assumes that the distribution value directly - * maps to the shard id. - * - * @author Benjamin Eberlei - */ -class MultiTenantShardChoser implements ShardChoser -{ - public function pickShard($distributionValue, PoolingShardConnection $conn) - { - return $distributionValue; - } -} - diff --git a/framework/library/Doctrine/DBAL/Sharding/ShardChoser/ShardChoser.php b/framework/library/Doctrine/DBAL/Sharding/ShardChoser/ShardChoser.php deleted file mode 100644 index 2aa9f74..0000000 --- a/framework/library/Doctrine/DBAL/Sharding/ShardChoser/ShardChoser.php +++ /dev/null @@ -1,41 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Sharding\ShardChoser; - -use Doctrine\DBAL\Sharding\PoolingShardConnection; - -/** - * Given a distribution value this shard-choser strategy will pick the shard to - * connect to for retrieving rows with the distribution value. - * - * @author Benjamin Eberlei - */ -interface ShardChoser -{ - /** - * Pick a shard for the given distribution value - * - * @param string $distributionValue - * @param PoolingShardConnection $conn - * @return int - */ - function pickShard($distributionValue, PoolingShardConnection $conn); -} - diff --git a/framework/library/Doctrine/DBAL/Sharding/ShardManager.php b/framework/library/Doctrine/DBAL/Sharding/ShardManager.php deleted file mode 100644 index aa67992..0000000 --- a/framework/library/Doctrine/DBAL/Sharding/ShardManager.php +++ /dev/null @@ -1,95 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Sharding; - -use Doctrine\DBAL\Connection; - -/** - * Sharding Manager gives access to APIs to implementing sharding on top of - * Doctrine\DBAL\Connection instances. - * - * For simplicity and developer ease-of-use (and understanding) the sharding - * API only covers single shard queries, no fan-out support. It is primarily - * suited for multi-tenant applications. - * - * The assumption about sharding here - * is that a distribution value can be found that gives access to all the - * necessary data for all use-cases. Switching between shards should be done with - * caution, especially if lazy loading is implemented. Any query is always - * executed against the last shard that was selected. If a query is created for - * a shard Y but then a shard X is selected when its actually excecuted you - * will hit the wrong shard. - * - * @author Benjamin Eberlei - */ -interface ShardManager -{ - /** - * Select global database with global data. - * - * This is the default database that is connected when no shard is - * selected. - * - * @return void - */ - function selectGlobal(); - - /** - * SELECT queries after this statement will be issued against the selected - * shard. - * - * @throws ShardingException If no value is passed as shard identifier. - * @param mixed $distributionValue - * @param array $options - * @return void - */ - function selectShard($distributionValue); - - /** - * Get the distribution value currently used for sharding. - * - * @return string - */ - function getCurrentDistributionValue(); - - /** - * Get information about the amount of shards and other details. - * - * Format is implementation specific, each shard is one element and has a - * 'name' attribute at least. - * - * @return array - */ - function getShards(); - - /** - * Query all shards in undefined order and return the results appended to - * each other. Restore the previous distribution value after execution. - * - * Using {@link Connection::fetchAll} to retrieve rows internally. - * - * @param string $sql - * @param array $params - * @param array $types - * @return array - */ - function queryAll($sql, array $params, array $types); -} - diff --git a/framework/library/Doctrine/DBAL/Sharding/ShardingException.php b/framework/library/Doctrine/DBAL/Sharding/ShardingException.php deleted file mode 100644 index 06dd169..0000000 --- a/framework/library/Doctrine/DBAL/Sharding/ShardingException.php +++ /dev/null @@ -1,61 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Sharding; - -use Doctrine\DBAL\DBALException; - -/** - * Sharding related Exceptions - * - * @since 2.3 - */ -class ShardingException extends DBALException -{ - static public function notImplemented() - { - return new self("This functionality is not implemented with this sharding provider.", 1331557937); - } - - static public function missingDefaultFederationName() - { - return new self("SQLAzure requires a federation name to be set during sharding configuration.", 1332141280); - } - - static public function missingDefaultDistributionKey() - { - return new self("SQLAzure requires a distribution key to be set during sharding configuration.", 1332141329); - } - - static public function activeTransaction() - { - return new self("Cannot switch shard during an active transaction.", 1332141766); - } - - static public function noShardDistributionValue() - { - return new self("You have to specify a string or integer as shard distribution value.", 1332142103); - } - - static public function missingDistributionType() - { - return new self("You have to specify a sharding distribution type such as 'integer', 'string', 'guid'."); - } -} - diff --git a/framework/library/Doctrine/DBAL/Statement.php b/framework/library/Doctrine/DBAL/Statement.php deleted file mode 100644 index 1bf9d74..0000000 --- a/framework/library/Doctrine/DBAL/Statement.php +++ /dev/null @@ -1,264 +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 \IteratorAggregate, DriverStatement -{ - /** - * @var string The SQL statement. - */ - protected $sql; - /** - * @var array The bound parameters. - */ - protected $params = array(); - /** - * @var array The parameter types - */ - protected $types = array(); - /** - * @var \Doctrine\DBAL\Driver\Statement The underlying driver statement. - */ - protected $stmt; - /** - * @var \Doctrine\DBAL\Platforms\AbstractPlatform The underlying database platform. - */ - protected $platform; - /** - * @var \Doctrine\DBAL\Connection The connection this statement is bound to and executed on. - */ - protected $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 string $name The name or position of the parameter. - * @param mixed $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; - $this->types[$name] = $type; - 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 $var 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, $length = null) - { - return $this->stmt->bindParam($name, $var, $type, $length ); - } - - /** - * Executes the statement with the currently bound parameters. - * - * @param array $params - * @return boolean TRUE on success, FALSE on failure. - */ - public function execute($params = null) - { - $logger = $this->conn->getConfiguration()->getSQLLogger(); - if ($logger) { - $logger->startQuery($this->sql, $this->params, $this->types); - } - - try { - $stmt = $this->stmt->execute($params); - } catch (\Exception $ex) { - throw DBALException::driverExceptionDuringQuery($ex, $this->sql, $this->conn->resolveParams($this->params, $this->types)); - } - - if ($logger) { - $logger->stopQuery(); - } - $this->params = array(); - $this->types = array(); - return $stmt; - } - - /** - * 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(); - } - - public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null) - { - if ($arg2 === null) { - return $this->stmt->setFetchMode($fetchMode); - } else if ($arg3 === null) { - return $this->stmt->setFetchMode($fetchMode, $arg2); - } - - return $this->stmt->setFetchMode($fetchMode, $arg2, $arg3); - } - - public function getIterator() - { - return $this->stmt; - } - - /** - * Fetches the next row from a result set. - * - * @param integer $fetchMode - * @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($fetchMode = null) - { - return $this->stmt->fetch($fetchMode); - } - - /** - * Returns an array containing all of the result set rows. - * - * @param integer $fetchMode - * @param mixed $fetchArgument - * @return array An array containing all of the remaining rows in the result set. - */ - public function fetchAll($fetchMode = null, $fetchArgument = 0) - { - if ($fetchArgument !== 0) { - return $this->stmt->fetchAll($fetchMode, $fetchArgument); - } - return $this->stmt->fetchAll($fetchMode); - } - - /** - * 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; - } -} diff --git a/framework/library/Doctrine/DBAL/Tools/Console/Command/ImportCommand.php b/framework/library/Doctrine/DBAL/Tools/Console/Command/ImportCommand.php deleted file mode 100644 index 6b2b8c2..0000000 --- a/framework/library/Doctrine/DBAL/Tools/Console/Command/ImportCommand.php +++ /dev/null @@ -1,124 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Tools\Console\Command; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console; - -/** - * Task for executing arbitrary SQL that can come from a file or directly from - * the command line. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @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) { - $output->writeln('OK!' . PHP_EOL); - } else { - $error = $stmt->errorInfo(); - - $output->write('error!' . PHP_EOL); - - throw new \RuntimeException($error[2], $error[0]); - } - - $stmt->closeCursor(); - } - } - } - } -} diff --git a/framework/library/Doctrine/DBAL/Tools/Console/Command/ReservedWordsCommand.php b/framework/library/Doctrine/DBAL/Tools/Console/Command/ReservedWordsCommand.php deleted file mode 100644 index 7b1bb1c..0000000 --- a/framework/library/Doctrine/DBAL/Tools/Console/Command/ReservedWordsCommand.php +++ /dev/null @@ -1,133 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Tools\Console\Command; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console\Command\Command, - Symfony\Component\Console\Input\InputInterface, - Symfony\Component\Console\Output\OutputInterface; -use Doctrine\DBAL\Platforms\Keywords\ReservedKeywordsValidator; - -class ReservedWordsCommand extends Command -{ - private $keywordListClasses = array( - 'mysql' => 'Doctrine\DBAL\Platforms\Keywords\MySQLKeywords', - 'mssql' => 'Doctrine\DBAL\Platforms\Keywords\MsSQLKeywords', - 'sqlite' => 'Doctrine\DBAL\Platforms\Keywords\SQLiteKeywords', - 'pgsql' => 'Doctrine\DBAL\Platforms\Keywords\PostgreSQLKeywords', - 'oracle' => 'Doctrine\DBAL\Platforms\Keywords\OracleKeywords', - 'db2' => 'Doctrine\DBAL\Platforms\Keywords\DB2Keywords', - ); - - /** - * If you want to add or replace a keywords list use this command - * - * @param string $name - * @param string $class - */ - public function setKeywordListClass($name, $class) - { - $this->keywordListClasses[$name] = $class; - } - - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('dbal:reserved-words') - ->setDescription('Checks if the current database contains identifiers that are reserved.') - ->setDefinition(array( - new InputOption( - 'list', 'l', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Keyword-List name.' - ) - )) - ->setHelp(<<%command.full_name% - -If you want to check against specific dialects you can -pass them to the command: - - %command.full_name% mysql pgsql - -The following keyword lists are currently shipped with Doctrine: - - * mysql - * pgsql - * sqlite - * oracle - * mssql - * db2 (Not checked by default) -EOT - ); - } - - /** - * @see Console\Command\Command - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - /* @var $conn \Doctrine\DBAL\Connection */ - $conn = $this->getHelper('db')->getConnection(); - - $keywordLists = (array)$input->getOption('list'); - if ( ! $keywordLists) { - $keywordLists = array('mysql', 'pgsql', 'sqlite', 'oracle', 'mssql'); - } - - $keywords = array(); - foreach ($keywordLists as $keywordList) { - if (!isset($this->keywordListClasses[$keywordList])) { - throw new \InvalidArgumentException( - "There exists no keyword list with name '" . $keywordList . "'. ". - "Known lists: " . implode(", ", array_keys($this->keywordListClasses)) - ); - } - $class = $this->keywordListClasses[$keywordList]; - $keywords[] = new $class; - } - - $output->write('Checking keyword violations for ' . implode(", ", $keywordLists) . "...", true); - - /* @var $schema \Doctrine\DBAL\Schema\Schema */ - $schema = $conn->getSchemaManager()->createSchema(); - $visitor = new ReservedKeywordsValidator($keywords); - $schema->visit($visitor); - - $violations = $visitor->getViolations(); - if (count($violations) == 0) { - $output->write("No reserved keywords violations have been found!", true); - } else { - $output->write('There are ' . count($violations) . ' reserved keyword violations in your database schema:', true); - foreach ($violations as $violation) { - $output->write(' - ' . $violation, true); - } - } - } -} diff --git a/framework/library/Doctrine/DBAL/Tools/Console/Command/RunSqlCommand.php b/framework/library/Doctrine/DBAL/Tools/Console/Command/RunSqlCommand.php deleted file mode 100644 index b1af34b..0000000 --- a/framework/library/Doctrine/DBAL/Tools/Console/Command/RunSqlCommand.php +++ /dev/null @@ -1,87 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Tools\Console\Command; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console; - -/** - * Task for executing arbitrary SQL that can come from a file or directly from - * the command line. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @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::VALUE_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 (stripos($sql, 'select') === 0) { - $resultSet = $conn->fetchAll($sql); - } else { - $resultSet = $conn->executeUpdate($sql); - } - - ob_start(); - \Doctrine\Common\Util\Debug::dump($resultSet, (int) $depth); - $message = ob_get_clean(); - - $output->write($message); - } -} diff --git a/framework/library/Doctrine/DBAL/Tools/Console/Helper/ConnectionHelper.php b/framework/library/Doctrine/DBAL/Tools/Console/Helper/ConnectionHelper.php deleted file mode 100644 index 877cb64..0000000 --- a/framework/library/Doctrine/DBAL/Tools/Console/Helper/ConnectionHelper.php +++ /dev/null @@ -1,74 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Tools\Console\Helper; - -use Symfony\Component\Console\Helper\Helper, - Doctrine\DBAL\Connection; - -/** - * Doctrine CLI Connection Helper. - * - * - * @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'; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/ArrayType.php b/framework/library/Doctrine/DBAL/Types/ArrayType.php deleted file mode 100644 index 447f9ee..0000000 --- a/framework/library/Doctrine/DBAL/Types/ArrayType.php +++ /dev/null @@ -1,64 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * 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) - { - if ($value === null) { - return null; - } - - $value = (is_resource($value)) ? stream_get_contents($value) : $value; - $val = unserialize($value); - if ($val === false && $value != 'b:0;') { - throw ConversionException::conversionFailed($value, $this->getName()); - } - return $val; - } - - public function getName() - { - return Type::TARRAY; - } - - public function requiresSQLCommentHint(AbstractPlatform $platform) - { - return true; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/BigIntType.php b/framework/library/Doctrine/DBAL/Types/BigIntType.php deleted file mode 100644 index 7648bef..0000000 --- a/framework/library/Doctrine/DBAL/Types/BigIntType.php +++ /dev/null @@ -1,56 +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_STR; - } - - /** - * {@inheritdoc} - */ - public function convertToPHPValue($value, AbstractPlatform $platform) - { - return (null === $value) ? null : (string) $value; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/BlobType.php b/framework/library/Doctrine/DBAL/Types/BlobType.php deleted file mode 100644 index ff04655..0000000 --- a/framework/library/Doctrine/DBAL/Types/BlobType.php +++ /dev/null @@ -1,71 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps an SQL BLOB to a PHP resource stream - * - * @since 2.2 - */ -class BlobType extends Type -{ - /** @override */ - public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getBlobTypeDeclarationSQL($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) - { - if (null === $value) { - return null; - } - - if (is_string($value)) { - $value = fopen('data://text/plain;base64,' . base64_encode($value), 'r'); - } - - if ( ! is_resource($value)) { - throw ConversionException::conversionFailed($value, self::BLOB); - } - - return $value; - } - - public function getName() - { - return Type::BLOB; - } - - public function getBindingType() - { - return \PDO::PARAM_LOB; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/BooleanType.php b/framework/library/Doctrine/DBAL/Types/BooleanType.php deleted file mode 100644 index f1a968d..0000000 --- a/framework/library/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 (null === $value) ? null : (bool) $value; - } - - public function getName() - { - return Type::BOOLEAN; - } - - public function getBindingType() - { - return \PDO::PARAM_BOOL; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/ConversionException.php b/framework/library/Doctrine/DBAL/Types/ConversionException.php deleted file mode 100644 index 3a19d1a..0000000 --- a/framework/library/Doctrine/DBAL/Types/ConversionException.php +++ /dev/null @@ -1,65 +0,0 @@ -. - */ - - -/** - * Conversion Exception is thrown when the database to PHP conversion fails - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -namespace Doctrine\DBAL\Types; - -class ConversionException extends \Doctrine\DBAL\DBALException -{ - /** - * Thrown when a Database to Doctrine Type Conversion fails. - * - * @param string $value - * @param string $toType - * @return ConversionException - */ - static public function conversionFailed($value, $toType) - { - $value = (strlen($value) > 32) ? substr($value, 0, 20) . "..." : $value; - return new self('Could not convert database value "' . $value . '" to Doctrine Type ' . $toType); - } - - /** - * Thrown when a Database to Doctrine Type Conversion fails and we can make a statement - * about the expected format. - * - * @param string $value - * @param string $toType - * @return ConversionException - */ - static public function conversionFailedFormat($value, $toType, $expectedFormat) - { - $value = (strlen($value) > 32) ? substr($value, 0, 20) . "..." : $value; - return new self( - 'Could not convert database value "' . $value . '" to Doctrine Type ' . - $toType . '. Expected format: ' . $expectedFormat - ); - } -} diff --git a/framework/library/Doctrine/DBAL/Types/DateTimeType.php b/framework/library/Doctrine/DBAL/Types/DateTimeType.php deleted file mode 100644 index 06de729..0000000 --- a/framework/library/Doctrine/DBAL/Types/DateTimeType.php +++ /dev/null @@ -1,59 +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) - { - if ($value === null || $value instanceof \DateTime) { - return $value; - } - - $val = \DateTime::createFromFormat($platform->getDateTimeFormatString(), $value); - if ( ! $val) { - throw ConversionException::conversionFailedFormat($value, $this->getName(), $platform->getDateTimeFormatString()); - } - return $val; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/DateTimeTzType.php b/framework/library/Doctrine/DBAL/Types/DateTimeTzType.php deleted file mode 100644 index e0a786c..0000000 --- a/framework/library/Doctrine/DBAL/Types/DateTimeTzType.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * DateTime type saving additional timezone information. - * - * Caution: Databases are not necessarily experts at storing timezone related - * data of dates. First, of all the supported vendors only PostgreSQL and Oracle - * support storing Timezone data. But those two don't save the actual timezone - * attached to a DateTime instance (for example "Europe/Berlin" or "America/Montreal") - * but the current offset of them related to UTC. That means depending on daylight saving times - * or not you may get different offsets. - * - * This datatype makes only sense to use, if your application works with an offset, not - * with an actual timezone that uses transitions. Otherwise your DateTime instance - * attached with a timezone such as Europe/Berlin gets saved into the database with - * the offset and re-created from persistence with only the offset, not the original timezone - * attached. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class DateTimeTzType extends Type -{ - public function getName() - { - return Type::DATETIMETZ; - } - - public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getDateTimeTzTypeDeclarationSQL($fieldDeclaration); - } - - public function convertToDatabaseValue($value, AbstractPlatform $platform) - { - return ($value !== null) - ? $value->format($platform->getDateTimeTzFormatString()) : null; - } - - public function convertToPHPValue($value, AbstractPlatform $platform) - { - if ($value === null || $value instanceof \DateTime) { - return $value; - } - - $val = \DateTime::createFromFormat($platform->getDateTimeTzFormatString(), $value); - if ( ! $val) { - throw ConversionException::conversionFailedFormat($value, $this->getName(), $platform->getDateTimeTzFormatString()); - } - return $val; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/DateType.php b/framework/library/Doctrine/DBAL/Types/DateType.php deleted file mode 100644 index a3f7018..0000000 --- a/framework/library/Doctrine/DBAL/Types/DateType.php +++ /dev/null @@ -1,59 +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) - { - if ($value === null || $value instanceof \DateTime) { - return $value; - } - - $val = \DateTime::createFromFormat('!'.$platform->getDateFormatString(), $value); - if ( ! $val) { - throw ConversionException::conversionFailedFormat($value, $this->getName(), $platform->getDateFormatString()); - } - return $val; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/DecimalType.php b/framework/library/Doctrine/DBAL/Types/DecimalType.php deleted file mode 100644 index fd61b53..0000000 --- a/framework/library/Doctrine/DBAL/Types/DecimalType.php +++ /dev/null @@ -1,45 +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 (null === $value) ? null : $value; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/FloatType.php b/framework/library/Doctrine/DBAL/Types/FloatType.php deleted file mode 100644 index d02ca0c..0000000 --- a/framework/library/Doctrine/DBAL/Types/FloatType.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -class FloatType extends Type -{ - public function getName() - { - return Type::FLOAT; - } - - /** - * @param array $fieldDeclaration - * @param AbstractPlatform $platform - * @return string - */ - public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getFloatDeclarationSQL($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 (null === $value) ? null : (double) $value; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/GuidType.php b/framework/library/Doctrine/DBAL/Types/GuidType.php deleted file mode 100644 index a8251dd..0000000 --- a/framework/library/Doctrine/DBAL/Types/GuidType.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Represents a GUID/UUID datatype (both are actually synomys) in the database. - * - * @author Benjamin Eberlei - * @since 2.3 - */ -class GuidType extends StringType -{ - public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getGuidTypeDeclarationSQL($fieldDeclaration); - } - - public function getName() - { - return Type::GUID; - } -} - diff --git a/framework/library/Doctrine/DBAL/Types/IntegerType.php b/framework/library/Doctrine/DBAL/Types/IntegerType.php deleted file mode 100644 index bac9b3f..0000000 --- a/framework/library/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; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/JsonArrayType.php b/framework/library/Doctrine/DBAL/Types/JsonArrayType.php deleted file mode 100644 index ca00557..0000000 --- a/framework/library/Doctrine/DBAL/Types/JsonArrayType.php +++ /dev/null @@ -1,66 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Array Type which can be used to generate json arrays. - * - * @since 2.3 - * @author Johannes M. Schmitt - */ -class JsonArrayType extends Type -{ - public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getClobTypeDeclarationSQL($fieldDeclaration); - } - - public function convertToDatabaseValue($value, AbstractPlatform $platform) - { - if (null === $value) { - return null; - } - - return json_encode($value); - } - - public function convertToPHPValue($value, AbstractPlatform $platform) - { - if ($value === null) { - return array(); - } - - $value = (is_resource($value)) ? stream_get_contents($value) : $value; - - return json_decode($value, true); - } - - public function getName() - { - return Type::JSON_ARRAY; - } - - public function requiresSQLCommentHint(AbstractPlatform $platform) - { - return true; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/ObjectType.php b/framework/library/Doctrine/DBAL/Types/ObjectType.php deleted file mode 100644 index 9510d29..0000000 --- a/framework/library/Doctrine/DBAL/Types/ObjectType.php +++ /dev/null @@ -1,64 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Type that maps a PHP object to a clob SQL type. - * - * @since 2.0 - */ -class ObjectType 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) - { - if ($value === null) { - return null; - } - - $value = (is_resource($value)) ? stream_get_contents($value) : $value; - $val = unserialize($value); - if ($val === false && $value !== 'b:0;') { - throw ConversionException::conversionFailed($value, $this->getName()); - } - return $val; - } - - public function getName() - { - return Type::OBJECT; - } - - public function requiresSQLCommentHint(AbstractPlatform $platform) - { - return true; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/SimpleArrayType.php b/framework/library/Doctrine/DBAL/Types/SimpleArrayType.php deleted file mode 100644 index 719d7f1..0000000 --- a/framework/library/Doctrine/DBAL/Types/SimpleArrayType.php +++ /dev/null @@ -1,69 +0,0 @@ -. - */ - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Array Type which can be used for simple values. - * - * Only use this type if you are sure that your values cannot contain a ",". - * - * @since 2.3 - * @author Johannes M. Schmitt - */ -class SimpleArrayType extends Type -{ - public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - return $platform->getClobTypeDeclarationSQL($fieldDeclaration); - } - - public function convertToDatabaseValue($value, AbstractPlatform $platform) - { - if (!$value) { - return null; - } - - return implode(',', $value); - } - - public function convertToPHPValue($value, AbstractPlatform $platform) - { - if ($value === null) { - return array(); - } - - $value = (is_resource($value)) ? stream_get_contents($value) : $value; - - return explode(',', $value); - } - - public function getName() - { - return Type::SIMPLE_ARRAY; - } - - public function requiresSQLCommentHint(AbstractPlatform $platform) - { - return true; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/SmallIntType.php b/framework/library/Doctrine/DBAL/Types/SmallIntType.php deleted file mode 100644 index 97e9aaf..0000000 --- a/framework/library/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 (null === $value) ? null : (int) $value; - } - - public function getBindingType() - { - return \PDO::PARAM_INT; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/StringType.php b/framework/library/Doctrine/DBAL/Types/StringType.php deleted file mode 100644 index 48c76d6..0000000 --- a/framework/library/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; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/TextType.php b/framework/library/Doctrine/DBAL/Types/TextType.php deleted file mode 100644 index 98ecbe6..0000000 --- a/framework/library/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; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/TimeType.php b/framework/library/Doctrine/DBAL/Types/TimeType.php deleted file mode 100644 index 8653750..0000000 --- a/framework/library/Doctrine/DBAL/Types/TimeType.php +++ /dev/null @@ -1,68 +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) - { - if ($value === null || $value instanceof \DateTime) { - return $value; - } - - $val = \DateTime::createFromFormat($platform->getTimeFormatString(), $value); - if ( ! $val) { - throw ConversionException::conversionFailedFormat($value, $this->getName(), $platform->getTimeFormatString()); - } - return $val; - } -} diff --git a/framework/library/Doctrine/DBAL/Types/Type.php b/framework/library/Doctrine/DBAL/Types/Type.php deleted file mode 100644 index 29947be..0000000 --- a/framework/library/Doctrine/DBAL/Types/Type.php +++ /dev/null @@ -1,306 +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 - * @author Benjamin Eberlei - * @since 2.0 - */ -abstract class Type -{ - const TARRAY = 'array'; - const SIMPLE_ARRAY = 'simple_array'; - const JSON_ARRAY = 'json_array'; - const BIGINT = 'bigint'; - const BOOLEAN = 'boolean'; - const DATETIME = 'datetime'; - const DATETIMETZ = 'datetimetz'; - const DATE = 'date'; - const TIME = 'time'; - const DECIMAL = 'decimal'; - const INTEGER = 'integer'; - const OBJECT = 'object'; - const SMALLINT = 'smallint'; - const STRING = 'string'; - const TEXT = 'text'; - const BLOB = 'blob'; - const FLOAT = 'float'; - const GUID = 'guid'; - - /** 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::SIMPLE_ARRAY => 'Doctrine\DBAL\Types\SimpleArrayType', - self::JSON_ARRAY => 'Doctrine\DBAL\Types\JsonArrayType', - 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::DATETIMETZ => 'Doctrine\DBAL\Types\DateTimeTzType', - self::DATE => 'Doctrine\DBAL\Types\DateType', - self::TIME => 'Doctrine\DBAL\Types\TimeType', - self::DECIMAL => 'Doctrine\DBAL\Types\DecimalType', - self::FLOAT => 'Doctrine\DBAL\Types\FloatType', - self::BLOB => 'Doctrine\DBAL\Types\BlobType', - self::GUID => 'Doctrine\DBAL\Types\GuidType', - ); - - /* 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); - } - - if (isset(self::$_typeObjects[$name])) { - unset(self::$_typeObjects[$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)); - } - - /** - * Does working with this column require SQL conversion functions? - * - * This is a metadata function that is required for example in the ORM. - * Usage of {@link convertToDatabaseValueSQL} and - * {@link convertToPHPValueSQL} works for any type and mostly - * does nothing. This method can additionally be used for optimization purposes. - * - * @return bool - */ - public function canRequireSQLConversion() - { - return false; - } - - /** - * Modifies the SQL expression (identifier, parameter) to convert to a database value. - * - * @param string $sqlExpr - * @param AbstractPlatform $platform - * @return string - */ - public function convertToDatabaseValueSQL($sqlExpr, AbstractPlatform $platform) - { - return $sqlExpr; - } - - /** - * Modifies the SQL expression (identifier, parameter) to convert to a PHP value. - * - * @param string $sqlExpr - * @param AbstractPlatform $platform - * @return string - */ - public function convertToPHPValueSQL($sqlExpr, $platform) - { - return $sqlExpr; - } - - /** - * Get an array of database types that map to this Doctrine type. - * - * @param AbstractPlatform $platform - * @return array - */ - public function getMappedDatabaseTypes(AbstractPlatform $platform) - { - return array(); - } - - /** - * If this Doctrine Type maps to an already mapped database type, - * reverse schema engineering can't take them apart. You need to mark - * one of those types as commented, which will have Doctrine use an SQL - * comment to typehint the actual Doctrine Type. - * - * @param AbstractPlatform $platform - * @return bool - */ - public function requiresSQLCommentHint(AbstractPlatform $platform) - { - return false; - } -} - diff --git a/framework/library/Doctrine/DBAL/Types/VarDateTimeType.php b/framework/library/Doctrine/DBAL/Types/VarDateTimeType.php deleted file mode 100644 index 7085822..0000000 --- a/framework/library/Doctrine/DBAL/Types/VarDateTimeType.php +++ /dev/null @@ -1,60 +0,0 @@ -. - */ - - -namespace Doctrine\DBAL\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * Variable DateTime Type using date_create() instead of DateTime::createFromFormat() - * - * This type has performance implications as it runs twice as long as the regular - * {@see DateTimeType}, however in certain PostgreSQL configurations with - * TIMESTAMP(n) columns where n > 0 it is necessary to use this type. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class VarDateTimeType extends DateTimeType -{ - /** - * @throws ConversionException - * @param string $value - * @param AbstractPlatform $platform - * @return \DateTime - */ - public function convertToPHPValue($value, AbstractPlatform $platform) - { - if ($value === null || $value instanceof \DateTime) { - return $value; - } - - $val = date_create($value); - if ( ! $val) { - throw ConversionException::conversionFailed($value, $this->getName()); - } - return $val; - } -} diff --git a/framework/library/Doctrine/DBAL/Version.php b/framework/library/Doctrine/DBAL/Version.php deleted file mode 100644 index 3637631..0000000 --- a/framework/library/Doctrine/DBAL/Version.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ - -namespace Doctrine\DBAL; - -/** - * Class to store and retrieve the version of Doctrine - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Version -{ - /** - * Current Doctrine Version - */ - const VERSION = '2.3.4'; - - /** - * Compares a Doctrine version with the current one. - * - * @param string $version Doctrine version to compare. - * @return int Returns -1 if older, 0 if it is the same, 1 if version - * passed as argument is newer. - */ - public static function compare($version) - { - $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); - $version = str_replace(' ', '', $version); - - return version_compare($version, $currentVersion); - } -} diff --git a/framework/library/Doctrine/ORM/AbstractQuery.php b/framework/library/Doctrine/ORM/AbstractQuery.php deleted file mode 100644 index 3a5edd9..0000000 --- a/framework/library/Doctrine/ORM/AbstractQuery.php +++ /dev/null @@ -1,825 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -use Doctrine\Common\Util\ClassUtils; -use Doctrine\Common\Collections\ArrayCollection; - -use Doctrine\DBAL\Types\Type; -use Doctrine\DBAL\Cache\QueryCacheProfile; - -use Doctrine\ORM\Query\QueryException; - -/** - * Base contract for ORM queries. Base class for Query and NativeQuery. - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Konsta Vesterinen - */ -abstract class AbstractQuery -{ - /* Hydration mode constants */ - /** - * Hydrates an object graph. This is the default behavior. - */ - const HYDRATE_OBJECT = 1; - /** - * Hydrates an array graph. - */ - const HYDRATE_ARRAY = 2; - /** - * Hydrates a flat, rectangular result set with scalar values. - */ - const HYDRATE_SCALAR = 3; - /** - * Hydrates a single scalar value. - */ - const HYDRATE_SINGLE_SCALAR = 4; - - /** - * Very simple object hydrator (optimized for performance). - */ - const HYDRATE_SIMPLEOBJECT = 5; - - /** - * @var \Doctrine\Common\Collections\ArrayCollection The parameter map of this query. - */ - protected $parameters; - - /** - * @var ResultSetMapping The user-specified ResultSetMapping to use. - */ - protected $_resultSetMapping; - - /** - * @var \Doctrine\ORM\EntityManager The entity manager used by this query object. - */ - protected $_em; - - /** - * @var array The map of query hints. - */ - protected $_hints = array(); - - /** - * @var integer The hydration mode. - */ - protected $_hydrationMode = self::HYDRATE_OBJECT; - - /** - * @param \Doctrine\DBAL\Cache\QueryCacheProfile - */ - protected $_queryCacheProfile; - - /** - * @var boolean Boolean value that indicates whether or not expire the result cache. - */ - protected $_expireResultCache = false; - - /** - * @param \Doctrine\DBAL\Cache\QueryCacheProfile - */ - protected $_hydrationCacheProfile; - - /** - * Initializes a new instance of a class derived from AbstractQuery. - * - * @param \Doctrine\ORM\EntityManager $entityManager - */ - public function __construct(EntityManager $em) - { - $this->_em = $em; - $this->parameters = new ArrayCollection(); - } - - /** - * Gets the SQL query that corresponds to this query object. - * The returned SQL syntax depends on the connection driver that is used - * by this query object at the time of this method call. - * - * @return string SQL query - */ - abstract public function getSQL(); - - /** - * Retrieves the associated EntityManager of this Query instance. - * - * @return \Doctrine\ORM\EntityManager - */ - public function getEntityManager() - { - return $this->_em; - } - - /** - * Frees the resources used by the query object. - * - * Resets Parameters, Parameter Types and Query Hints. - * - * @return void - */ - public function free() - { - $this->parameters = new ArrayCollection(); - - $this->_hints = array(); - } - - /** - * Get all defined parameters. - * - * @return \Doctrine\Common\Collections\ArrayCollection The defined query parameters. - */ - public function getParameters() - { - return $this->parameters; - } - - /** - * Gets a query parameter. - * - * @param mixed $key The key (index or name) of the bound parameter. - * - * @return mixed The value of the bound parameter. - */ - public function getParameter($key) - { - $filteredParameters = $this->parameters->filter( - function ($parameter) use ($key) - { - // Must not be identical because of string to integer conversion - return ($key == $parameter->getName()); - } - ); - - return count($filteredParameters) ? $filteredParameters->first() : null; - } - - /** - * Sets a collection of query parameters. - * - * @param \Doctrine\Common\Collections\ArrayCollection|array $parameters - * - * @return \Doctrine\ORM\AbstractQuery This query instance. - */ - public function setParameters($parameters) - { - // BC compatibility with 2.3- - if (is_array($parameters)) { - $parameterCollection = new ArrayCollection(); - - foreach ($parameters as $key => $value) { - $parameter = new Query\Parameter($key, $value); - - $parameterCollection->add($parameter); - } - - $parameters = $parameterCollection; - } - - $this->parameters = $parameters; - - return $this; - } - - /** - * Sets a query parameter. - * - * @param string|integer $key The parameter position or name. - * @param mixed $value The parameter value. - * @param string $type The parameter type. If specified, the given value will be run through - * the type conversion of this type. This is usually not needed for - * strings and numeric types. - * - * @return \Doctrine\ORM\AbstractQuery This query instance. - */ - public function setParameter($key, $value, $type = null) - { - $filteredParameters = $this->parameters->filter( - function ($parameter) use ($key) - { - // Must not be identical because of string to integer conversion - return ($key == $parameter->getName()); - } - ); - - if (count($filteredParameters)) { - $parameter = $filteredParameters->first(); - $parameter->setValue($value, $type); - - return $this; - } - - $parameter = new Query\Parameter($key, $value, $type); - - $this->parameters->add($parameter); - - return $this; - } - - /** - * Process an individual parameter value - * - * @param mixed $value - * @return array - */ - public function processParameterValue($value) - { - switch (true) { - case is_array($value): - foreach ($value as $key => $paramValue) { - $paramValue = $this->processParameterValue($paramValue); - $value[$key] = is_array($paramValue) ? $paramValue[key($paramValue)] : $paramValue; - } - - return $value; - - case is_object($value) && $this->_em->getMetadataFactory()->hasMetadataFor(ClassUtils::getClass($value)): - return $this->convertObjectParameterToScalarValue($value); - - default: - return $value; - } - } - - private function convertObjectParameterToScalarValue($value) - { - $class = $this->_em->getClassMetadata(get_class($value)); - - if ($class->isIdentifierComposite) { - throw new \InvalidArgumentException( - "Binding an entity with a composite primary key to a query is not supported. " . - "You should split the parameter into the explicit fields and bind them seperately." - ); - } - - $values = ($this->_em->getUnitOfWork()->getEntityState($value) === UnitOfWork::STATE_MANAGED) - ? $this->_em->getUnitOfWork()->getEntityIdentifier($value) - : $class->getIdentifierValues($value); - - $value = $values[$class->getSingleIdentifierFieldName()]; - - if (null === $value) { - throw new \InvalidArgumentException( - "Binding entities to query parameters only allowed for entities that have an identifier." - ); - } - - return $value; - } - - /** - * Sets the ResultSetMapping that should be used for hydration. - * - * @param ResultSetMapping $rsm - * @return \Doctrine\ORM\AbstractQuery - */ - public function setResultSetMapping(Query\ResultSetMapping $rsm) - { - $this->_resultSetMapping = $rsm; - - return $this; - } - - /** - * Set a cache profile for hydration caching. - * - * If no result cache driver is set in the QueryCacheProfile, the default - * result cache driver is used from the configuration. - * - * Important: Hydration caching does NOT register entities in the - * UnitOfWork when retrieved from the cache. Never use result cached - * entities for requests that also flush the EntityManager. If you want - * some form of caching with UnitOfWork registration you should use - * {@see AbstractQuery::setResultCacheProfile()}. - * - * @example - * $lifetime = 100; - * $resultKey = "abc"; - * $query->setHydrationCacheProfile(new QueryCacheProfile()); - * $query->setHydrationCacheProfile(new QueryCacheProfile($lifetime, $resultKey)); - * - * @param \Doctrine\DBAL\Cache\QueryCacheProfile $profile - * @return \Doctrine\ORM\AbstractQuery - */ - public function setHydrationCacheProfile(QueryCacheProfile $profile = null) - { - if ( ! $profile->getResultCacheDriver()) { - $resultCacheDriver = $this->_em->getConfiguration()->getHydrationCacheImpl(); - $profile = $profile->setResultCacheDriver($resultCacheDriver); - } - - $this->_hydrationCacheProfile = $profile; - - return $this; - } - - /** - * @return \Doctrine\DBAL\Cache\QueryCacheProfile - */ - public function getHydrationCacheProfile() - { - return $this->_hydrationCacheProfile; - } - - /** - * Set a cache profile for the result cache. - * - * If no result cache driver is set in the QueryCacheProfile, the default - * result cache driver is used from the configuration. - * - * @param \Doctrine\DBAL\Cache\QueryCacheProfile $profile - * @return \Doctrine\ORM\AbstractQuery - */ - public function setResultCacheProfile(QueryCacheProfile $profile = null) - { - if ( ! $profile->getResultCacheDriver()) { - $resultCacheDriver = $this->_em->getConfiguration()->getResultCacheImpl(); - $profile = $profile->setResultCacheDriver($resultCacheDriver); - } - - $this->_queryCacheProfile = $profile; - - return $this; - } - - /** - * Defines a cache driver to be used for caching result sets and implictly enables caching. - * - * @param \Doctrine\Common\Cache\Cache $driver Cache driver - * @return \Doctrine\ORM\AbstractQuery - */ - public function setResultCacheDriver($resultCacheDriver = null) - { - if ($resultCacheDriver !== null && ! ($resultCacheDriver instanceof \Doctrine\Common\Cache\Cache)) { - throw ORMException::invalidResultCacheDriver(); - } - - $this->_queryCacheProfile = $this->_queryCacheProfile - ? $this->_queryCacheProfile->setResultCacheDriver($resultCacheDriver) - : new QueryCacheProfile(0, null, $resultCacheDriver); - - return $this; - } - - /** - * Returns the cache driver used for caching result sets. - * - * @deprecated - * @return \Doctrine\Common\Cache\Cache Cache driver - */ - public function getResultCacheDriver() - { - if ($this->_queryCacheProfile && $this->_queryCacheProfile->getResultCacheDriver()) { - return $this->_queryCacheProfile->getResultCacheDriver(); - } - - return $this->_em->getConfiguration()->getResultCacheImpl(); - } - - /** - * Set whether or not to cache the results of this query and if so, for - * how long and which ID to use for the cache entry. - * - * @param boolean $bool - * @param integer $lifetime - * @param string $resultCacheId - * @return \Doctrine\ORM\AbstractQuery This query instance. - */ - public function useResultCache($bool, $lifetime = null, $resultCacheId = null) - { - if ($bool) { - $this->setResultCacheLifetime($lifetime); - $this->setResultCacheId($resultCacheId); - - return $this; - } - - $this->_queryCacheProfile = null; - - return $this; - } - - /** - * Defines how long the result cache will be active before expire. - * - * @param integer $lifetime How long the cache entry is valid. - * @return \Doctrine\ORM\AbstractQuery This query instance. - */ - public function setResultCacheLifetime($lifetime) - { - $lifetime = ($lifetime !== null) ? (int) $lifetime : 0; - - $this->_queryCacheProfile = $this->_queryCacheProfile - ? $this->_queryCacheProfile->setLifetime($lifetime) - : new QueryCacheProfile($lifetime, null, $this->_em->getConfiguration()->getResultCacheImpl()); - - return $this; - } - - /** - * Retrieves the lifetime of resultset cache. - * - * @deprecated - * @return integer - */ - public function getResultCacheLifetime() - { - return $this->_queryCacheProfile ? $this->_queryCacheProfile->getLifetime() : 0; - } - - /** - * Defines if the result cache is active or not. - * - * @param boolean $expire Whether or not to force resultset cache expiration. - * @return \Doctrine\ORM\AbstractQuery This query instance. - */ - public function expireResultCache($expire = true) - { - $this->_expireResultCache = $expire; - - return $this; - } - - /** - * Retrieves if the resultset cache is active or not. - * - * @return boolean - */ - public function getExpireResultCache() - { - return $this->_expireResultCache; - } - - /** - * @return QueryCacheProfile - */ - public function getQueryCacheProfile() - { - return $this->_queryCacheProfile; - } - - /** - * Change the default fetch mode of an association for this query. - * - * $fetchMode can be one of ClassMetadata::FETCH_EAGER or ClassMetadata::FETCH_LAZY - * - * @param string $class - * @param string $assocName - * @param int $fetchMode - * @return AbstractQuery - */ - public function setFetchMode($class, $assocName, $fetchMode) - { - if ($fetchMode !== Mapping\ClassMetadata::FETCH_EAGER) { - $fetchMode = Mapping\ClassMetadata::FETCH_LAZY; - } - - $this->_hints['fetchMode'][$class][$assocName] = $fetchMode; - - return $this; - } - - /** - * Defines the processing mode to be used during hydration / result set transformation. - * - * @param integer $hydrationMode Doctrine processing mode to be used during hydration process. - * One of the Query::HYDRATE_* constants. - * @return \Doctrine\ORM\AbstractQuery This query instance. - */ - public function setHydrationMode($hydrationMode) - { - $this->_hydrationMode = $hydrationMode; - - return $this; - } - - /** - * Gets the hydration mode currently used by the query. - * - * @return integer - */ - public function getHydrationMode() - { - return $this->_hydrationMode; - } - - /** - * Gets the list of results for the query. - * - * Alias for execute(null, $hydrationMode = HYDRATE_OBJECT). - * - * @return array - */ - public function getResult($hydrationMode = self::HYDRATE_OBJECT) - { - return $this->execute(null, $hydrationMode); - } - - /** - * Gets the array of results for the query. - * - * Alias for execute(null, HYDRATE_ARRAY). - * - * @return array - */ - public function getArrayResult() - { - return $this->execute(null, self::HYDRATE_ARRAY); - } - - /** - * Gets the scalar results for the query. - * - * Alias for execute(null, HYDRATE_SCALAR). - * - * @return array - */ - public function getScalarResult() - { - return $this->execute(null, self::HYDRATE_SCALAR); - } - - /** - * Get exactly one result or null. - * - * @throws NonUniqueResultException - * @param int $hydrationMode - * @return mixed - */ - public function getOneOrNullResult($hydrationMode = null) - { - $result = $this->execute(null, $hydrationMode); - - if ($this->_hydrationMode !== self::HYDRATE_SINGLE_SCALAR && ! $result) { - return null; - } - - if ( ! is_array($result)) { - return $result; - } - - if (count($result) > 1) { - throw new NonUniqueResultException; - } - - return array_shift($result); - } - - /** - * Gets the single result of the query. - * - * Enforces the presence as well as the uniqueness of the result. - * - * If the result is not unique, a NonUniqueResultException is thrown. - * If there is no result, a NoResultException is thrown. - * - * @param integer $hydrationMode - * @return mixed - * @throws NonUniqueResultException If the query result is not unique. - * @throws NoResultException If the query returned no result. - */ - public function getSingleResult($hydrationMode = null) - { - $result = $this->execute(null, $hydrationMode); - - if ($this->_hydrationMode !== self::HYDRATE_SINGLE_SCALAR && ! $result) { - throw new NoResultException; - } - - if ( ! is_array($result)) { - return $result; - } - - if (count($result) > 1) { - throw new NonUniqueResultException; - } - - return array_shift($result); - } - - /** - * Gets the single scalar result of the query. - * - * Alias for getSingleResult(HYDRATE_SINGLE_SCALAR). - * - * @return mixed - * @throws QueryException If the query result is not unique. - */ - public function getSingleScalarResult() - { - return $this->getSingleResult(self::HYDRATE_SINGLE_SCALAR); - } - - /** - * Sets a query hint. If the hint name is not recognized, it is silently ignored. - * - * @param string $name The name of the hint. - * @param mixed $value The value of the hint. - * @return \Doctrine\ORM\AbstractQuery - */ - public function setHint($name, $value) - { - $this->_hints[$name] = $value; - - return $this; - } - - /** - * Gets the value of a query hint. If the hint name is not recognized, FALSE is returned. - * - * @param string $name The name of the hint. - * @return mixed The value of the hint or FALSE, if the hint name is not recognized. - */ - public function getHint($name) - { - return isset($this->_hints[$name]) ? $this->_hints[$name] : false; - } - - /** - * Return the key value map of query hints that are currently set. - * - * @return array - */ - public function getHints() - { - return $this->_hints; - } - - /** - * Executes the query and returns an IterableResult that can be used to incrementally - * iterate over the result. - * - * @param \Doctrine\Common\Collections\ArrayCollection|array $parameters The query parameters. - * @param integer $hydrationMode The hydration mode to use. - * @return \Doctrine\ORM\Internal\Hydration\IterableResult - */ - public function iterate($parameters = null, $hydrationMode = null) - { - if ($hydrationMode !== null) { - $this->setHydrationMode($hydrationMode); - } - - if ( ! empty($parameters)) { - $this->setParameters($parameters); - } - - $stmt = $this->_doExecute(); - - return $this->_em->newHydrator($this->_hydrationMode)->iterate( - $stmt, $this->_resultSetMapping, $this->_hints - ); - } - - /** - * Executes the query. - * - * @param \Doctrine\Common\Collections\ArrayCollection|array $parameters Query parameters. - * @param integer $hydrationMode Processing mode to be used during the hydration process. - * @return mixed - */ - public function execute($parameters = null, $hydrationMode = null) - { - if ($hydrationMode !== null) { - $this->setHydrationMode($hydrationMode); - } - - if ( ! empty($parameters)) { - $this->setParameters($parameters); - } - - $setCacheEntry = function() {}; - - if ($this->_hydrationCacheProfile !== null) { - list($cacheKey, $realCacheKey) = $this->getHydrationCacheId(); - - $queryCacheProfile = $this->getHydrationCacheProfile(); - $cache = $queryCacheProfile->getResultCacheDriver(); - $result = $cache->fetch($cacheKey); - - if (isset($result[$realCacheKey])) { - return $result[$realCacheKey]; - } - - if ( ! $result) { - $result = array(); - } - - $setCacheEntry = function($data) use ($cache, $result, $cacheKey, $realCacheKey, $queryCacheProfile) { - $result[$realCacheKey] = $data; - - $cache->save($cacheKey, $result, $queryCacheProfile->getLifetime()); - }; - } - - $stmt = $this->_doExecute(); - - if (is_numeric($stmt)) { - $setCacheEntry($stmt); - - return $stmt; - } - - $data = $this->_em->getHydrator($this->_hydrationMode)->hydrateAll( - $stmt, $this->_resultSetMapping, $this->_hints - ); - - $setCacheEntry($data); - - return $data; - } - - /** - * Get the result cache id to use to store the result set cache entry. - * Will return the configured id if it exists otherwise a hash will be - * automatically generated for you. - * - * @return array ($key, $hash) - */ - protected function getHydrationCacheId() - { - $parameters = array(); - - foreach ($this->getParameters() as $parameter) { - $parameters[$parameter->getName()] = $this->processParameterValue($parameter->getValue()); - } - - $sql = $this->getSQL(); - $queryCacheProfile = $this->getHydrationCacheProfile(); - $hints = $this->getHints(); - $hints['hydrationMode'] = $this->getHydrationMode(); - - ksort($hints); - - return $queryCacheProfile->generateCacheKeys($sql, $parameters, $hints); - } - - /** - * Set the result cache id to use to store the result set cache entry. - * If this is not explicitly set by the developer then a hash is automatically - * generated for you. - * - * @param string $id - * @return \Doctrine\ORM\AbstractQuery This query instance. - */ - public function setResultCacheId($id) - { - $this->_queryCacheProfile = $this->_queryCacheProfile - ? $this->_queryCacheProfile->setCacheKey($id) - : new QueryCacheProfile(0, $id, $this->_em->getConfiguration()->getResultCacheImpl()); - - return $this; - } - - /** - * Get the result cache id to use to store the result set cache entry if set. - * - * @deprecated - * @return string - */ - public function getResultCacheId() - { - return $this->_queryCacheProfile ? $this->_queryCacheProfile->getCacheKey() : null; - } - - /** - * Executes the query and returns a the resulting Statement object. - * - * @return \Doctrine\DBAL\Driver\Statement The executed database statement that holds the results. - */ - abstract protected function _doExecute(); - - /** - * Cleanup Query resource when clone is called. - * - * @return void - */ - public function __clone() - { - $this->parameters = new ArrayCollection(); - - $this->_hints = array(); - } -} diff --git a/framework/library/Doctrine/ORM/Configuration.php b/framework/library/Doctrine/ORM/Configuration.php deleted file mode 100644 index a835488..0000000 --- a/framework/library/Doctrine/ORM/Configuration.php +++ /dev/null @@ -1,683 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -use Doctrine\Common\Cache\Cache, - Doctrine\Common\Cache\ArrayCache, - Doctrine\Common\Annotations\AnnotationRegistry, - Doctrine\Common\Annotations\AnnotationReader, - Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, - Doctrine\ORM\Mapping\Driver\AnnotationDriver, - Doctrine\ORM\Mapping\QuoteStrategy, - Doctrine\ORM\Mapping\DefaultQuoteStrategy, - Doctrine\ORM\Mapping\NamingStrategy, - Doctrine\ORM\Mapping\DefaultNamingStrategy, - Doctrine\Common\Annotations\SimpleAnnotationReader, - Doctrine\Common\Annotations\CachedReader; - -/** - * Configuration container for all configuration options of Doctrine. - * It combines all configuration options from DBAL & ORM. - * - * @since 2.0 - * @internal When adding a new configuration option just write a getter/setter pair. - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Configuration extends \Doctrine\DBAL\Configuration -{ - /** - * Sets the directory where Doctrine generates any necessary proxy class files. - * - * @param string $dir - */ - public function setProxyDir($dir) - { - $this->_attributes['proxyDir'] = $dir; - } - - /** - * Gets the directory where Doctrine generates any necessary proxy class files. - * - * @return string - */ - public function getProxyDir() - { - return isset($this->_attributes['proxyDir']) - ? $this->_attributes['proxyDir'] - : null; - } - - /** - * Gets a boolean flag that indicates whether proxy classes should always be regenerated - * during each script execution. - * - * @return boolean - */ - public function getAutoGenerateProxyClasses() - { - return isset($this->_attributes['autoGenerateProxyClasses']) - ? $this->_attributes['autoGenerateProxyClasses'] - : true; - } - - /** - * Sets a boolean flag that indicates whether proxy classes should always be regenerated - * during each script execution. - * - * @param boolean $bool - */ - public function setAutoGenerateProxyClasses($bool) - { - $this->_attributes['autoGenerateProxyClasses'] = $bool; - } - - /** - * Gets the namespace where proxy classes reside. - * - * @return string - */ - public function getProxyNamespace() - { - return isset($this->_attributes['proxyNamespace']) - ? $this->_attributes['proxyNamespace'] - : null; - } - - /** - * Sets the namespace where proxy classes reside. - * - * @param string $ns - */ - public function setProxyNamespace($ns) - { - $this->_attributes['proxyNamespace'] = $ns; - } - - /** - * Sets the cache driver implementation that is used for metadata caching. - * - * @param MappingDriver $driverImpl - * @todo Force parameter to be a Closure to ensure lazy evaluation - * (as soon as a metadata cache is in effect, the driver never needs to initialize). - */ - public function setMetadataDriverImpl(MappingDriver $driverImpl) - { - $this->_attributes['metadataDriverImpl'] = $driverImpl; - } - - /** - * Add a new default annotation driver with a correctly configured annotation reader. If $useSimpleAnnotationReader - * is true, the notation `@Entity` will work, otherwise, the notation `@ORM\Entity` will be supported. - * - * @param array $paths - * @param bool $useSimpleAnnotationReader - * @return AnnotationDriver - */ - public function newDefaultAnnotationDriver($paths = array(), $useSimpleAnnotationReader = true) - { - AnnotationRegistry::registerFile(__DIR__ . '/Mapping/Driver/DoctrineAnnotations.php'); - - if ($useSimpleAnnotationReader) { - // Register the ORM Annotations in the AnnotationRegistry - $reader = new SimpleAnnotationReader(); - $reader->addNamespace('Doctrine\ORM\Mapping'); - $cachedReader = new CachedReader($reader, new ArrayCache()); - - return new AnnotationDriver($cachedReader, (array) $paths); - } - - return new AnnotationDriver( - new CachedReader(new AnnotationReader(), new ArrayCache()), - (array) $paths - ); - } - - /** - * Adds a namespace under a certain alias. - * - * @param string $alias - * @param string $namespace - */ - public function addEntityNamespace($alias, $namespace) - { - $this->_attributes['entityNamespaces'][$alias] = $namespace; - } - - /** - * Resolves a registered namespace alias to the full namespace. - * - * @param string $entityNamespaceAlias - * @throws ORMException - * @return string - */ - public function getEntityNamespace($entityNamespaceAlias) - { - if ( ! isset($this->_attributes['entityNamespaces'][$entityNamespaceAlias])) { - throw ORMException::unknownEntityNamespace($entityNamespaceAlias); - } - - return trim($this->_attributes['entityNamespaces'][$entityNamespaceAlias], '\\'); - } - - /** - * Set the entity alias map - * - * @param array $entityNamespaces - */ - public function setEntityNamespaces(array $entityNamespaces) - { - $this->_attributes['entityNamespaces'] = $entityNamespaces; - } - - /** - * Retrieves the list of registered entity namespace aliases. - * - * @return array - */ - public function getEntityNamespaces() - { - return $this->_attributes['entityNamespaces']; - } - - /** - * Gets the cache driver implementation that is used for the mapping metadata. - * - * @throws ORMException - * @return MappingDriver - */ - public function getMetadataDriverImpl() - { - return isset($this->_attributes['metadataDriverImpl']) - ? $this->_attributes['metadataDriverImpl'] - : null; - } - - /** - * Gets the cache driver implementation that is used for the query cache (SQL cache). - * - * @return \Doctrine\Common\Cache\Cache - */ - public function getQueryCacheImpl() - { - return isset($this->_attributes['queryCacheImpl']) - ? $this->_attributes['queryCacheImpl'] - : null; - } - - /** - * Sets the cache driver implementation that is used for the query cache (SQL cache). - * - * @param \Doctrine\Common\Cache\Cache $cacheImpl - */ - public function setQueryCacheImpl(Cache $cacheImpl) - { - $this->_attributes['queryCacheImpl'] = $cacheImpl; - } - - /** - * Gets the cache driver implementation that is used for the hydration cache (SQL cache). - * - * @return \Doctrine\Common\Cache\Cache - */ - public function getHydrationCacheImpl() - { - return isset($this->_attributes['hydrationCacheImpl']) - ? $this->_attributes['hydrationCacheImpl'] - : null; - } - - /** - * Sets the cache driver implementation that is used for the hydration cache (SQL cache). - * - * @param \Doctrine\Common\Cache\Cache $cacheImpl - */ - public function setHydrationCacheImpl(Cache $cacheImpl) - { - $this->_attributes['hydrationCacheImpl'] = $cacheImpl; - } - - /** - * Gets the cache driver implementation that is used for metadata caching. - * - * @return \Doctrine\Common\Cache\Cache - */ - public function getMetadataCacheImpl() - { - return isset($this->_attributes['metadataCacheImpl']) - ? $this->_attributes['metadataCacheImpl'] - : null; - } - - /** - * Sets the cache driver implementation that is used for metadata caching. - * - * @param \Doctrine\Common\Cache\Cache $cacheImpl - */ - public function setMetadataCacheImpl(Cache $cacheImpl) - { - $this->_attributes['metadataCacheImpl'] = $cacheImpl; - } - - /** - * Adds a named DQL query to the configuration. - * - * @param string $name The name of the query. - * @param string $dql The DQL query string. - */ - public function addNamedQuery($name, $dql) - { - $this->_attributes['namedQueries'][$name] = $dql; - } - - /** - * Gets a previously registered named DQL query. - * - * @param string $name The name of the query. - * @throws ORMException - * @return string The DQL query. - */ - public function getNamedQuery($name) - { - if ( ! isset($this->_attributes['namedQueries'][$name])) { - throw ORMException::namedQueryNotFound($name); - } - - return $this->_attributes['namedQueries'][$name]; - } - - /** - * Adds a named native query to the configuration. - * - * @param string $name The name of the query. - * @param string $sql The native SQL query string. - * @param Query\ResultSetMapping $rsm The ResultSetMapping used for the results of the SQL query. - */ - public function addNamedNativeQuery($name, $sql, Query\ResultSetMapping $rsm) - { - $this->_attributes['namedNativeQueries'][$name] = array($sql, $rsm); - } - - /** - * Gets the components of a previously registered named native query. - * - * @param string $name The name of the query. - * @throws ORMException - * @return array A tuple with the first element being the SQL string and the second - * element being the ResultSetMapping. - */ - public function getNamedNativeQuery($name) - { - if ( ! isset($this->_attributes['namedNativeQueries'][$name])) { - throw ORMException::namedNativeQueryNotFound($name); - } - - return $this->_attributes['namedNativeQueries'][$name]; - } - - /** - * Ensures that this Configuration instance contains settings that are - * suitable for a production environment. - * - * @throws ORMException If a configuration setting has a value that is not - * suitable for a production environment. - */ - public function ensureProductionSettings() - { - if ( ! $this->getQueryCacheImpl()) { - throw ORMException::queryCacheNotConfigured(); - } - - if ( ! $this->getMetadataCacheImpl()) { - throw ORMException::metadataCacheNotConfigured(); - } - - if ($this->getAutoGenerateProxyClasses()) { - throw ORMException::proxyClassesAlwaysRegenerating(); - } - } - - /** - * Registers a custom DQL function that produces a string value. - * Such a function can then be used in any DQL statement in any place where string - * functions are allowed. - * - * DQL function names are case-insensitive. - * - * @param string $name - * @param string $className - * @throws ORMException - */ - public function addCustomStringFunction($name, $className) - { - if (Query\Parser::isInternalFunction($name)) { - throw ORMException::overwriteInternalDQLFunctionNotAllowed($name); - } - - $this->_attributes['customStringFunctions'][strtolower($name)] = $className; - } - - /** - * Gets the implementation class name of a registered custom string DQL function. - * - * @param string $name - * @return string - */ - public function getCustomStringFunction($name) - { - $name = strtolower($name); - - return isset($this->_attributes['customStringFunctions'][$name]) - ? $this->_attributes['customStringFunctions'][$name] - : null; - } - - /** - * Sets a map of custom DQL string functions. - * - * Keys must be function names and values the FQCN of the implementing class. - * The function names will be case-insensitive in DQL. - * - * Any previously added string functions are discarded. - * - * @param array $functions The map of custom DQL string functions. - */ - public function setCustomStringFunctions(array $functions) - { - foreach ($functions as $name => $className) { - $this->addCustomStringFunction($name, $className); - } - } - - /** - * Registers a custom DQL function that produces a numeric value. - * Such a function can then be used in any DQL statement in any place where numeric - * functions are allowed. - * - * DQL function names are case-insensitive. - * - * @param string $name - * @param string $className - * @throws ORMException - */ - public function addCustomNumericFunction($name, $className) - { - if (Query\Parser::isInternalFunction($name)) { - throw ORMException::overwriteInternalDQLFunctionNotAllowed($name); - } - - $this->_attributes['customNumericFunctions'][strtolower($name)] = $className; - } - - /** - * Gets the implementation class name of a registered custom numeric DQL function. - * - * @param string $name - * @return string - */ - public function getCustomNumericFunction($name) - { - $name = strtolower($name); - - return isset($this->_attributes['customNumericFunctions'][$name]) - ? $this->_attributes['customNumericFunctions'][$name] - : null; - } - - /** - * Sets a map of custom DQL numeric functions. - * - * Keys must be function names and values the FQCN of the implementing class. - * The function names will be case-insensitive in DQL. - * - * Any previously added numeric functions are discarded. - * - * @param array $functions The map of custom DQL numeric functions. - */ - public function setCustomNumericFunctions(array $functions) - { - foreach ($functions as $name => $className) { - $this->addCustomNumericFunction($name, $className); - } - } - - /** - * Registers a custom DQL function that produces a date/time value. - * Such a function can then be used in any DQL statement in any place where date/time - * functions are allowed. - * - * DQL function names are case-insensitive. - * - * @param string $name - * @param string $className - * @throws ORMException - */ - public function addCustomDatetimeFunction($name, $className) - { - if (Query\Parser::isInternalFunction($name)) { - throw ORMException::overwriteInternalDQLFunctionNotAllowed($name); - } - - $this->_attributes['customDatetimeFunctions'][strtolower($name)] = $className; - } - - /** - * Gets the implementation class name of a registered custom date/time DQL function. - * - * @param string $name - * @return string - */ - public function getCustomDatetimeFunction($name) - { - $name = strtolower($name); - - return isset($this->_attributes['customDatetimeFunctions'][$name]) - ? $this->_attributes['customDatetimeFunctions'][$name] - : null; - } - - /** - * Sets a map of custom DQL date/time functions. - * - * Keys must be function names and values the FQCN of the implementing class. - * The function names will be case-insensitive in DQL. - * - * Any previously added date/time functions are discarded. - * - * @param array $functions The map of custom DQL date/time functions. - */ - public function setCustomDatetimeFunctions(array $functions) - { - foreach ($functions as $name => $className) { - $this->addCustomDatetimeFunction($name, $className); - } - } - - /** - * Set the custom hydrator modes in one pass. - * - * @param array An array of ($modeName => $hydrator) - */ - public function setCustomHydrationModes($modes) - { - $this->_attributes['customHydrationModes'] = array(); - - foreach ($modes as $modeName => $hydrator) { - $this->addCustomHydrationMode($modeName, $hydrator); - } - } - - /** - * 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; - } - - /** - * Set a class metadata factory. - * - * @param string $cmfName - */ - public function setClassMetadataFactoryName($cmfName) - { - $this->_attributes['classMetadataFactoryName'] = $cmfName; - } - - /** - * @return string - */ - public function getClassMetadataFactoryName() - { - if ( ! isset($this->_attributes['classMetadataFactoryName'])) { - $this->_attributes['classMetadataFactoryName'] = 'Doctrine\ORM\Mapping\ClassMetadataFactory'; - } - - return $this->_attributes['classMetadataFactoryName']; - } - - /** - * Add a filter to the list of possible filters. - * - * @param string $name The name of the filter. - * @param string $className The class name of the filter. - */ - public function addFilter($name, $className) - { - $this->_attributes['filters'][$name] = $className; - } - - /** - * Gets the class name for a given filter name. - * - * @param string $name The name of the filter. - * - * @return string The class name of the filter, or null of it is not - * defined. - */ - public function getFilterClassName($name) - { - return isset($this->_attributes['filters'][$name]) - ? $this->_attributes['filters'][$name] - : null; - } - - /** - * Set default repository class. - * - * @since 2.2 - * @param string $className - * @throws ORMException If not is a \Doctrine\Common\Persistence\ObjectRepository - */ - public function setDefaultRepositoryClassName($className) - { - $reflectionClass = new \ReflectionClass($className); - - if ( ! $reflectionClass->implementsInterface('Doctrine\Common\Persistence\ObjectRepository')) { - throw ORMException::invalidEntityRepository($className); - } - - $this->_attributes['defaultRepositoryClassName'] = $className; - } - - /** - * Get default repository class. - * - * @since 2.2 - * @return string - */ - public function getDefaultRepositoryClassName() - { - return isset($this->_attributes['defaultRepositoryClassName']) - ? $this->_attributes['defaultRepositoryClassName'] - : 'Doctrine\ORM\EntityRepository'; - } - - /** - * Set naming strategy. - * - * @since 2.3 - * @param NamingStrategy $namingStrategy - */ - public function setNamingStrategy(NamingStrategy $namingStrategy) - { - $this->_attributes['namingStrategy'] = $namingStrategy; - } - - /** - * Get naming strategy.. - * - * @since 2.3 - * @return NamingStrategy - */ - public function getNamingStrategy() - { - if ( ! isset($this->_attributes['namingStrategy'])) { - $this->_attributes['namingStrategy'] = new DefaultNamingStrategy(); - } - - return $this->_attributes['namingStrategy']; - } - - /** - * Set quote strategy. - * - * @since 2.3 - * @param Doctrine\ORM\Mapping\QuoteStrategy $quoteStrategy - */ - public function setQuoteStrategy(QuoteStrategy $quoteStrategy) - { - $this->_attributes['quoteStrategy'] = $quoteStrategy; - } - - /** - * Get quote strategy. - * - * @since 2.3 - * @return Doctrine\ORM\Mapping\QuoteStrategy - */ - public function getQuoteStrategy() - { - if ( ! isset($this->_attributes['quoteStrategy'])) { - $this->_attributes['quoteStrategy'] = new DefaultQuoteStrategy(); - } - - return $this->_attributes['quoteStrategy']; - } -} diff --git a/framework/library/Doctrine/ORM/EntityManager.php b/framework/library/Doctrine/ORM/EntityManager.php deleted file mode 100644 index 50e7382..0000000 --- a/framework/library/Doctrine/ORM/EntityManager.php +++ /dev/null @@ -1,902 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -use Exception, - Doctrine\Common\EventManager, - Doctrine\Common\Persistence\ObjectManager, - Doctrine\DBAL\Connection, - Doctrine\DBAL\LockMode, - Doctrine\ORM\Mapping\ClassMetadata, - Doctrine\ORM\Mapping\ClassMetadataFactory, - Doctrine\ORM\Query\ResultSetMapping, - Doctrine\ORM\Proxy\ProxyFactory, - Doctrine\ORM\Query\FilterCollection; - -/** - * The EntityManager is the central access point to ORM functionality. - * - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class EntityManager implements ObjectManager -{ - /** - * The used Configuration. - * - * @var \Doctrine\ORM\Configuration - */ - private $config; - - /** - * The database connection used by the EntityManager. - * - * @var \Doctrine\DBAL\Connection - */ - private $conn; - - /** - * The metadata factory, used to retrieve the ORM metadata of entity classes. - * - * @var \Doctrine\ORM\Mapping\ClassMetadataFactory - */ - private $metadataFactory; - - /** - * The EntityRepository instances. - * - * @var array - */ - private $repositories = array(); - - /** - * The UnitOfWork used to coordinate object-level transactions. - * - * @var \Doctrine\ORM\UnitOfWork - */ - private $unitOfWork; - - /** - * The event manager that is the central point of the event system. - * - * @var \Doctrine\Common\EventManager - */ - private $eventManager; - - /** - * The maintained (cached) hydrators. One instance per type. - * - * @var array - */ - private $hydrators = array(); - - /** - * The proxy factory used to create dynamic proxies. - * - * @var \Doctrine\ORM\Proxy\ProxyFactory - */ - private $proxyFactory; - - /** - * The expression builder instance used to generate query expressions. - * - * @var \Doctrine\ORM\Query\Expr - */ - private $expressionBuilder; - - /** - * Whether the EntityManager is closed or not. - * - * @var bool - */ - private $closed = false; - - /** - * Collection of query filters. - * - * @var Doctrine\ORM\Query\FilterCollection - */ - private $filterCollection; - - /** - * Creates a new EntityManager that operates on the given database connection - * and uses the given Configuration and EventManager implementations. - * - * @param \Doctrine\DBAL\Connection $conn - * @param \Doctrine\ORM\Configuration $config - * @param \Doctrine\Common\EventManager $eventManager - */ - protected function __construct(Connection $conn, Configuration $config, EventManager $eventManager) - { - $this->conn = $conn; - $this->config = $config; - $this->eventManager = $eventManager; - - $metadataFactoryClassName = $config->getClassMetadataFactoryName(); - - $this->metadataFactory = new $metadataFactoryClassName; - $this->metadataFactory->setEntityManager($this); - $this->metadataFactory->setCacheDriver($this->config->getMetadataCacheImpl()); - - $this->unitOfWork = new UnitOfWork($this); - $this->proxyFactory = new ProxyFactory( - $this, - $config->getProxyDir(), - $config->getProxyNamespace(), - $config->getAutoGenerateProxyClasses() - ); - } - - /** - * Gets the database connection object used by the EntityManager. - * - * @return \Doctrine\DBAL\Connection - */ - public function getConnection() - { - return $this->conn; - } - - /** - * Gets the metadata factory used to gather the metadata of classes. - * - * @return \Doctrine\ORM\Mapping\ClassMetadataFactory - */ - public function getMetadataFactory() - { - return $this->metadataFactory; - } - - /** - * Gets an ExpressionBuilder used for object-oriented construction of query expressions. - * - * Example: - * - * - * $qb = $em->createQueryBuilder(); - * $expr = $em->getExpressionBuilder(); - * $qb->select('u')->from('User', 'u') - * ->where($expr->orX($expr->eq('u.id', 1), $expr->eq('u.id', 2))); - * - * - * @return \Doctrine\ORM\Query\Expr - */ - public function getExpressionBuilder() - { - if ($this->expressionBuilder === null) { - $this->expressionBuilder = new Query\Expr; - } - - return $this->expressionBuilder; - } - - /** - * Starts a transaction on the underlying database connection. - */ - public function beginTransaction() - { - $this->conn->beginTransaction(); - } - - /** - * Executes a function in a transaction. - * - * The function gets passed this EntityManager instance as an (optional) parameter. - * - * {@link flush} is invoked prior to transaction commit. - * - * If an exception occurs during execution of the function or flushing or transaction commit, - * the transaction is rolled back, the EntityManager closed and the exception re-thrown. - * - * @param callable $func The function to execute transactionally. - * @return mixed Returns the non-empty value returned from the closure or true instead - */ - public function transactional($func) - { - if (!is_callable($func)) { - throw new \InvalidArgumentException('Expected argument of type "callable", got "' . gettype($func) . '"'); - } - - $this->conn->beginTransaction(); - - try { - $return = call_user_func($func, $this); - - $this->flush(); - $this->conn->commit(); - - return $return ?: true; - } catch (Exception $e) { - $this->close(); - $this->conn->rollback(); - - throw $e; - } - } - - /** - * Commits a transaction on the underlying database connection. - */ - public function commit() - { - $this->conn->commit(); - } - - /** - * Performs a rollback on the underlying database connection. - */ - public function rollback() - { - $this->conn->rollback(); - } - - /** - * Returns the ORM metadata descriptor for a class. - * - * The class name must be the fully-qualified class name without a leading backslash - * (as it is returned by get_class($obj)) or an aliased class name. - * - * Examples: - * MyProject\Domain\User - * sales:PriceRequest - * - * @return \Doctrine\ORM\Mapping\ClassMetadata - * @internal Performance-sensitive method. - */ - public function getClassMetadata($className) - { - return $this->metadataFactory->getMetadataFor($className); - } - - /** - * Creates a new Query object. - * - * @param string $dql The DQL string. - * @return \Doctrine\ORM\Query - */ - public function createQuery($dql = "") - { - $query = new Query($this); - - if ( ! empty($dql)) { - $query->setDql($dql); - } - - return $query; - } - - /** - * Creates a Query from a named query. - * - * @param string $name - * @return \Doctrine\ORM\Query - */ - public function createNamedQuery($name) - { - return $this->createQuery($this->config->getNamedQuery($name)); - } - - /** - * Creates a native SQL query. - * - * @param string $sql - * @param ResultSetMapping $rsm The ResultSetMapping to use. - * @return NativeQuery - */ - public function createNativeQuery($sql, ResultSetMapping $rsm) - { - $query = new NativeQuery($this); - - $query->setSql($sql); - $query->setResultSetMapping($rsm); - - return $query; - } - - /** - * Creates a NativeQuery from a named native query. - * - * @param string $name - * @return \Doctrine\ORM\NativeQuery - */ - public function createNamedNativeQuery($name) - { - list($sql, $rsm) = $this->config->getNamedNativeQuery($name); - - return $this->createNativeQuery($sql, $rsm); - } - - /** - * Create a QueryBuilder instance - * - * @return QueryBuilder $qb - */ - public function createQueryBuilder() - { - return new QueryBuilder($this); - } - - /** - * Flushes all changes to objects that have been queued up to now to the database. - * This effectively synchronizes the in-memory state of managed objects with the - * database. - * - * If an entity is explicitly passed to this method only this entity and - * the cascade-persist semantics + scheduled inserts/removals are synchronized. - * - * @param object $entity - * @throws \Doctrine\ORM\OptimisticLockException If a version check on an entity that - * makes use of optimistic locking fails. - */ - public function flush($entity = null) - { - $this->errorIfClosed(); - - $this->unitOfWork->commit($entity); - } - - /** - * Finds an Entity by its identifier. - * - * @param string $entityName - * @param mixed $id - * @param integer $lockMode - * @param integer $lockVersion - * - * @return object - */ - public function find($entityName, $id, $lockMode = LockMode::NONE, $lockVersion = null) - { - $class = $this->metadataFactory->getMetadataFor(ltrim($entityName, '\\')); - - if ( ! is_array($id)) { - $id = array($class->identifier[0] => $id); - } - - $sortedId = array(); - - foreach ($class->identifier as $identifier) { - if ( ! isset($id[$identifier])) { - throw ORMException::missingIdentifierField($class->name, $identifier); - } - - $sortedId[$identifier] = $id[$identifier]; - } - - $unitOfWork = $this->getUnitOfWork(); - - // Check identity map first - if (($entity = $unitOfWork->tryGetById($sortedId, $class->rootEntityName)) !== false) { - if ( ! ($entity instanceof $class->name)) { - return null; - } - - switch ($lockMode) { - case LockMode::OPTIMISTIC: - $this->lock($entity, $lockMode, $lockVersion); - break; - - case LockMode::PESSIMISTIC_READ: - case LockMode::PESSIMISTIC_WRITE: - $persister = $unitOfWork->getEntityPersister($class->name); - $persister->refresh($sortedId, $entity, $lockMode); - break; - } - - return $entity; // Hit! - } - - $persister = $unitOfWork->getEntityPersister($class->name); - - switch ($lockMode) { - case LockMode::NONE: - return $persister->load($sortedId); - - case LockMode::OPTIMISTIC: - if ( ! $class->isVersioned) { - throw OptimisticLockException::notVersioned($class->name); - } - - $entity = $persister->load($sortedId); - - $unitOfWork->lock($entity, $lockMode, $lockVersion); - - return $entity; - - default: - if ( ! $this->getConnection()->isTransactionActive()) { - throw TransactionRequiredException::transactionRequired(); - } - - return $persister->load($sortedId, null, null, array(), $lockMode); - } - } - - /** - * Gets a reference to the entity identified by the given type and identifier - * without actually loading it, if the entity is not yet loaded. - * - * @param string $entityName The name of the entity type. - * @param mixed $id The entity identifier. - * @return object The entity reference. - */ - public function getReference($entityName, $id) - { - $class = $this->metadataFactory->getMetadataFor(ltrim($entityName, '\\')); - - if ( ! is_array($id)) { - $id = array($class->identifier[0] => $id); - } - - $sortedId = array(); - - foreach ($class->identifier as $identifier) { - if ( ! isset($id[$identifier])) { - throw ORMException::missingIdentifierField($class->name, $identifier); - } - - $sortedId[$identifier] = $id[$identifier]; - } - - // Check identity map first, if its already in there just return it. - if (($entity = $this->unitOfWork->tryGetById($sortedId, $class->rootEntityName)) !== false) { - return ($entity instanceof $class->name) ? $entity : null; - } - - if ($class->subClasses) { - return $this->find($entityName, $sortedId); - } - - if ( ! is_array($sortedId)) { - $sortedId = array($class->identifier[0] => $sortedId); - } - - $entity = $this->proxyFactory->getProxy($class->name, $sortedId); - - $this->unitOfWork->registerManaged($entity, $sortedId, array()); - - return $entity; - } - - /** - * Gets a partial reference to the entity identified by the given type and identifier - * without actually loading it, if the entity is not yet loaded. - * - * The returned reference may be a partial object if the entity is not yet loaded/managed. - * If it is a partial object it will not initialize the rest of the entity state on access. - * Thus you can only ever safely access the identifier of an entity obtained through - * this method. - * - * The use-cases for partial references involve maintaining bidirectional associations - * without loading one side of the association or to update an entity without loading it. - * Note, however, that in the latter case the original (persistent) entity data will - * never be visible to the application (especially not event listeners) as it will - * never be loaded in the first place. - * - * @param string $entityName The name of the entity type. - * @param mixed $identifier The entity identifier. - * @return object The (partial) entity reference. - */ - public function getPartialReference($entityName, $identifier) - { - $class = $this->metadataFactory->getMetadataFor(ltrim($entityName, '\\')); - - // Check identity map first, if its already in there just return it. - if (($entity = $this->unitOfWork->tryGetById($identifier, $class->rootEntityName)) !== false) { - return ($entity instanceof $class->name) ? $entity : null; - } - - if ( ! is_array($identifier)) { - $identifier = array($class->identifier[0] => $identifier); - } - - $entity = $class->newInstance(); - - $class->setIdentifierValues($entity, $identifier); - - $this->unitOfWork->registerManaged($entity, $identifier, array()); - $this->unitOfWork->markReadOnly($entity); - - return $entity; - } - - /** - * Clears the EntityManager. All entities that are currently managed - * by this EntityManager become detached. - * - * @param string $entityName if given, only entities of this type will get detached - */ - public function clear($entityName = null) - { - $this->unitOfWork->clear($entityName); - } - - /** - * Closes the EntityManager. All entities that are currently managed - * by this EntityManager become detached. The EntityManager may no longer - * be used after it is closed. - */ - public function close() - { - $this->clear(); - - $this->closed = true; - } - - /** - * Tells the EntityManager to make an instance managed and persistent. - * - * The entity will be entered into the database at or before transaction - * commit or as a result of the flush operation. - * - * NOTE: The persist operation always considers entities that are not yet known to - * this EntityManager as NEW. Do not pass detached entities to the persist operation. - * - * @param object $object The instance to make managed and persistent. - */ - public function persist($entity) - { - if ( ! is_object($entity)) { - throw ORMInvalidArgumentException::invalidObject('EntityManager#persist()' , $entity); - } - - $this->errorIfClosed(); - - $this->unitOfWork->persist($entity); - } - - /** - * Removes an entity instance. - * - * A removed entity will be removed from the database at or before transaction commit - * or as a result of the flush operation. - * - * @param object $entity The entity instance to remove. - */ - public function remove($entity) - { - if ( ! is_object($entity)) { - throw ORMInvalidArgumentException::invalidObject('EntityManager#remove()' , $entity); - } - - $this->errorIfClosed(); - - $this->unitOfWork->remove($entity); - } - - /** - * Refreshes the persistent state of an entity from the database, - * overriding any local changes that have not yet been persisted. - * - * @param object $entity The entity to refresh. - */ - public function refresh($entity) - { - if ( ! is_object($entity)) { - throw ORMInvalidArgumentException::invalidObject('EntityManager#refresh()' , $entity); - } - - $this->errorIfClosed(); - - $this->unitOfWork->refresh($entity); - } - - /** - * Detaches an entity from the EntityManager, causing a managed entity to - * become detached. Unflushed changes made to the entity if any - * (including removal of the entity), will not be synchronized to the database. - * Entities which previously referenced the detached entity will continue to - * reference it. - * - * @param object $entity The entity to detach. - */ - public function detach($entity) - { - if ( ! is_object($entity)) { - throw ORMInvalidArgumentException::invalidObject('EntityManager#detach()' , $entity); - } - - $this->unitOfWork->detach($entity); - } - - /** - * Merges the state of a detached entity into the persistence context - * of this EntityManager and returns the managed copy of the entity. - * The entity passed to merge will not become associated/managed with this EntityManager. - * - * @param object $entity The detached entity to merge into the persistence context. - * @return object The managed copy of the entity. - */ - public function merge($entity) - { - if ( ! is_object($entity)) { - throw ORMInvalidArgumentException::invalidObject('EntityManager#merge()' , $entity); - } - - $this->errorIfClosed(); - - return $this->unitOfWork->merge($entity); - } - - /** - * Creates a copy of the given entity. Can create a shallow or a deep copy. - * - * @param object $entity The entity to copy. - * @return object The new entity. - * @todo Implementation need. This is necessary since $e2 = clone $e1; throws an E_FATAL when access anything on $e: - * Fatal error: Maximum function nesting level of '100' reached, aborting! - */ - public function copy($entity, $deep = false) - { - throw new \BadMethodCallException("Not implemented."); - } - - /** - * Acquire a lock on the given entity. - * - * @param object $entity - * @param int $lockMode - * @param int $lockVersion - * @throws OptimisticLockException - * @throws PessimisticLockException - */ - public function lock($entity, $lockMode, $lockVersion = null) - { - $this->unitOfWork->lock($entity, $lockMode, $lockVersion); - } - - /** - * Gets the repository for an entity class. - * - * @param string $entityName The name of the entity. - * @return EntityRepository The repository class. - */ - public function getRepository($entityName) - { - $entityName = ltrim($entityName, '\\'); - - if (isset($this->repositories[$entityName])) { - return $this->repositories[$entityName]; - } - - $metadata = $this->getClassMetadata($entityName); - $repositoryClassName = $metadata->customRepositoryClassName; - - if ($repositoryClassName === null) { - $repositoryClassName = $this->config->getDefaultRepositoryClassName(); - } - - $repository = new $repositoryClassName($this, $metadata); - - $this->repositories[$entityName] = $repository; - - return $repository; - } - - /** - * Determines whether an entity instance is managed in this EntityManager. - * - * @param object $entity - * @return boolean TRUE if this EntityManager currently manages the given entity, FALSE otherwise. - */ - public function contains($entity) - { - return $this->unitOfWork->isScheduledForInsert($entity) - || $this->unitOfWork->isInIdentityMap($entity) - && ! $this->unitOfWork->isScheduledForDelete($entity); - } - - /** - * Gets the EventManager used by the EntityManager. - * - * @return \Doctrine\Common\EventManager - */ - public function getEventManager() - { - return $this->eventManager; - } - - /** - * Gets the Configuration used by the EntityManager. - * - * @return \Doctrine\ORM\Configuration - */ - public function getConfiguration() - { - return $this->config; - } - - /** - * Throws an exception if the EntityManager is closed or currently not active. - * - * @throws ORMException If the EntityManager is closed. - */ - private function errorIfClosed() - { - if ($this->closed) { - throw ORMException::entityManagerClosed(); - } - } - - /** - * Check if the Entity manager is open or closed. - * - * @return bool - */ - public function isOpen() - { - return (!$this->closed); - } - - /** - * Gets the UnitOfWork used by the EntityManager to coordinate operations. - * - * @return \Doctrine\ORM\UnitOfWork - */ - public function getUnitOfWork() - { - return $this->unitOfWork; - } - - /** - * Gets a hydrator for the given hydration mode. - * - * This method caches the hydrator instances which is used for all queries that don't - * selectively iterate over the result. - * - * @param int $hydrationMode - * @return \Doctrine\ORM\Internal\Hydration\AbstractHydrator - */ - public function getHydrator($hydrationMode) - { - if ( ! isset($this->hydrators[$hydrationMode])) { - $this->hydrators[$hydrationMode] = $this->newHydrator($hydrationMode); - } - - return $this->hydrators[$hydrationMode]; - } - - /** - * Create a new instance for the given hydration mode. - * - * @param int $hydrationMode - * @return \Doctrine\ORM\Internal\Hydration\AbstractHydrator - */ - public function newHydrator($hydrationMode) - { - switch ($hydrationMode) { - case Query::HYDRATE_OBJECT: - return new Internal\Hydration\ObjectHydrator($this); - - case Query::HYDRATE_ARRAY: - return new Internal\Hydration\ArrayHydrator($this); - - case Query::HYDRATE_SCALAR: - return new Internal\Hydration\ScalarHydrator($this); - - case Query::HYDRATE_SINGLE_SCALAR: - return new Internal\Hydration\SingleScalarHydrator($this); - - case Query::HYDRATE_SIMPLEOBJECT: - return new Internal\Hydration\SimpleObjectHydrator($this); - - default: - if (($class = $this->config->getCustomHydrationMode($hydrationMode)) !== null) { - return new $class($this); - } - } - - throw ORMException::invalidHydrationMode($hydrationMode); - } - - /** - * Gets the proxy factory used by the EntityManager to create entity proxies. - * - * @return ProxyFactory - */ - public function getProxyFactory() - { - return $this->proxyFactory; - } - - /** - * Helper method to initialize a lazy loading proxy or persistent collection. - * - * This method is a no-op for other objects - * - * @param object $obj - */ - public function initializeObject($obj) - { - $this->unitOfWork->initializeObject($obj); - } - - /** - * Factory method to create EntityManager instances. - * - * @param mixed $conn An array with the connection parameters or an existing - * Connection instance. - * @param Configuration $config The Configuration instance to use. - * @param EventManager $eventManager The EventManager instance to use. - * @return EntityManager The created EntityManager. - */ - public static function create($conn, Configuration $config, EventManager $eventManager = null) - { - if ( ! $config->getMetadataDriverImpl()) { - throw ORMException::missingMappingDriverImpl(); - } - - switch (true) { - case (is_array($conn)): - $conn = \Doctrine\DBAL\DriverManager::getConnection( - $conn, $config, ($eventManager ?: new EventManager()) - ); - break; - - case ($conn instanceof Connection): - if ($eventManager !== null && $conn->getEventManager() !== $eventManager) { - throw ORMException::mismatchedEventManager(); - } - break; - - default: - throw new \InvalidArgumentException("Invalid argument: " . $conn); - } - - return new EntityManager($conn, $config, $conn->getEventManager()); - } - - /** - * Gets the enabled filters. - * - * @return FilterCollection The active filter collection. - */ - public function getFilters() - { - if (null === $this->filterCollection) { - $this->filterCollection = new FilterCollection($this); - } - - return $this->filterCollection; - } - - /** - * Checks whether the state of the filter collection is clean. - * - * @return boolean True, if the filter collection is clean. - */ - public function isFiltersStateClean() - { - return null === $this->filterCollection || $this->filterCollection->isClean(); - } - - /** - * Checks whether the Entity Manager has filters. - * - * @return True, if the EM has a filter collection. - */ - public function hasFilters() - { - return null !== $this->filterCollection; - } -} diff --git a/framework/library/Doctrine/ORM/EntityNotFoundException.php b/framework/library/Doctrine/ORM/EntityNotFoundException.php deleted file mode 100644 index 087c65d..0000000 --- a/framework/library/Doctrine/ORM/EntityNotFoundException.php +++ /dev/null @@ -1,34 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -/** - * Exception thrown when a Proxy fails to retrieve an Entity result. - * - * @author robo - * @since 2.0 - */ -class EntityNotFoundException extends ORMException -{ - public function __construct() - { - parent::__construct('Entity was not found.'); - } -} diff --git a/framework/library/Doctrine/ORM/EntityRepository.php b/framework/library/Doctrine/ORM/EntityRepository.php deleted file mode 100644 index fc5ae83..0000000 --- a/framework/library/Doctrine/ORM/EntityRepository.php +++ /dev/null @@ -1,277 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -use Doctrine\DBAL\LockMode; -use Doctrine\Common\Persistence\ObjectRepository; - -use Doctrine\Common\Collections\Selectable; -use Doctrine\Common\Collections\Criteria; -use Doctrine\Common\Collections\ArrayCollection; -use Doctrine\Common\Collections\ExpressionBuilder; - -/** - * An EntityRepository serves as a repository for entities with generic as well as - * business specific methods for retrieving entities. - * - * This class is designed for inheritance and users can subclass this class to - * write their own repositories with business-specific methods to locate entities. - * - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class EntityRepository implements ObjectRepository, Selectable -{ - /** - * @var string - */ - protected $_entityName; - - /** - * @var EntityManager - */ - protected $_em; - - /** - * @var \Doctrine\ORM\Mapping\ClassMetadata - */ - protected $_class; - - /** - * Initializes a new EntityRepository. - * - * @param EntityManager $em The EntityManager to use. - * @param ClassMetadata $classMetadata The class descriptor. - */ - public function __construct($em, Mapping\ClassMetadata $class) - { - $this->_entityName = $class->name; - $this->_em = $em; - $this->_class = $class; - } - - /** - * Create a new QueryBuilder instance that is prepopulated for this entity name - * - * @param string $alias - * @return QueryBuilder $qb - */ - public function createQueryBuilder($alias) - { - return $this->_em->createQueryBuilder() - ->select($alias) - ->from($this->_entityName, $alias); - } - - /** - * Create a new Query instance based on a predefined metadata named query. - * - * @param string $queryName - * @return Query - */ - public function createNamedQuery($queryName) - { - return $this->_em->createQuery($this->_class->getNamedQuery($queryName)); - } - - /** - * Creates a native SQL query. - * - * @param string $queryName - * @return NativeQuery - */ - public function createNativeNamedQuery($queryName) - { - $queryMapping = $this->_class->getNamedNativeQuery($queryName); - $rsm = new Query\ResultSetMappingBuilder($this->_em); - $rsm->addNamedNativeQueryMapping($this->_class, $queryMapping); - - return $this->_em->createNativeQuery($queryMapping['query'], $rsm); - } - - /** - * Clears the repository, causing all managed entities to become detached. - */ - public function clear() - { - $this->_em->clear($this->_class->rootEntityName); - } - - /** - * Finds an entity by its primary key / identifier. - * - * @param mixed $id The identifier. - * @param integer $lockMode - * @param integer $lockVersion - * - * @return object The entity. - */ - public function find($id, $lockMode = LockMode::NONE, $lockVersion = null) - { - return $this->_em->find($this->_entityName, $id, $lockMode, $lockVersion); - } - - /** - * Finds all entities in the repository. - * - * @return array The entities. - */ - public function findAll() - { - return $this->findBy(array()); - } - - /** - * Finds entities by a set of criteria. - * - * @param array $criteria - * @param array|null $orderBy - * @param int|null $limit - * @param int|null $offset - * @return array The objects. - */ - public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) - { - $persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName); - - return $persister->loadAll($criteria, $orderBy, $limit, $offset); - } - - /** - * Finds a single entity by a set of criteria. - * - * @param array $criteria - * @param array|null $orderBy - * @return object - */ - public function findOneBy(array $criteria, array $orderBy = null) - { - $persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName); - - return $persister->load($criteria, null, null, array(), 0, 1, $orderBy); - } - - /** - * Adds support for magic finders. - * - * @return array|object The found entity/entities. - * @throws BadMethodCallException If the method called is an invalid find* method - * or no find* method at all and therefore an invalid - * method call. - */ - public function __call($method, $arguments) - { - switch (true) { - case (0 === strpos($method, 'findBy')): - $by = substr($method, 6); - $method = 'findBy'; - break; - - case (0 === strpos($method, 'findOneBy')): - $by = substr($method, 9); - $method = 'findOneBy'; - break; - - default: - throw new \BadMethodCallException( - "Undefined method '$method'. The method name must start with ". - "either findBy or findOneBy!" - ); - } - - if (empty($arguments)) { - throw ORMException::findByRequiresParameter($method . $by); - } - - $fieldName = lcfirst(\Doctrine\Common\Util\Inflector::classify($by)); - - if ($this->_class->hasField($fieldName) || $this->_class->hasAssociation($fieldName)) { - switch (count($arguments)) { - case 1: - return $this->$method(array($fieldName => $arguments[0])); - - case 2: - return $this->$method(array($fieldName => $arguments[0]), $arguments[1]); - - case 3: - return $this->$method(array($fieldName => $arguments[0]), $arguments[1], $arguments[2]); - - case 4: - return $this->$method(array($fieldName => $arguments[0]), $arguments[1], $arguments[2], $arguments[3]); - - default: - // Do nothing - } - } - - throw ORMException::invalidFindByCall($this->_entityName, $fieldName, $method.$by); - } - - /** - * @return string - */ - protected function getEntityName() - { - return $this->_entityName; - } - - /** - * @return string - */ - public function getClassName() - { - return $this->getEntityName(); - } - - /** - * @return EntityManager - */ - protected function getEntityManager() - { - return $this->_em; - } - - /** - * @return Mapping\ClassMetadata - */ - protected function getClassMetadata() - { - return $this->_class; - } - - /** - * Select all elements from a selectable that match the expression and - * return a new collection containing these elements. - * - * @param \Doctrine\Common\Collections\Criteria $criteria - * - * @return \Doctrine\Common\Collections\Collection - */ - public function matching(Criteria $criteria) - { - $persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName); - - return new ArrayCollection($persister->loadCriteria($criteria)); - } -} - diff --git a/framework/library/Doctrine/ORM/Event/LifecycleEventArgs.php b/framework/library/Doctrine/ORM/Event/LifecycleEventArgs.php deleted file mode 100644 index 4346054..0000000 --- a/framework/library/Doctrine/ORM/Event/LifecycleEventArgs.php +++ /dev/null @@ -1,77 +0,0 @@ -. -*/ - -namespace Doctrine\ORM\Event; - -use Doctrine\Common\EventArgs; -use Doctrine\ORM\EntityManager; - -/** - * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions - * of entities. - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class LifecycleEventArgs extends EventArgs -{ - /** - * @var \Doctrine\ORM\EntityManager - */ - private $em; - - /** - * @var object - */ - private $entity; - - /** - * Constructor - * - * @param object $entity - * @param \Doctrine\ORM\EntityManager $em - */ - public function __construct($entity, EntityManager $em) - { - $this->entity = $entity; - $this->em = $em; - } - - /** - * Retrieve associated Entity. - * - * @return object - */ - public function getEntity() - { - return $this->entity; - } - - /** - * Retrieve associated EntityManager. - * - * @return \Doctrine\ORM\EntityManager - */ - public function getEntityManager() - { - return $this->em; - } -} diff --git a/framework/library/Doctrine/ORM/Event/LoadClassMetadataEventArgs.php b/framework/library/Doctrine/ORM/Event/LoadClassMetadataEventArgs.php deleted file mode 100644 index 4c2cb07..0000000 --- a/framework/library/Doctrine/ORM/Event/LoadClassMetadataEventArgs.php +++ /dev/null @@ -1,76 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Event; - -use Doctrine\Common\EventArgs; -use Doctrine\ORM\Mapping\ClassMetadataInfo; -use Doctrine\ORM\EntityManager; - -/** - * Class that holds event arguments for a loadMetadata event. - * - * @author Jonathan H. Wage - * @since 2.0 - */ -class LoadClassMetadataEventArgs extends EventArgs -{ - /** - * @var \Doctrine\ORM\Mapping\ClassMetadata - */ - private $classMetadata; - - /** - * @var \Doctrine\ORM\EntityManager - */ - private $em; - - /** - * Constructor. - * - * @param \Doctrine\ORM\Mapping\ClassMetadataInfo $classMetadata - * @param \Doctrine\ORM\EntityManager $em - */ - public function __construct(ClassMetadataInfo $classMetadata, EntityManager $em) - { - $this->classMetadata = $classMetadata; - $this->em = $em; - } - - /** - * Retrieve associated ClassMetadata. - * - * @return \Doctrine\ORM\Mapping\ClassMetadataInfo - */ - public function getClassMetadata() - { - return $this->classMetadata; - } - - /** - * Retrieve associated EntityManager. - * - * @return \Doctrine\ORM\EntityManager - */ - public function getEntityManager() - { - return $this->em; - } -} - diff --git a/framework/library/Doctrine/ORM/Event/OnClearEventArgs.php b/framework/library/Doctrine/ORM/Event/OnClearEventArgs.php deleted file mode 100644 index 309994f..0000000 --- a/framework/library/Doctrine/ORM/Event/OnClearEventArgs.php +++ /dev/null @@ -1,84 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Event; - -/** - * Provides event arguments for the onClear event. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class OnClearEventArgs extends \Doctrine\Common\EventArgs -{ - /** - * @var \Doctrine\ORM\EntityManager - */ - private $em; - - /** - * @var string - */ - private $entityClass; - - /** - * Constructor. - * - * @param \Doctrine\ORM\EntityManager $em - * @param string $entityClass Optional entity class - */ - public function __construct($em, $entityClass = null) - { - $this->em = $em; - $this->entityClass = $entityClass; - } - - /** - * Retrieve associated EntityManager. - * - * @return \Doctrine\ORM\EntityManager - */ - public function getEntityManager() - { - return $this->em; - } - - /** - * Name of the entity class that is cleared, or empty if all are cleared. - * - * @return string - */ - public function getEntityClass() - { - return $this->entityClass; - } - - /** - * Check if event clears all entities. - * - * @return bool - */ - public function clearsAllEntities() - { - return ($this->entityClass === null); - } -} diff --git a/framework/library/Doctrine/ORM/Event/OnFlushEventArgs.php b/framework/library/Doctrine/ORM/Event/OnFlushEventArgs.php deleted file mode 100644 index 1e18d2a..0000000 --- a/framework/library/Doctrine/ORM/Event/OnFlushEventArgs.php +++ /dev/null @@ -1,84 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Event; - -use Doctrine\ORM\EntityManager; - -/** - * Provides event arguments for the preFlush event. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class OnFlushEventArgs extends \Doctrine\Common\EventArgs -{ - /** - * @var Doctirne\ORM\EntityManager - */ - private $em; - - //private $entitiesToPersist = array(); - //private $entitiesToRemove = array(); - - /** - * Constructor. - * - * @param \Doctrine\ORM\EntityManager $em - */ - public function __construct(EntityManager $em) - { - $this->em = $em; - } - - /** - * Retrieve associated EntityManager. - * - * @return \Doctrine\ORM\EntityManager - */ - public function getEntityManager() - { - return $this->em; - } - - /* - public function addEntityToPersist($entity) - { - - } - - public function addEntityToRemove($entity) - { - - } - - public function addEntityToUpdate($entity) - { - - } - - public function getEntitiesToPersist() - { - return $this->_entitiesToPersist; - } - */ -} diff --git a/framework/library/Doctrine/ORM/Event/PostFlushEventArgs.php b/framework/library/Doctrine/ORM/Event/PostFlushEventArgs.php deleted file mode 100644 index 5f9735c..0000000 --- a/framework/library/Doctrine/ORM/Event/PostFlushEventArgs.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ -namespace Doctrine\ORM\Event; - -use Doctrine\ORM\EntityManager; -use Doctrine\Common\EventArgs; - -/** - * Provides event arguments for the postFlush event. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @author Daniel Freudenberger - */ -class PostFlushEventArgs extends EventArgs -{ - /** - * @var \Doctrine\ORM\EntityManager - */ - private $em; - - /** - * Constructor. - * - * @param \Doctrine\ORM\EntityManager $em - */ - public function __construct(EntityManager $em) - { - $this->em = $em; - } - - /** - * Retrieve associated EntityManager. - * - * @return \Doctrine\ORM\EntityManager - */ - public function getEntityManager() - { - return $this->em; - } -} diff --git a/framework/library/Doctrine/ORM/Event/PreFlushEventArgs.php b/framework/library/Doctrine/ORM/Event/PreFlushEventArgs.php deleted file mode 100644 index 82f2b7e..0000000 --- a/framework/library/Doctrine/ORM/Event/PreFlushEventArgs.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Event; - -/** - * Provides event arguments for the preFlush event. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.0 - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class PreFlushEventArgs extends \Doctrine\Common\EventArgs -{ - /** - * @var EntityManager - */ - private $_em; - - public function __construct($em) - { - $this->_em = $em; - } - - /** - * @return EntityManager - */ - public function getEntityManager() - { - return $this->_em; - } -} diff --git a/framework/library/Doctrine/ORM/Event/PreUpdateEventArgs.php b/framework/library/Doctrine/ORM/Event/PreUpdateEventArgs.php deleted file mode 100644 index 188417e..0000000 --- a/framework/library/Doctrine/ORM/Event/PreUpdateEventArgs.php +++ /dev/null @@ -1,129 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Event; - -use Doctrine\Common\EventArgs, - Doctrine\ORM\EntityManager; - -/** - * Class that holds event arguments for a preInsert/preUpdate event. - * - * @author Guilherme Blanco - * @author Roman Borschel - * @author Benjamin Eberlei - * @since 2.0 - */ -class PreUpdateEventArgs extends LifecycleEventArgs -{ - /** - * @var array - */ - private $entityChangeSet; - - /** - * Constructor. - * - * @param object $entity - * @param \Doctrine\ORM\EntityManager $em - * @param array $changeSet - */ - public function __construct($entity, EntityManager $em, array &$changeSet) - { - parent::__construct($entity, $em); - - $this->entityChangeSet = &$changeSet; - } - - /** - * Retrieve entity changeset. - * - * @return array - */ - public function getEntityChangeSet() - { - return $this->entityChangeSet; - } - - /** - * Check if field has a changeset. - * - * @return boolean - */ - public function hasChangedField($field) - { - return isset($this->entityChangeSet[$field]); - } - - /** - * Get the old value of the changeset of the changed field. - * - * @param string $field - * @return mixed - */ - public function getOldValue($field) - { - $this->assertValidField($field); - - return $this->entityChangeSet[$field][0]; - } - - /** - * Get the new value of the changeset of the changed field. - * - * @param string $field - * @return mixed - */ - public function getNewValue($field) - { - $this->assertValidField($field); - - return $this->entityChangeSet[$field][1]; - } - - /** - * Set the new value of this field. - * - * @param string $field - * @param mixed $value - */ - public function setNewValue($field, $value) - { - $this->assertValidField($field); - - $this->entityChangeSet[$field][1] = $value; - } - - /** - * Assert the field exists in changeset. - * - * @param string $field - */ - private function assertValidField($field) - { - if ( ! isset($this->entityChangeSet[$field])) { - throw new \InvalidArgumentException(sprintf( - 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.', - $field, - get_class($this->getEntity()) - )); - } - } -} - diff --git a/framework/library/Doctrine/ORM/Events.php b/framework/library/Doctrine/ORM/Events.php deleted file mode 100644 index 812a43e..0000000 --- a/framework/library/Doctrine/ORM/Events.php +++ /dev/null @@ -1,146 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -/** - * Container for all ORM events. - * - * This class cannot be instantiated. - * - * @author Roman Borschel - * @since 2.0 - */ -final class Events -{ - private function __construct() {} - /** - * The preRemove event occurs for a given entity before the respective - * EntityManager remove operation for that entity is executed. - * - * This is an entity lifecycle event. - * - * @var string - */ - const preRemove = 'preRemove'; - /** - * The postRemove event occurs for an entity after the entity has - * been deleted. It will be invoked after the database delete operations. - * - * This is an entity lifecycle event. - * - * @var string - */ - const postRemove = 'postRemove'; - /** - * The prePersist event occurs for a given entity before the respective - * EntityManager persist operation for that entity is executed. - * - * This is an entity lifecycle event. - * - * @var string - */ - const prePersist = 'prePersist'; - /** - * The postPersist event occurs for an entity after the entity has - * been made persistent. It will be invoked after the database insert operations. - * Generated primary key values are available in the postPersist event. - * - * This is an entity lifecycle event. - * - * @var string - */ - const postPersist = 'postPersist'; - /** - * The preUpdate event occurs before the database update operations to - * entity data. - * - * This is an entity lifecycle event. - * - * @var string - */ - const preUpdate = 'preUpdate'; - /** - * The postUpdate event occurs after the database update operations to - * entity data. - * - * This is an entity lifecycle event. - * - * @var string - */ - const postUpdate = 'postUpdate'; - /** - * The postLoad event occurs for an entity after the entity has been loaded - * into the current EntityManager from the database or after the refresh operation - * has been applied to it. - * - * Note that the postLoad event occurs for an entity before any associations have been - * initialized. Therefore it is not safe to access associations in a postLoad callback - * or event handler. - * - * This is an entity lifecycle event. - * - * @var string - */ - const postLoad = 'postLoad'; - /** - * The loadClassMetadata event occurs after the mapping metadata for a class - * has been loaded from a mapping source (annotations/xml/yaml). - * - * @var string - */ - const loadClassMetadata = 'loadClassMetadata'; - - /** - * The preFlush event occurs when the EntityManager#flush() operation is invoked, - * but before any changes to managed entites have been calculated. This event is - * always raised right after EntityManager#flush() call. - */ - const preFlush = 'preFlush'; - - /** - * The onFlush event occurs when the EntityManager#flush() operation is invoked, - * after any changes to managed entities have been determined but before any - * actual database operations are executed. The event is only raised if there is - * actually something to do for the underlying UnitOfWork. If nothing needs to be done, - * the onFlush event is not raised. - * - * @var string - */ - const onFlush = 'onFlush'; - - /** - * The postFlush event occurs when the EntityManager#flush() operation is invoked and - * after all actual database operations are executed successfully. The event is only raised if there is - * actually something to do for the underlying UnitOfWork. If nothing needs to be done, - * the postFlush event is not raised. The event won't be raised if an error occurs during the - * flush operation. - * - * @var string - */ - const postFlush = 'postFlush'; - - /** - * The onClear event occurs when the EntityManager#clear() operation is invoked, - * after all references to entities have been removed from the unit of work. - * - * @var string - */ - const onClear = 'onClear'; -} diff --git a/framework/library/Doctrine/ORM/Id/AbstractIdGenerator.php b/framework/library/Doctrine/ORM/Id/AbstractIdGenerator.php deleted file mode 100644 index ef98caf..0000000 --- a/framework/library/Doctrine/ORM/Id/AbstractIdGenerator.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Id; - -use Doctrine\ORM\EntityManager; - -abstract class AbstractIdGenerator -{ - /** - * Generates an identifier for an entity. - * - * @param \Doctrine\ORM\Entity $entity - * @return mixed - */ - abstract public function generate(EntityManager $em, $entity); - - /** - * Gets whether this generator is a post-insert generator which means that - * {@link generate()} must be called after the entity has been inserted - * into the database. - * - * By default, this method returns FALSE. Generators that have this requirement - * must override this method and return TRUE. - * - * @return boolean - */ - public function isPostInsertGenerator() - { - return false; - } -} diff --git a/framework/library/Doctrine/ORM/Id/AssignedGenerator.php b/framework/library/Doctrine/ORM/Id/AssignedGenerator.php deleted file mode 100644 index 0597c3b..0000000 --- a/framework/library/Doctrine/ORM/Id/AssignedGenerator.php +++ /dev/null @@ -1,70 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Id; - -use Doctrine\ORM\EntityManager; -use Doctrine\ORM\ORMException; - -/** - * Special generator for application-assigned identifiers (doesnt really generate anything). - * - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class AssignedGenerator extends AbstractIdGenerator -{ - /** - * Returns the identifier assigned to the given entity. - * - * @param object $entity - * @return mixed - * @override - */ - public function generate(EntityManager $em, $entity) - { - $class = $em->getClassMetadata(get_class($entity)); - $idFields = $class->getIdentifierFieldNames(); - $identifier = array(); - - foreach ($idFields as $idField) { - $value = $class->reflFields[$idField]->getValue($entity); - - if ( ! isset($value)) { - throw ORMException::entityMissingAssignedIdForField($entity, $idField); - } - - if (isset($class->associationMappings[$idField])) { - if ( ! $em->getUnitOfWork()->isInIdentityMap($value)) { - throw ORMException::entityMissingForeignAssignedId($entity, $value); - } - - // NOTE: Single Columns as associated identifiers only allowed - this constraint it is enforced. - $value = current($em->getUnitOfWork()->getEntityIdentifier($value)); - } - - $identifier[$idField] = $value; - } - - return $identifier; - } -} diff --git a/framework/library/Doctrine/ORM/Id/BigIntegerIdentityGenerator.php b/framework/library/Doctrine/ORM/Id/BigIntegerIdentityGenerator.php deleted file mode 100644 index e387023..0000000 --- a/framework/library/Doctrine/ORM/Id/BigIntegerIdentityGenerator.php +++ /dev/null @@ -1,66 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Id; - -use Doctrine\ORM\EntityManager; - -/** - * Id generator that obtains IDs from special "identity" columns. These are columns - * that automatically get a database-generated, auto-incremented identifier on INSERT. - * This generator obtains the last insert id after such an insert. - */ -class BigIntegerIdentityGenerator extends AbstractIdGenerator -{ - /** - * The name of the sequence to pass to lastInsertId(), if any. - * - * @var string - */ - private $sequenceName; - - /** - * Constructor. - * - * @param string|null $seqName The name of the sequence to pass to lastInsertId() - * to obtain the last generated identifier within the current - * database session/connection, if any. - */ - public function __construct($sequenceName = null) - { - $this->sequenceName = $sequenceName; - } - - /** - * {@inheritdoc} - */ - public function generate(EntityManager $em, $entity) - { - return (string)$em->getConnection()->lastInsertId($this->sequenceName); - } - - /** - * {@inheritdoc} - */ - public function isPostInsertGenerator() - { - return true; - } -} - diff --git a/framework/library/Doctrine/ORM/Id/IdentityGenerator.php b/framework/library/Doctrine/ORM/Id/IdentityGenerator.php deleted file mode 100644 index ad61312..0000000 --- a/framework/library/Doctrine/ORM/Id/IdentityGenerator.php +++ /dev/null @@ -1,63 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Id; - -use Doctrine\ORM\EntityManager; - -/** - * Id generator that obtains IDs from special "identity" columns. These are columns - * that automatically get a database-generated, auto-incremented identifier on INSERT. - * This generator obtains the last insert id after such an insert. - */ -class IdentityGenerator extends AbstractIdGenerator -{ - /** - * The name of the sequence to pass to lastInsertId(), if any. - * - * @var string - */ - private $sequenceName; - - /** - * @param string $seqName The name of the sequence to pass to lastInsertId() - * to obtain the last generated identifier within the current - * database session/connection, if any. - */ - public function __construct($sequenceName = null) - { - $this->sequenceName = $sequenceName; - } - - /** - * {@inheritdoc} - */ - public function generate(EntityManager $em, $entity) - { - return (int)$em->getConnection()->lastInsertId($this->sequenceName); - } - - /** - * {@inheritdoc} - */ - public function isPostInsertGenerator() - { - return true; - } -} diff --git a/framework/library/Doctrine/ORM/Id/SequenceGenerator.php b/framework/library/Doctrine/ORM/Id/SequenceGenerator.php deleted file mode 100644 index 5b5d831..0000000 --- a/framework/library/Doctrine/ORM/Id/SequenceGenerator.php +++ /dev/null @@ -1,106 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Id; - -use Serializable, Doctrine\ORM\EntityManager; - -/** - * Represents an ID generator that uses a database sequence. - * - * @since 2.0 - * @author Roman Borschel - */ -class SequenceGenerator extends AbstractIdGenerator implements Serializable -{ - private $_allocationSize; - private $_sequenceName; - private $_nextValue = 0; - private $_maxValue = null; - - /** - * Initializes a new sequence generator. - * - * @param \Doctrine\ORM\EntityManager $em The EntityManager to use. - * @param string $sequenceName The name of the sequence. - * @param integer $allocationSize The allocation size of the sequence. - */ - public function __construct($sequenceName, $allocationSize) - { - $this->_sequenceName = $sequenceName; - $this->_allocationSize = $allocationSize; - } - - /** - * Generates an ID for the given entity. - * - * @param object $entity - * @return integer|float The generated value. - * @override - */ - public function generate(EntityManager $em, $entity) - { - if ($this->_maxValue === null || $this->_nextValue == $this->_maxValue) { - // Allocate new values - $conn = $em->getConnection(); - $sql = $conn->getDatabasePlatform()->getSequenceNextValSQL($this->_sequenceName); - - $this->_nextValue = (int)$conn->fetchColumn($sql); - $this->_maxValue = $this->_nextValue + $this->_allocationSize; - } - - return $this->_nextValue++; - } - - /** - * Gets the maximum value of the currently allocated bag of values. - * - * @return integer|float - */ - public function getCurrentMaxValue() - { - return $this->_maxValue; - } - - /** - * Gets the next value that will be returned by generate(). - * - * @return integer|float - */ - public function getNextValue() - { - return $this->_nextValue; - } - - public function serialize() - { - return serialize(array( - 'allocationSize' => $this->_allocationSize, - 'sequenceName' => $this->_sequenceName - )); - } - - public function unserialize($serialized) - { - $array = unserialize($serialized); - - $this->_sequenceName = $array['sequenceName']; - $this->_allocationSize = $array['allocationSize']; - } -} diff --git a/framework/library/Doctrine/ORM/Id/TableGenerator.php b/framework/library/Doctrine/ORM/Id/TableGenerator.php deleted file mode 100644 index 7e84b0a..0000000 --- a/framework/library/Doctrine/ORM/Id/TableGenerator.php +++ /dev/null @@ -1,81 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Id; - -use Doctrine\ORM\EntityManager; - -/** - * Id generator that uses a single-row database table and a hi/lo algorithm. - * - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class TableGenerator extends AbstractIdGenerator -{ - private $_tableName; - private $_sequenceName; - private $_allocationSize; - private $_nextValue; - private $_maxValue; - - public function __construct($tableName, $sequenceName = 'default', $allocationSize = 10) - { - $this->_tableName = $tableName; - $this->_sequenceName = $sequenceName; - $this->_allocationSize = $allocationSize; - } - - public function generate(EntityManager $em, $entity) - { - if ($this->_maxValue === null || $this->_nextValue == $this->_maxValue) { - // Allocate new values - $conn = $em->getConnection(); - - if ($conn->getTransactionNestingLevel() === 0) { - // use select for update - $sql = $conn->getDatabasePlatform()->getTableHiLoCurrentValSql($this->_tableName, $this->_sequenceName); - $currentLevel = $conn->fetchColumn($sql); - - if ($currentLevel != null) { - $this->_nextValue = $currentLevel; - $this->_maxValue = $this->_nextValue + $this->_allocationSize; - - $updateSql = $conn->getDatabasePlatform()->getTableHiLoUpdateNextValSql( - $this->_tableName, $this->_sequenceName, $this->_allocationSize - ); - - if ($conn->executeUpdate($updateSql, array(1 => $currentLevel, 2 => $currentLevel+1)) !== 1) { - // no affected rows, concurrency issue, throw exception - } - } else { - // no current level returned, TableGenerator seems to be broken, throw exception - } - } else { - // only table locks help here, implement this or throw exception? - // or do we want to work with table locks exclusively? - } - } - - return $this->_nextValue++; - } -} diff --git a/framework/library/Doctrine/ORM/Id/UuidGenerator.php b/framework/library/Doctrine/ORM/Id/UuidGenerator.php deleted file mode 100644 index 3978f1b..0000000 --- a/framework/library/Doctrine/ORM/Id/UuidGenerator.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Id; - -use Serializable, Doctrine\ORM\EntityManager; - -/** - * Represents an ID generator that uses the database UUID expression - * - * @since 2.3 - * @author Maarten de Keizer - */ -class UuidGenerator extends AbstractIdGenerator -{ - - /** - * Generates an ID for the given entity. - * - * @param Doctrine\ORM\EntityManager $em The EntityManager to user - * @param object $entity - * @return string The generated value. - * @override - */ - public function generate(EntityManager $em, $entity) - { - $conn = $em->getConnection(); - $sql = 'SELECT ' . $conn->getDatabasePlatform()->getGuidExpression(); - return $conn->query($sql)->fetchColumn(0); - } - -} diff --git a/framework/library/Doctrine/ORM/Internal/CommitOrderCalculator.php b/framework/library/Doctrine/ORM/Internal/CommitOrderCalculator.php deleted file mode 100644 index a4ae5f3..0000000 --- a/framework/library/Doctrine/ORM/Internal/CommitOrderCalculator.php +++ /dev/null @@ -1,118 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Internal; - -/** - * The CommitOrderCalculator is used by the UnitOfWork to sort out the - * correct order in which changes to entities need to be persisted. - * - * @since 2.0 - * @author Roman Borschel - * @author Guilherme Blanco - */ -class CommitOrderCalculator -{ - const NOT_VISITED = 1; - const IN_PROGRESS = 2; - const VISITED = 3; - - private $_nodeStates = array(); - private $_classes = array(); // The nodes to sort - private $_relatedClasses = array(); - private $_sorted = array(); - - /** - * Clears the current graph. - * - * @return void - */ - public function clear() - { - $this->_classes = - $this->_relatedClasses = array(); - } - - /** - * Gets a valid commit order for all current nodes. - * - * Uses a depth-first search (DFS) to traverse the graph. - * The desired topological sorting is the reverse postorder of these searches. - * - * @return array The list of ordered classes. - */ - public function getCommitOrder() - { - // Check whether we need to do anything. 0 or 1 node is easy. - $nodeCount = count($this->_classes); - - if ($nodeCount <= 1) { - return ($nodeCount == 1) ? array_values($this->_classes) : array(); - } - - // Init - foreach ($this->_classes as $node) { - $this->_nodeStates[$node->name] = self::NOT_VISITED; - } - - // Go - foreach ($this->_classes as $node) { - if ($this->_nodeStates[$node->name] == self::NOT_VISITED) { - $this->_visitNode($node); - } - } - - $sorted = array_reverse($this->_sorted); - - $this->_sorted = $this->_nodeStates = array(); - - return $sorted; - } - - private function _visitNode($node) - { - $this->_nodeStates[$node->name] = self::IN_PROGRESS; - - if (isset($this->_relatedClasses[$node->name])) { - foreach ($this->_relatedClasses[$node->name] as $relatedNode) { - if ($this->_nodeStates[$relatedNode->name] == self::NOT_VISITED) { - $this->_visitNode($relatedNode); - } - } - } - - $this->_nodeStates[$node->name] = self::VISITED; - $this->_sorted[] = $node; - } - - public function addDependency($fromClass, $toClass) - { - $this->_relatedClasses[$fromClass->name][] = $toClass; - } - - public function hasClass($className) - { - return isset($this->_classes[$className]); - } - - public function addClass($class) - { - $this->_classes[$class->name] = $class; - } -} diff --git a/framework/library/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php b/framework/library/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php deleted file mode 100644 index a5eae8b..0000000 --- a/framework/library/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php +++ /dev/null @@ -1,390 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Internal\Hydration; - -use PDO, - Doctrine\DBAL\Connection, - Doctrine\DBAL\Types\Type, - Doctrine\ORM\EntityManager, - Doctrine\ORM\Events, - Doctrine\ORM\Mapping\ClassMetadata; - -/** - * Base class for all hydrators. A hydrator is a class that provides some form - * of transformation of an SQL result set into another structure. - * - * @since 2.0 - * @author Konsta Vesterinen - * @author Roman Borschel - * @author Guilherme Blanco - */ -abstract class AbstractHydrator -{ - /** @var \Doctrine\ORM\Query\ResultSetMapping The ResultSetMapping. */ - protected $_rsm; - - /** @var EntityManager The EntityManager instance. */ - protected $_em; - - /** @var \Doctrine\DBAL\Platforms\AbstractPlatform The dbms Platform instance */ - protected $_platform; - - /** @var \Doctrine\ORM\UnitOfWork The UnitOfWork of the associated EntityManager. */ - protected $_uow; - - /** @var array The cache used during row-by-row hydration. */ - protected $_cache = array(); - - /** @var \Doctrine\DBAL\Driver\Statement The statement that provides the data to hydrate. */ - protected $_stmt; - - /** @var array The query hints. */ - protected $_hints; - - /** - * Initializes a new instance of a class derived from AbstractHydrator. - * - * @param \Doctrine\ORM\EntityManager $em The EntityManager to use. - */ - public function __construct(EntityManager $em) - { - $this->_em = $em; - $this->_platform = $em->getConnection()->getDatabasePlatform(); - $this->_uow = $em->getUnitOfWork(); - } - - /** - * Initiates a row-by-row hydration. - * - * @param object $stmt - * @param object $resultSetMapping - * - * @return IterableResult - */ - public function iterate($stmt, $resultSetMapping, array $hints = array()) - { - $this->_stmt = $stmt; - $this->_rsm = $resultSetMapping; - $this->_hints = $hints; - - $evm = $this->_em->getEventManager(); - $evm->addEventListener(array(Events::onClear), $this); - - $this->prepare(); - - return new IterableResult($this); - } - - /** - * Hydrates all rows returned by the passed statement instance at once. - * - * @param object $stmt - * @param object $resultSetMapping - * @param array $hints - * @return mixed - */ - public function hydrateAll($stmt, $resultSetMapping, array $hints = array()) - { - $this->_stmt = $stmt; - $this->_rsm = $resultSetMapping; - $this->_hints = $hints; - - $this->prepare(); - - $result = $this->hydrateAllData(); - - $this->cleanup(); - - return $result; - } - - /** - * Hydrates a single row returned by the current statement instance during - * row-by-row hydration with {@link iterate()}. - * - * @return mixed - */ - public function hydrateRow() - { - $row = $this->_stmt->fetch(PDO::FETCH_ASSOC); - - if ( ! $row) { - $this->cleanup(); - - return false; - } - - $result = array(); - - $this->hydrateRowData($row, $this->_cache, $result); - - return $result; - } - - /** - * Excutes one-time preparation tasks, once each time hydration is started - * through {@link hydrateAll} or {@link iterate()}. - */ - protected function prepare() - {} - - /** - * Excutes one-time cleanup tasks at the end of a hydration that was initiated - * through {@link hydrateAll} or {@link iterate()}. - */ - protected function cleanup() - { - $this->_rsm = null; - - $this->_stmt->closeCursor(); - $this->_stmt = null; - } - - /** - * Hydrates a single row from the current statement instance. - * - * Template method. - * - * @param array $data The row data. - * @param array $cache The cache to use. - * @param mixed $result The result to fill. - */ - protected function hydrateRowData(array $data, array &$cache, array &$result) - { - throw new HydrationException("hydrateRowData() not implemented by this hydrator."); - } - - /** - * Hydrates all rows from the current statement instance at once. - */ - abstract protected function hydrateAllData(); - - /** - * Processes a row of the result set. - * - * Used for identity-based hydration (HYDRATE_OBJECT and HYDRATE_ARRAY). - * Puts the elements of a result row into a new array, grouped by the dql alias - * they belong to. The column names in the result set are mapped to their - * field names during this procedure as well as any necessary conversions on - * the values applied. Scalar values are kept in a specfic key 'scalars'. - * - * @param array $data SQL Result Row - * @param array &$cache Cache for column to field result information - * @param array &$id Dql-Alias => ID-Hash - * @param array &$nonemptyComponents Does this DQL-Alias has at least one non NULL value? - * - * @return array An array with all the fields (name => value) of the data row, - * grouped by their component alias. - */ - protected function gatherRowData(array $data, array &$cache, array &$id, array &$nonemptyComponents) - { - $rowData = array(); - - foreach ($data as $key => $value) { - // Parse each column name only once. Cache the results. - if ( ! isset($cache[$key])) { - switch (true) { - // NOTE: Most of the times it's a field mapping, so keep it first!!! - case (isset($this->_rsm->fieldMappings[$key])): - $fieldName = $this->_rsm->fieldMappings[$key]; - $classMetadata = $this->_em->getClassMetadata($this->_rsm->declaringClasses[$key]); - - $cache[$key]['fieldName'] = $fieldName; - $cache[$key]['type'] = Type::getType($classMetadata->fieldMappings[$fieldName]['type']); - $cache[$key]['isIdentifier'] = $classMetadata->isIdentifier($fieldName); - $cache[$key]['dqlAlias'] = $this->_rsm->columnOwnerMap[$key]; - break; - - case (isset($this->_rsm->scalarMappings[$key])): - $cache[$key]['fieldName'] = $this->_rsm->scalarMappings[$key]; - $cache[$key]['type'] = Type::getType($this->_rsm->typeMappings[$key]); - $cache[$key]['isScalar'] = true; - break; - - case (isset($this->_rsm->metaMappings[$key])): - // Meta column (has meaning in relational schema only, i.e. foreign keys or discriminator columns). - $fieldName = $this->_rsm->metaMappings[$key]; - $classMetadata = $this->_em->getClassMetadata($this->_rsm->aliasMap[$this->_rsm->columnOwnerMap[$key]]); - - $cache[$key]['isMetaColumn'] = true; - $cache[$key]['fieldName'] = $fieldName; - $cache[$key]['dqlAlias'] = $this->_rsm->columnOwnerMap[$key]; - $cache[$key]['isIdentifier'] = isset($this->_rsm->isIdentifierColumn[$cache[$key]['dqlAlias']][$key]); - break; - - default: - // this column is a left over, maybe from a LIMIT query hack for example in Oracle or DB2 - // maybe from an additional column that has not been defined in a NativeQuery ResultSetMapping. - continue 2; - } - } - - if (isset($cache[$key]['isScalar'])) { - $value = $cache[$key]['type']->convertToPHPValue($value, $this->_platform); - - $rowData['scalars'][$cache[$key]['fieldName']] = $value; - - continue; - } - - $dqlAlias = $cache[$key]['dqlAlias']; - - if ($cache[$key]['isIdentifier']) { - $id[$dqlAlias] .= '|' . $value; - } - - if (isset($cache[$key]['isMetaColumn'])) { - if ( ! isset($rowData[$dqlAlias][$cache[$key]['fieldName']]) && $value !== null) { - $rowData[$dqlAlias][$cache[$key]['fieldName']] = $value; - if ($cache[$key]['isIdentifier']) { - $nonemptyComponents[$dqlAlias] = true; - } - } - - continue; - } - - // in an inheritance hierarchy the same field could be defined several times. - // We overwrite this value so long we dont have a non-null value, that value we keep. - // Per definition it cannot be that a field is defined several times and has several values. - if (isset($rowData[$dqlAlias][$cache[$key]['fieldName']]) && $value === null) { - continue; - } - - $rowData[$dqlAlias][$cache[$key]['fieldName']] = $cache[$key]['type']->convertToPHPValue($value, $this->_platform); - - if ( ! isset($nonemptyComponents[$dqlAlias]) && $value !== null) { - $nonemptyComponents[$dqlAlias] = true; - } - } - - return $rowData; - } - - /** - * Processes a row of the result set. - * - * Used for HYDRATE_SCALAR. This is a variant of _gatherRowData() that - * simply converts column names to field names and properly converts the - * values according to their types. The resulting row has the same number - * of elements as before. - * - * @param array $data - * @param array $cache - * - * @return array The processed row. - */ - protected function gatherScalarRowData(&$data, &$cache) - { - $rowData = array(); - - foreach ($data as $key => $value) { - // Parse each column name only once. Cache the results. - if ( ! isset($cache[$key])) { - switch (true) { - // NOTE: During scalar hydration, most of the times it's a scalar mapping, keep it first!!! - case (isset($this->_rsm->scalarMappings[$key])): - $cache[$key]['fieldName'] = $this->_rsm->scalarMappings[$key]; - $cache[$key]['isScalar'] = true; - break; - - case (isset($this->_rsm->fieldMappings[$key])): - $fieldName = $this->_rsm->fieldMappings[$key]; - $classMetadata = $this->_em->getClassMetadata($this->_rsm->declaringClasses[$key]); - - $cache[$key]['fieldName'] = $fieldName; - $cache[$key]['type'] = Type::getType($classMetadata->fieldMappings[$fieldName]['type']); - $cache[$key]['dqlAlias'] = $this->_rsm->columnOwnerMap[$key]; - break; - - case (isset($this->_rsm->metaMappings[$key])): - // Meta column (has meaning in relational schema only, i.e. foreign keys or discriminator columns). - $cache[$key]['isMetaColumn'] = true; - $cache[$key]['fieldName'] = $this->_rsm->metaMappings[$key]; - $cache[$key]['dqlAlias'] = $this->_rsm->columnOwnerMap[$key]; - break; - - default: - // this column is a left over, maybe from a LIMIT query hack for example in Oracle or DB2 - // maybe from an additional column that has not been defined in a NativeQuery ResultSetMapping. - continue 2; - } - } - - $fieldName = $cache[$key]['fieldName']; - - switch (true) { - case (isset($cache[$key]['isScalar'])): - $rowData[$fieldName] = $value; - break; - - case (isset($cache[$key]['isMetaColumn'])): - $rowData[$cache[$key]['dqlAlias'] . '_' . $fieldName] = $value; - break; - - default: - $value = $cache[$key]['type']->convertToPHPValue($value, $this->_platform); - - $rowData[$cache[$key]['dqlAlias'] . '_' . $fieldName] = $value; - } - } - - return $rowData; - } - - /** - * Register entity as managed in UnitOfWork. - * - * @param \Doctrine\ORM\Mapping\ClassMetadata $class - * @param object $entity - * @param array $data - * - * @todo The "$id" generation is the same of UnitOfWork#createEntity. Remove this duplication somehow - */ - protected function registerManaged(ClassMetadata $class, $entity, array $data) - { - if ($class->isIdentifierComposite) { - $id = array(); - foreach ($class->identifier as $fieldName) { - if (isset($class->associationMappings[$fieldName])) { - $id[$fieldName] = $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']]; - } else { - $id[$fieldName] = $data[$fieldName]; - } - } - } else { - if (isset($class->associationMappings[$class->identifier[0]])) { - $id = array($class->identifier[0] => $data[$class->associationMappings[$class->identifier[0]]['joinColumns'][0]['name']]); - } else { - $id = array($class->identifier[0] => $data[$class->identifier[0]]); - } - } - - $this->_em->getUnitOfWork()->registerManaged($entity, $id, $data); - } - - /** - * When executed in a hydrate() loop we have to clear internal state to - * decrease memory consumption. - */ - public function onClear($eventArgs) - { - } -} diff --git a/framework/library/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php b/framework/library/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php deleted file mode 100644 index 8f7178e..0000000 --- a/framework/library/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php +++ /dev/null @@ -1,289 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Internal\Hydration; - -use PDO, Doctrine\DBAL\Connection, Doctrine\ORM\Mapping\ClassMetadata; - -/** - * The ArrayHydrator produces a nested array "graph" that is often (not always) - * interchangeable with the corresponding object graph for read-only access. - * - * @since 2.0 - * @author Roman Borschel - * @author Guilherme Blanco - */ -class ArrayHydrator extends AbstractHydrator -{ - private $_ce = array(); - private $_rootAliases = array(); - private $_isSimpleQuery = false; - private $_identifierMap = array(); - private $_resultPointers = array(); - private $_idTemplate = array(); - private $_resultCounter = 0; - - /** - * {@inheritdoc} - */ - protected function prepare() - { - $this->_isSimpleQuery = count($this->_rsm->aliasMap) <= 1; - $this->_identifierMap = array(); - $this->_resultPointers = array(); - $this->_idTemplate = array(); - $this->_resultCounter = 0; - - foreach ($this->_rsm->aliasMap as $dqlAlias => $className) { - $this->_identifierMap[$dqlAlias] = array(); - $this->_resultPointers[$dqlAlias] = array(); - $this->_idTemplate[$dqlAlias] = ''; - } - } - - /** - * {@inheritdoc} - */ - protected function hydrateAllData() - { - $result = array(); - $cache = array(); - - while ($data = $this->_stmt->fetch(PDO::FETCH_ASSOC)) { - $this->hydrateRowData($data, $cache, $result); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - protected function hydrateRowData(array $row, array &$cache, array &$result) - { - // 1) Initialize - $id = $this->_idTemplate; // initialize the id-memory - $nonemptyComponents = array(); - $rowData = $this->gatherRowData($row, $cache, $id, $nonemptyComponents); - - // Extract scalar values. They're appended at the end. - if (isset($rowData['scalars'])) { - $scalars = $rowData['scalars']; - - unset($rowData['scalars']); - - if (empty($rowData)) { - ++$this->_resultCounter; - } - } - - // 2) Now hydrate the data found in the current row. - foreach ($rowData as $dqlAlias => $data) { - $index = false; - - if (isset($this->_rsm->parentAliasMap[$dqlAlias])) { - // It's a joined result - - $parent = $this->_rsm->parentAliasMap[$dqlAlias]; - $path = $parent . '.' . $dqlAlias; - - // missing parent data, skipping as RIGHT JOIN hydration is not supported. - if ( ! isset($nonemptyComponents[$parent]) ) { - continue; - } - - // Get a reference to the right element in the result tree. - // This element will get the associated element attached. - if ($this->_rsm->isMixed && isset($this->_rootAliases[$parent])) { - $first = reset($this->_resultPointers); - // TODO: Exception if $key === null ? - $baseElement =& $this->_resultPointers[$parent][key($first)]; - } else if (isset($this->_resultPointers[$parent])) { - $baseElement =& $this->_resultPointers[$parent]; - } else { - unset($this->_resultPointers[$dqlAlias]); // Ticket #1228 - continue; - } - - $relationAlias = $this->_rsm->relationMap[$dqlAlias]; - $relation = $this->getClassMetadata($this->_rsm->aliasMap[$parent])->associationMappings[$relationAlias]; - - // Check the type of the relation (many or single-valued) - if ( ! ($relation['type'] & ClassMetadata::TO_ONE)) { - $oneToOne = false; - - if (isset($nonemptyComponents[$dqlAlias])) { - if ( ! isset($baseElement[$relationAlias])) { - $baseElement[$relationAlias] = array(); - } - - $indexExists = isset($this->_identifierMap[$path][$id[$parent]][$id[$dqlAlias]]); - $index = $indexExists ? $this->_identifierMap[$path][$id[$parent]][$id[$dqlAlias]] : false; - $indexIsValid = $index !== false ? isset($baseElement[$relationAlias][$index]) : false; - - if ( ! $indexExists || ! $indexIsValid) { - $element = $data; - if (isset($this->_rsm->indexByMap[$dqlAlias])) { - $baseElement[$relationAlias][$row[$this->_rsm->indexByMap[$dqlAlias]]] = $element; - } else { - $baseElement[$relationAlias][] = $element; - } - - end($baseElement[$relationAlias]); - - $this->_identifierMap[$path][$id[$parent]][$id[$dqlAlias]] = key($baseElement[$relationAlias]); - } - } else if ( ! isset($baseElement[$relationAlias])) { - $baseElement[$relationAlias] = array(); - } - } else { - $oneToOne = true; - - if ( ! isset($nonemptyComponents[$dqlAlias]) && ! isset($baseElement[$relationAlias])) { - $baseElement[$relationAlias] = null; - } else if ( ! isset($baseElement[$relationAlias])) { - $baseElement[$relationAlias] = $data; - } - } - - $coll =& $baseElement[$relationAlias]; - - if ($coll !== null) { - $this->updateResultPointer($coll, $index, $dqlAlias, $oneToOne); - } - - } else { - // It's a root result element - - $this->_rootAliases[$dqlAlias] = true; // Mark as root - $entityKey = $this->_rsm->entityMappings[$dqlAlias] ?: 0; - - // if this row has a NULL value for the root result id then make it a null result. - if ( ! isset($nonemptyComponents[$dqlAlias]) ) { - if ($this->_rsm->isMixed) { - $result[] = array($entityKey => null); - } else { - $result[] = null; - } - $resultKey = $this->_resultCounter; - ++$this->_resultCounter; - continue; - } - - // Check for an existing element - if ($this->_isSimpleQuery || ! isset($this->_identifierMap[$dqlAlias][$id[$dqlAlias]])) { - $element = $rowData[$dqlAlias]; - if ($this->_rsm->isMixed) { - $element = array($entityKey => $element); - } - - if (isset($this->_rsm->indexByMap[$dqlAlias])) { - $resultKey = $row[$this->_rsm->indexByMap[$dqlAlias]]; - $result[$resultKey] = $element; - } else { - $resultKey = $this->_resultCounter; - $result[] = $element; - ++$this->_resultCounter; - } - - $this->_identifierMap[$dqlAlias][$id[$dqlAlias]] = $resultKey; - } else { - $index = $this->_identifierMap[$dqlAlias][$id[$dqlAlias]]; - $resultKey = $index; - /*if ($this->_rsm->isMixed) { - $result[] =& $result[$index]; - ++$this->_resultCounter; - }*/ - } - $this->updateResultPointer($result, $index, $dqlAlias, false); - } - } - - // Append scalar values to mixed result sets - if (isset($scalars)) { - if ( ! isset($resultKey) ) { - // this only ever happens when no object is fetched (scalar result only) - if (isset($this->_rsm->indexByMap['scalars'])) { - $resultKey = $row[$this->_rsm->indexByMap['scalars']]; - } else { - $resultKey = $this->_resultCounter - 1; - } - } - - foreach ($scalars as $name => $value) { - $result[$resultKey][$name] = $value; - } - } - } - - /** - * Updates the result pointer for an Entity. The result pointers point to the - * last seen instance of each Entity type. This is used for graph construction. - * - * @param array $coll The element. - * @param boolean|integer $index Index of the element in the collection. - * @param string $dqlAlias - * @param boolean $oneToOne Whether it is a single-valued association or not. - */ - private function updateResultPointer(array &$coll, $index, $dqlAlias, $oneToOne) - { - if ($coll === null) { - unset($this->_resultPointers[$dqlAlias]); // Ticket #1228 - - return; - } - - if ($index !== false) { - $this->_resultPointers[$dqlAlias] =& $coll[$index]; - - return; - } - - if ( ! $coll) { - return; - } - - if ($oneToOne) { - $this->_resultPointers[$dqlAlias] =& $coll; - - return; - } - - end($coll); - $this->_resultPointers[$dqlAlias] =& $coll[key($coll)]; - - return; - } - - /** - * Retrieve ClassMetadata associated to entity class name. - * - * @param string $className - * - * @return \Doctrine\ORM\Mapping\ClassMetadata - */ - private function getClassMetadata($className) - { - if ( ! isset($this->_ce[$className])) { - $this->_ce[$className] = $this->_em->getClassMetadata($className); - } - - return $this->_ce[$className]; - } -} diff --git a/framework/library/Doctrine/ORM/Internal/Hydration/HydrationException.php b/framework/library/Doctrine/ORM/Internal/Hydration/HydrationException.php deleted file mode 100644 index 2acc332..0000000 --- a/framework/library/Doctrine/ORM/Internal/Hydration/HydrationException.php +++ /dev/null @@ -1,56 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Internal\Hydration; - -/** - * Represents a result structure that can be iterated over, hydrating row-by-row - * during the iteration. An IterableResult is obtained by AbstractHydrator#iterate(). - * - * @author robo - * @since 2.0 - */ -class IterableResult implements \Iterator -{ - /** - * @var \Doctrine\ORM\Internal\Hydration\AbstractHydrator - */ - private $_hydrator; - - /** - * @var boolean - */ - private $_rewinded = false; - - /** - * @var integer - */ - private $_key = -1; - - /** - * @var object - */ - private $_current = null; - - /** - * @param \Doctrine\ORM\Internal\Hydration\AbstractHydrator $hydrator - */ - public function __construct($hydrator) - { - $this->_hydrator = $hydrator; - } - - public function rewind() - { - if ($this->_rewinded == true) { - throw new HydrationException("Can only iterate a Result once."); - } else { - $this->_current = $this->next(); - $this->_rewinded = true; - } - } - - /** - * Gets the next set of results. - * - * @return array - */ - public function next() - { - $this->_current = $this->_hydrator->hydrateRow(); - $this->_key++; - return $this->_current; - } - - /** - * @return mixed - */ - public function current() - { - return $this->_current; - } - - /** - * @return int - */ - public function key() - { - return $this->_key; - } - - /** - * @return bool - */ - public function valid() - { - return ($this->_current!=false); - } -} diff --git a/framework/library/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/framework/library/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php deleted file mode 100644 index 3f48f86..0000000 --- a/framework/library/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ /dev/null @@ -1,551 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Internal\Hydration; - -use PDO, - Doctrine\ORM\Mapping\ClassMetadata, - Doctrine\ORM\PersistentCollection, - Doctrine\ORM\Query, - Doctrine\ORM\Event\LifecycleEventArgs, - Doctrine\ORM\Events, - Doctrine\Common\Collections\ArrayCollection, - Doctrine\Common\Collections\Collection, - Doctrine\ORM\Proxy\Proxy; - -/** - * The ObjectHydrator constructs an object graph out of an SQL result set. - * - * @since 2.0 - * @author Roman Borschel - * @author Guilherme Blanco - * - * @internal Highly performance-sensitive code. - */ -class ObjectHydrator extends AbstractHydrator -{ - /* Local ClassMetadata cache to avoid going to the EntityManager all the time. - * This local cache is maintained between hydration runs and not cleared. - */ - private $_ce = array(); - - /* The following parts are reinitialized on every hydration run. */ - - private $_identifierMap; - private $_resultPointers; - private $_idTemplate; - private $_resultCounter; - private $_rootAliases = array(); - private $_initializedCollections = array(); - private $_existingCollections = array(); - - - /** @override */ - protected function prepare() - { - $this->_identifierMap = - $this->_resultPointers = - $this->_idTemplate = array(); - - $this->_resultCounter = 0; - - if ( ! isset($this->_hints['deferEagerLoad'])) { - $this->_hints['deferEagerLoad'] = true; - } - - foreach ($this->_rsm->aliasMap as $dqlAlias => $className) { - $this->_identifierMap[$dqlAlias] = array(); - $this->_idTemplate[$dqlAlias] = ''; - - if ( ! isset($this->_ce[$className])) { - $this->_ce[$className] = $this->_em->getClassMetadata($className); - } - - // Remember which associations are "fetch joined", so that we know where to inject - // collection stubs or proxies and where not. - if ( ! isset($this->_rsm->relationMap[$dqlAlias])) { - continue; - } - - if ( ! isset($this->_rsm->aliasMap[$this->_rsm->parentAliasMap[$dqlAlias]])) { - throw HydrationException::parentObjectOfRelationNotFound($dqlAlias, $this->_rsm->parentAliasMap[$dqlAlias]); - } - - $sourceClassName = $this->_rsm->aliasMap[$this->_rsm->parentAliasMap[$dqlAlias]]; - $sourceClass = $this->_getClassMetadata($sourceClassName); - $assoc = $sourceClass->associationMappings[$this->_rsm->relationMap[$dqlAlias]]; - - $this->_hints['fetched'][$this->_rsm->parentAliasMap[$dqlAlias]][$assoc['fieldName']] = true; - - if ($assoc['type'] === ClassMetadata::MANY_TO_MANY) { - continue; - } - - // Mark any non-collection opposite sides as fetched, too. - if ($assoc['mappedBy']) { - $this->_hints['fetched'][$dqlAlias][$assoc['mappedBy']] = true; - - continue; - } - - // handle fetch-joined owning side bi-directional one-to-one associations - if ($assoc['inversedBy']) { - $class = $this->_ce[$className]; - $inverseAssoc = $class->associationMappings[$assoc['inversedBy']]; - - if ( ! ($inverseAssoc['type'] & ClassMetadata::TO_ONE)) { - continue; - } - - $this->_hints['fetched'][$dqlAlias][$inverseAssoc['fieldName']] = true; - } - } - } - - /** - * {@inheritdoc} - */ - protected function cleanup() - { - $eagerLoad = (isset($this->_hints['deferEagerLoad'])) && $this->_hints['deferEagerLoad'] == true; - - parent::cleanup(); - - $this->_identifierMap = - $this->_initializedCollections = - $this->_existingCollections = - $this->_resultPointers = array(); - - if ($eagerLoad) { - $this->_em->getUnitOfWork()->triggerEagerLoads(); - } - } - - /** - * {@inheritdoc} - */ - protected function hydrateAllData() - { - $result = array(); - $cache = array(); - - while ($row = $this->_stmt->fetch(PDO::FETCH_ASSOC)) { - $this->hydrateRowData($row, $cache, $result); - } - - // Take snapshots from all newly initialized collections - foreach ($this->_initializedCollections as $coll) { - $coll->takeSnapshot(); - } - - return $result; - } - - /** - * Initializes a related collection. - * - * @param object $entity The entity to which the collection belongs. - * @param ClassMetadata $class - * @param string $fieldName The name of the field on the entity that holds the collection. - * @param string $parentDqlAlias Alias of the parent fetch joining this collection. - */ - private function _initRelatedCollection($entity, $class, $fieldName, $parentDqlAlias) - { - $oid = spl_object_hash($entity); - $relation = $class->associationMappings[$fieldName]; - $value = $class->reflFields[$fieldName]->getValue($entity); - - if ($value === null) { - $value = new ArrayCollection; - } - - if ( ! $value instanceof PersistentCollection) { - $value = new PersistentCollection( - $this->_em, $this->_ce[$relation['targetEntity']], $value - ); - $value->setOwner($entity, $relation); - - $class->reflFields[$fieldName]->setValue($entity, $value); - $this->_uow->setOriginalEntityProperty($oid, $fieldName, $value); - - $this->_initializedCollections[$oid . $fieldName] = $value; - } else if ( - isset($this->_hints[Query::HINT_REFRESH]) || - isset($this->_hints['fetched'][$parentDqlAlias][$fieldName]) && - ! $value->isInitialized() - ) { - // Is already PersistentCollection, but either REFRESH or FETCH-JOIN and UNINITIALIZED! - $value->setDirty(false); - $value->setInitialized(true); - $value->unwrap()->clear(); - - $this->_initializedCollections[$oid . $fieldName] = $value; - } else { - // Is already PersistentCollection, and DON'T REFRESH or FETCH-JOIN! - $this->_existingCollections[$oid . $fieldName] = $value; - } - - return $value; - } - - /** - * Gets an entity instance. - * - * @param array $data The instance data. - * @param string $dqlAlias The DQL alias of the entity's class. - * @return object The entity. - */ - private function _getEntity(array $data, $dqlAlias) - { - $className = $this->_rsm->aliasMap[$dqlAlias]; - - if (isset($this->_rsm->discriminatorColumns[$dqlAlias])) { - - if ( ! isset($this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]])) { - throw HydrationException::missingDiscriminatorMetaMappingColumn($className, $this->_rsm->discriminatorColumns[$dqlAlias], $dqlAlias); - } - - $discrColumn = $this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]]; - - if ( ! isset($data[$discrColumn])) { - throw HydrationException::missingDiscriminatorColumn($className, $discrColumn, $dqlAlias); - } - - if ($data[$discrColumn] === "") { - throw HydrationException::emptyDiscriminatorValue($dqlAlias); - } - - $className = $this->_ce[$className]->discriminatorMap[$data[$discrColumn]]; - - unset($data[$discrColumn]); - } - - if (isset($this->_hints[Query::HINT_REFRESH_ENTITY]) && isset($this->_rootAliases[$dqlAlias])) { - $this->registerManaged($this->_ce[$className], $this->_hints[Query::HINT_REFRESH_ENTITY], $data); - } - - $this->_hints['fetchAlias'] = $dqlAlias; - - return $this->_uow->createEntity($className, $data, $this->_hints); - } - - /** - * @param string $className - * @param array $data - * @return mixed - */ - private function _getEntityFromIdentityMap($className, array $data) - { - // TODO: Abstract this code and UnitOfWork::createEntity() equivalent? - $class = $this->_ce[$className]; - - /* @var $class ClassMetadata */ - if ($class->isIdentifierComposite) { - $idHash = ''; - foreach ($class->identifier as $fieldName) { - if (isset($class->associationMappings[$fieldName])) { - $idHash .= $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']] . ' '; - } else { - $idHash .= $data[$fieldName] . ' '; - } - } - return $this->_uow->tryGetByIdHash(rtrim($idHash), $class->rootEntityName); - } else if (isset($class->associationMappings[$class->identifier[0]])) { - return $this->_uow->tryGetByIdHash($data[$class->associationMappings[$class->identifier[0]]['joinColumns'][0]['name']], $class->rootEntityName); - } else { - return $this->_uow->tryGetByIdHash($data[$class->identifier[0]], $class->rootEntityName); - } - } - - /** - * Gets a ClassMetadata instance from the local cache. - * If the instance is not yet in the local cache, it is loaded into the - * local cache. - * - * @param string $className The name of the class. - * @return ClassMetadata - */ - private function _getClassMetadata($className) - { - if ( ! isset($this->_ce[$className])) { - $this->_ce[$className] = $this->_em->getClassMetadata($className); - } - - return $this->_ce[$className]; - } - - /** - * Hydrates a single row in an SQL result set. - * - * @internal - * First, the data of the row is split into chunks where each chunk contains data - * that belongs to a particular component/class. Afterwards, all these chunks - * are processed, one after the other. For each chunk of class data only one of the - * following code paths is executed: - * - * Path A: The data chunk belongs to a joined/associated object and the association - * is collection-valued. - * Path B: The data chunk belongs to a joined/associated object and the association - * is single-valued. - * Path C: The data chunk belongs to a root result element/object that appears in the topmost - * level of the hydrated result. A typical example are the objects of the type - * specified by the FROM clause in a DQL query. - * - * @param array $row The data of the row to process. - * @param array $cache The cache to use. - * @param array $result The result array to fill. - */ - protected function hydrateRowData(array $row, array &$cache, array &$result) - { - // Initialize - $id = $this->_idTemplate; // initialize the id-memory - $nonemptyComponents = array(); - // Split the row data into chunks of class data. - $rowData = $this->gatherRowData($row, $cache, $id, $nonemptyComponents); - - // Extract scalar values. They're appended at the end. - if (isset($rowData['scalars'])) { - $scalars = $rowData['scalars']; - - unset($rowData['scalars']); - - if (empty($rowData)) { - ++$this->_resultCounter; - } - } - - // Hydrate the data chunks - foreach ($rowData as $dqlAlias => $data) { - $entityName = $this->_rsm->aliasMap[$dqlAlias]; - - if (isset($this->_rsm->parentAliasMap[$dqlAlias])) { - // It's a joined result - - $parentAlias = $this->_rsm->parentAliasMap[$dqlAlias]; - // we need the $path to save into the identifier map which entities were already - // seen for this parent-child relationship - $path = $parentAlias . '.' . $dqlAlias; - - // We have a RIGHT JOIN result here. Doctrine cannot hydrate RIGHT JOIN Object-Graphs - if ( ! isset($nonemptyComponents[$parentAlias])) { - // TODO: Add special case code where we hydrate the right join objects into identity map at least - continue; - } - - // Get a reference to the parent object to which the joined element belongs. - if ($this->_rsm->isMixed && isset($this->_rootAliases[$parentAlias])) { - $first = reset($this->_resultPointers); - $parentObject = $first[key($first)]; - } else if (isset($this->_resultPointers[$parentAlias])) { - $parentObject = $this->_resultPointers[$parentAlias]; - } else { - // Parent object of relation not found, so skip it. - continue; - } - - $parentClass = $this->_ce[$this->_rsm->aliasMap[$parentAlias]]; - $oid = spl_object_hash($parentObject); - $relationField = $this->_rsm->relationMap[$dqlAlias]; - $relation = $parentClass->associationMappings[$relationField]; - $reflField = $parentClass->reflFields[$relationField]; - - // Check the type of the relation (many or single-valued) - if ( ! ($relation['type'] & ClassMetadata::TO_ONE)) { - $reflFieldValue = $reflField->getValue($parentObject); - // PATH A: Collection-valued association - if (isset($nonemptyComponents[$dqlAlias])) { - $collKey = $oid . $relationField; - if (isset($this->_initializedCollections[$collKey])) { - $reflFieldValue = $this->_initializedCollections[$collKey]; - } else if ( ! isset($this->_existingCollections[$collKey])) { - $reflFieldValue = $this->_initRelatedCollection($parentObject, $parentClass, $relationField, $parentAlias); - } - - $indexExists = isset($this->_identifierMap[$path][$id[$parentAlias]][$id[$dqlAlias]]); - $index = $indexExists ? $this->_identifierMap[$path][$id[$parentAlias]][$id[$dqlAlias]] : false; - $indexIsValid = $index !== false ? isset($reflFieldValue[$index]) : false; - - if ( ! $indexExists || ! $indexIsValid) { - if (isset($this->_existingCollections[$collKey])) { - // Collection exists, only look for the element in the identity map. - if ($element = $this->_getEntityFromIdentityMap($entityName, $data)) { - $this->_resultPointers[$dqlAlias] = $element; - } else { - unset($this->_resultPointers[$dqlAlias]); - } - } else { - $element = $this->_getEntity($data, $dqlAlias); - - if (isset($this->_rsm->indexByMap[$dqlAlias])) { - $indexValue = $row[$this->_rsm->indexByMap[$dqlAlias]]; - $reflFieldValue->hydrateSet($indexValue, $element); - $this->_identifierMap[$path][$id[$parentAlias]][$id[$dqlAlias]] = $indexValue; - } else { - $reflFieldValue->hydrateAdd($element); - $reflFieldValue->last(); - $this->_identifierMap[$path][$id[$parentAlias]][$id[$dqlAlias]] = $reflFieldValue->key(); - } - // Update result pointer - $this->_resultPointers[$dqlAlias] = $element; - } - } else { - // Update result pointer - $this->_resultPointers[$dqlAlias] = $reflFieldValue[$index]; - } - } else if ( ! $reflFieldValue) { - $reflFieldValue = $this->_initRelatedCollection($parentObject, $parentClass, $relationField, $parentAlias); - } else if ($reflFieldValue instanceof PersistentCollection && $reflFieldValue->isInitialized() === false) { - $reflFieldValue->setInitialized(true); - } - - } else { - // PATH B: Single-valued association - $reflFieldValue = $reflField->getValue($parentObject); - if ( ! $reflFieldValue || isset($this->_hints[Query::HINT_REFRESH]) || ($reflFieldValue instanceof Proxy && !$reflFieldValue->__isInitialized__)) { - // we only need to take action if this value is null, - // we refresh the entity or its an unitialized proxy. - if (isset($nonemptyComponents[$dqlAlias])) { - $element = $this->_getEntity($data, $dqlAlias); - $reflField->setValue($parentObject, $element); - $this->_uow->setOriginalEntityProperty($oid, $relationField, $element); - $targetClass = $this->_ce[$relation['targetEntity']]; - - if ($relation['isOwningSide']) { - //TODO: Just check hints['fetched'] here? - // If there is an inverse mapping on the target class its bidirectional - if ($relation['inversedBy']) { - $inverseAssoc = $targetClass->associationMappings[$relation['inversedBy']]; - if ($inverseAssoc['type'] & ClassMetadata::TO_ONE) { - $targetClass->reflFields[$inverseAssoc['fieldName']]->setValue($element, $parentObject); - $this->_uow->setOriginalEntityProperty(spl_object_hash($element), $inverseAssoc['fieldName'], $parentObject); - } - } else if ($parentClass === $targetClass && $relation['mappedBy']) { - // Special case: bi-directional self-referencing one-one on the same class - $targetClass->reflFields[$relationField]->setValue($element, $parentObject); - } - } else { - // For sure bidirectional, as there is no inverse side in unidirectional mappings - $targetClass->reflFields[$relation['mappedBy']]->setValue($element, $parentObject); - $this->_uow->setOriginalEntityProperty(spl_object_hash($element), $relation['mappedBy'], $parentObject); - } - // Update result pointer - $this->_resultPointers[$dqlAlias] = $element; - } else { - $this->_uow->setOriginalEntityProperty($oid, $relationField, null); - $reflField->setValue($parentObject, null); - } - // else leave $reflFieldValue null for single-valued associations - } else { - // Update result pointer - $this->_resultPointers[$dqlAlias] = $reflFieldValue; - } - } - } else { - // PATH C: Its a root result element - $this->_rootAliases[$dqlAlias] = true; // Mark as root alias - $entityKey = $this->_rsm->entityMappings[$dqlAlias] ?: 0; - - // if this row has a NULL value for the root result id then make it a null result. - if ( ! isset($nonemptyComponents[$dqlAlias]) ) { - if ($this->_rsm->isMixed) { - $result[] = array($entityKey => null); - } else { - $result[] = null; - } - $resultKey = $this->_resultCounter; - ++$this->_resultCounter; - continue; - } - - // check for existing result from the iterations before - if ( ! isset($this->_identifierMap[$dqlAlias][$id[$dqlAlias]])) { - $element = $this->_getEntity($rowData[$dqlAlias], $dqlAlias); - if ($this->_rsm->isMixed) { - $element = array($entityKey => $element); - } - - if (isset($this->_rsm->indexByMap[$dqlAlias])) { - $resultKey = $row[$this->_rsm->indexByMap[$dqlAlias]]; - - if (isset($this->_hints['collection'])) { - $this->_hints['collection']->hydrateSet($resultKey, $element); - } - - $result[$resultKey] = $element; - } else { - $resultKey = $this->_resultCounter; - ++$this->_resultCounter; - - if (isset($this->_hints['collection'])) { - $this->_hints['collection']->hydrateAdd($element); - } - - $result[] = $element; - } - - $this->_identifierMap[$dqlAlias][$id[$dqlAlias]] = $resultKey; - - // Update result pointer - $this->_resultPointers[$dqlAlias] = $element; - - } else { - // Update result pointer - $index = $this->_identifierMap[$dqlAlias][$id[$dqlAlias]]; - $this->_resultPointers[$dqlAlias] = $result[$index]; - $resultKey = $index; - /*if ($this->_rsm->isMixed) { - $result[] = $result[$index]; - ++$this->_resultCounter; - }*/ - } - } - } - - // Append scalar values to mixed result sets - if (isset($scalars)) { - if ( ! isset($resultKey) ) { - if (isset($this->_rsm->indexByMap['scalars'])) { - $resultKey = $row[$this->_rsm->indexByMap['scalars']]; - } else { - $resultKey = $this->_resultCounter - 1; - } - } - - foreach ($scalars as $name => $value) { - $result[$resultKey][$name] = $value; - } - } - } - - /** - * When executed in a hydrate() loop we may have to clear internal state to - * decrease memory consumption. - */ - public function onClear($eventArgs) - { - parent::onClear($eventArgs); - - $aliases = array_keys($this->_identifierMap); - $this->_identifierMap = array(); - - foreach ($aliases as $alias) { - $this->_identifierMap[$alias] = array(); - } - } -} diff --git a/framework/library/Doctrine/ORM/Internal/Hydration/ScalarHydrator.php b/framework/library/Doctrine/ORM/Internal/Hydration/ScalarHydrator.php deleted file mode 100644 index 23b0abe..0000000 --- a/framework/library/Doctrine/ORM/Internal/Hydration/ScalarHydrator.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Internal\Hydration; - -/** - * Hydrator that produces flat, rectangular results of scalar data. - * The created result is almost the same as a regular SQL result set, except - * that column names are mapped to field names and data type conversions take place. - * - * @since 2.0 - * @author Roman Borschel - * @author Guilherme Blanco - */ -class ScalarHydrator extends AbstractHydrator -{ - /** - * {@inheritdoc} - */ - protected function hydrateAllData() - { - $result = array(); - $cache = array(); - - while ($data = $this->_stmt->fetch(\PDO::FETCH_ASSOC)) { - $this->hydrateRowData($data, $cache, $result); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - protected function hydrateRowData(array $data, array &$cache, array &$result) - { - $result[] = $this->gatherScalarRowData($data, $cache); - } -} diff --git a/framework/library/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php b/framework/library/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php deleted file mode 100644 index 613f94c..0000000 --- a/framework/library/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php +++ /dev/null @@ -1,190 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Internal\Hydration; - -use \PDO, - Doctrine\DBAL\Types\Type, - Doctrine\ORM\Mapping\ClassMetadata, - Doctrine\ORM\Event\LifecycleEventArgs, - Doctrine\ORM\Events, - Doctrine\ORM\Query; - -class SimpleObjectHydrator extends AbstractHydrator -{ - /** - * @var ClassMetadata - */ - private $class; - - /** - * @var array - */ - private $declaringClasses = array(); - - /** - * {@inheritdoc} - */ - protected function hydrateAllData() - { - $result = array(); - $cache = array(); - - while ($row = $this->_stmt->fetch(PDO::FETCH_ASSOC)) { - $this->hydrateRowData($row, $cache, $result); - } - - $this->_em->getUnitOfWork()->triggerEagerLoads(); - - return $result; - } - - /** - * {@inheritdoc} - */ - protected function prepare() - { - if (count($this->_rsm->aliasMap) !== 1) { - throw new \RuntimeException("Cannot use SimpleObjectHydrator with a ResultSetMapping that contains more than one object result."); - } - - if ($this->_rsm->scalarMappings) { - throw new \RuntimeException("Cannot use SimpleObjectHydrator with a ResultSetMapping that contains scalar mappings."); - } - - $this->class = $this->_em->getClassMetadata(reset($this->_rsm->aliasMap)); - - // We only need to add declaring classes if we have inheritance. - if ($this->class->inheritanceType === ClassMetadata::INHERITANCE_TYPE_NONE) { - return; - } - - foreach ($this->_rsm->declaringClasses as $column => $class) { - $this->declaringClasses[$column] = $this->_em->getClassMetadata($class); - } - } - - /** - * {@inheritdoc} - */ - protected function hydrateRowData(array $sqlResult, array &$cache, array &$result) - { - $entityName = $this->class->name; - $data = array(); - - // We need to find the correct entity class name if we have inheritance in resultset - if ($this->class->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) { - $discrColumnName = $this->_platform->getSQLResultCasing($this->class->discriminatorColumn['name']); - - if ( ! isset($sqlResult[$discrColumnName])) { - throw HydrationException::missingDiscriminatorColumn($entityName, $discrColumnName, key($this->_rsm->aliasMap)); - } - - if ($sqlResult[$discrColumnName] === '') { - throw HydrationException::emptyDiscriminatorValue(key($this->_rsm->aliasMap)); - } - - $entityName = $this->class->discriminatorMap[$sqlResult[$discrColumnName]]; - - unset($sqlResult[$discrColumnName]); - } - - foreach ($sqlResult as $column => $value) { - // Hydrate column information if not yet present - if ( ! isset($cache[$column])) { - if (($info = $this->hydrateColumnInfo($entityName, $column)) === null) { - continue; - } - - $cache[$column] = $info; - } - - // Convert field to a valid PHP value - if (isset($cache[$column]['field'])) { - $type = Type::getType($cache[$column]['class']->fieldMappings[$cache[$column]['name']]['type']); - $value = $type->convertToPHPValue($value, $this->_platform); - } - - // Prevent overwrite in case of inherit classes using same property name (See AbstractHydrator) - if (isset($cache[$column]) && ( ! isset($data[$cache[$column]['name']]) || $value !== null)) { - $data[$cache[$column]['name']] = $value; - } - } - - if (isset($this->_hints[Query::HINT_REFRESH_ENTITY])) { - $this->registerManaged($this->class, $this->_hints[Query::HINT_REFRESH_ENTITY], $data); - } - - $uow = $this->_em->getUnitOfWork(); - $entity = $uow->createEntity($entityName, $data, $this->_hints); - - $result[] = $entity; - } - - /** - * Retrieve column information form ResultSetMapping. - * - * @param string $entityName - * @param string $column - * - * @return array - */ - protected function hydrateColumnInfo($entityName, $column) - { - switch (true) { - case (isset($this->_rsm->fieldMappings[$column])): - $class = isset($this->declaringClasses[$column]) - ? $this->declaringClasses[$column] - : $this->class; - - // If class is not part of the inheritance, ignore - if ( ! ($class->name === $entityName || is_subclass_of($entityName, $class->name))) { - return null; - } - - return array( - 'class' => $class, - 'name' => $this->_rsm->fieldMappings[$column], - 'field' => true, - ); - - case (isset($this->_rsm->relationMap[$column])): - $class = isset($this->_rsm->relationMap[$column]) - ? $this->_rsm->relationMap[$column] - : $this->class; - - // If class is not self referencing, ignore - if ( ! ($class === $entityName || is_subclass_of($entityName, $class))) { - return null; - } - - // TODO: Decide what to do with associations. It seems original code is incomplete. - // One solution is to load the association, but it might require extra efforts. - return array('name' => $column); - - case (isset($this->_rsm->metaMappings[$column])): - return array( - 'name' => $this->_rsm->metaMappings[$column] - ); - - default: - return null; - } - } -} diff --git a/framework/library/Doctrine/ORM/Internal/Hydration/SingleScalarHydrator.php b/framework/library/Doctrine/ORM/Internal/Hydration/SingleScalarHydrator.php deleted file mode 100644 index a23c4ce..0000000 --- a/framework/library/Doctrine/ORM/Internal/Hydration/SingleScalarHydrator.php +++ /dev/null @@ -1,56 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Internal\Hydration; - -use Doctrine\DBAL\Connection, - Doctrine\ORM\NoResultException, - Doctrine\ORM\NonUniqueResultException; - -/** - * Hydrator that hydrates a single scalar value from the result set. - * - * @since 2.0 - * @author Roman Borschel - * @author Guilherme Blanco - */ -class SingleScalarHydrator extends AbstractHydrator -{ - /** - * {@inheritdoc} - */ - protected function hydrateAllData() - { - $data = $this->_stmt->fetchAll(\PDO::FETCH_ASSOC); - $numRows = count($data); - - if ($numRows === 0) { - throw new NoResultException(); - } - - if ($numRows > 1 || count($data[key($data)]) > 1) { - throw new NonUniqueResultException(); - } - - $cache = array(); - $result = $this->gatherScalarRowData($data[key($data)], $cache); - - return array_shift($result); - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/Annotation.php b/framework/library/Doctrine/ORM/Mapping/Annotation.php deleted file mode 100644 index 19374ff..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Annotation.php +++ /dev/null @@ -1,24 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -interface Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/AssociationOverride.php b/framework/library/Doctrine/ORM/Mapping/AssociationOverride.php deleted file mode 100644 index 8776be6..0000000 --- a/framework/library/Doctrine/ORM/Mapping/AssociationOverride.php +++ /dev/null @@ -1,56 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * This annotation is used to override association mapping of property for an entity relationship. - * - * @author Fabio B. Silva - * @since 2.3 - * - * @Annotation - * @Target("ANNOTATION") - */ -final class AssociationOverride implements Annotation -{ - - /** - * The name of the relationship property whose mapping is being overridden - * - * @var string - */ - public $name; - - /** - * The join column that is being mapped to the persistent attribute. - * - * @var array<\Doctrine\ORM\Mapping\JoinColumn> - */ - public $joinColumns; - - - /** - * The join table that maps the relationship. - * - * @var \Doctrine\ORM\Mapping\JoinTable - */ - public $joinTable; - -} diff --git a/framework/library/Doctrine/ORM/Mapping/AssociationOverrides.php b/framework/library/Doctrine/ORM/Mapping/AssociationOverrides.php deleted file mode 100644 index b0a0c13..0000000 --- a/framework/library/Doctrine/ORM/Mapping/AssociationOverrides.php +++ /dev/null @@ -1,41 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * This annotation is used to override association mappings of relationship properties. - * - * @author Fabio B. Silva - * @since 2.3 - * - * @Annotation - * @Target("CLASS") - */ -final class AssociationOverrides implements Annotation -{ - - /** - * Mapping overrides of relationship properties - * - * @var array<\Doctrine\ORM\Mapping\AssociationOverride> - */ - public $value; - -} diff --git a/framework/library/Doctrine/ORM/Mapping/AttributeOverride.php b/framework/library/Doctrine/ORM/Mapping/AttributeOverride.php deleted file mode 100644 index ef9e6dd..0000000 --- a/framework/library/Doctrine/ORM/Mapping/AttributeOverride.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * This annotation is used to override the mapping of a entity property. - * - * @author Fabio B. Silva - * @since 2.3 - * - * @Annotation - * @Target("ANNOTATION") - */ -final class AttributeOverride implements Annotation -{ - - /** - * The name of the property whose mapping is being overridden. - * - * @var string - */ - public $name; - - /** - * The column definition. - * - * @var \Doctrine\ORM\Mapping\Column - */ - public $column; -} diff --git a/framework/library/Doctrine/ORM/Mapping/AttributeOverrides.php b/framework/library/Doctrine/ORM/Mapping/AttributeOverrides.php deleted file mode 100644 index 41f680d..0000000 --- a/framework/library/Doctrine/ORM/Mapping/AttributeOverrides.php +++ /dev/null @@ -1,41 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * This annotation is used to override the mapping of a entity property. - * - * @author Fabio B. Silva - * @since 2.3 - * - * @Annotation - * @Target("CLASS") - */ -final class AttributeOverrides implements Annotation -{ - - /** - * One or more field or property mapping overrides. - * - * @var array<\Doctrine\ORM\Mapping\AttributeOverride> - */ - public $value; - -} diff --git a/framework/library/Doctrine/ORM/Mapping/Builder/AssociationBuilder.php b/framework/library/Doctrine/ORM/Mapping/Builder/AssociationBuilder.php deleted file mode 100644 index d540774..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Builder/AssociationBuilder.php +++ /dev/null @@ -1,167 +0,0 @@ -. - */ - - -namespace Doctrine\ORM\Mapping\Builder; - -use Doctrine\ORM\Mapping\ClassMetadata; - -class AssociationBuilder -{ - /** - * @var ClassMetadataBuilder - */ - protected $builder; - - /** - * @var array - */ - protected $mapping; - - /** - * @var array - */ - protected $joinColumns; - - /** - * - * @var int - */ - protected $type; - - /** - * @param ClassMetadataBuilder $builder - * @param array $mapping - */ - public function __construct(ClassMetadataBuilder $builder, array $mapping, $type) - { - $this->builder = $builder; - $this->mapping = $mapping; - $this->type = $type; - } - - public function mappedBy($fieldName) - { - $this->mapping['mappedBy'] = $fieldName; - return $this; - } - - public function inversedBy($fieldName) - { - $this->mapping['inversedBy'] = $fieldName; - return $this; - } - - public function cascadeAll() - { - $this->mapping['cascade'] = array("ALL"); - return $this; - } - - public function cascadePersist() - { - $this->mapping['cascade'][] = "persist"; - return $this; - } - - public function cascadeRemove() - { - $this->mapping['cascade'][] = "remove"; - return $this; - } - - public function cascadeMerge() - { - $this->mapping['cascade'][] = "merge"; - return $this; - } - - public function cascadeDetach() - { - $this->mapping['cascade'][] = "detach"; - return $this; - } - - public function cascadeRefresh() - { - $this->mapping['cascade'][] = "refresh"; - return $this; - } - - public function fetchExtraLazy() - { - $this->mapping['fetch'] = ClassMetadata::FETCH_EXTRA_LAZY; - return $this; - } - - public function fetchEager() - { - $this->mapping['fetch'] = ClassMetadata::FETCH_EAGER; - return $this; - } - - public function fetchLazy() - { - $this->mapping['fetch'] = ClassMetadata::FETCH_LAZY; - return $this; - } - - /** - * Add Join Columns - * - * @param string $columnName - * @param string $referencedColumnName - * @param bool $nullable - * @param bool $unique - * @param string $onDelete - * @param string $columnDef - */ - public function addJoinColumn($columnName, $referencedColumnName, $nullable = true, $unique = false, $onDelete = null, $columnDef = null) - { - $this->joinColumns[] = array( - 'name' => $columnName, - 'referencedColumnName' => $referencedColumnName, - 'nullable' => $nullable, - 'unique' => $unique, - 'onDelete' => $onDelete, - 'columnDefinition' => $columnDef, - ); - return $this; - } - - /** - * @return ClassMetadataBuilder - */ - public function build() - { - $mapping = $this->mapping; - if ($this->joinColumns) { - $mapping['joinColumns'] = $this->joinColumns; - } - $cm = $this->builder->getClassMetadata(); - if ($this->type == ClassMetadata::MANY_TO_ONE) { - $cm->mapManyToOne($mapping); - } else if ($this->type == ClassMetadata::ONE_TO_ONE) { - $cm->mapOneToOne($mapping); - } else { - throw new \InvalidArgumentException("Type should be a ToOne Assocation here"); - } - return $this->builder; - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php b/framework/library/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php deleted file mode 100644 index fb7bbc4..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php +++ /dev/null @@ -1,470 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping\Builder; - -use Doctrine\ORM\Mapping\ClassMetadata, - Doctrine\ORM\Mapping\ClassMetadataInfo; - -/** - * Builder Object for ClassMetadata - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - */ -class ClassMetadataBuilder -{ - /** - * @var \Doctrine\ORM\Mapping\ClassMetadataInfo - */ - private $cm; - - /** - * @param \Doctrine\ORM\Mapping\ClassMetadataInfo $cm - */ - public function __construct(ClassMetadataInfo $cm) - { - $this->cm = $cm; - } - - /** - * @return ClassMetadata - */ - public function getClassMetadata() - { - return $this->cm; - } - - /** - * Mark the class as mapped superclass. - * - * @return ClassMetadataBuilder - */ - public function setMappedSuperClass() - { - $this->cm->isMappedSuperclass = true; - - return $this; - } - - /** - * Set custom Repository class name - * - * @param string $repositoryClassName - * @return ClassMetadataBuilder - */ - public function setCustomRepositoryClass($repositoryClassName) - { - $this->cm->setCustomRepositoryClass($repositoryClassName); - - return $this; - } - - /** - * Mark class read only - * - * @return ClassMetadataBuilder - */ - public function setReadOnly() - { - $this->cm->markReadOnly(); - - return $this; - } - - /** - * Set the table name - * - * @param string $name - * @return ClassMetadataBuilder - */ - public function setTable($name) - { - $this->cm->setPrimaryTable(array('name' => $name)); - - return $this; - } - - /** - * Add Index - * - * @param array $columns - * @param string $name - * @return ClassMetadataBuilder - */ - public function addIndex(array $columns, $name) - { - if (!isset($this->cm->table['indexes'])) { - $this->cm->table['indexes'] = array(); - } - - $this->cm->table['indexes'][$name] = array('columns' => $columns); - - return $this; - } - - /** - * Add Unique Constraint - * - * @param array $columns - * @param string $name - * @return ClassMetadataBuilder - */ - public function addUniqueConstraint(array $columns, $name) - { - if ( ! isset($this->cm->table['uniqueConstraints'])) { - $this->cm->table['uniqueConstraints'] = array(); - } - - $this->cm->table['uniqueConstraints'][$name] = array('columns' => $columns); - - return $this; - } - - /** - * Add named query - * - * @param string $name - * @param string $dqlQuery - * @return ClassMetadataBuilder - */ - public function addNamedQuery($name, $dqlQuery) - { - $this->cm->addNamedQuery(array( - 'name' => $name, - 'query' => $dqlQuery, - )); - - return $this; - } - - /** - * Set class as root of a joined table inheritance hierachy. - * - * @return ClassMetadataBuilder - */ - public function setJoinedTableInheritance() - { - $this->cm->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_JOINED); - - return $this; - } - - /** - * Set class as root of a single table inheritance hierachy. - * - * @return ClassMetadataBuilder - */ - public function setSingleTableInheritance() - { - $this->cm->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_SINGLE_TABLE); - - return $this; - } - - /** - * Set the discriminator column details. - * - * @param string $name - * @param string $type - */ - public function setDiscriminatorColumn($name, $type = 'string', $length = 255) - { - $this->cm->setDiscriminatorColumn(array( - 'name' => $name, - 'type' => $type, - 'length' => $length, - )); - - return $this; - } - - /** - * Add a subclass to this inheritance hierachy. - * - * @param string $name - * @param string $class - * @return ClassMetadataBuilder - */ - public function addDiscriminatorMapClass($name, $class) - { - $this->cm->addDiscriminatorMapClass($name, $class); - - return $this; - } - - /** - * Set deferred explicit change tracking policy. - * - * @return ClassMetadataBuilder - */ - public function setChangeTrackingPolicyDeferredExplicit() - { - $this->cm->setChangeTrackingPolicy(ClassMetadata::CHANGETRACKING_DEFERRED_EXPLICIT); - - return $this; - } - - /** - * Set notify change tracking policy. - * - * @return ClassMetadataBuilder - */ - public function setChangeTrackingPolicyNotify() - { - $this->cm->setChangeTrackingPolicy(ClassMetadata::CHANGETRACKING_NOTIFY); - - return $this; - } - - /** - * Add lifecycle event - * - * @param string $methodName - * @param string $event - * @return ClassMetadataBuilder - */ - public function addLifecycleEvent($methodName, $event) - { - $this->cm->addLifecycleCallback($methodName, $event); - - return $this; - } - - /** - * Add Field - * - * @param string $name - * @param string $type - * @param array $mapping - */ - public function addField($name, $type, array $mapping = array()) - { - $mapping['fieldName'] = $name; - $mapping['type'] = $type; - - $this->cm->mapField($mapping); - - return $this; - } - - /** - * Create a field builder. - * - * @param string $name - * @param string $type - * @return FieldBuilder - */ - public function createField($name, $type) - { - return new FieldBuilder( - $this, - array( - 'fieldName' => $name, - 'type' => $type - ) - ); - } - - /** - * Add a simple many to one association, optionally with the inversed by field. - * - * @param string $name - * @param string $targetEntity - * @param string|null $inversedBy - * @return ClassMetadataBuilder - */ - public function addManyToOne($name, $targetEntity, $inversedBy = null) - { - $builder = $this->createManyToOne($name, $targetEntity); - - if ($inversedBy) { - $builder->inversedBy($inversedBy); - } - - return $builder->build(); - } - - /** - * Create a ManyToOne Assocation Builder. - * - * Note: This method does not add the association, you have to call build() on the AssociationBuilder. - * - * @param string $name - * @param string $targetEntity - * @return AssociationBuilder - */ - public function createManyToOne($name, $targetEntity) - { - return new AssociationBuilder( - $this, - array( - 'fieldName' => $name, - 'targetEntity' => $targetEntity - ), - ClassMetadata::MANY_TO_ONE - ); - } - - /** - * Create OneToOne Assocation Builder - * - * @param string $name - * @param string $targetEntity - * @return AssociationBuilder - */ - public function createOneToOne($name, $targetEntity) - { - return new AssociationBuilder( - $this, - array( - 'fieldName' => $name, - 'targetEntity' => $targetEntity - ), - ClassMetadata::ONE_TO_ONE - ); - } - - /** - * Add simple inverse one-to-one assocation. - * - * @param string $name - * @param string $targetEntity - * @param string $mappedBy - * @return ClassMetadataBuilder - */ - public function addInverseOneToOne($name, $targetEntity, $mappedBy) - { - $builder = $this->createOneToOne($name, $targetEntity); - $builder->mappedBy($mappedBy); - - return $builder->build(); - } - - /** - * Add simple owning one-to-one assocation. - * - * @param string $name - * @param string $targetEntity - * @param string $inversedBy - * @return ClassMetadataBuilder - */ - public function addOwningOneToOne($name, $targetEntity, $inversedBy = null) - { - $builder = $this->createOneToOne($name, $targetEntity); - - if ($inversedBy) { - $builder->inversedBy($inversedBy); - } - - return $builder->build(); - } - - /** - * Create ManyToMany Assocation Builder - * - * @param string $name - * @param string $targetEntity - * @return ManyToManyAssociationBuilder - */ - public function createManyToMany($name, $targetEntity) - { - return new ManyToManyAssociationBuilder( - $this, - array( - 'fieldName' => $name, - 'targetEntity' => $targetEntity - ), - ClassMetadata::MANY_TO_MANY - ); - } - - /** - * Add a simple owning many to many assocation. - * - * @param string $name - * @param string $targetEntity - * @param string|null $inversedBy - * @return ClassMetadataBuilder - */ - public function addOwningManyToMany($name, $targetEntity, $inversedBy = null) - { - $builder = $this->createManyToMany($name, $targetEntity); - - if ($inversedBy) { - $builder->inversedBy($inversedBy); - } - - return $builder->build(); - } - - /** - * Add a simple inverse many to many assocation. - * - * @param string $name - * @param string $targetEntity - * @param string $mappedBy - * @return ClassMetadataBuilder - */ - public function addInverseManyToMany($name, $targetEntity, $mappedBy) - { - $builder = $this->createManyToMany($name, $targetEntity); - $builder->mappedBy($mappedBy); - - return $builder->build(); - } - - /** - * Create a one to many assocation builder - * - * @param string $name - * @param string $targetEntity - * @return OneToManyAssociationBuilder - */ - public function createOneToMany($name, $targetEntity) - { - return new OneToManyAssociationBuilder( - $this, - array( - 'fieldName' => $name, - 'targetEntity' => $targetEntity - ), - ClassMetadata::ONE_TO_MANY - ); - } - - /** - * Add simple OneToMany assocation. - * - * @param string $name - * @param string $targetEntity - * @param string $mappedBy - * @return ClassMetadataBuilder - */ - public function addOneToMany($name, $targetEntity, $mappedBy) - { - $builder = $this->createOneToMany($name, $targetEntity); - $builder->mappedBy($mappedBy); - - return $builder->build(); - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/Builder/FieldBuilder.php b/framework/library/Doctrine/ORM/Mapping/Builder/FieldBuilder.php deleted file mode 100644 index 49dd54c..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Builder/FieldBuilder.php +++ /dev/null @@ -1,223 +0,0 @@ -. - */ - - -namespace Doctrine\ORM\Mapping\Builder; - -/** - * Field Builder - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.2 - * @author Benjamin Eberlei - */ -class FieldBuilder -{ - /** - * @var ClassMetadataBuilder - */ - private $builder; - /** - * @var array - */ - private $mapping; - /** - * @var bool - */ - private $version; - - /** - * @var string - */ - private $generatedValue; - - /** - * @var array - */ - private $sequenceDef; - - /** - * - * @param ClassMetadataBuilder $builder - * @param array $mapping - */ - public function __construct(ClassMetadataBuilder $builder, array $mapping) - { - $this->builder = $builder; - $this->mapping = $mapping; - } - - /** - * Set length. - * - * @param int $length - * @return FieldBuilder - */ - public function length($length) - { - $this->mapping['length'] = $length; - return $this; - } - - /** - * Set nullable - * - * @param bool - * @return FieldBuilder - */ - public function nullable($flag = true) - { - $this->mapping['nullable'] = (bool)$flag; - return $this; - } - - /** - * Set Unique - * - * @param bool - * @return FieldBuilder - */ - public function unique($flag = true) - { - $this->mapping['unique'] = (bool)$flag; - return $this; - } - - /** - * Set column name - * - * @param string $name - * @return FieldBuilder - */ - public function columnName($name) - { - $this->mapping['columnName'] = $name; - return $this; - } - - /** - * Set Precision - * - * @param int $p - * @return FieldBuilder - */ - public function precision($p) - { - $this->mapping['precision'] = $p; - return $this; - } - - /** - * Set scale. - * - * @param int $s - * @return FieldBuilder - */ - public function scale($s) - { - $this->mapping['scale'] = $s; - return $this; - } - - /** - * Set field as primary key. - * - * @return FieldBuilder - */ - public function isPrimaryKey() - { - $this->mapping['id'] = true; - return $this; - } - - /** - * @param int $strategy - * @return FieldBuilder - */ - public function generatedValue($strategy = 'AUTO') - { - $this->generatedValue = $strategy; - return $this; - } - - /** - * Set field versioned - * - * @return FieldBuilder - */ - public function isVersionField() - { - $this->version = true; - return $this; - } - - /** - * Set Sequence Generator - * - * @param string $sequenceName - * @param int $allocationSize - * @param int $initialValue - * @return FieldBuilder - */ - public function setSequenceGenerator($sequenceName, $allocationSize = 1, $initialValue = 1) - { - $this->sequenceDef = array( - 'sequenceName' => $sequenceName, - 'allocationSize' => $allocationSize, - 'initialValue' => $initialValue, - ); - return $this; - } - - /** - * Set column definition. - * - * @param string $def - * @return FieldBuilder - */ - public function columnDefinition($def) - { - $this->mapping['columnDefinition'] = $def; - return $this; - } - - /** - * Finalize this field and attach it to the ClassMetadata. - * - * Without this call a FieldBuilder has no effect on the ClassMetadata. - * - * @return ClassMetadataBuilder - */ - public function build() - { - $cm = $this->builder->getClassMetadata(); - if ($this->generatedValue) { - $cm->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' . $this->generatedValue)); - } - if ($this->version) { - $cm->setVersionMapping($this->mapping); - } - $cm->mapField($this->mapping); - if ($this->sequenceDef) { - $cm->setSequenceGeneratorDefinition($this->sequenceDef); - } - return $this->builder; - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/Builder/ManyToManyAssociationBuilder.php b/framework/library/Doctrine/ORM/Mapping/Builder/ManyToManyAssociationBuilder.php deleted file mode 100644 index 17edeea..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Builder/ManyToManyAssociationBuilder.php +++ /dev/null @@ -1,86 +0,0 @@ -. - */ - - -namespace Doctrine\ORM\Mapping\Builder; - -/** - * ManyToMany Association Builder - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - */ -class ManyToManyAssociationBuilder extends OneToManyAssociationBuilder -{ - private $joinTableName; - - private $inverseJoinColumns = array(); - - public function setJoinTable($name) - { - $this->joinTableName = $name; - return $this; - } - - /** - * Add Inverse Join Columns - * - * @param string $columnName - * @param string $referencedColumnName - * @param bool $nullable - * @param bool $unique - * @param string $onDelete - * @param string $columnDef - */ - public function addInverseJoinColumn($columnName, $referencedColumnName, $nullable = true, $unique = false, $onDelete = null, $columnDef = null) - { - $this->inverseJoinColumns[] = array( - 'name' => $columnName, - 'referencedColumnName' => $referencedColumnName, - 'nullable' => $nullable, - 'unique' => $unique, - 'onDelete' => $onDelete, - 'columnDefinition' => $columnDef, - ); - return $this; - } - - /** - * @return ClassMetadataBuilder - */ - public function build() - { - $mapping = $this->mapping; - $mapping['joinTable'] = array(); - if ($this->joinColumns) { - $mapping['joinTable']['joinColumns'] = $this->joinColumns; - } - if ($this->inverseJoinColumns) { - $mapping['joinTable']['inverseJoinColumns'] = $this->inverseJoinColumns; - } - if ($this->joinTableName) { - $mapping['joinTable']['name'] = $this->joinTableName; - } - $cm = $this->builder->getClassMetadata(); - $cm->mapManyToMany($mapping); - return $this->builder; - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/Builder/OneToManyAssociationBuilder.php b/framework/library/Doctrine/ORM/Mapping/Builder/OneToManyAssociationBuilder.php deleted file mode 100644 index 6f22fe2..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Builder/OneToManyAssociationBuilder.php +++ /dev/null @@ -1,62 +0,0 @@ -. - */ - - -namespace Doctrine\ORM\Mapping\Builder; - -/** - * OneToMany Association Builder - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 2.0 - * @author Benjamin Eberlei - */ -class OneToManyAssociationBuilder extends AssociationBuilder -{ - /** - * @param array $fieldNames - * @return OneToManyAssociationBuilder - */ - public function setOrderBy(array $fieldNames) - { - $this->mapping['orderBy'] = $fieldNames; - return $this; - } - - public function setIndexBy($fieldName) - { - $this->mapping['indexBy'] = $fieldName; - return $this; - } - - /** - * @return ClassMetadataBuilder - */ - public function build() - { - $mapping = $this->mapping; - if ($this->joinColumns) { - $mapping['joinColumns'] = $this->joinColumns; - } - $cm = $this->builder->getClassMetadata(); - $cm->mapOneToMany($mapping); - return $this->builder; - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/ChangeTrackingPolicy.php b/framework/library/Doctrine/ORM/Mapping/ChangeTrackingPolicy.php deleted file mode 100644 index bab34a6..0000000 --- a/framework/library/Doctrine/ORM/Mapping/ChangeTrackingPolicy.php +++ /dev/null @@ -1,30 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("CLASS") - */ -final class ChangeTrackingPolicy implements Annotation -{ - /** @var string */ - public $value; -} diff --git a/framework/library/Doctrine/ORM/Mapping/ClassMetadata.php b/framework/library/Doctrine/ORM/Mapping/ClassMetadata.php deleted file mode 100644 index a57f1e1..0000000 --- a/framework/library/Doctrine/ORM/Mapping/ClassMetadata.php +++ /dev/null @@ -1,29 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * {@inheritDoc} - * - * @todo remove or rename ClassMetadataInfo to ClassMetadata - */ -class ClassMetadata extends ClassMetadataInfo -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/framework/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php deleted file mode 100644 index bf449a4..0000000 --- a/framework/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ /dev/null @@ -1,543 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -use ReflectionException; -use Doctrine\ORM\ORMException; -use Doctrine\ORM\EntityManager; -use Doctrine\DBAL\Platforms; -use Doctrine\ORM\Events; -use Doctrine\Common\Persistence\Mapping\ReflectionService; -use Doctrine\Common\Persistence\Mapping\ClassMetadata as ClassMetadataInterface; -use Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory; -use Doctrine\ORM\Id\IdentityGenerator; -use Doctrine\ORM\Id\BigIntegerIdentityGenerator; -use Doctrine\ORM\Event\LoadClassMetadataEventArgs; - -/** - * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the - * metadata mapping information of a class which describes how a class should be mapped - * to a relational database. - * - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ClassMetadataFactory extends AbstractClassMetadataFactory -{ - /** - * @var EntityManager - */ - private $em; - - /** - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $targetPlatform; - - /** - * @var \Doctrine\Common\Persistence\Mapping\Driver\MappingDriver - */ - private $driver; - - /** - * @var \Doctrine\Common\EventManager - */ - private $evm; - - /** - * @param EntityManager $em - */ - public function setEntityManager(EntityManager $em) - { - $this->em = $em; - } - - /** - * {@inheritDoc}. - */ - protected function initialize() - { - $this->driver = $this->em->getConfiguration()->getMetadataDriverImpl(); - $this->targetPlatform = $this->em->getConnection()->getDatabasePlatform(); - $this->evm = $this->em->getEventManager(); - $this->initialized = true; - } - - /** - * {@inheritDoc} - */ - protected function doLoadMetadata($class, $parent, $rootEntityFound, array $nonSuperclassParents) - { - /* @var $class ClassMetadata */ - /* @var $parent ClassMetadata */ - if ($parent) { - $class->setInheritanceType($parent->inheritanceType); - $class->setDiscriminatorColumn($parent->discriminatorColumn); - $class->setIdGeneratorType($parent->generatorType); - $this->addInheritedFields($class, $parent); - $this->addInheritedRelations($class, $parent); - $class->setIdentifier($parent->identifier); - $class->setVersioned($parent->isVersioned); - $class->setVersionField($parent->versionField); - $class->setDiscriminatorMap($parent->discriminatorMap); - $class->setLifecycleCallbacks($parent->lifecycleCallbacks); - $class->setChangeTrackingPolicy($parent->changeTrackingPolicy); - - if ($parent->isMappedSuperclass) { - $class->setCustomRepositoryClass($parent->customRepositoryClassName); - } - } - - // Invoke driver - try { - $this->driver->loadMetadataForClass($class->getName(), $class); - } catch (ReflectionException $e) { - throw MappingException::reflectionFailure($class->getName(), $e); - } - - // If this class has a parent the id generator strategy is inherited. - // However this is only true if the hierarchy of parents contains the root entity, - // if it consists of mapped superclasses these don't necessarily include the id field. - if ($parent && $rootEntityFound) { - if ($parent->isIdGeneratorSequence()) { - $class->setSequenceGeneratorDefinition($parent->sequenceGeneratorDefinition); - } else if ($parent->isIdGeneratorTable()) { - $class->tableGeneratorDefinition = $parent->tableGeneratorDefinition; - } - - if ($parent->generatorType) { - $class->setIdGeneratorType($parent->generatorType); - } - - if ($parent->idGenerator) { - $class->setIdGenerator($parent->idGenerator); - } - } else { - $this->completeIdGeneratorMapping($class); - } - - if ($parent && $parent->isInheritanceTypeSingleTable()) { - $class->setPrimaryTable($parent->table); - } - - if ($parent && $parent->containsForeignIdentifier) { - $class->containsForeignIdentifier = true; - } - - if ($parent && !empty($parent->namedQueries)) { - $this->addInheritedNamedQueries($class, $parent); - } - - if ($parent && !empty($parent->namedNativeQueries)) { - $this->addInheritedNamedNativeQueries($class, $parent); - } - - if ($parent && !empty($parent->sqlResultSetMappings)) { - $this->addInheritedSqlResultSetMappings($class, $parent); - } - - $class->setParentClasses($nonSuperclassParents); - - if ( $class->isRootEntity() && ! $class->isInheritanceTypeNone() && ! $class->discriminatorMap) { - $this->addDefaultDiscriminatorMap($class); - } - - if ($this->evm->hasListeners(Events::loadClassMetadata)) { - $eventArgs = new LoadClassMetadataEventArgs($class, $this->em); - $this->evm->dispatchEvent(Events::loadClassMetadata, $eventArgs); - } - - $this->wakeupReflection($class, $this->getReflectionService()); - $this->validateRuntimeMetadata($class, $parent); - } - - /** - * Validate runtime metadata is correctly defined. - * - * @param ClassMetadata $class - * @param $parent - * @throws MappingException - */ - protected function validateRuntimeMetadata($class, $parent) - { - if ( ! $class->reflClass ) { - // only validate if there is a reflection class instance - return; - } - - $class->validateIdentifier(); - $class->validateAssocations(); - $class->validateLifecycleCallbacks($this->getReflectionService()); - - // verify inheritance - if ( ! $class->isMappedSuperclass && !$class->isInheritanceTypeNone()) { - if ( ! $parent) { - if (count($class->discriminatorMap) == 0) { - throw MappingException::missingDiscriminatorMap($class->name); - } - if ( ! $class->discriminatorColumn) { - throw MappingException::missingDiscriminatorColumn($class->name); - } - } else if ($parent && !$class->reflClass->isAbstract() && !in_array($class->name, array_values($class->discriminatorMap))) { - // enforce discriminator map for all entities of an inheritance hierarchy, otherwise problems will occur. - throw MappingException::mappedClassNotPartOfDiscriminatorMap($class->name, $class->rootEntityName); - } - } else if ($class->isMappedSuperclass && $class->name == $class->rootEntityName && (count($class->discriminatorMap) || $class->discriminatorColumn)) { - // second condition is necessary for mapped superclasses in the middle of an inheritance hierarchy - throw MappingException::noInheritanceOnMappedSuperClass($class->name); - } - } - - /** - * {@inheritDoc} - */ - protected function newClassMetadataInstance($className) - { - return new ClassMetadata($className, $this->em->getConfiguration()->getNamingStrategy()); - } - - /** - * Adds a default discriminator map if no one is given - * - * If an entity is of any inheritance type and does not contain a - * discriminator map, then the map is generated automatically. This process - * is expensive computation wise. - * - * The automatically generated discriminator map contains the lowercase short name of - * each class as key. - * - * @param \Doctrine\ORM\Mapping\ClassMetadata $class - * @throws MappingException - */ - private function addDefaultDiscriminatorMap(ClassMetadata $class) - { - $allClasses = $this->driver->getAllClassNames(); - $fqcn = $class->getName(); - $map = array($this->getShortName($class->name) => $fqcn); - - $duplicates = array(); - foreach ($allClasses as $subClassCandidate) { - if (is_subclass_of($subClassCandidate, $fqcn)) { - $shortName = $this->getShortName($subClassCandidate); - - if (isset($map[$shortName])) { - $duplicates[] = $shortName; - } - - $map[$shortName] = $subClassCandidate; - } - } - - if ($duplicates) { - throw MappingException::duplicateDiscriminatorEntry($class->name, $duplicates, $map); - } - - $class->setDiscriminatorMap($map); - } - - /** - * Get the lower-case short name of a class. - * - * @param string $className - * @return string - */ - private function getShortName($className) - { - if (strpos($className, "\\") === false) { - return strtolower($className); - } - - $parts = explode("\\", $className); - return strtolower(end($parts)); - } - - /** - * Adds inherited fields to the subclass mapping. - * - * @param \Doctrine\ORM\Mapping\ClassMetadata $subClass - * @param \Doctrine\ORM\Mapping\ClassMetadata $parentClass - */ - private function addInheritedFields(ClassMetadata $subClass, ClassMetadata $parentClass) - { - foreach ($parentClass->fieldMappings as $mapping) { - if ( ! isset($mapping['inherited']) && ! $parentClass->isMappedSuperclass) { - $mapping['inherited'] = $parentClass->name; - } - if ( ! isset($mapping['declared'])) { - $mapping['declared'] = $parentClass->name; - } - $subClass->addInheritedFieldMapping($mapping); - } - foreach ($parentClass->reflFields as $name => $field) { - $subClass->reflFields[$name] = $field; - } - } - - /** - * Adds inherited association mappings to the subclass mapping. - * - * @param \Doctrine\ORM\Mapping\ClassMetadata $subClass - * @param \Doctrine\ORM\Mapping\ClassMetadata $parentClass - * @throws MappingException - */ - private function addInheritedRelations(ClassMetadata $subClass, ClassMetadata $parentClass) - { - foreach ($parentClass->associationMappings as $field => $mapping) { - if ($parentClass->isMappedSuperclass) { - if ($mapping['type'] & ClassMetadata::TO_MANY && !$mapping['isOwningSide']) { - throw MappingException::illegalToManyAssocationOnMappedSuperclass($parentClass->name, $field); - } - $mapping['sourceEntity'] = $subClass->name; - } - - //$subclassMapping = $mapping; - if ( ! isset($mapping['inherited']) && ! $parentClass->isMappedSuperclass) { - $mapping['inherited'] = $parentClass->name; - } - if ( ! isset($mapping['declared'])) { - $mapping['declared'] = $parentClass->name; - } - $subClass->addInheritedAssociationMapping($mapping); - } - } - - /** - * Adds inherited named queries to the subclass mapping. - * - * @since 2.2 - * @param \Doctrine\ORM\Mapping\ClassMetadata $subClass - * @param \Doctrine\ORM\Mapping\ClassMetadata $parentClass - */ - private function addInheritedNamedQueries(ClassMetadata $subClass, ClassMetadata $parentClass) - { - foreach ($parentClass->namedQueries as $name => $query) { - if ( ! isset ($subClass->namedQueries[$name])) { - $subClass->addNamedQuery(array( - 'name' => $query['name'], - 'query' => $query['query'] - )); - } - } - } - - /** - * Adds inherited named native queries to the subclass mapping. - * - * @since 2.3 - * @param \Doctrine\ORM\Mapping\ClassMetadata $subClass - * @param \Doctrine\ORM\Mapping\ClassMetadata $parentClass - */ - private function addInheritedNamedNativeQueries(ClassMetadata $subClass, ClassMetadata $parentClass) - { - foreach ($parentClass->namedNativeQueries as $name => $query) { - if ( ! isset ($subClass->namedNativeQueries[$name])) { - $subClass->addNamedNativeQuery(array( - 'name' => $query['name'], - 'query' => $query['query'], - 'isSelfClass' => $query['isSelfClass'], - 'resultSetMapping' => $query['resultSetMapping'], - 'resultClass' => $query['isSelfClass'] ? $subClass->name : $query['resultClass'], - )); - } - } - } - - /** - * Adds inherited sql result set mappings to the subclass mapping. - * - * @since 2.3 - * @param \Doctrine\ORM\Mapping\ClassMetadata $subClass - * @param \Doctrine\ORM\Mapping\ClassMetadata $parentClass - */ - private function addInheritedSqlResultSetMappings(ClassMetadata $subClass, ClassMetadata $parentClass) - { - foreach ($parentClass->sqlResultSetMappings as $name => $mapping) { - if ( ! isset ($subClass->sqlResultSetMappings[$name])) { - $entities = array(); - foreach ($mapping['entities'] as $entity) { - $entities[] = array( - 'fields' => $entity['fields'], - 'isSelfClass' => $entity['isSelfClass'], - 'discriminatorColumn' => $entity['discriminatorColumn'], - 'entityClass' => $entity['isSelfClass'] ? $subClass->name : $entity['entityClass'], - ); - } - - $subClass->addSqlResultSetMapping(array( - 'name' => $mapping['name'], - 'columns' => $mapping['columns'], - 'entities' => $entities, - )); - } - } - } - - /** - * Completes the ID generator mapping. If "auto" is specified we choose the generator - * most appropriate for the targeted database platform. - * - * @param ClassMetadataInfo $class - * @throws ORMException - */ - private function completeIdGeneratorMapping(ClassMetadataInfo $class) - { - $idGenType = $class->generatorType; - if ($idGenType == ClassMetadata::GENERATOR_TYPE_AUTO) { - if ($this->targetPlatform->prefersSequences()) { - $class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_SEQUENCE); - } else if ($this->targetPlatform->prefersIdentityColumns()) { - $class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_IDENTITY); - } else { - $class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_TABLE); - } - } - - // Create & assign an appropriate ID generator instance - switch ($class->generatorType) { - case ClassMetadata::GENERATOR_TYPE_IDENTITY: - // For PostgreSQL IDENTITY (SERIAL) we need a sequence name. It defaults to - // __seq in PostgreSQL for SERIAL columns. - // Not pretty but necessary and the simplest solution that currently works. - $sequenceName = null; - $fieldName = $class->identifier ? $class->getSingleIdentifierFieldName() : null; - - if ($this->targetPlatform instanceof Platforms\PostgreSQLPlatform) { - $columnName = $class->getSingleIdentifierColumnName(); - $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); - $sequenceName = $class->getTableName() . '_' . $columnName . '_seq'; - $definition = array( - 'sequenceName' => $this->targetPlatform->fixSchemaElementName($sequenceName) - ); - - if ($quoted) { - $definition['quoted'] = true; - } - - $sequenceName = $this->em->getConfiguration()->getQuoteStrategy()->getSequenceName($definition, $class, $this->targetPlatform); - } - - $generator = ($fieldName && $class->fieldMappings[$fieldName]['type'] === "bigint") - ? new BigIntegerIdentityGenerator($sequenceName) - : new IdentityGenerator($sequenceName); - - $class->setIdGenerator($generator); - - break; - - case ClassMetadata::GENERATOR_TYPE_SEQUENCE: - // If there is no sequence definition yet, create a default definition - $definition = $class->sequenceGeneratorDefinition; - - if ( ! $definition) { - $fieldName = $class->getSingleIdentifierFieldName(); - $columnName = $class->getSingleIdentifierColumnName(); - $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); - $sequenceName = $class->getTableName() . '_' . $columnName . '_seq'; - $definition = array( - 'sequenceName' => $this->targetPlatform->fixSchemaElementName($sequenceName), - 'allocationSize' => 1, - 'initialValue' => 1, - ); - - if ($quoted) { - $definition['quoted'] = true; - } - - $class->setSequenceGeneratorDefinition($definition); - } - - $sequenceGenerator = new \Doctrine\ORM\Id\SequenceGenerator( - $this->em->getConfiguration()->getQuoteStrategy()->getSequenceName($definition, $class, $this->targetPlatform), - $definition['allocationSize'] - ); - $class->setIdGenerator($sequenceGenerator); - break; - - case ClassMetadata::GENERATOR_TYPE_NONE: - $class->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator()); - break; - - case ClassMetadata::GENERATOR_TYPE_UUID: - $class->setIdGenerator(new \Doctrine\ORM\Id\UuidGenerator()); - break; - - case ClassMetadata::GENERATOR_TYPE_TABLE: - throw new ORMException("TableGenerator not yet implemented."); - break; - - case ClassMetadata::GENERATOR_TYPE_CUSTOM: - $definition = $class->customGeneratorDefinition; - if ( ! class_exists($definition['class'])) { - throw new ORMException("Can't instantiate custom generator : " . - $definition['class']); - } - $class->setIdGenerator(new $definition['class']); - break; - - default: - throw new ORMException("Unknown generator type: " . $class->generatorType); - } - } - - /** - * {@inheritDoc} - */ - protected function wakeupReflection(ClassMetadataInterface $class, ReflectionService $reflService) - { - /* @var $class ClassMetadata */ - $class->wakeupReflection($reflService); - } - - /** - * {@inheritDoc} - */ - protected function initializeReflection(ClassMetadataInterface $class, ReflectionService $reflService) - { - /* @var $class ClassMetadata */ - $class->initializeReflection($reflService); - } - - /** - * {@inheritDoc} - */ - protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) - { - return $this->em->getConfiguration()->getEntityNamespace($namespaceAlias) . '\\' . $simpleClassName; - } - - /** - * {@inheritDoc} - */ - protected function getDriver() - { - return $this->driver; - } - - /** - * {@inheritDoc} - */ - protected function isEntity(ClassMetadataInterface $class) - { - return isset($class->isMappedSuperclass) && $class->isMappedSuperclass === false; - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/framework/library/Doctrine/ORM/Mapping/ClassMetadataInfo.php deleted file mode 100644 index cba525a..0000000 --- a/framework/library/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ /dev/null @@ -1,2820 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -use BadMethodCallException; -use InvalidArgumentException; -use RuntimeException; -use Doctrine\DBAL\Types\Type; -use ReflectionClass; -use Doctrine\Common\Persistence\Mapping\ClassMetadata; -use Doctrine\Common\ClassLoader; - -/** - * A ClassMetadata instance holds all the object-relational mapping metadata - * of an entity and it's associations. - * - * Once populated, ClassMetadata instances are usually cached in a serialized form. - * - * IMPORTANT NOTE: - * - * The fields of this class are only public for 2 reasons: - * 1) To allow fast READ access. - * 2) To drastically reduce the size of a serialized instance (private/protected members - * get the whole class name, namespace inclusive, prepended to every property in - * the serialized representation). - * - * @author Roman Borschel - * @author Jonathan H. Wage - * @since 2.0 - */ -class ClassMetadataInfo implements ClassMetadata -{ - /* The inheritance mapping types */ - /** - * NONE means the class does not participate in an inheritance hierarchy - * and therefore does not need an inheritance mapping type. - */ - const INHERITANCE_TYPE_NONE = 1; - - /** - * JOINED means the class will be persisted according to the rules of - * Class Table Inheritance. - */ - const INHERITANCE_TYPE_JOINED = 2; - - /** - * SINGLE_TABLE means the class will be persisted according to the rules of - * Single Table Inheritance. - */ - const INHERITANCE_TYPE_SINGLE_TABLE = 3; - - /** - * TABLE_PER_CLASS means the class will be persisted according to the rules - * of Concrete Table Inheritance. - */ - const INHERITANCE_TYPE_TABLE_PER_CLASS = 4; - - /* The Id generator types. */ - /** - * AUTO means the generator type will depend on what the used platform prefers. - * Offers full portability. - */ - const GENERATOR_TYPE_AUTO = 1; - - /** - * SEQUENCE means a separate sequence object will be used. Platforms that do - * not have native sequence support may emulate it. Full portability is currently - * not guaranteed. - */ - const GENERATOR_TYPE_SEQUENCE = 2; - - /** - * TABLE means a separate table is used for id generation. - * Offers full portability. - */ - const GENERATOR_TYPE_TABLE = 3; - - /** - * IDENTITY means an identity column is used for id generation. The database - * will fill in the id column on insertion. Platforms that do not support - * native identity columns may emulate them. Full portability is currently - * not guaranteed. - */ - const GENERATOR_TYPE_IDENTITY = 4; - - /** - * NONE means the class does not have a generated id. That means the class - * must have a natural, manually assigned id. - */ - const GENERATOR_TYPE_NONE = 5; - - /** - * UUID means that a UUID/GUID expression is used for id generation. Full - * portability is currently not guaranteed. - */ - const GENERATOR_TYPE_UUID = 6; - /** - * CUSTOM means that customer will use own ID generator that supposedly work - */ - const GENERATOR_TYPE_CUSTOM = 7; - /** - * DEFERRED_IMPLICIT means that changes of entities are calculated at commit-time - * by doing a property-by-property comparison with the original data. This will - * be done for all entities that are in MANAGED state at commit-time. - * - * This is the default change tracking policy. - */ - const CHANGETRACKING_DEFERRED_IMPLICIT = 1; - - /** - * DEFERRED_EXPLICIT means that changes of entities are calculated at commit-time - * by doing a property-by-property comparison with the original data. This will - * be done only for entities that were explicitly saved (through persist() or a cascade). - */ - const CHANGETRACKING_DEFERRED_EXPLICIT = 2; - - /** - * NOTIFY means that Doctrine relies on the entities sending out notifications - * when their properties change. Such entity classes must implement - * the NotifyPropertyChanged interface. - */ - const CHANGETRACKING_NOTIFY = 3; - - /** - * Specifies that an association is to be fetched when it is first accessed. - */ - const FETCH_LAZY = 2; - - /** - * Specifies that an association is to be fetched when the owner of the - * association is fetched. - */ - const FETCH_EAGER = 3; - - /** - * Specifies that an association is to be fetched lazy (on first access) and that - * commands such as Collection#count, Collection#slice are issued directly against - * the database if the collection is not yet initialized. - */ - const FETCH_EXTRA_LAZY = 4; - - /** - * Identifies a one-to-one association. - */ - const ONE_TO_ONE = 1; - - /** - * Identifies a many-to-one association. - */ - const MANY_TO_ONE = 2; - - /** - * Identifies a one-to-many association. - */ - const ONE_TO_MANY = 4; - - /** - * Identifies a many-to-many association. - */ - const MANY_TO_MANY = 8; - - /** - * Combined bitmask for to-one (single-valued) associations. - */ - const TO_ONE = 3; - - /** - * Combined bitmask for to-many (collection-valued) associations. - */ - const TO_MANY = 12; - - /** - * READ-ONLY: The name of the entity class. - */ - public $name; - - /** - * READ-ONLY: The namespace the entity class is contained in. - * - * @var string - * @todo Not really needed. Usage could be localized. - */ - public $namespace; - - /** - * READ-ONLY: The name of the entity class that is at the root of the mapped entity inheritance - * hierarchy. If the entity is not part of a mapped inheritance hierarchy this is the same - * as {@link $entityName}. - * - * @var string - */ - public $rootEntityName; - - /** - * READ-ONLY: The definition of custom generator. Only used for CUSTOM - * generator type - * - * The definition has the following structure: - * - * array( - * 'class' => 'ClassName', - * ) - * - * - * @var array - * @todo Merge with tableGeneratorDefinition into generic generatorDefinition - */ - public $customGeneratorDefinition; - - /** - * The name of the custom repository class used for the entity class. - * (Optional). - * - * @var string - */ - public $customRepositoryClassName; - - /** - * READ-ONLY: Whether this class describes the mapping of a mapped superclass. - * - * @var boolean - */ - public $isMappedSuperclass = false; - - /** - * READ-ONLY: The names of the parent classes (ancestors). - * - * @var array - */ - public $parentClasses = array(); - - /** - * READ-ONLY: The names of all subclasses (descendants). - * - * @var array - */ - public $subClasses = array(); - - /** - * READ-ONLY: The named queries allowed to be called directly from Repository. - * - * @var array - */ - public $namedQueries = array(); - - /** - * READ-ONLY: The named native queries allowed to be called directly from Repository. - * - * A native SQL named query definition has the following structure: - *
-     * array(
-     *     'name'               => ,
-     *     'query'              => ,
-     *     'resultClass'        => ,
-     *     'resultSetMapping'   => 
-     * )
-     * 
- */ - public $namedNativeQueries = array(); - - /** - * READ-ONLY: The mappings of the results of native SQL queries. - * - * A native result mapping definition has the following structure: - *
-     * array(
-     *     'name'               => ,
-     *     'entities'           => array(),
-     *     'columns'            => array()
-     * )
-     * 
- */ - public $sqlResultSetMappings = array(); - - /** - * READ-ONLY: The field names of all fields that are part of the identifier/primary key - * of the mapped entity class. - * - * @var array - */ - public $identifier = array(); - - /** - * READ-ONLY: The inheritance mapping type used by the class. - * - * @var integer - */ - public $inheritanceType = self::INHERITANCE_TYPE_NONE; - - /** - * READ-ONLY: The Id generator type used by the class. - * - * @var string - */ - public $generatorType = self::GENERATOR_TYPE_NONE; - - /** - * READ-ONLY: The field mappings of the class. - * Keys are field names and values are mapping definitions. - * - * The mapping definition array has the following values: - * - * - fieldName (string) - * The name of the field in the Entity. - * - * - type (string) - * The type name of the mapped field. Can be one of Doctrine's mapping types - * or a custom mapping type. - * - * - columnName (string, optional) - * The column name. Optional. Defaults to the field name. - * - * - length (integer, optional) - * The database length of the column. Optional. Default value taken from - * the type. - * - * - id (boolean, optional) - * Marks the field as the primary key of the entity. Multiple fields of an - * entity can have the id attribute, forming a composite key. - * - * - nullable (boolean, optional) - * Whether the column is nullable. Defaults to FALSE. - * - * - columnDefinition (string, optional, schema-only) - * The SQL fragment that is used when generating the DDL for the column. - * - * - precision (integer, optional, schema-only) - * The precision of a decimal column. Only valid if the column type is decimal. - * - * - scale (integer, optional, schema-only) - * The scale of a decimal column. Only valid if the column type is decimal. - * - [* - 'unique'] (string, optional, schema-only) - * Whether a unique constraint should be generated for the column. - * - * @var array - */ - public $fieldMappings = array(); - - /** - * READ-ONLY: An array of field names. Used to look up field names from column names. - * Keys are column names and values are field names. - * This is the reverse lookup map of $_columnNames. - * - * @var array - */ - public $fieldNames = array(); - - /** - * READ-ONLY: A map of field names to column names. Keys are field names and values column names. - * Used to look up column names from field names. - * This is the reverse lookup map of $_fieldNames. - * - * @var array - * @todo We could get rid of this array by just using $fieldMappings[$fieldName]['columnName']. - */ - public $columnNames = array(); - - /** - * READ-ONLY: The discriminator value of this class. - * - * This does only apply to the JOINED and SINGLE_TABLE inheritance mapping strategies - * where a discriminator column is used. - * - * @var mixed - * @see discriminatorColumn - */ - public $discriminatorValue; - - /** - * READ-ONLY: The discriminator map of all mapped classes in the hierarchy. - * - * This does only apply to the JOINED and SINGLE_TABLE inheritance mapping strategies - * where a discriminator column is used. - * - * @var mixed - * @see discriminatorColumn - */ - public $discriminatorMap = array(); - - /** - * READ-ONLY: The definition of the discriminator column used in JOINED and SINGLE_TABLE - * inheritance mappings. - * - * @var array - */ - public $discriminatorColumn; - - /** - * READ-ONLY: The primary table definition. The definition is an array with the - * following entries: - * - * name => - * schema => - * indexes => array - * uniqueConstraints => array - * - * @var array - */ - public $table; - - /** - * READ-ONLY: The registered lifecycle callbacks for entities of this class. - * - * @var array - */ - public $lifecycleCallbacks = array(); - - /** - * READ-ONLY: The association mappings of this class. - * - * The mapping definition array supports the following keys: - * - * - fieldName (string) - * The name of the field in the entity the association is mapped to. - * - * - targetEntity (string) - * The class name of the target entity. If it is fully-qualified it is used as is. - * If it is a simple, unqualified class name the namespace is assumed to be the same - * as the namespace of the source entity. - * - * - mappedBy (string, required for bidirectional associations) - * The name of the field that completes the bidirectional association on the owning side. - * This key must be specified on the inverse side of a bidirectional association. - * - * - inversedBy (string, required for bidirectional associations) - * The name of the field that completes the bidirectional association on the inverse side. - * This key must be specified on the owning side of a bidirectional association. - * - * - cascade (array, optional) - * The names of persistence operations to cascade on the association. The set of possible - * values are: "persist", "remove", "detach", "merge", "refresh", "all" (implies all others). - * - * - orderBy (array, one-to-many/many-to-many only) - * A map of field names (of the target entity) to sorting directions (ASC/DESC). - * Example: array('priority' => 'desc') - * - * - fetch (integer, optional) - * The fetching strategy to use for the association, usually defaults to FETCH_LAZY. - * Possible values are: ClassMetadata::FETCH_EAGER, ClassMetadata::FETCH_LAZY. - * - * - joinTable (array, optional, many-to-many only) - * Specification of the join table and its join columns (foreign keys). - * Only valid for many-to-many mappings. Note that one-to-many associations can be mapped - * through a join table by simply mapping the association as many-to-many with a unique - * constraint on the join table. - * - * - indexBy (string, optional, to-many only) - * Specification of a field on target-entity that is used to index the collection by. - * This field HAS to be either the primary key or a unique column. Otherwise the collection - * does not contain all the entities that are actually related. - * - * A join table definition has the following structure: - *
-     * array(
-     *     'name' => ,
-     *      'joinColumns' => array(),
-     *      'inverseJoinColumns' => array()
-     * )
-     * 
- * - * - * @var array - */ - public $associationMappings = array(); - - /** - * READ-ONLY: Flag indicating whether the identifier/primary key of the class is composite. - * - * @var boolean - */ - public $isIdentifierComposite = false; - - /** - * READ-ONLY: Flag indicating wheather the identifier/primary key contains at least one foreign key association. - * - * This flag is necessary because some code blocks require special treatment of this cases. - * - * @var boolean - */ - public $containsForeignIdentifier = false; - - /** - * READ-ONLY: The ID generator used for generating IDs for this class. - * - * @var \Doctrine\ORM\Id\AbstractIdGenerator - * @todo Remove! - */ - public $idGenerator; - - /** - * READ-ONLY: The definition of the sequence generator of this class. Only used for the - * SEQUENCE generation strategy. - * - * The definition has the following structure: - * - * array( - * 'sequenceName' => 'name', - * 'allocationSize' => 20, - * 'initialValue' => 1 - * ) - * - * - * @var array - * @todo Merge with tableGeneratorDefinition into generic generatorDefinition - */ - public $sequenceGeneratorDefinition; - - /** - * READ-ONLY: The definition of the table generator of this class. Only used for the - * TABLE generation strategy. - * - * @var array - * @todo Merge with tableGeneratorDefinition into generic generatorDefinition - */ - public $tableGeneratorDefinition; - - /** - * READ-ONLY: The policy used for change-tracking on entities of this class. - * - * @var integer - */ - public $changeTrackingPolicy = self::CHANGETRACKING_DEFERRED_IMPLICIT; - - /** - * READ-ONLY: A flag for whether or not instances of this class are to be versioned - * with optimistic locking. - * - * @var boolean $isVersioned - */ - public $isVersioned; - - /** - * READ-ONLY: The name of the field which is used for versioning in optimistic locking (if any). - * - * @var mixed $versionField - */ - public $versionField; - - /** - * The ReflectionClass instance of the mapped class. - * - * @var ReflectionClass - */ - public $reflClass; - - /** - * Is this entity marked as "read-only"? - * - * That means it is never considered for change-tracking in the UnitOfWork. It is a very helpful performance - * optimization for entities that are immutable, either in your domain or through the relation database - * (coming from a view, or a history table for example). - * - * @var bool - */ - public $isReadOnly = false; - - /** - * NamingStrategy determining the default column and table names - * - * @var \Doctrine\ORM\Mapping\NamingStrategy - */ - protected $namingStrategy; - - /** - * The ReflectionProperty instances of the mapped class. - * - * @var array - */ - public $reflFields = array(); - - /** - * The prototype from which new instances of the mapped class are created. - * - * @var object - */ - private $_prototype; - - /** - * Initializes a new ClassMetadata instance that will hold the object-relational mapping - * metadata of the class with the given name. - * - * @param string $entityName The name of the entity class the new instance is used for. - * @param NamingStrategy $namingStrategy - */ - public function __construct($entityName, NamingStrategy $namingStrategy = null) - { - $this->name = $entityName; - $this->rootEntityName = $entityName; - $this->namingStrategy = $namingStrategy ?: new DefaultNamingStrategy(); - } - - /** - * Gets the ReflectionPropertys of the mapped class. - * - * @return array An array of ReflectionProperty instances. - */ - public function getReflectionProperties() - { - return $this->reflFields; - } - - /** - * Gets a ReflectionProperty for a specific field of the mapped class. - * - * @param string $name - * @return \ReflectionProperty - */ - public function getReflectionProperty($name) - { - return $this->reflFields[$name]; - } - - /** - * Gets the ReflectionProperty for the single identifier field. - * - * @return \ReflectionProperty - * @throws BadMethodCallException If the class has a composite identifier. - */ - public function getSingleIdReflectionProperty() - { - if ($this->isIdentifierComposite) { - throw new BadMethodCallException("Class " . $this->name . " has a composite identifier."); - } - return $this->reflFields[$this->identifier[0]]; - } - - /** - * Extracts the identifier values of an entity of this class. - * - * For composite identifiers, the identifier values are returned as an array - * with the same order as the field order in {@link identifier}. - * - * @param object $entity - * @return array - */ - public function getIdentifierValues($entity) - { - if ($this->isIdentifierComposite) { - $id = array(); - - foreach ($this->identifier as $idField) { - $value = $this->reflFields[$idField]->getValue($entity); - - if ($value !== null) { - $id[$idField] = $value; - } - } - - return $id; - } - - $value = $this->reflFields[$this->identifier[0]]->getValue($entity); - - if ($value !== null) { - return array($this->identifier[0] => $value); - } - - return array(); - } - - /** - * Populates the entity identifier of an entity. - * - * @param object $entity - * @param mixed $id - * @todo Rename to assignIdentifier() - */ - public function setIdentifierValues($entity, array $id) - { - foreach ($id as $idField => $idValue) { - $this->reflFields[$idField]->setValue($entity, $idValue); - } - } - - /** - * Sets the specified field to the specified value on the given entity. - * - * @param object $entity - * @param string $field - * @param mixed $value - */ - public function setFieldValue($entity, $field, $value) - { - $this->reflFields[$field]->setValue($entity, $value); - } - - /** - * Gets the specified field's value off the given entity. - * - * @param object $entity - * @param string $field - */ - public function getFieldValue($entity, $field) - { - return $this->reflFields[$field]->getValue($entity); - } - - /** - * Creates a string representation of this instance. - * - * @return string The string representation of this instance. - * @todo Construct meaningful string representation. - */ - public function __toString() - { - return __CLASS__ . '@' . spl_object_hash($this); - } - - /** - * Determines which fields get serialized. - * - * It is only serialized what is necessary for best unserialization performance. - * That means any metadata properties that are not set or empty or simply have - * their default value are NOT serialized. - * - * Parts that are also NOT serialized because they can not be properly unserialized: - * - reflClass (ReflectionClass) - * - reflFields (ReflectionProperty array) - * - * @return array The names of all the fields that should be serialized. - */ - public function __sleep() - { - // This metadata is always serialized/cached. - $serialized = array( - 'associationMappings', - 'columnNames', //TODO: Not really needed. Can use fieldMappings[$fieldName]['columnName'] - 'fieldMappings', - 'fieldNames', - 'identifier', - 'isIdentifierComposite', // TODO: REMOVE - 'name', - 'namespace', // TODO: REMOVE - 'table', - 'rootEntityName', - 'idGenerator', //TODO: Does not really need to be serialized. Could be moved to runtime. - ); - - // The rest of the metadata is only serialized if necessary. - if ($this->changeTrackingPolicy != self::CHANGETRACKING_DEFERRED_IMPLICIT) { - $serialized[] = 'changeTrackingPolicy'; - } - - if ($this->customRepositoryClassName) { - $serialized[] = 'customRepositoryClassName'; - } - - if ($this->inheritanceType != self::INHERITANCE_TYPE_NONE) { - $serialized[] = 'inheritanceType'; - $serialized[] = 'discriminatorColumn'; - $serialized[] = 'discriminatorValue'; - $serialized[] = 'discriminatorMap'; - $serialized[] = 'parentClasses'; - $serialized[] = 'subClasses'; - } - - if ($this->generatorType != self::GENERATOR_TYPE_NONE) { - $serialized[] = 'generatorType'; - if ($this->generatorType == self::GENERATOR_TYPE_SEQUENCE) { - $serialized[] = 'sequenceGeneratorDefinition'; - } - } - - if ($this->isMappedSuperclass) { - $serialized[] = 'isMappedSuperclass'; - } - - if ($this->containsForeignIdentifier) { - $serialized[] = 'containsForeignIdentifier'; - } - - if ($this->isVersioned) { - $serialized[] = 'isVersioned'; - $serialized[] = 'versionField'; - } - - if ($this->lifecycleCallbacks) { - $serialized[] = 'lifecycleCallbacks'; - } - - if ($this->namedQueries) { - $serialized[] = 'namedQueries'; - } - - if ($this->namedNativeQueries) { - $serialized[] = 'namedNativeQueries'; - } - - if ($this->sqlResultSetMappings) { - $serialized[] = 'sqlResultSetMappings'; - } - - if ($this->isReadOnly) { - $serialized[] = 'isReadOnly'; - } - - if ($this->customGeneratorDefinition) { - $serialized[] = "customGeneratorDefinition"; - } - - return $serialized; - } - - /** - * Creates a new instance of the mapped class, without invoking the constructor. - * - * @return object - */ - public function newInstance() - { - if ($this->_prototype === null) { - $this->_prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name)); - } - - return clone $this->_prototype; - } - /** - * Restores some state that can not be serialized/unserialized. - * - * @param \Doctrine\Common\Persistence\Mapping\ReflectionService $reflService - * @return void - */ - public function wakeupReflection($reflService) - { - // Restore ReflectionClass and properties - $this->reflClass = $reflService->getClass($this->name); - - foreach ($this->fieldMappings as $field => $mapping) { - $this->reflFields[$field] = isset($mapping['declared']) - ? $reflService->getAccessibleProperty($mapping['declared'], $field) - : $reflService->getAccessibleProperty($this->name, $field); - } - - foreach ($this->associationMappings as $field => $mapping) { - $this->reflFields[$field] = isset($mapping['declared']) - ? $reflService->getAccessibleProperty($mapping['declared'], $field) - : $reflService->getAccessibleProperty($this->name, $field); - } - } - - /** - * Initializes a new ClassMetadata instance that will hold the object-relational mapping - * metadata of the class with the given name. - * - * @param \Doctrine\Common\Persistence\Mapping\ReflectionService $reflService The reflection service. - */ - public function initializeReflection($reflService) - { - $this->reflClass = $reflService->getClass($this->name); - $this->namespace = $reflService->getClassNamespace($this->name); - - if ($this->reflClass) { - $this->name = $this->rootEntityName = $this->reflClass->getName(); - } - - $this->table['name'] = $this->namingStrategy->classToTableName($this->name); - } - - /** - * Validate Identifier - * - * @throws MappingException - * @return void - */ - public function validateIdentifier() - { - // Verify & complete identifier mapping - if ( ! $this->identifier && ! $this->isMappedSuperclass) { - throw MappingException::identifierRequired($this->name); - } - - if ($this->usesIdGenerator() && $this->isIdentifierComposite) { - throw MappingException::compositeKeyAssignedIdGeneratorRequired($this->name); - } - } - - /** - * Validate association targets actually exist. - * - * @throws MappingException - * @return void - */ - public function validateAssocations() - { - foreach ($this->associationMappings as $mapping) { - if ( ! ClassLoader::classExists($mapping['targetEntity']) ) { - throw MappingException::invalidTargetEntityClass($mapping['targetEntity'], $this->name, $mapping['fieldName']); - } - } - } - - /** - * Validate lifecycle callbacks - * - * @param \Doctrine\Common\Persistence\Mapping\ReflectionService $reflService - * @throws MappingException - * @return void - */ - public function validateLifecycleCallbacks($reflService) - { - foreach ($this->lifecycleCallbacks as $callbacks) { - foreach ($callbacks as $callbackFuncName) { - if ( ! $reflService->hasPublicMethod($this->name, $callbackFuncName)) { - throw MappingException::lifecycleCallbackMethodNotFound($this->name, $callbackFuncName); - } - } - } - } - - /** - * {@inheritDoc} - */ - public function getReflectionClass() - { - return $this->reflClass; - } - - /** - * Sets the change tracking policy used by this class. - * - * @param integer $policy - */ - public function setChangeTrackingPolicy($policy) - { - $this->changeTrackingPolicy = $policy; - } - - /** - * Whether the change tracking policy of this class is "deferred explicit". - * - * @return boolean - */ - public function isChangeTrackingDeferredExplicit() - { - return $this->changeTrackingPolicy == self::CHANGETRACKING_DEFERRED_EXPLICIT; - } - - /** - * Whether the change tracking policy of this class is "deferred implicit". - * - * @return boolean - */ - public function isChangeTrackingDeferredImplicit() - { - return $this->changeTrackingPolicy == self::CHANGETRACKING_DEFERRED_IMPLICIT; - } - - /** - * Whether the change tracking policy of this class is "notify". - * - * @return boolean - */ - public function isChangeTrackingNotify() - { - return $this->changeTrackingPolicy == self::CHANGETRACKING_NOTIFY; - } - - /** - * Checks whether a field is part of the identifier/primary key field(s). - * - * @param string $fieldName The field name - * @return boolean TRUE if the field is part of the table identifier/primary key field(s), - * FALSE otherwise. - */ - public function isIdentifier($fieldName) - { - if ( ! $this->isIdentifierComposite) { - return $fieldName === $this->identifier[0]; - } - return in_array($fieldName, $this->identifier); - } - - /** - * Check if the field is unique. - * - * @param string $fieldName The field name - * @return boolean TRUE if the field is unique, FALSE otherwise. - */ - public function isUniqueField($fieldName) - { - $mapping = $this->getFieldMapping($fieldName); - if ($mapping !== false) { - return isset($mapping['unique']) && $mapping['unique'] == true; - } - return false; - } - - /** - * Check if the field is not null. - * - * @param string $fieldName The field name - * @return boolean TRUE if the field is not null, FALSE otherwise. - */ - public function isNullable($fieldName) - { - $mapping = $this->getFieldMapping($fieldName); - if ($mapping !== false) { - return isset($mapping['nullable']) && $mapping['nullable'] == true; - } - return false; - } - - /** - * Gets a column name for a field name. - * If the column name for the field cannot be found, the given field name - * is returned. - * - * @param string $fieldName The field name. - * @return string The column name. - */ - public function getColumnName($fieldName) - { - return isset($this->columnNames[$fieldName]) ? - $this->columnNames[$fieldName] : $fieldName; - } - - /** - * Gets the mapping of a (regular) field that holds some data but not a - * reference to another object. - * - * @param string $fieldName The field name. - * @throws MappingException - * @return array The field mapping. - */ - public function getFieldMapping($fieldName) - { - if ( ! isset($this->fieldMappings[$fieldName])) { - throw MappingException::mappingNotFound($this->name, $fieldName); - } - return $this->fieldMappings[$fieldName]; - } - - /** - * Gets the mapping of an association. - * - * @see ClassMetadataInfo::$associationMappings - * @param string $fieldName The field name that represents the association in - * the object model. - * @throws MappingException - * @return array The mapping. - */ - public function getAssociationMapping($fieldName) - { - if ( ! isset($this->associationMappings[$fieldName])) { - throw MappingException::mappingNotFound($this->name, $fieldName); - } - return $this->associationMappings[$fieldName]; - } - - /** - * Gets all association mappings of the class. - * - * @return array - */ - public function getAssociationMappings() - { - return $this->associationMappings; - } - - /** - * Gets the field name for a column name. - * If no field name can be found the column name is returned. - * - * @param string $columnName column name - * @return string column alias - */ - public function getFieldName($columnName) - { - return isset($this->fieldNames[$columnName]) ? - $this->fieldNames[$columnName] : $columnName; - } - - /** - * Gets the named query. - * - * @see ClassMetadataInfo::$namedQueries - * @throws MappingException - * @param string $queryName The query name - * @return string - */ - public function getNamedQuery($queryName) - { - if ( ! isset($this->namedQueries[$queryName])) { - throw MappingException::queryNotFound($this->name, $queryName); - } - return $this->namedQueries[$queryName]['dql']; - } - - /** - * Gets all named queries of the class. - * - * @return array - */ - public function getNamedQueries() - { - return $this->namedQueries; - } - - /** - * Gets the named native query. - * - * @see ClassMetadataInfo::$namedNativeQueries - * @throws MappingException - * @param string $queryName The query name - * @return array - */ - public function getNamedNativeQuery($queryName) - { - if ( ! isset($this->namedNativeQueries[$queryName])) { - throw MappingException::queryNotFound($this->name, $queryName); - } - - return $this->namedNativeQueries[$queryName]; - } - - /** - * Gets all named native queries of the class. - * - * @return array - */ - public function getNamedNativeQueries() - { - return $this->namedNativeQueries; - } - - /** - * Gets the result set mapping. - * - * @see ClassMetadataInfo::$sqlResultSetMappings - * @throws MappingException - * @param string $name The result set mapping name - * @return array - */ - public function getSqlResultSetMapping($name) - { - if ( ! isset($this->sqlResultSetMappings[$name])) { - throw MappingException::resultMappingNotFound($this->name, $name); - } - - return $this->sqlResultSetMappings[$name]; - } - - /** - * Gets all sql result set mappings of the class. - * - * @return array - */ - public function getSqlResultSetMappings() - { - return $this->sqlResultSetMappings; - } - - /** - * Validates & completes the given field mapping. - * - * @param array $mapping The field mapping to validated & complete. - * @throws MappingException - * @return array The validated and completed field mapping. - */ - protected function _validateAndCompleteFieldMapping(array &$mapping) - { - // Check mandatory fields - if ( ! isset($mapping['fieldName']) || strlen($mapping['fieldName']) == 0) { - throw MappingException::missingFieldName($this->name); - } - if ( ! isset($mapping['type'])) { - // Default to string - $mapping['type'] = 'string'; - } - - // Complete fieldName and columnName mapping - if ( ! isset($mapping['columnName'])) { - $mapping['columnName'] = $this->namingStrategy->propertyToColumnName($mapping['fieldName']); - } - - if ($mapping['columnName'][0] === '`') { - $mapping['columnName'] = trim($mapping['columnName'], '`'); - $mapping['quoted'] = true; - } - - $this->columnNames[$mapping['fieldName']] = $mapping['columnName']; - if (isset($this->fieldNames[$mapping['columnName']]) || ($this->discriminatorColumn != null && $this->discriminatorColumn['name'] == $mapping['columnName'])) { - throw MappingException::duplicateColumnName($this->name, $mapping['columnName']); - } - - $this->fieldNames[$mapping['columnName']] = $mapping['fieldName']; - - // Complete id mapping - if (isset($mapping['id']) && $mapping['id'] === true) { - if ($this->versionField == $mapping['fieldName']) { - throw MappingException::cannotVersionIdField($this->name, $mapping['fieldName']); - } - - if ( ! in_array($mapping['fieldName'], $this->identifier)) { - $this->identifier[] = $mapping['fieldName']; - } - // Check for composite key - if ( ! $this->isIdentifierComposite && count($this->identifier) > 1) { - $this->isIdentifierComposite = true; - } - } - - if (Type::hasType($mapping['type']) && Type::getType($mapping['type'])->canRequireSQLConversion()) { - if (isset($mapping['id']) && $mapping['id'] === true) { - throw MappingException::sqlConversionNotAllowedForIdentifiers($this->name, $mapping['fieldName'], $mapping['type']); - } - - $mapping['requireSQLConversion'] = true; - } - } - - /** - * Validates & completes the basic mapping information that is common to all - * association mappings (one-to-one, many-ot-one, one-to-many, many-to-many). - * - * @param array $mapping The mapping. - * @return array The updated mapping. - * @throws MappingException If something is wrong with the mapping. - */ - protected function _validateAndCompleteAssociationMapping(array $mapping) - { - if ( ! isset($mapping['mappedBy'])) { - $mapping['mappedBy'] = null; - } - if ( ! isset($mapping['inversedBy'])) { - $mapping['inversedBy'] = null; - } - $mapping['isOwningSide'] = true; // assume owning side until we hit mappedBy - - // unset optional indexBy attribute if its empty - if ( ! isset($mapping['indexBy']) || !$mapping['indexBy']) { - unset($mapping['indexBy']); - } - - // If targetEntity is unqualified, assume it is in the same namespace as - // the sourceEntity. - $mapping['sourceEntity'] = $this->name; - - if (isset($mapping['targetEntity'])) { - if (strlen($this->namespace) > 0 && strpos($mapping['targetEntity'], '\\') === false) { - $mapping['targetEntity'] = $this->namespace . '\\' . $mapping['targetEntity']; - } - - $mapping['targetEntity'] = ltrim($mapping['targetEntity'], '\\'); - } - - if ( ($mapping['type'] & self::MANY_TO_ONE) > 0 && - isset($mapping['orphanRemoval']) && - $mapping['orphanRemoval'] == true) { - - throw MappingException::illegalOrphanRemoval($this->name, $mapping['fieldName']); - } - - // Complete id mapping - if (isset($mapping['id']) && $mapping['id'] === true) { - if (isset($mapping['orphanRemoval']) && $mapping['orphanRemoval'] == true) { - throw MappingException::illegalOrphanRemovalOnIdentifierAssociation($this->name, $mapping['fieldName']); - } - - if ( ! in_array($mapping['fieldName'], $this->identifier)) { - if (count($mapping['joinColumns']) >= 2) { - throw MappingException::cannotMapCompositePrimaryKeyEntitiesAsForeignId( - $mapping['targetEntity'], $this->name, $mapping['fieldName'] - ); - } - - $this->identifier[] = $mapping['fieldName']; - $this->containsForeignIdentifier = true; - } - // Check for composite key - if ( ! $this->isIdentifierComposite && count($this->identifier) > 1) { - $this->isIdentifierComposite = true; - } - } - - // Mandatory attributes for both sides - // Mandatory: fieldName, targetEntity - if ( ! isset($mapping['fieldName']) || strlen($mapping['fieldName']) == 0) { - throw MappingException::missingFieldName($this->name); - } - if ( ! isset($mapping['targetEntity'])) { - throw MappingException::missingTargetEntity($mapping['fieldName']); - } - - // Mandatory and optional attributes for either side - if ( ! $mapping['mappedBy']) { - if (isset($mapping['joinTable']) && $mapping['joinTable']) { - if (isset($mapping['joinTable']['name']) && $mapping['joinTable']['name'][0] === '`') { - $mapping['joinTable']['name'] = trim($mapping['joinTable']['name'], '`'); - $mapping['joinTable']['quoted'] = true; - } - } - } else { - $mapping['isOwningSide'] = false; - } - - if (isset($mapping['id']) && $mapping['id'] === true && $mapping['type'] & self::TO_MANY) { - throw MappingException::illegalToManyIdentifierAssoaction($this->name, $mapping['fieldName']); - } - - // Fetch mode. Default fetch mode to LAZY, if not set. - if ( ! isset($mapping['fetch'])) { - $mapping['fetch'] = self::FETCH_LAZY; - } - - // Cascades - $cascades = isset($mapping['cascade']) ? array_map('strtolower', $mapping['cascade']) : array(); - - if (in_array('all', $cascades)) { - $cascades = array('remove', 'persist', 'refresh', 'merge', 'detach'); - } - - if (count($cascades) !== count(array_intersect($cascades, array('remove', 'persist', 'refresh', 'merge', 'detach')))) { - throw MappingException::invalidCascadeOption( - array_diff($cascades, array_intersect($cascades, array('remove', 'persist', 'refresh', 'merge', 'detach'))), - $this->name, - $mapping['fieldName'] - ); - } - - $mapping['cascade'] = $cascades; - $mapping['isCascadeRemove'] = in_array('remove', $cascades); - $mapping['isCascadePersist'] = in_array('persist', $cascades); - $mapping['isCascadeRefresh'] = in_array('refresh', $cascades); - $mapping['isCascadeMerge'] = in_array('merge', $cascades); - $mapping['isCascadeDetach'] = in_array('detach', $cascades); - - return $mapping; - } - - /** - * Validates & completes a one-to-one association mapping. - * - * @param array $mapping The mapping to validate & complete. - * @throws RuntimeException - * @throws MappingException - * @return array The validated & completed mapping.@override - */ - protected function _validateAndCompleteOneToOneMapping(array $mapping) - { - $mapping = $this->_validateAndCompleteAssociationMapping($mapping); - - if (isset($mapping['joinColumns']) && $mapping['joinColumns']) { - $mapping['isOwningSide'] = true; - } - - if ($mapping['isOwningSide']) { - if ( ! isset($mapping['joinColumns']) || ! $mapping['joinColumns']) { - // Apply default join column - $mapping['joinColumns'] = array(array( - 'name' => $this->namingStrategy->joinColumnName($mapping['fieldName']), - 'referencedColumnName' => $this->namingStrategy->referenceColumnName() - )); - } - - $uniqueContraintColumns = array(); - foreach ($mapping['joinColumns'] as &$joinColumn) { - if ($mapping['type'] === self::ONE_TO_ONE && ! $this->isInheritanceTypeSingleTable()) { - if (count($mapping['joinColumns']) == 1) { - if ( ! isset($mapping['id']) || ! $mapping['id']) { - $joinColumn['unique'] = true; - } - } else { - $uniqueContraintColumns[] = $joinColumn['name']; - } - } - - if (empty($joinColumn['name'])) { - $joinColumn['name'] = $this->namingStrategy->joinColumnName($mapping['fieldName']); - } - - if (empty($joinColumn['referencedColumnName'])) { - $joinColumn['referencedColumnName'] = $this->namingStrategy->referenceColumnName(); - } - - if ($joinColumn['name'][0] === '`') { - $joinColumn['name'] = trim($joinColumn['name'], '`'); - $joinColumn['quoted'] = true; - } - - if ($joinColumn['referencedColumnName'][0] === '`') { - $joinColumn['referencedColumnName'] = trim($joinColumn['referencedColumnName'], '`'); - $joinColumn['quoted'] = true; - } - - $mapping['sourceToTargetKeyColumns'][$joinColumn['name']] = $joinColumn['referencedColumnName']; - $mapping['joinColumnFieldNames'][$joinColumn['name']] = isset($joinColumn['fieldName']) - ? $joinColumn['fieldName'] : $joinColumn['name']; - } - - if ($uniqueContraintColumns) { - if ( ! $this->table) { - throw new RuntimeException("ClassMetadataInfo::setTable() has to be called before defining a one to one relationship."); - } - $this->table['uniqueConstraints'][$mapping['fieldName']."_uniq"] = array( - 'columns' => $uniqueContraintColumns - ); - } - - $mapping['targetToSourceKeyColumns'] = array_flip($mapping['sourceToTargetKeyColumns']); - } - - $mapping['orphanRemoval'] = isset($mapping['orphanRemoval']) ? (bool) $mapping['orphanRemoval'] : false; - $mapping['isCascadeRemove'] = $mapping['orphanRemoval'] ? true : $mapping['isCascadeRemove']; - - if ($mapping['orphanRemoval']) { - unset($mapping['unique']); - } - - if (isset($mapping['id']) && $mapping['id'] === true && !$mapping['isOwningSide']) { - throw MappingException::illegalInverseIdentifierAssocation($this->name, $mapping['fieldName']); - } - - return $mapping; - } - - /** - * Validates and completes the mapping. - * - * @param array $mapping The mapping to validate and complete. - * @throws MappingException - * @throws InvalidArgumentException - * @return array The validated and completed mapping.@override - */ - protected function _validateAndCompleteOneToManyMapping(array $mapping) - { - $mapping = $this->_validateAndCompleteAssociationMapping($mapping); - - // OneToMany-side MUST be inverse (must have mappedBy) - if ( ! isset($mapping['mappedBy'])) { - throw MappingException::oneToManyRequiresMappedBy($mapping['fieldName']); - } - - $mapping['orphanRemoval'] = isset($mapping['orphanRemoval']) ? (bool) $mapping['orphanRemoval'] : false; - $mapping['isCascadeRemove'] = $mapping['orphanRemoval'] ? true : $mapping['isCascadeRemove']; - - if (isset($mapping['orderBy'])) { - if ( ! is_array($mapping['orderBy'])) { - throw new InvalidArgumentException("'orderBy' is expected to be an array, not ".gettype($mapping['orderBy'])); - } - } - - return $mapping; - } - - protected function _validateAndCompleteManyToManyMapping(array $mapping) - { - $mapping = $this->_validateAndCompleteAssociationMapping($mapping); - if ($mapping['isOwningSide']) { - // owning side MUST have a join table - if ( ! isset($mapping['joinTable']['name'])) { - $mapping['joinTable']['name'] = $this->namingStrategy->joinTableName($mapping['sourceEntity'], $mapping['targetEntity'], $mapping['fieldName']); - } - if ( ! isset($mapping['joinTable']['joinColumns'])) { - $mapping['joinTable']['joinColumns'] = array(array( - 'name' => $this->namingStrategy->joinKeyColumnName($mapping['sourceEntity']), - 'referencedColumnName' => $this->namingStrategy->referenceColumnName(), - 'onDelete' => 'CASCADE')); - } - if ( ! isset($mapping['joinTable']['inverseJoinColumns'])) { - $mapping['joinTable']['inverseJoinColumns'] = array(array( - 'name' => $this->namingStrategy->joinKeyColumnName($mapping['targetEntity']), - 'referencedColumnName' => $this->namingStrategy->referenceColumnName(), - 'onDelete' => 'CASCADE')); - } - - $mapping['joinTableColumns'] = array(); - - foreach ($mapping['joinTable']['joinColumns'] as &$joinColumn) { - if (empty($joinColumn['name'])) { - $joinColumn['name'] = $this->namingStrategy->joinKeyColumnName($mapping['sourceEntity'], $joinColumn['referencedColumnName']); - } - - if (empty($joinColumn['referencedColumnName'])) { - $joinColumn['referencedColumnName'] = $this->namingStrategy->referenceColumnName(); - } - - if ($joinColumn['name'][0] === '`') { - $joinColumn['name'] = trim($joinColumn['name'], '`'); - $joinColumn['quoted'] = true; - } - - if ($joinColumn['referencedColumnName'][0] === '`') { - $joinColumn['referencedColumnName'] = trim($joinColumn['referencedColumnName'], '`'); - $joinColumn['quoted'] = true; - } - - if (isset($joinColumn['onDelete']) && strtolower($joinColumn['onDelete']) == 'cascade') { - $mapping['isOnDeleteCascade'] = true; - } - - $mapping['relationToSourceKeyColumns'][$joinColumn['name']] = $joinColumn['referencedColumnName']; - $mapping['joinTableColumns'][] = $joinColumn['name']; - } - - foreach ($mapping['joinTable']['inverseJoinColumns'] as &$inverseJoinColumn) { - if (empty($inverseJoinColumn['name'])) { - $inverseJoinColumn['name'] = $this->namingStrategy->joinKeyColumnName($mapping['targetEntity'], $inverseJoinColumn['referencedColumnName']); - } - - if (empty($inverseJoinColumn['referencedColumnName'])) { - $inverseJoinColumn['referencedColumnName'] = $this->namingStrategy->referenceColumnName(); - } - - if ($inverseJoinColumn['name'][0] === '`') { - $inverseJoinColumn['name'] = trim($inverseJoinColumn['name'], '`'); - $inverseJoinColumn['quoted'] = true; - } - - if ($inverseJoinColumn['referencedColumnName'][0] === '`') { - $inverseJoinColumn['referencedColumnName'] = trim($inverseJoinColumn['referencedColumnName'], '`'); - $inverseJoinColumn['quoted'] = true; - } - - if (isset($inverseJoinColumn['onDelete']) && strtolower($inverseJoinColumn['onDelete']) == 'cascade') { - $mapping['isOnDeleteCascade'] = true; - } - - $mapping['relationToTargetKeyColumns'][$inverseJoinColumn['name']] = $inverseJoinColumn['referencedColumnName']; - $mapping['joinTableColumns'][] = $inverseJoinColumn['name']; - } - } - - $mapping['orphanRemoval'] = isset($mapping['orphanRemoval']) ? (bool) $mapping['orphanRemoval'] : false; - - if (isset($mapping['orderBy'])) { - if ( ! is_array($mapping['orderBy'])) { - throw new InvalidArgumentException("'orderBy' is expected to be an array, not ".gettype($mapping['orderBy'])); - } - } - - return $mapping; - } - - /** - * {@inheritDoc} - */ - public function getIdentifierFieldNames() - { - return $this->identifier; - } - - /** - * Gets the name of the single id field. Note that this only works on - * entity classes that have a single-field pk. - * - * @return string - * @throws MappingException If the class has a composite primary key. - */ - public function getSingleIdentifierFieldName() - { - if ($this->isIdentifierComposite) { - throw MappingException::singleIdNotAllowedOnCompositePrimaryKey($this->name); - } - return $this->identifier[0]; - } - - /** - * Gets the column name of the single id column. Note that this only works on - * entity classes that have a single-field pk. - * - * @return string - * @throws MappingException If the class has a composite primary key. - */ - public function getSingleIdentifierColumnName() - { - return $this->getColumnName($this->getSingleIdentifierFieldName()); - } - - /** - * INTERNAL: - * Sets the mapped identifier/primary key fields of this class. - * Mainly used by the ClassMetadataFactory to assign inherited identifiers. - * - * @param array $identifier - */ - public function setIdentifier(array $identifier) - { - $this->identifier = $identifier; - $this->isIdentifierComposite = (count($this->identifier) > 1); - } - - /** - * Gets the mapped identifier field of this class. - * - * @return array|string $identifier - */ - public function getIdentifier() - { - return $this->identifier; - } - - /** - * {@inheritDoc} - */ - public function hasField($fieldName) - { - return isset($this->fieldMappings[$fieldName]); - } - - /** - * Gets an array containing all the column names. - * - * @param array $fieldNames - * @return array - */ - public function getColumnNames(array $fieldNames = null) - { - if ($fieldNames === null) { - return array_keys($this->fieldNames); - } else { - $columnNames = array(); - foreach ($fieldNames as $fieldName) { - $columnNames[] = $this->getColumnName($fieldName); - } - return $columnNames; - } - } - - /** - * Returns an array with all the identifier column names. - * - * @return array - */ - public function getIdentifierColumnNames() - { - $columnNames = array(); - - foreach ($this->identifier as $idProperty) { - if (isset($this->fieldMappings[$idProperty])) { - $columnNames[] = $this->fieldMappings[$idProperty]['columnName']; - - continue; - } - - // Association defined as Id field - $joinColumns = $this->associationMappings[$idProperty]['joinColumns']; - $assocColumnNames = array_map(function ($joinColumn) { return $joinColumn['name']; }, $joinColumns); - - $columnNames = array_merge($columnNames, $assocColumnNames); - } - - return $columnNames; - } - - /** - * Sets the type of Id generator to use for the mapped class. - */ - public function setIdGeneratorType($generatorType) - { - $this->generatorType = $generatorType; - } - - /** - * Checks whether the mapped class uses an Id generator. - * - * @return boolean TRUE if the mapped class uses an Id generator, FALSE otherwise. - */ - public function usesIdGenerator() - { - return $this->generatorType != self::GENERATOR_TYPE_NONE; - } - - /** - * @return boolean - */ - public function isInheritanceTypeNone() - { - return $this->inheritanceType == self::INHERITANCE_TYPE_NONE; - } - - /** - * Checks whether the mapped class uses the JOINED inheritance mapping strategy. - * - * @return boolean TRUE if the class participates in a JOINED inheritance mapping, - * FALSE otherwise. - */ - public function isInheritanceTypeJoined() - { - return $this->inheritanceType == self::INHERITANCE_TYPE_JOINED; - } - - /** - * Checks whether the mapped class uses the SINGLE_TABLE inheritance mapping strategy. - * - * @return boolean TRUE if the class participates in a SINGLE_TABLE inheritance mapping, - * FALSE otherwise. - */ - public function isInheritanceTypeSingleTable() - { - return $this->inheritanceType == self::INHERITANCE_TYPE_SINGLE_TABLE; - } - - /** - * Checks whether the mapped class uses the TABLE_PER_CLASS inheritance mapping strategy. - * - * @return boolean TRUE if the class participates in a TABLE_PER_CLASS inheritance mapping, - * FALSE otherwise. - */ - public function isInheritanceTypeTablePerClass() - { - return $this->inheritanceType == self::INHERITANCE_TYPE_TABLE_PER_CLASS; - } - - /** - * Checks whether the class uses an identity column for the Id generation. - * - * @return boolean TRUE if the class uses the IDENTITY generator, FALSE otherwise. - */ - public function isIdGeneratorIdentity() - { - return $this->generatorType == self::GENERATOR_TYPE_IDENTITY; - } - - /** - * Checks whether the class uses a sequence for id generation. - * - * @return boolean TRUE if the class uses the SEQUENCE generator, FALSE otherwise. - */ - public function isIdGeneratorSequence() - { - return $this->generatorType == self::GENERATOR_TYPE_SEQUENCE; - } - - /** - * Checks whether the class uses a table for id generation. - * - * @return boolean TRUE if the class uses the TABLE generator, FALSE otherwise. - */ - public function isIdGeneratorTable() - { - return $this->generatorType == self::GENERATOR_TYPE_TABLE; - } - - /** - * Checks whether the class has a natural identifier/pk (which means it does - * not use any Id generator. - * - * @return boolean - */ - public function isIdentifierNatural() - { - return $this->generatorType == self::GENERATOR_TYPE_NONE; - } - - /** - * Checks whether the class use a UUID for id generation - * - * @return boolean - */ - public function isIdentifierUuid() - { - return $this->generatorType == self::GENERATOR_TYPE_UUID; - } - - /** - * Gets the type of a field. - * - * @param string $fieldName - * @return \Doctrine\DBAL\Types\Type|string - */ - public function getTypeOfField($fieldName) - { - return isset($this->fieldMappings[$fieldName]) ? - $this->fieldMappings[$fieldName]['type'] : null; - } - - /** - * Gets the type of a column. - * - * @param string $columnName - * @return \Doctrine\DBAL\Types\Type - */ - public function getTypeOfColumn($columnName) - { - return $this->getTypeOfField($this->getFieldName($columnName)); - } - - /** - * Gets the name of the primary table. - * - * @return string - */ - public function getTableName() - { - return $this->table['name']; - } - - /** - * Gets the table name to use for temporary identifier tables of this class. - * - * @return string - */ - public function getTemporaryIdTableName() - { - // replace dots with underscores because PostgreSQL creates temporary tables in a special schema - return str_replace('.', '_', $this->getTableName() . '_id_tmp'); - } - - /** - * Sets the mapped subclasses of this class. - * - * @param array $subclasses The names of all mapped subclasses. - */ - public function setSubclasses(array $subclasses) - { - foreach ($subclasses as $subclass) { - if (strpos($subclass, '\\') === false && strlen($this->namespace)) { - $this->subClasses[] = $this->namespace . '\\' . $subclass; - } else { - $this->subClasses[] = $subclass; - } - } - } - - /** - * Sets the parent class names. - * Assumes that the class names in the passed array are in the order: - * directParent -> directParentParent -> directParentParentParent ... -> root. - */ - public function setParentClasses(array $classNames) - { - $this->parentClasses = $classNames; - if (count($classNames) > 0) { - $this->rootEntityName = array_pop($classNames); - } - } - - /** - * Sets the inheritance type used by the class and it's subclasses. - * - * @param integer $type - * @throws MappingException - * @return void - */ - public function setInheritanceType($type) - { - if ( ! $this->_isInheritanceType($type)) { - throw MappingException::invalidInheritanceType($this->name, $type); - } - $this->inheritanceType = $type; - } - - /** - * Sets the association to override association mapping of property for an entity relationship. - * - * @param string $fieldName - * @param array $overrideMapping - * @throws MappingException - * @return void - */ - public function setAssociationOverride($fieldName, array $overrideMapping) - { - if ( ! isset($this->associationMappings[$fieldName])) { - throw MappingException::invalidOverrideFieldName($this->name, $fieldName); - } - - $mapping = $this->associationMappings[$fieldName]; - - if (isset($overrideMapping['joinColumns'])) { - $mapping['joinColumns'] = $overrideMapping['joinColumns']; - } - - if (isset($overrideMapping['joinTable'])) { - $mapping['joinTable'] = $overrideMapping['joinTable']; - } - - $mapping['joinColumnFieldNames'] = null; - $mapping['joinTableColumns'] = null; - $mapping['sourceToTargetKeyColumns'] = null; - $mapping['relationToSourceKeyColumns'] = null; - $mapping['relationToTargetKeyColumns'] = null; - - switch ($mapping['type']) { - case self::ONE_TO_ONE: - $mapping = $this->_validateAndCompleteOneToOneMapping($mapping); - break; - case self::ONE_TO_MANY: - $mapping = $this->_validateAndCompleteOneToManyMapping($mapping); - break; - case self::MANY_TO_ONE: - $mapping = $this->_validateAndCompleteOneToOneMapping($mapping); - break; - case self::MANY_TO_MANY: - $mapping = $this->_validateAndCompleteManyToManyMapping($mapping); - break; - } - - $this->associationMappings[$fieldName] = $mapping; - } - - /** - * Sets the override for a mapped field. - * - * @param string $fieldName - * @param array $overrideMapping - * @throws MappingException - * @param array $overrideMapping - * @return void - */ - public function setAttributeOverride($fieldName, array $overrideMapping) - { - if ( ! isset($this->fieldMappings[$fieldName])) { - throw MappingException::invalidOverrideFieldName($this->name, $fieldName); - } - - $mapping = $this->fieldMappings[$fieldName]; - - if (isset($mapping['id'])) { - $overrideMapping['id'] = $mapping['id']; - } - - if ( ! isset($overrideMapping['type']) || $overrideMapping['type'] === null) { - $overrideMapping['type'] = $mapping['type']; - } - - if ( ! isset($overrideMapping['fieldName']) || $overrideMapping['fieldName'] === null) { - $overrideMapping['fieldName'] = $mapping['fieldName']; - } - - if ($overrideMapping['type'] !== $mapping['type']) { - throw MappingException::invalidOverrideFieldType($this->name, $fieldName); - } - - unset($this->fieldMappings[$fieldName]); - unset($this->fieldNames[$mapping['columnName']]); - unset($this->columnNames[$mapping['fieldName']]); - $this->_validateAndCompleteFieldMapping($overrideMapping); - - $this->fieldMappings[$fieldName] = $overrideMapping; - } - - /** - * Checks whether a mapped field is inherited from an entity superclass. - * - * @param string $fieldName - * @return bool TRUE if the field is inherited, FALSE otherwise. - */ - public function isInheritedField($fieldName) - { - return isset($this->fieldMappings[$fieldName]['inherited']); - } - - /** - * Check if this entity is the root in any entity-inheritance-hierachy. - * - * @return bool - */ - public function isRootEntity() - { - return $this->name == $this->rootEntityName; - } - - /** - * Checks whether a mapped association field is inherited from a superclass. - * - * @param string $fieldName - * @return boolean TRUE if the field is inherited, FALSE otherwise. - */ - public function isInheritedAssociation($fieldName) - { - return isset($this->associationMappings[$fieldName]['inherited']); - } - - /** - * Sets the name of the primary table the class is mapped to. - * - * @param string $tableName The table name. - * @deprecated Use {@link setPrimaryTable}. - */ - public function setTableName($tableName) - { - $this->table['name'] = $tableName; - } - - /** - * Sets the primary table definition. The provided array supports the - * following structure: - * - * name => (optional, defaults to class name) - * indexes => array of indexes (optional) - * uniqueConstraints => array of constraints (optional) - * - * If a key is omitted, the current value is kept. - * - * @param array $table The table description. - */ - public function setPrimaryTable(array $table) - { - if (isset($table['name'])) { - if ($table['name'][0] === '`') { - $table['name'] = trim($table['name'], '`'); - $this->table['quoted'] = true; - } - - $this->table['name'] = $table['name']; - } - - if (isset($table['indexes'])) { - $this->table['indexes'] = $table['indexes']; - } - - if (isset($table['uniqueConstraints'])) { - $this->table['uniqueConstraints'] = $table['uniqueConstraints']; - } - - if (isset($table['options'])) { - $this->table['options'] = $table['options']; - } - } - - /** - * Checks whether the given type identifies an inheritance type. - * - * @param integer $type - * @return boolean TRUE if the given type identifies an inheritance type, FALSe otherwise. - */ - private function _isInheritanceType($type) - { - return $type == self::INHERITANCE_TYPE_NONE || - $type == self::INHERITANCE_TYPE_SINGLE_TABLE || - $type == self::INHERITANCE_TYPE_JOINED || - $type == self::INHERITANCE_TYPE_TABLE_PER_CLASS; - } - - /** - * Adds a mapped field to the class. - * - * @param array $mapping The field mapping. - * @throws MappingException - * @return void - */ - public function mapField(array $mapping) - { - $this->_validateAndCompleteFieldMapping($mapping); - if (isset($this->fieldMappings[$mapping['fieldName']]) || isset($this->associationMappings[$mapping['fieldName']])) { - throw MappingException::duplicateFieldMapping($this->name, $mapping['fieldName']); - } - $this->fieldMappings[$mapping['fieldName']] = $mapping; - } - - /** - * INTERNAL: - * Adds an association mapping without completing/validating it. - * This is mainly used to add inherited association mappings to derived classes. - * - * @param array $mapping - * @throws MappingException - * @return void - */ - public function addInheritedAssociationMapping(array $mapping/*, $owningClassName = null*/) - { - if (isset($this->associationMappings[$mapping['fieldName']])) { - throw MappingException::duplicateAssociationMapping($this->name, $mapping['fieldName']); - } - $this->associationMappings[$mapping['fieldName']] = $mapping; - } - - /** - * INTERNAL: - * Adds a field mapping without completing/validating it. - * This is mainly used to add inherited field mappings to derived classes. - * - * @param array $fieldMapping - * @return void - */ - public function addInheritedFieldMapping(array $fieldMapping) - { - $this->fieldMappings[$fieldMapping['fieldName']] = $fieldMapping; - $this->columnNames[$fieldMapping['fieldName']] = $fieldMapping['columnName']; - $this->fieldNames[$fieldMapping['columnName']] = $fieldMapping['fieldName']; - } - - /** - * INTERNAL: - * Adds a named query to this class. - * - * @throws MappingException - * @param array $queryMapping - */ - public function addNamedQuery(array $queryMapping) - { - if (!isset($queryMapping['name'])) { - throw MappingException::nameIsMandatoryForQueryMapping($this->name); - } - - if (isset($this->namedQueries[$queryMapping['name']])) { - throw MappingException::duplicateQueryMapping($this->name, $queryMapping['name']); - } - - if (!isset($queryMapping['query'])) { - throw MappingException::emptyQueryMapping($this->name, $queryMapping['name']); - } - - $name = $queryMapping['name']; - $query = $queryMapping['query']; - $dql = str_replace('__CLASS__', $this->name, $query); - $this->namedQueries[$name] = array( - 'name' => $name, - 'query' => $query, - 'dql' => $dql - ); - } - - /** - * INTERNAL: - * Adds a named native query to this class. - * - * @throws MappingException - * @param array $queryMapping - */ - public function addNamedNativeQuery(array $queryMapping) - { - if (!isset($queryMapping['name'])) { - throw MappingException::nameIsMandatoryForQueryMapping($this->name); - } - - if (isset($this->namedNativeQueries[$queryMapping['name']])) { - throw MappingException::duplicateQueryMapping($this->name, $queryMapping['name']); - } - - if (!isset($queryMapping['query'])) { - throw MappingException::emptyQueryMapping($this->name, $queryMapping['name']); - } - - if (!isset($queryMapping['resultClass']) && !isset($queryMapping['resultSetMapping'])) { - throw MappingException::missingQueryMapping($this->name, $queryMapping['name']); - } - - $queryMapping['isSelfClass'] = false; - if (isset($queryMapping['resultClass'])) { - - if($queryMapping['resultClass'] === '__CLASS__') { - - $queryMapping['isSelfClass'] = true; - $queryMapping['resultClass'] = $this->name; - - } else if (strlen($this->namespace) > 0 && strpos($queryMapping['resultClass'], '\\') === false) { - $queryMapping['resultClass'] = $this->namespace . '\\' . $queryMapping['resultClass']; - } - - $queryMapping['resultClass'] = ltrim($queryMapping['resultClass'], '\\'); - } - - $this->namedNativeQueries[$queryMapping['name']] = $queryMapping; - } - - /** - * INTERNAL: - * Adds a sql result set mapping to this class. - * - * @throws MappingException - * @param array $resultMapping - */ - public function addSqlResultSetMapping(array $resultMapping) - { - if (!isset($resultMapping['name'])) { - throw MappingException::nameIsMandatoryForSqlResultSetMapping($this->name); - } - - if (isset($this->sqlResultSetMappings[$resultMapping['name']])) { - throw MappingException::duplicateResultSetMapping($this->name, $resultMapping['name']); - } - - if (isset($resultMapping['entities'])) { - foreach ($resultMapping['entities'] as $key => $entityResult) { - if (!isset($entityResult['entityClass'])) { - throw MappingException::missingResultSetMappingEntity($this->name, $resultMapping['name']); - } - - $entityResult['isSelfClass'] = false; - if($entityResult['entityClass'] === '__CLASS__') { - - $entityResult['isSelfClass'] = true; - $entityResult['entityClass'] = $this->name; - - } else if (strlen($this->namespace) > 0 && strpos($entityResult['entityClass'], '\\') === false) { - $entityResult['entityClass'] = $this->namespace . '\\' . $entityResult['entityClass']; - } - - $resultMapping['entities'][$key]['entityClass'] = ltrim($entityResult['entityClass'], '\\'); - $resultMapping['entities'][$key]['isSelfClass'] = $entityResult['isSelfClass']; - - if (isset($entityResult['fields'])) { - foreach ($entityResult['fields'] as $k => $field) { - if (!isset($field['name'])) { - throw MappingException::missingResultSetMappingFieldName($this->name, $resultMapping['name']); - } - - if (!isset($field['column'])) { - $fieldName = $field['name']; - if(strpos($fieldName, '.')){ - list(, $fieldName) = explode('.', $fieldName); - } - - $resultMapping['entities'][$key]['fields'][$k]['column'] = $fieldName; - } - } - } - } - } - - $this->sqlResultSetMappings[$resultMapping['name']] = $resultMapping; - } - - /** - * Adds a one-to-one mapping. - * - * @param array $mapping The mapping. - */ - public function mapOneToOne(array $mapping) - { - $mapping['type'] = self::ONE_TO_ONE; - $mapping = $this->_validateAndCompleteOneToOneMapping($mapping); - $this->_storeAssociationMapping($mapping); - } - - /** - * Adds a one-to-many mapping. - * - * @param array $mapping The mapping. - */ - public function mapOneToMany(array $mapping) - { - $mapping['type'] = self::ONE_TO_MANY; - $mapping = $this->_validateAndCompleteOneToManyMapping($mapping); - $this->_storeAssociationMapping($mapping); - } - - /** - * Adds a many-to-one mapping. - * - * @param array $mapping The mapping. - */ - public function mapManyToOne(array $mapping) - { - $mapping['type'] = self::MANY_TO_ONE; - // A many-to-one mapping is essentially a one-one backreference - $mapping = $this->_validateAndCompleteOneToOneMapping($mapping); - $this->_storeAssociationMapping($mapping); - } - - /** - * Adds a many-to-many mapping. - * - * @param array $mapping The mapping. - */ - public function mapManyToMany(array $mapping) - { - $mapping['type'] = self::MANY_TO_MANY; - $mapping = $this->_validateAndCompleteManyToManyMapping($mapping); - $this->_storeAssociationMapping($mapping); - } - - /** - * Stores the association mapping. - * - * @param array $assocMapping - * @throws MappingException - * @return void - */ - protected function _storeAssociationMapping(array $assocMapping) - { - $sourceFieldName = $assocMapping['fieldName']; - - if (isset($this->fieldMappings[$sourceFieldName]) || isset($this->associationMappings[$sourceFieldName])) { - throw MappingException::duplicateFieldMapping($this->name, $sourceFieldName); - } - - $this->associationMappings[$sourceFieldName] = $assocMapping; - } - - /** - * Registers a custom repository class for the entity class. - * - * @param string $repositoryClassName The class name of the custom mapper. - * @return void - */ - public function setCustomRepositoryClass($repositoryClassName) - { - if ($repositoryClassName !== null && strpos($repositoryClassName, '\\') === false - && strlen($this->namespace) > 0) { - $repositoryClassName = $this->namespace . '\\' . $repositoryClassName; - } - $this->customRepositoryClassName = $repositoryClassName; - } - - /** - * Dispatches the lifecycle event of the given entity to the registered - * lifecycle callbacks and lifecycle listeners. - * - * @param string $lifecycleEvent The lifecycle event. - * @param \Object $entity The Entity on which the event occured. - */ - public function invokeLifecycleCallbacks($lifecycleEvent, $entity) - { - foreach ($this->lifecycleCallbacks[$lifecycleEvent] as $callback) { - $entity->$callback(); - } - } - - /** - * Whether the class has any attached lifecycle listeners or callbacks for a lifecycle event. - * - * @param string $lifecycleEvent - * @return boolean - */ - public function hasLifecycleCallbacks($lifecycleEvent) - { - return isset($this->lifecycleCallbacks[$lifecycleEvent]); - } - - /** - * Gets the registered lifecycle callbacks for an event. - * - * @param string $event - * @return array - */ - public function getLifecycleCallbacks($event) - { - return isset($this->lifecycleCallbacks[$event]) ? $this->lifecycleCallbacks[$event] : array(); - } - - /** - * Adds a lifecycle callback for entities of this class. - * - * @param string $callback - * @param string $event - */ - public function addLifecycleCallback($callback, $event) - { - $this->lifecycleCallbacks[$event][] = $callback; - } - - /** - * Sets the lifecycle callbacks for entities of this class. - * Any previously registered callbacks are overwritten. - * - * @param array $callbacks - */ - public function setLifecycleCallbacks(array $callbacks) - { - $this->lifecycleCallbacks = $callbacks; - } - - /** - * Sets the discriminator column definition. - * - * @param array $columnDef - * - * @param $columnDef - * @throws MappingException - * @return void - * @see getDiscriminatorColumn() - */ - public function setDiscriminatorColumn($columnDef) - { - if ($columnDef !== null) { - if ( ! isset($columnDef['name'])) { - throw MappingException::nameIsMandatoryForDiscriminatorColumns($this->name); - } - - if (isset($this->fieldNames[$columnDef['name']])) { - throw MappingException::duplicateColumnName($this->name, $columnDef['name']); - } - - if ( ! isset($columnDef['fieldName'])) { - $columnDef['fieldName'] = $columnDef['name']; - } - - if ( ! isset($columnDef['type'])) { - $columnDef['type'] = "string"; - } - - if (in_array($columnDef['type'], array("boolean", "array", "object", "datetime", "time", "date"))) { - throw MappingException::invalidDiscriminatorColumnType($this->name, $columnDef['type']); - } - - $this->discriminatorColumn = $columnDef; - } - } - - /** - * Sets the discriminator values used by this class. - * Used for JOINED and SINGLE_TABLE inheritance mapping strategies. - * - * @param array $map - */ - public function setDiscriminatorMap(array $map) - { - foreach ($map as $value => $className) { - $this->addDiscriminatorMapClass($value, $className); - } - } - - /** - * Add one entry of the discriminator map with a new class and corresponding name. - * - * @param string $name - * @param string $className - * @throws MappingException - * @return void - */ - public function addDiscriminatorMapClass($name, $className) - { - if (strlen($this->namespace) > 0 && strpos($className, '\\') === false) { - $className = $this->namespace . '\\' . $className; - } - - $className = ltrim($className, '\\'); - $this->discriminatorMap[$name] = $className; - - if ($this->name == $className) { - $this->discriminatorValue = $name; - } else { - if ( ! class_exists($className)) { - throw MappingException::invalidClassInDiscriminatorMap($className, $this->name); - } - if (is_subclass_of($className, $this->name) && ! in_array($className, $this->subClasses)) { - $this->subClasses[] = $className; - } - } - } - - /** - * Checks whether the class has a named query with the given query name. - * - * @param string $queryName - * @return boolean - */ - public function hasNamedQuery($queryName) - { - return isset($this->namedQueries[$queryName]); - } - - /** - * Checks whether the class has a named native query with the given query name. - * - * @param string $queryName - * @return boolean - */ - public function hasNamedNativeQuery($queryName) - { - return isset($this->namedNativeQueries[$queryName]); - } - - /** - * Checks whether the class has a named native query with the given query name. - * - * @param string $name - * @return boolean - */ - public function hasSqlResultSetMapping($name) - { - return isset($this->sqlResultSetMappings[$name]); - } - - /** - * {@inheritDoc} - */ - public function hasAssociation($fieldName) - { - return isset($this->associationMappings[$fieldName]); - } - - /** - * {@inheritDoc} - */ - public function isSingleValuedAssociation($fieldName) - { - return isset($this->associationMappings[$fieldName]) && - ($this->associationMappings[$fieldName]['type'] & self::TO_ONE); - } - - /** - * {@inheritDoc} - */ - public function isCollectionValuedAssociation($fieldName) - { - return isset($this->associationMappings[$fieldName]) && - ! ($this->associationMappings[$fieldName]['type'] & self::TO_ONE); - } - - /** - * Is this an association that only has a single join column? - * - * @param string $fieldName - * @return bool - */ - public function isAssociationWithSingleJoinColumn($fieldName) - { - return ( - isset($this->associationMappings[$fieldName]) && - isset($this->associationMappings[$fieldName]['joinColumns'][0]) && - !isset($this->associationMappings[$fieldName]['joinColumns'][1]) - ); - } - - /** - * Return the single association join column (if any). - * - * @param string $fieldName - * @throws MappingException - * @return string - */ - public function getSingleAssociationJoinColumnName($fieldName) - { - if ( ! $this->isAssociationWithSingleJoinColumn($fieldName)) { - throw MappingException::noSingleAssociationJoinColumnFound($this->name, $fieldName); - } - return $this->associationMappings[$fieldName]['joinColumns'][0]['name']; - } - - /** - * Return the single association referenced join column name (if any). - * - * @param string $fieldName - * @throws MappingException - * @return string - */ - public function getSingleAssociationReferencedJoinColumnName($fieldName) - { - if ( ! $this->isAssociationWithSingleJoinColumn($fieldName)) { - throw MappingException::noSingleAssociationJoinColumnFound($this->name, $fieldName); - } - return $this->associationMappings[$fieldName]['joinColumns'][0]['referencedColumnName']; - } - - /** - * Used to retrieve a fieldname for either field or association from a given column, - * - * This method is used in foreign-key as primary-key contexts. - * - * @param string $columnName - * @throws MappingException - * @return string - */ - public function getFieldForColumn($columnName) - { - if (isset($this->fieldNames[$columnName])) { - return $this->fieldNames[$columnName]; - } else { - foreach ($this->associationMappings as $assocName => $mapping) { - if ($this->isAssociationWithSingleJoinColumn($assocName) && - $this->associationMappings[$assocName]['joinColumns'][0]['name'] == $columnName) { - - return $assocName; - } - } - - throw MappingException::noFieldNameFoundForColumn($this->name, $columnName); - } - } - - /** - * Sets the ID generator used to generate IDs for instances of this class. - * - * @param \Doctrine\ORM\Id\AbstractIdGenerator $generator - */ - public function setIdGenerator($generator) - { - $this->idGenerator = $generator; - } - - /** - * Sets definition - * @param array $definition - */ - public function setCustomGeneratorDefinition(array $definition) - { - $this->customGeneratorDefinition = $definition; - } - - /** - * Sets the definition of the sequence ID generator for this class. - * - * The definition must have the following structure: - * - * array( - * 'sequenceName' => 'name', - * 'allocationSize' => 20, - * 'initialValue' => 1 - * 'quoted' => 1 - * ) - * - * - * @param array $definition - */ - public function setSequenceGeneratorDefinition(array $definition) - { - if (isset($definition['name']) && $definition['name'] == '`') { - $definition['name'] = trim($definition['name'], '`'); - $definition['quoted'] = true; - } - - $this->sequenceGeneratorDefinition = $definition; - } - - /** - * Sets the version field mapping used for versioning. Sets the default - * value to use depending on the column type. - * - * @param array $mapping The version field mapping array - * @throws MappingException - * @return void - */ - public function setVersionMapping(array &$mapping) - { - $this->isVersioned = true; - $this->versionField = $mapping['fieldName']; - - if ( ! isset($mapping['default'])) { - if (in_array($mapping['type'], array('integer', 'bigint', 'smallint'))) { - $mapping['default'] = 1; - } else if ($mapping['type'] == 'datetime') { - $mapping['default'] = 'CURRENT_TIMESTAMP'; - } else { - throw MappingException::unsupportedOptimisticLockingType($this->name, $mapping['fieldName'], $mapping['type']); - } - } - } - - /** - * Sets whether this class is to be versioned for optimistic locking. - * - * @param boolean $bool - */ - public function setVersioned($bool) - { - $this->isVersioned = $bool; - } - - /** - * Sets the name of the field that is to be used for versioning if this class is - * versioned for optimistic locking. - * - * @param string $versionField - */ - public function setVersionField($versionField) - { - $this->versionField = $versionField; - } - - /** - * Mark this class as read only, no change tracking is applied to it. - * - * @return void - */ - public function markReadOnly() - { - $this->isReadOnly = true; - } - - /** - * {@inheritDoc} - */ - public function getFieldNames() - { - return array_keys($this->fieldMappings); - } - - /** - * {@inheritDoc} - */ - public function getAssociationNames() - { - return array_keys($this->associationMappings); - } - - /** - * {@inheritDoc} - * @throws InvalidArgumentException - */ - public function getAssociationTargetClass($assocName) - { - if ( ! isset($this->associationMappings[$assocName])) { - throw new InvalidArgumentException("Association name expected, '" . $assocName ."' is not an association."); - } - - return $this->associationMappings[$assocName]['targetEntity']; - } - - /** - * {@inheritDoc} - */ - public function getName() - { - return $this->name; - } - - /** - * Gets the (possibly quoted) identifier column names for safe use in an SQL statement. - * - * @deprecated Deprecated since version 2.3 in favor of \Doctrine\ORM\Mapping\QuoteStrategy - * - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - * @return array - */ - public function getQuotedIdentifierColumnNames($platform) - { - $quotedColumnNames = array(); - - foreach ($this->identifier as $idProperty) { - if (isset($this->fieldMappings[$idProperty])) { - $quotedColumnNames[] = isset($this->fieldMappings[$idProperty]['quoted']) - ? $platform->quoteIdentifier($this->fieldMappings[$idProperty]['columnName']) - : $this->fieldMappings[$idProperty]['columnName']; - - continue; - } - - // Association defined as Id field - $joinColumns = $this->associationMappings[$idProperty]['joinColumns']; - $assocQuotedColumnNames = array_map( - function ($joinColumn) use ($platform) { - return isset($joinColumn['quoted']) - ? $platform->quoteIdentifier($joinColumn['name']) - : $joinColumn['name']; - }, - $joinColumns - ); - - $quotedColumnNames = array_merge($quotedColumnNames, $assocQuotedColumnNames); - } - - return $quotedColumnNames; - } - - /** - * Gets the (possibly quoted) column name of a mapped field for safe use in an SQL statement. - * - * @deprecated Deprecated since version 2.3 in favor of \Doctrine\ORM\Mapping\QuoteStrategy - * - * @param string $field - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - * @return string - */ - public function getQuotedColumnName($field, $platform) - { - return isset($this->fieldMappings[$field]['quoted']) - ? $platform->quoteIdentifier($this->fieldMappings[$field]['columnName']) - : $this->fieldMappings[$field]['columnName']; - } - - /** - * Gets the (possibly quoted) primary table name of this class for safe use in an SQL statement. - * - * @deprecated Deprecated since version 2.3 in favor of \Doctrine\ORM\Mapping\QuoteStrategy - * - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - * @return string - */ - public function getQuotedTableName($platform) - { - return isset($this->table['quoted']) ? $platform->quoteIdentifier($this->table['name']) : $this->table['name']; - } - - /** - * Gets the (possibly quoted) name of the join table. - * - * @deprecated Deprecated since version 2.3 in favor of \Doctrine\ORM\Mapping\QuoteStrategy - * - * @param array $assoc - * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform - * @return string - */ - public function getQuotedJoinTableName(array $assoc, $platform) - { - return isset($assoc['joinTable']['quoted']) ? $platform->quoteIdentifier($assoc['joinTable']['name']) : $assoc['joinTable']['name']; - } - - /** - * {@inheritDoc} - */ - public function isAssociationInverseSide($fieldName) - { - return isset($this->associationMappings[$fieldName]) && ! $this->associationMappings[$fieldName]['isOwningSide']; - } - - /** - * {@inheritDoc} - */ - public function getAssociationMappedByTargetField($fieldName) - { - return $this->associationMappings[$fieldName]['mappedBy']; - } - - /** - * @param string $targetClass - * @return array - */ - public function getAssociationsByTargetClass($targetClass) - { - $relations = array(); - foreach ($this->associationMappings as $mapping) { - if ($mapping['targetEntity'] == $targetClass) { - $relations[$mapping['fieldName']] = $mapping; - } - } - return $relations; - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/Column.php b/framework/library/Doctrine/ORM/Mapping/Column.php deleted file mode 100644 index b233566..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Column.php +++ /dev/null @@ -1,46 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target({"PROPERTY","ANNOTATION"}) - */ -final class Column implements Annotation -{ - /** @var string */ - public $name; - /** @var mixed */ - public $type = 'string'; - /** @var integer */ - public $length; - /** @var integer */ - public $precision = 0; // The precision for a decimal (exact numeric) column (Applies only for decimal column) - /** @var integer */ - public $scale = 0; // The scale for a decimal (exact numeric) column (Applies only for decimal column) - /** @var boolean */ - public $unique = false; - /** @var boolean */ - public $nullable = false; - /** @var array */ - public $options = array(); - /** @var string */ - public $columnDefinition; -} diff --git a/framework/library/Doctrine/ORM/Mapping/ColumnResult.php b/framework/library/Doctrine/ORM/Mapping/ColumnResult.php deleted file mode 100644 index cf5c2b4..0000000 --- a/framework/library/Doctrine/ORM/Mapping/ColumnResult.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * References name of a column in the SELECT clause of a SQL query. - * Scalar result types can be included in the query result by specifying this annotation in the metadata. - * - * @author Fabio B. Silva - * @since 2.3 - * - * @Annotation - * @Target("ANNOTATION") - */ -final class ColumnResult implements Annotation -{ - - /** - * The name of a column in the SELECT clause of a SQL query - * - * @var string - */ - public $name; - -} diff --git a/framework/library/Doctrine/ORM/Mapping/CustomIdGenerator.php b/framework/library/Doctrine/ORM/Mapping/CustomIdGenerator.php deleted file mode 100644 index f31f082..0000000 --- a/framework/library/Doctrine/ORM/Mapping/CustomIdGenerator.php +++ /dev/null @@ -1,30 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("PROPERTY") - */ -final class CustomIdGenerator implements Annotation -{ - /** @var string */ - public $class; -} diff --git a/framework/library/Doctrine/ORM/Mapping/DefaultNamingStrategy.php b/framework/library/Doctrine/ORM/Mapping/DefaultNamingStrategy.php deleted file mode 100644 index 4c64385..0000000 --- a/framework/library/Doctrine/ORM/Mapping/DefaultNamingStrategy.php +++ /dev/null @@ -1,86 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * The default NamingStrategy - * - * - * @link www.doctrine-project.org - * @since 2.3 - * @author Fabio B. Silva - */ -class DefaultNamingStrategy implements NamingStrategy -{ - /** - * {@inheritdoc} - */ - public function classToTableName($className) - { - if (strpos($className, '\\') !== false) { - return substr($className, strrpos($className, '\\') + 1); - } - - return $className; - } - - /** - * {@inheritdoc} - */ - public function propertyToColumnName($propertyName) - { - return $propertyName; - } - - /** - * {@inheritdoc} - */ - public function referenceColumnName() - { - return 'id'; - } - - /** - * {@inheritdoc} - */ - public function joinColumnName($propertyName) - { - return $propertyName . '_' . $this->referenceColumnName(); - } - - /** - * {@inheritdoc} - */ - public function joinTableName($sourceEntity, $targetEntity, $propertyName = null) - { - return strtolower($this->classToTableName($sourceEntity) . '_' . - $this->classToTableName($targetEntity)); - } - - /** - * {@inheritdoc} - */ - public function joinKeyColumnName($entityName, $referencedColumnName = null) - { - return strtolower($this->classToTableName($entityName) . '_' . - ($referencedColumnName ?: $this->referenceColumnName())); - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php b/framework/library/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php deleted file mode 100644 index b5a6fc4..0000000 --- a/framework/library/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php +++ /dev/null @@ -1,140 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * A set of rules for determining the physical column, alias and table quotes - * - * @since 2.3 - * @author Fabio B. Silva - */ -class DefaultQuoteStrategy implements QuoteStrategy -{ - /** - * {@inheritdoc} - */ - public function getColumnName($fieldName, ClassMetadata $class, AbstractPlatform $platform) - { - return isset($class->fieldMappings[$fieldName]['quoted']) - ? $platform->quoteIdentifier($class->fieldMappings[$fieldName]['columnName']) - : $class->fieldMappings[$fieldName]['columnName']; - } - - /** - * {@inheritdoc} - */ - public function getTableName(ClassMetadata $class, AbstractPlatform $platform) - { - return isset($class->table['quoted']) - ? $platform->quoteIdentifier($class->table['name']) - : $class->table['name']; - } - - /** - * {@inheritdoc} - */ - public function getSequenceName(array $definition, ClassMetadata $class, AbstractPlatform $platform) - { - return isset($definition['quoted']) - ? $platform->quoteIdentifier($definition['sequenceName']) - : $definition['sequenceName']; - } - - /** - * {@inheritdoc} - */ - public function getJoinColumnName(array $joinColumn, ClassMetadata $class, AbstractPlatform $platform) - { - return isset($joinColumn['quoted']) - ? $platform->quoteIdentifier($joinColumn['name']) - : $joinColumn['name']; - } - - /** - * {@inheritdoc} - */ - public function getReferencedJoinColumnName(array $joinColumn, ClassMetadata $class, AbstractPlatform $platform) - { - return isset($joinColumn['quoted']) - ? $platform->quoteIdentifier($joinColumn['referencedColumnName']) - : $joinColumn['referencedColumnName']; - } - - /** - * {@inheritdoc} - */ - public function getJoinTableName(array $association, ClassMetadata $class, AbstractPlatform $platform) - { - return isset($association['joinTable']['quoted']) - ? $platform->quoteIdentifier($association['joinTable']['name']) - : $association['joinTable']['name']; - } - - /** - * {@inheritdoc} - */ - public function getIdentifierColumnNames(ClassMetadata $class, AbstractPlatform $platform) - { - $quotedColumnNames = array(); - - foreach ($class->identifier as $fieldName) { - if (isset($class->fieldMappings[$fieldName])) { - $quotedColumnNames[] = $this->getColumnName($fieldName, $class, $platform); - - continue; - } - - // Association defined as Id field - $joinColumns = $class->associationMappings[$fieldName]['joinColumns']; - $assocQuotedColumnNames = array_map( - function ($joinColumn) use ($platform) - { - return isset($joinColumn['quoted']) - ? $platform->quoteIdentifier($joinColumn['name']) - : $joinColumn['name']; - }, - $joinColumns - ); - - $quotedColumnNames = array_merge($quotedColumnNames, $assocQuotedColumnNames); - } - - return $quotedColumnNames; - } - - /** - * {@inheritdoc} - */ - public function getColumnAlias($columnName, $counter, AbstractPlatform $platform, ClassMetadata $class = null) - { - // Trim the column alias to the maximum identifier length of the platform. - // If the alias is to long, characters are cut off from the beginning. - // And strip non alphanumeric characters - $columnName = $columnName . $counter; - $columnName = substr($columnName, -$platform->getMaxIdentifierLength()); - $columnName = preg_replace('/[^A-Za-z0-9_]/', '', $columnName); - - return $platform->getSQLResultCasing($columnName); - } - -} \ No newline at end of file diff --git a/framework/library/Doctrine/ORM/Mapping/DiscriminatorColumn.php b/framework/library/Doctrine/ORM/Mapping/DiscriminatorColumn.php deleted file mode 100644 index f5cb077..0000000 --- a/framework/library/Doctrine/ORM/Mapping/DiscriminatorColumn.php +++ /dev/null @@ -1,38 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("CLASS") - */ -final class DiscriminatorColumn implements Annotation -{ - /** @var string */ - public $name; - /** @var string */ - public $type; - /** @var integer */ - public $length; - /** @var mixed */ - public $fieldName; // field name used in non-object hydration (array/scalar) - /** @var string */ - public $columnDefinition; -} diff --git a/framework/library/Doctrine/ORM/Mapping/DiscriminatorMap.php b/framework/library/Doctrine/ORM/Mapping/DiscriminatorMap.php deleted file mode 100644 index d68b85b..0000000 --- a/framework/library/Doctrine/ORM/Mapping/DiscriminatorMap.php +++ /dev/null @@ -1,30 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("CLASS") - */ -final class DiscriminatorMap implements Annotation -{ - /** @var array */ - public $value; -} diff --git a/framework/library/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php b/framework/library/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php deleted file mode 100644 index bb01896..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php +++ /dev/null @@ -1,555 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping\Driver; - -use Doctrine\Common\Annotations\AnnotationReader, - Doctrine\ORM\Mapping\MappingException, - Doctrine\ORM\Mapping\JoinColumn, - Doctrine\ORM\Mapping\Column, - Doctrine\Common\Persistence\Mapping\ClassMetadata, - Doctrine\Common\Persistence\Mapping\Driver\AnnotationDriver as AbstractAnnotationDriver; - -/** - * The AnnotationDriver reads the mapping metadata from docblock annotations. - * - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan H. Wage - * @author Roman Borschel - */ -class AnnotationDriver extends AbstractAnnotationDriver -{ - /** - * {@inheritDoc} - */ - protected $entityAnnotationClasses = array( - 'Doctrine\ORM\Mapping\Entity' => 1, - 'Doctrine\ORM\Mapping\MappedSuperclass' => 2, - ); - - /** - * {@inheritDoc} - */ - public function loadMetadataForClass($className, ClassMetadata $metadata) - { - /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadataInfo */ - $class = $metadata->getReflectionClass(); - if ( ! $class) { - // this happens when running annotation driver in combination with - // static reflection services. This is not the nicest fix - $class = new \ReflectionClass($metadata->name); - } - - $classAnnotations = $this->reader->getClassAnnotations($class); - - if ($classAnnotations) { - foreach ($classAnnotations as $key => $annot) { - if ( ! is_numeric($key)) { - continue; - } - - $classAnnotations[get_class($annot)] = $annot; - } - } - - // Evaluate Entity annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\Entity'])) { - $entityAnnot = $classAnnotations['Doctrine\ORM\Mapping\Entity']; - if ($entityAnnot->repositoryClass !== null) { - $metadata->setCustomRepositoryClass($entityAnnot->repositoryClass); - } - if ($entityAnnot->readOnly) { - $metadata->markReadOnly(); - } - } else if (isset($classAnnotations['Doctrine\ORM\Mapping\MappedSuperclass'])) { - $mappedSuperclassAnnot = $classAnnotations['Doctrine\ORM\Mapping\MappedSuperclass']; - $metadata->setCustomRepositoryClass($mappedSuperclassAnnot->repositoryClass); - $metadata->isMappedSuperclass = true; - } else { - throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className); - } - - // Evaluate Table annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\Table'])) { - $tableAnnot = $classAnnotations['Doctrine\ORM\Mapping\Table']; - $primaryTable = array( - 'name' => $tableAnnot->name, - 'schema' => $tableAnnot->schema - ); - - if ($tableAnnot->indexes !== null) { - foreach ($tableAnnot->indexes as $indexAnnot) { - $index = array('columns' => $indexAnnot->columns); - - if ( ! empty($indexAnnot->name)) { - $primaryTable['indexes'][$indexAnnot->name] = $index; - } else { - $primaryTable['indexes'][] = $index; - } - } - } - - if ($tableAnnot->uniqueConstraints !== null) { - foreach ($tableAnnot->uniqueConstraints as $uniqueConstraintAnnot) { - $uniqueConstraint = array('columns' => $uniqueConstraintAnnot->columns); - - if ( ! empty($uniqueConstraintAnnot->name)) { - $primaryTable['uniqueConstraints'][$uniqueConstraintAnnot->name] = $uniqueConstraint; - } else { - $primaryTable['uniqueConstraints'][] = $uniqueConstraint; - } - } - } - - if ($tableAnnot->options !== null) { - $primaryTable['options'] = $tableAnnot->options; - } - - $metadata->setPrimaryTable($primaryTable); - } - - // Evaluate NamedNativeQueries annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\NamedNativeQueries'])) { - $namedNativeQueriesAnnot = $classAnnotations['Doctrine\ORM\Mapping\NamedNativeQueries']; - - foreach ($namedNativeQueriesAnnot->value as $namedNativeQuery) { - $metadata->addNamedNativeQuery(array( - 'name' => $namedNativeQuery->name, - 'query' => $namedNativeQuery->query, - 'resultClass' => $namedNativeQuery->resultClass, - 'resultSetMapping' => $namedNativeQuery->resultSetMapping, - )); - } - } - - // Evaluate SqlResultSetMappings annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\SqlResultSetMappings'])) { - $sqlResultSetMappingsAnnot = $classAnnotations['Doctrine\ORM\Mapping\SqlResultSetMappings']; - - foreach ($sqlResultSetMappingsAnnot->value as $resultSetMapping) { - $entities = array(); - $columns = array(); - foreach ($resultSetMapping->entities as $entityResultAnnot) { - $entityResult = array( - 'fields' => array(), - 'entityClass' => $entityResultAnnot->entityClass, - 'discriminatorColumn' => $entityResultAnnot->discriminatorColumn, - ); - - foreach ($entityResultAnnot->fields as $fieldResultAnnot) { - $entityResult['fields'][] = array( - 'name' => $fieldResultAnnot->name, - 'column' => $fieldResultAnnot->column - ); - } - - $entities[] = $entityResult; - } - - foreach ($resultSetMapping->columns as $columnResultAnnot) { - $columns[] = array( - 'name' => $columnResultAnnot->name, - ); - } - - $metadata->addSqlResultSetMapping(array( - 'name' => $resultSetMapping->name, - 'entities' => $entities, - 'columns' => $columns - )); - } - } - - // Evaluate NamedQueries annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\NamedQueries'])) { - $namedQueriesAnnot = $classAnnotations['Doctrine\ORM\Mapping\NamedQueries']; - - if ( ! is_array($namedQueriesAnnot->value)) { - throw new \UnexpectedValueException("@NamedQueries should contain an array of @NamedQuery annotations."); - } - - foreach ($namedQueriesAnnot->value as $namedQuery) { - if ( ! ($namedQuery instanceof \Doctrine\ORM\Mapping\NamedQuery)) { - throw new \UnexpectedValueException("@NamedQueries should contain an array of @NamedQuery annotations."); - } - $metadata->addNamedQuery(array( - 'name' => $namedQuery->name, - 'query' => $namedQuery->query - )); - } - } - - // Evaluate InheritanceType annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\InheritanceType'])) { - $inheritanceTypeAnnot = $classAnnotations['Doctrine\ORM\Mapping\InheritanceType']; - $metadata->setInheritanceType(constant('Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_' . $inheritanceTypeAnnot->value)); - - if ($metadata->inheritanceType != \Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_NONE) { - // Evaluate DiscriminatorColumn annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\DiscriminatorColumn'])) { - $discrColumnAnnot = $classAnnotations['Doctrine\ORM\Mapping\DiscriminatorColumn']; - $metadata->setDiscriminatorColumn(array( - 'name' => $discrColumnAnnot->name, - 'type' => $discrColumnAnnot->type, - 'length' => $discrColumnAnnot->length, - 'columnDefinition' => $discrColumnAnnot->columnDefinition - )); - } else { - $metadata->setDiscriminatorColumn(array('name' => 'dtype', 'type' => 'string', 'length' => 255)); - } - - // Evaluate DiscriminatorMap annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\DiscriminatorMap'])) { - $discrMapAnnot = $classAnnotations['Doctrine\ORM\Mapping\DiscriminatorMap']; - $metadata->setDiscriminatorMap($discrMapAnnot->value); - } - } - } - - - // Evaluate DoctrineChangeTrackingPolicy annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\ChangeTrackingPolicy'])) { - $changeTrackingAnnot = $classAnnotations['Doctrine\ORM\Mapping\ChangeTrackingPolicy']; - $metadata->setChangeTrackingPolicy(constant('Doctrine\ORM\Mapping\ClassMetadata::CHANGETRACKING_' . $changeTrackingAnnot->value)); - } - - // Evaluate annotations on properties/fields - /* @var $property \ReflectionProperty */ - foreach ($class->getProperties() as $property) { - if ($metadata->isMappedSuperclass && ! $property->isPrivate() - || - $metadata->isInheritedField($property->name) - || - $metadata->isInheritedAssociation($property->name)) { - continue; - } - - $mapping = array(); - $mapping['fieldName'] = $property->getName(); - - // Check for JoinColummn/JoinColumns annotations - $joinColumns = array(); - - if ($joinColumnAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\JoinColumn')) { - $joinColumns[] = $this->joinColumnToArray($joinColumnAnnot); - } else if ($joinColumnsAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\JoinColumns')) { - foreach ($joinColumnsAnnot->value as $joinColumn) { - $joinColumns[] = $this->joinColumnToArray($joinColumn); - } - } - - // Field can only be annotated with one of: - // @Column, @OneToOne, @OneToMany, @ManyToOne, @ManyToMany - if ($columnAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\Column')) { - if ($columnAnnot->type == null) { - throw MappingException::propertyTypeIsRequired($className, $property->getName()); - } - - $mapping = $this->columnToArray($property->getName(), $columnAnnot); - - if ($idAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\Id')) { - $mapping['id'] = true; - } - - if ($generatedValueAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\GeneratedValue')) { - $metadata->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' . $generatedValueAnnot->strategy)); - } - - if ($this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\Version')) { - $metadata->setVersionMapping($mapping); - } - - $metadata->mapField($mapping); - - // Check for SequenceGenerator/TableGenerator definition - if ($seqGeneratorAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\SequenceGenerator')) { - $metadata->setSequenceGeneratorDefinition(array( - 'sequenceName' => $seqGeneratorAnnot->sequenceName, - 'allocationSize' => $seqGeneratorAnnot->allocationSize, - 'initialValue' => $seqGeneratorAnnot->initialValue - )); - } else if ($this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\TableGenerator')) { - throw MappingException::tableIdGeneratorNotImplemented($className); - } else if ($customGeneratorAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\CustomIdGenerator')) { - $metadata->setCustomGeneratorDefinition(array( - 'class' => $customGeneratorAnnot->class - )); - } - } else if ($oneToOneAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\OneToOne')) { - if ($idAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\Id')) { - $mapping['id'] = true; - } - - $mapping['targetEntity'] = $oneToOneAnnot->targetEntity; - $mapping['joinColumns'] = $joinColumns; - $mapping['mappedBy'] = $oneToOneAnnot->mappedBy; - $mapping['inversedBy'] = $oneToOneAnnot->inversedBy; - $mapping['cascade'] = $oneToOneAnnot->cascade; - $mapping['orphanRemoval'] = $oneToOneAnnot->orphanRemoval; - $mapping['fetch'] = $this->getFetchMode($className, $oneToOneAnnot->fetch); - $metadata->mapOneToOne($mapping); - } else if ($oneToManyAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\OneToMany')) { - $mapping['mappedBy'] = $oneToManyAnnot->mappedBy; - $mapping['targetEntity'] = $oneToManyAnnot->targetEntity; - $mapping['cascade'] = $oneToManyAnnot->cascade; - $mapping['indexBy'] = $oneToManyAnnot->indexBy; - $mapping['orphanRemoval'] = $oneToManyAnnot->orphanRemoval; - $mapping['fetch'] = $this->getFetchMode($className, $oneToManyAnnot->fetch); - - if ($orderByAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\OrderBy')) { - $mapping['orderBy'] = $orderByAnnot->value; - } - - $metadata->mapOneToMany($mapping); - } else if ($manyToOneAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\ManyToOne')) { - if ($idAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\Id')) { - $mapping['id'] = true; - } - - $mapping['joinColumns'] = $joinColumns; - $mapping['cascade'] = $manyToOneAnnot->cascade; - $mapping['inversedBy'] = $manyToOneAnnot->inversedBy; - $mapping['targetEntity'] = $manyToOneAnnot->targetEntity; - $mapping['fetch'] = $this->getFetchMode($className, $manyToOneAnnot->fetch); - $metadata->mapManyToOne($mapping); - } else if ($manyToManyAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\ManyToMany')) { - $joinTable = array(); - - if ($joinTableAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\JoinTable')) { - $joinTable = array( - 'name' => $joinTableAnnot->name, - 'schema' => $joinTableAnnot->schema - ); - - foreach ($joinTableAnnot->joinColumns as $joinColumn) { - $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumn); - } - - foreach ($joinTableAnnot->inverseJoinColumns as $joinColumn) { - $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumn); - } - } - - $mapping['joinTable'] = $joinTable; - $mapping['targetEntity'] = $manyToManyAnnot->targetEntity; - $mapping['mappedBy'] = $manyToManyAnnot->mappedBy; - $mapping['inversedBy'] = $manyToManyAnnot->inversedBy; - $mapping['cascade'] = $manyToManyAnnot->cascade; - $mapping['indexBy'] = $manyToManyAnnot->indexBy; - $mapping['orphanRemoval'] = $manyToManyAnnot->orphanRemoval; - $mapping['fetch'] = $this->getFetchMode($className, $manyToManyAnnot->fetch); - - if ($orderByAnnot = $this->reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\OrderBy')) { - $mapping['orderBy'] = $orderByAnnot->value; - } - - $metadata->mapManyToMany($mapping); - } - } - - // Evaluate AssociationOverrides annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\AssociationOverrides'])) { - $associationOverridesAnnot = $classAnnotations['Doctrine\ORM\Mapping\AssociationOverrides']; - - foreach ($associationOverridesAnnot->value as $associationOverride) { - $override = array(); - $fieldName = $associationOverride->name; - - // Check for JoinColummn/JoinColumns annotations - if ($associationOverride->joinColumns) { - $joinColumns = array(); - foreach ($associationOverride->joinColumns as $joinColumn) { - $joinColumns[] = $this->joinColumnToArray($joinColumn); - } - $override['joinColumns'] = $joinColumns; - } - - // Check for JoinTable annotations - if ($associationOverride->joinTable) { - $joinTable = null; - $joinTableAnnot = $associationOverride->joinTable; - $joinTable = array( - 'name' => $joinTableAnnot->name, - 'schema' => $joinTableAnnot->schema - ); - - foreach ($joinTableAnnot->joinColumns as $joinColumn) { - $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumn); - } - - foreach ($joinTableAnnot->inverseJoinColumns as $joinColumn) { - $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumn); - } - - $override['joinTable'] = $joinTable; - } - - $metadata->setAssociationOverride($fieldName, $override); - } - } - - // Evaluate AttributeOverrides annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\AttributeOverrides'])) { - $attributeOverridesAnnot = $classAnnotations['Doctrine\ORM\Mapping\AttributeOverrides']; - foreach ($attributeOverridesAnnot->value as $attributeOverrideAnnot) { - $attributeOverride = $this->columnToArray($attributeOverrideAnnot->name, $attributeOverrideAnnot->column); - $metadata->setAttributeOverride($attributeOverrideAnnot->name, $attributeOverride); - } - } - - // Evaluate @HasLifecycleCallbacks annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\HasLifecycleCallbacks'])) { - /* @var $method \ReflectionMethod */ - foreach ($class->getMethods() as $method) { - // filter for the declaring class only, callbacks from parents will already be registered. - if ($method->isPublic() && $method->getDeclaringClass()->getName() == $class->name) { - $annotations = $this->reader->getMethodAnnotations($method); - - if ($annotations) { - foreach ($annotations as $key => $annot) { - if ( ! is_numeric($key)) { - continue; - } - $annotations[get_class($annot)] = $annot; - } - } - - if (isset($annotations['Doctrine\ORM\Mapping\PrePersist'])) { - $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::prePersist); - } - - if (isset($annotations['Doctrine\ORM\Mapping\PostPersist'])) { - $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::postPersist); - } - - if (isset($annotations['Doctrine\ORM\Mapping\PreUpdate'])) { - $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::preUpdate); - } - - if (isset($annotations['Doctrine\ORM\Mapping\PostUpdate'])) { - $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::postUpdate); - } - - if (isset($annotations['Doctrine\ORM\Mapping\PreRemove'])) { - $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::preRemove); - } - - if (isset($annotations['Doctrine\ORM\Mapping\PostRemove'])) { - $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::postRemove); - } - - if (isset($annotations['Doctrine\ORM\Mapping\PostLoad'])) { - $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::postLoad); - } - - if (isset($annotations['Doctrine\ORM\Mapping\PreFlush'])) { - $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::preFlush); - } - } - } - } - } - - /** - * Attempts to resolve the fetch mode. - * - * @param string $className The class name - * @param string $fetchMode The fetch mode - * @return integer The fetch mode as defined in ClassMetadata - * @throws MappingException If the fetch mode is not valid - */ - private function getFetchMode($className, $fetchMode) - { - if( ! defined('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $fetchMode)) { - throw MappingException::invalidFetchMode($className, $fetchMode); - } - - return constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $fetchMode); - } - - /** - * Parse the given JoinColumn as array - * - * @param JoinColumn $joinColumn - * @return array - */ - private function joinColumnToArray(JoinColumn $joinColumn) - { - return array( - 'name' => $joinColumn->name, - 'unique' => $joinColumn->unique, - 'nullable' => $joinColumn->nullable, - 'onDelete' => $joinColumn->onDelete, - 'columnDefinition' => $joinColumn->columnDefinition, - 'referencedColumnName' => $joinColumn->referencedColumnName, - ); - } - - /** - * Parse the given Column as array - * - * @param string $fieldName - * @param Column $column - * @return array - */ - private function columnToArray($fieldName, Column $column) - { - $mapping = array( - 'fieldName' => $fieldName, - 'type' => $column->type, - 'scale' => $column->scale, - 'length' => $column->length, - 'unique' => $column->unique, - 'nullable' => $column->nullable, - 'precision' => $column->precision - ); - - if ($column->options) { - $mapping['options'] = $column->options; - } - - if (isset($column->name)) { - $mapping['columnName'] = $column->name; - } - - if (isset($column->columnDefinition)) { - $mapping['columnDefinition'] = $column->columnDefinition; - } - - return $mapping; - } - - /** - * Factory method for the Annotation Driver - * - * @param array|string $paths - * @param AnnotationReader $reader - * @return AnnotationDriver - */ - static public function create($paths = array(), AnnotationReader $reader = null) - { - if ($reader == null) { - $reader = new AnnotationReader(); - } - - return new self($reader, $paths); - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php b/framework/library/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php deleted file mode 100644 index b2ae312..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php +++ /dev/null @@ -1,415 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping\Driver; - -use Doctrine\DBAL\Schema\AbstractSchemaManager, - Doctrine\DBAL\Schema\SchemaException, - Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, - Doctrine\Common\Persistence\Mapping\ClassMetadata, - Doctrine\ORM\Mapping\ClassMetadataInfo, - Doctrine\Common\Util\Inflector, - Doctrine\ORM\Mapping\MappingException; - -/** - * The DatabaseDriver reverse engineers the mapping metadata from a database. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Benjamin Eberlei - */ -class DatabaseDriver implements MappingDriver -{ - /** - * @var AbstractSchemaManager - */ - private $_sm; - - /** - * @var array - */ - private $tables = null; - - private $classToTableNames = array(); - - /** - * @var array - */ - private $manyToManyTables = array(); - - /** - * @var array - */ - private $classNamesForTables = array(); - - /** - * @var array - */ - private $fieldNamesForColumns = array(); - - /** - * The namespace for the generated entities. - * - * @var string - */ - private $namespace; - - /** - * - * @param AbstractSchemaManager $schemaManager - */ - public function __construct(AbstractSchemaManager $schemaManager) - { - $this->_sm = $schemaManager; - } - - /** - * Set tables manually instead of relying on the reverse engeneering capabilities of SchemaManager. - * - * @param array $entityTables - * @param array $manyToManyTables - * @return void - */ - public function setTables($entityTables, $manyToManyTables) - { - $this->tables = $this->manyToManyTables = $this->classToTableNames = array(); - foreach ($entityTables as $table) { - $className = $this->getClassNameForTable($table->getName()); - $this->classToTableNames[$className] = $table->getName(); - $this->tables[$table->getName()] = $table; - } - foreach ($manyToManyTables as $table) { - $this->manyToManyTables[$table->getName()] = $table; - } - } - - private function reverseEngineerMappingFromDatabase() - { - if ($this->tables !== null) { - return; - } - - $tables = array(); - - foreach ($this->_sm->listTableNames() as $tableName) { - $tables[$tableName] = $this->_sm->listTableDetails($tableName); - } - - $this->tables = $this->manyToManyTables = $this->classToTableNames = array(); - foreach ($tables as $tableName => $table) { - /* @var $table \Doctrine\DBAL\Schema\Table */ - if ($this->_sm->getDatabasePlatform()->supportsForeignKeyConstraints()) { - $foreignKeys = $table->getForeignKeys(); - } else { - $foreignKeys = array(); - } - - $allForeignKeyColumns = array(); - foreach ($foreignKeys as $foreignKey) { - $allForeignKeyColumns = array_merge($allForeignKeyColumns, $foreignKey->getLocalColumns()); - } - - if ( ! $table->hasPrimaryKey()) { - throw new MappingException( - "Table " . $table->getName() . " has no primary key. Doctrine does not ". - "support reverse engineering from tables that don't have a primary key." - ); - } - - $pkColumns = $table->getPrimaryKey()->getColumns(); - sort($pkColumns); - sort($allForeignKeyColumns); - - if ($pkColumns == $allForeignKeyColumns && count($foreignKeys) == 2) { - $this->manyToManyTables[$tableName] = $table; - } else { - // lower-casing is necessary because of Oracle Uppercase Tablenames, - // assumption is lower-case + underscore separated. - $className = $this->getClassNameForTable($tableName); - $this->tables[$tableName] = $table; - $this->classToTableNames[$className] = $tableName; - } - } - } - - /** - * {@inheritDoc} - */ - public function loadMetadataForClass($className, ClassMetadata $metadata) - { - $this->reverseEngineerMappingFromDatabase(); - - if (!isset($this->classToTableNames[$className])) { - throw new \InvalidArgumentException("Unknown class " . $className); - } - - $tableName = $this->classToTableNames[$className]; - - $metadata->name = $className; - $metadata->table['name'] = $tableName; - - $columns = $this->tables[$tableName]->getColumns(); - $indexes = $this->tables[$tableName]->getIndexes(); - try { - $primaryKeyColumns = $this->tables[$tableName]->getPrimaryKey()->getColumns(); - } catch(SchemaException $e) { - $primaryKeyColumns = array(); - } - - if ($this->_sm->getDatabasePlatform()->supportsForeignKeyConstraints()) { - $foreignKeys = $this->tables[$tableName]->getForeignKeys(); - } else { - $foreignKeys = array(); - } - - $allForeignKeyColumns = array(); - foreach ($foreignKeys as $foreignKey) { - $allForeignKeyColumns = array_merge($allForeignKeyColumns, $foreignKey->getLocalColumns()); - } - - $ids = array(); - $fieldMappings = array(); - foreach ($columns as $column) { - $fieldMapping = array(); - - if (in_array($column->getName(), $allForeignKeyColumns)) { - continue; - } else if ($primaryKeyColumns && in_array($column->getName(), $primaryKeyColumns)) { - $fieldMapping['id'] = true; - } - - $fieldMapping['fieldName'] = $this->getFieldNameForColumn($tableName, $column->getName(), false); - $fieldMapping['columnName'] = $column->getName(); - $fieldMapping['type'] = strtolower((string) $column->getType()); - - if ($column->getType() instanceof \Doctrine\DBAL\Types\StringType) { - $fieldMapping['length'] = $column->getLength(); - $fieldMapping['fixed'] = $column->getFixed(); - } else if ($column->getType() instanceof \Doctrine\DBAL\Types\IntegerType) { - $fieldMapping['unsigned'] = $column->getUnsigned(); - } - $fieldMapping['nullable'] = $column->getNotNull() ? false : true; - - if (isset($fieldMapping['id'])) { - $ids[] = $fieldMapping; - } else { - $fieldMappings[] = $fieldMapping; - } - } - - if ($ids) { - if (count($ids) == 1) { - $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_AUTO); - } - - foreach ($ids as $id) { - $metadata->mapField($id); - } - } - - foreach ($fieldMappings as $fieldMapping) { - $metadata->mapField($fieldMapping); - } - - foreach ($this->manyToManyTables as $manyTable) { - foreach ($manyTable->getForeignKeys() as $foreignKey) { - // foreign key maps to the table of the current entity, many to many association probably exists - if (strtolower($tableName) == strtolower($foreignKey->getForeignTableName())) { - $myFk = $foreignKey; - $otherFk = null; - foreach ($manyTable->getForeignKeys() as $foreignKey) { - if ($foreignKey != $myFk) { - $otherFk = $foreignKey; - break; - } - } - - if (!$otherFk) { - // the definition of this many to many table does not contain - // enough foreign key information to continue reverse engeneering. - continue; - } - - $localColumn = current($myFk->getColumns()); - $associationMapping = array(); - $associationMapping['fieldName'] = $this->getFieldNameForColumn($manyTable->getName(), current($otherFk->getColumns()), true); - $associationMapping['targetEntity'] = $this->getClassNameForTable($otherFk->getForeignTableName()); - if (current($manyTable->getColumns())->getName() == $localColumn) { - $associationMapping['inversedBy'] = $this->getFieldNameForColumn($manyTable->getName(), current($myFk->getColumns()), true); - $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'] = $this->getFieldNameForColumn($manyTable->getName(), current($myFk->getColumns()), true); - } - $metadata->mapManyToMany($associationMapping); - break; - } - } - } - - foreach ($foreignKeys as $foreignKey) { - $foreignTable = $foreignKey->getForeignTableName(); - $cols = $foreignKey->getColumns(); - $fkCols = $foreignKey->getForeignColumns(); - - $localColumn = current($cols); - $associationMapping = array(); - $associationMapping['fieldName'] = $this->getFieldNameForColumn($tableName, $localColumn, true); - $associationMapping['targetEntity'] = $this->getClassNameForTable($foreignTable); - - if (isset($metadata->fieldMappings[$associationMapping['fieldName']])) { - $associationMapping['fieldName'] = $associationMapping['fieldName'] . "2"; - } - - if ($primaryKeyColumns && in_array($localColumn, $primaryKeyColumns)) { - $associationMapping['id'] = true; - } - - for ($i = 0; $i < count($cols); $i++) { - $associationMapping['joinColumns'][] = array( - 'name' => $cols[$i], - 'referencedColumnName' => $fkCols[$i], - ); - } - - //Here we need to check if $cols are the same as $primaryKeyColums - if (!array_diff($cols,$primaryKeyColumns)) { - $metadata->mapOneToOne($associationMapping); - } else { - $metadata->mapManyToOne($associationMapping); - } - } - } - - /** - * {@inheritDoc} - */ - public function isTransient($className) - { - return true; - } - - /** - * {@inheritDoc} - */ - public function getAllClassNames() - { - $this->reverseEngineerMappingFromDatabase(); - - return array_keys($this->classToTableNames); - } - - /** - * Set class name for a table. - * - * @param string $tableName - * @param string $className - * @return void - */ - public function setClassNameForTable($tableName, $className) - { - $this->classNamesForTables[$tableName] = $className; - } - - /** - * Set field name for a column on a specific table. - * - * @param string $tableName - * @param string $columnName - * @param string $fieldName - * @return void - */ - public function setFieldNameForColumn($tableName, $columnName, $fieldName) - { - $this->fieldNamesForColumns[$tableName][$columnName] = $fieldName; - } - - /** - * Return the mapped class name for a table if it exists. Otherwise return "classified" version. - * - * @param string $tableName - * @return string - */ - private function getClassNameForTable($tableName) - { - if (isset($this->classNamesForTables[$tableName])) { - return $this->namespace . $this->classNamesForTables[$tableName]; - } - - return $this->namespace . Inflector::classify(strtolower($tableName)); - } - - /** - * Return the mapped field name for a column, if it exists. Otherwise return camelized version. - * - * @param string $tableName - * @param string $columnName - * @param boolean $fk Whether the column is a foreignkey or not. - * @return string - */ - private function getFieldNameForColumn($tableName, $columnName, $fk = false) - { - if (isset($this->fieldNamesForColumns[$tableName]) && isset($this->fieldNamesForColumns[$tableName][$columnName])) { - return $this->fieldNamesForColumns[$tableName][$columnName]; - } - - $columnName = strtolower($columnName); - - // Replace _id if it is a foreignkey column - if ($fk) { - $columnName = str_replace('_id', '', $columnName); - } - return Inflector::camelize($columnName); - } - - /** - * Set the namespace for the generated entities. - * - * @param string $namespace - * @return void - */ - public function setNamespace($namespace) - { - $this->namespace = $namespace; - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php b/framework/library/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php deleted file mode 100644 index 04bf2de..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php +++ /dev/null @@ -1,66 +0,0 @@ -. - */ - -require_once __DIR__.'/../Annotation.php'; -require_once __DIR__.'/../Entity.php'; -require_once __DIR__.'/../MappedSuperclass.php'; -require_once __DIR__.'/../InheritanceType.php'; -require_once __DIR__.'/../DiscriminatorColumn.php'; -require_once __DIR__.'/../DiscriminatorMap.php'; -require_once __DIR__.'/../Id.php'; -require_once __DIR__.'/../GeneratedValue.php'; -require_once __DIR__.'/../Version.php'; -require_once __DIR__.'/../JoinColumn.php'; -require_once __DIR__.'/../JoinColumns.php'; -require_once __DIR__.'/../Column.php'; -require_once __DIR__.'/../OneToOne.php'; -require_once __DIR__.'/../OneToMany.php'; -require_once __DIR__.'/../ManyToOne.php'; -require_once __DIR__.'/../ManyToMany.php'; -require_once __DIR__.'/../ElementCollection.php'; -require_once __DIR__.'/../Table.php'; -require_once __DIR__.'/../UniqueConstraint.php'; -require_once __DIR__.'/../Index.php'; -require_once __DIR__.'/../JoinTable.php'; -require_once __DIR__.'/../SequenceGenerator.php'; -require_once __DIR__.'/../CustomIdGenerator.php'; -require_once __DIR__.'/../ChangeTrackingPolicy.php'; -require_once __DIR__.'/../OrderBy.php'; -require_once __DIR__.'/../NamedQueries.php'; -require_once __DIR__.'/../NamedQuery.php'; -require_once __DIR__.'/../HasLifecycleCallbacks.php'; -require_once __DIR__.'/../PrePersist.php'; -require_once __DIR__.'/../PostPersist.php'; -require_once __DIR__.'/../PreUpdate.php'; -require_once __DIR__.'/../PostUpdate.php'; -require_once __DIR__.'/../PreRemove.php'; -require_once __DIR__.'/../PostRemove.php'; -require_once __DIR__.'/../PostLoad.php'; -require_once __DIR__.'/../PreFlush.php'; -require_once __DIR__.'/../FieldResult.php'; -require_once __DIR__.'/../ColumnResult.php'; -require_once __DIR__.'/../EntityResult.php'; -require_once __DIR__.'/../NamedNativeQuery.php'; -require_once __DIR__.'/../NamedNativeQueries.php'; -require_once __DIR__.'/../SqlResultSetMapping.php'; -require_once __DIR__.'/../SqlResultSetMappings.php'; -require_once __DIR__.'/../AssociationOverride.php'; -require_once __DIR__.'/../AssociationOverrides.php'; -require_once __DIR__.'/../AttributeOverride.php'; -require_once __DIR__.'/../AttributeOverrides.php'; diff --git a/framework/library/Doctrine/ORM/Mapping/Driver/DriverChain.php b/framework/library/Doctrine/ORM/Mapping/Driver/DriverChain.php deleted file mode 100644 index 02d409d..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Driver/DriverChain.php +++ /dev/null @@ -1,31 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain; - -/** - * {@inheritDoc} - * - * @deprecated this driver will be removed. Use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain instead - */ -class DriverChain extends MappingDriverChain -{ -} \ No newline at end of file diff --git a/framework/library/Doctrine/ORM/Mapping/Driver/PHPDriver.php b/framework/library/Doctrine/ORM/Mapping/Driver/PHPDriver.php deleted file mode 100644 index 3d60447..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Driver/PHPDriver.php +++ /dev/null @@ -1,31 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\Driver\PHPDriver as CommonPHPDriver; - -/** - * {@inheritDoc} - * - * @deprecated this driver will be removed. Use Doctrine\Common\Persistence\Mapping\Driver\PHPDriver instead - */ -class PHPDriver extends CommonPHPDriver -{ -} \ No newline at end of file diff --git a/framework/library/Doctrine/ORM/Mapping/Driver/SimplifiedXmlDriver.php b/framework/library/Doctrine/ORM/Mapping/Driver/SimplifiedXmlDriver.php deleted file mode 100644 index 85221f3..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Driver/SimplifiedXmlDriver.php +++ /dev/null @@ -1,43 +0,0 @@ -. -*/ - -namespace Doctrine\ORM\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator; - -/** - * XmlDriver that additionally looks for mapping information in a global file. - * - * @author Fabien Potencier - * @author Benjamin Eberlei - * @license MIT - */ -class SimplifiedXmlDriver extends XmlDriver -{ - const DEFAULT_FILE_EXTENSION = '.orm.xml'; - - /** - * {@inheritDoc} - */ - public function __construct($prefixes, $fileExtension = self::DEFAULT_FILE_EXTENSION) - { - $locator = new SymfonyFileLocator((array) $prefixes, $fileExtension); - parent::__construct($locator, $fileExtension); - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/Driver/SimplifiedYamlDriver.php b/framework/library/Doctrine/ORM/Mapping/Driver/SimplifiedYamlDriver.php deleted file mode 100644 index d2b8c0f..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Driver/SimplifiedYamlDriver.php +++ /dev/null @@ -1,43 +0,0 @@ -. -*/ - -namespace Doctrine\ORM\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator; - -/** - * YamlDriver that additionally looks for mapping information in a global file. - * - * @author Fabien Potencier - * @author Benjamin Eberlei - * @license MIT - */ -class SimplifiedYamlDriver extends YamlDriver -{ - const DEFAULT_FILE_EXTENSION = '.orm.yml'; - - /** - * {@inheritDoc} - */ - public function __construct($prefixes, $fileExtension = self::DEFAULT_FILE_EXTENSION) - { - $locator = new SymfonyFileLocator((array) $prefixes, $fileExtension); - parent::__construct($locator, $fileExtension); - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/Driver/StaticPHPDriver.php b/framework/library/Doctrine/ORM/Mapping/Driver/StaticPHPDriver.php deleted file mode 100644 index 6d53f77..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Driver/StaticPHPDriver.php +++ /dev/null @@ -1,31 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\Driver\StaticPHPDriver as CommonStaticPHPDriver; - -/** - * {@inheritDoc} - * - * @deprecated this driver will be removed. Use Doctrine\Common\Persistence\Mapping\Driver\StaticPHPDriver instead - */ -class StaticPHPDriver extends CommonStaticPHPDriver -{ -} \ No newline at end of file diff --git a/framework/library/Doctrine/ORM/Mapping/Driver/XmlDriver.php b/framework/library/Doctrine/ORM/Mapping/Driver/XmlDriver.php deleted file mode 100644 index 0be7c36..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Driver/XmlDriver.php +++ /dev/null @@ -1,731 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping\Driver; - -use SimpleXMLElement, - Doctrine\Common\Persistence\Mapping\Driver\FileDriver, - Doctrine\Common\Persistence\Mapping\ClassMetadata, - Doctrine\ORM\Mapping\MappingException; - -/** - * XmlDriver is a metadata driver that enables mapping through XML files. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan H. Wage - * @author Roman Borschel - */ -class XmlDriver extends FileDriver -{ - const DEFAULT_FILE_EXTENSION = '.dcm.xml'; - - /** - * {@inheritDoc} - */ - public function __construct($locator, $fileExtension = self::DEFAULT_FILE_EXTENSION) - { - parent::__construct($locator, $fileExtension); - } - - /** - * {@inheritDoc} - */ - public function loadMetadataForClass($className, ClassMetadata $metadata) - { - /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadataInfo */ - /* @var $xmlRoot SimpleXMLElement */ - $xmlRoot = $this->getElement($className); - - if ($xmlRoot->getName() == 'entity') { - if (isset($xmlRoot['repository-class'])) { - $metadata->setCustomRepositoryClass((string)$xmlRoot['repository-class']); - } - if (isset($xmlRoot['read-only']) && $this->evaluateBoolean($xmlRoot['read-only'])) { - $metadata->markReadOnly(); - } - } else if ($xmlRoot->getName() == 'mapped-superclass') { - $metadata->setCustomRepositoryClass( - isset($xmlRoot['repository-class']) ? (string)$xmlRoot['repository-class'] : null - ); - $metadata->isMappedSuperclass = true; - } else { - throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className); - } - - // Evaluate attributes - $table = array(); - if (isset($xmlRoot['table'])) { - $table['name'] = (string)$xmlRoot['table']; - } - - $metadata->setPrimaryTable($table); - - // Evaluate named queries - if (isset($xmlRoot->{'named-queries'})) { - foreach ($xmlRoot->{'named-queries'}->{'named-query'} as $namedQueryElement) { - $metadata->addNamedQuery(array( - 'name' => (string)$namedQueryElement['name'], - 'query' => (string)$namedQueryElement['query'] - )); - } - } - - // Evaluate native named queries - if (isset($xmlRoot->{'named-native-queries'})) { - foreach ($xmlRoot->{'named-native-queries'}->{'named-native-query'} as $nativeQueryElement) { - $metadata->addNamedNativeQuery(array( - 'name' => isset($nativeQueryElement['name']) ? (string)$nativeQueryElement['name'] : null, - 'query' => isset($nativeQueryElement->query) ? (string)$nativeQueryElement->query : null, - 'resultClass' => isset($nativeQueryElement['result-class']) ? (string)$nativeQueryElement['result-class'] : null, - 'resultSetMapping' => isset($nativeQueryElement['result-set-mapping']) ? (string)$nativeQueryElement['result-set-mapping'] : null, - )); - } - } - - // Evaluate sql result set mapping - if (isset($xmlRoot->{'sql-result-set-mappings'})) { - foreach ($xmlRoot->{'sql-result-set-mappings'}->{'sql-result-set-mapping'} as $rsmElement) { - $entities = array(); - $columns = array(); - foreach ($rsmElement as $entityElement) { - // - if (isset($entityElement['entity-class'])) { - $entityResult = array( - 'fields' => array(), - 'entityClass' => (string)$entityElement['entity-class'], - 'discriminatorColumn' => isset($entityElement['discriminator-column']) ? (string)$entityElement['discriminator-column'] : null, - ); - - foreach ($entityElement as $fieldElement) { - $entityResult['fields'][] = array( - 'name' => isset($fieldElement['name']) ? (string)$fieldElement['name'] : null, - 'column' => isset($fieldElement['column']) ? (string)$fieldElement['column'] : null, - ); - } - - $entities[] = $entityResult; - } - - // - if (isset($entityElement['name'])) { - $columns[] = array( - 'name' => (string)$entityElement['name'], - ); - } - } - - $metadata->addSqlResultSetMapping(array( - 'name' => (string)$rsmElement['name'], - 'entities' => $entities, - 'columns' => $columns - )); - } - } - - /* not implemented specially anyway. use table = schema.table - if (isset($xmlRoot['schema'])) { - $metadata->table['schema'] = (string)$xmlRoot['schema']; - }*/ - - if (isset($xmlRoot['inheritance-type'])) { - $inheritanceType = (string)$xmlRoot['inheritance-type']; - $metadata->setInheritanceType(constant('Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_' . $inheritanceType)); - - if ($metadata->inheritanceType != \Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_NONE) { - // Evaluate - if (isset($xmlRoot->{'discriminator-column'})) { - $discrColumn = $xmlRoot->{'discriminator-column'}; - $metadata->setDiscriminatorColumn(array( - 'name' => isset($discrColumn['name']) ? (string)$discrColumn['name'] : null, - 'type' => isset($discrColumn['type']) ? (string)$discrColumn['type'] : null, - 'length' => isset($discrColumn['length']) ? (string)$discrColumn['length'] : null, - 'columnDefinition' => isset($discrColumn['column-definition']) ? (string)$discrColumn['column-definition'] : null - )); - } else { - $metadata->setDiscriminatorColumn(array('name' => 'dtype', 'type' => 'string', 'length' => 255)); - } - - // Evaluate - if (isset($xmlRoot->{'discriminator-map'})) { - $map = array(); - foreach ($xmlRoot->{'discriminator-map'}->{'discriminator-mapping'} as $discrMapElement) { - $map[(string)$discrMapElement['value']] = (string)$discrMapElement['class']; - } - $metadata->setDiscriminatorMap($map); - } - } - } - - - // Evaluate - if (isset($xmlRoot['change-tracking-policy'])) { - $metadata->setChangeTrackingPolicy(constant('Doctrine\ORM\Mapping\ClassMetadata::CHANGETRACKING_' - . strtoupper((string)$xmlRoot['change-tracking-policy']))); - } - - // Evaluate - if (isset($xmlRoot->indexes)) { - $metadata->table['indexes'] = array(); - foreach ($xmlRoot->indexes->index as $index) { - $columns = explode(',', (string)$index['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']); - - if (isset($unique['name'])) { - $metadata->table['uniqueConstraints'][(string)$unique['name']] = array( - 'columns' => $columns - ); - } else { - $metadata->table['uniqueConstraints'][] = array( - 'columns' => $columns - ); - } - } - } - - if (isset($xmlRoot->options)) { - $metadata->table['options'] = $this->_parseOptions($xmlRoot->options->children()); - } - - // The mapping assignement is done in 2 times as a bug might occurs on some php/xml lib versions - // The internal SimpleXmlIterator get resetted, to this generate a duplicate field exception - $mappings = array(); - // Evaluate mappings - if (isset($xmlRoot->field)) { - foreach ($xmlRoot->field as $fieldMapping) { - $mapping = $this->columnToArray($fieldMapping); - - if (isset($mapping['version'])) { - $metadata->setVersionMapping($mapping); - unset($mapping['version']); - } - - $metadata->mapField($mapping); - } - } - - foreach ($mappings as $mapping) { - if (isset($mapping['version'])) { - $metadata->setVersionMapping($mapping); - } - - $metadata->mapField($mapping); - } - - // Evaluate mappings - $associationIds = array(); - foreach ($xmlRoot->id as $idElement) { - if (isset($idElement['association-key']) && $this->evaluateBoolean($idElement['association-key'])) { - $associationIds[(string)$idElement['name']] = true; - continue; - } - - $mapping = array( - 'id' => true, - 'fieldName' => (string)$idElement['name'] - ); - - if (isset($idElement['type'])) { - $mapping['type'] = (string)$idElement['type']; - } - - if (isset($idElement['length'])) { - $mapping['length'] = (string)$idElement['length']; - } - - if (isset($idElement['column'])) { - $mapping['columnName'] = (string)$idElement['column']; - } - - if (isset($idElement['column-definition'])) { - $mapping['columnDefinition'] = (string)$idElement['column-definition']; - } - - $metadata->mapField($mapping); - - if (isset($idElement->generator)) { - $strategy = isset($idElement->generator['strategy']) ? - (string)$idElement->generator['strategy'] : 'AUTO'; - $metadata->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' - . $strategy)); - } - - // Check for SequenceGenerator/TableGenerator definition - if (isset($idElement->{'sequence-generator'})) { - $seqGenerator = $idElement->{'sequence-generator'}; - $metadata->setSequenceGeneratorDefinition(array( - 'sequenceName' => (string)$seqGenerator['sequence-name'], - 'allocationSize' => (string)$seqGenerator['allocation-size'], - 'initialValue' => (string)$seqGenerator['initial-value'] - )); - } else if (isset($idElement->{'custom-id-generator'})) { - $customGenerator = $idElement->{'custom-id-generator'}; - $metadata->setCustomGeneratorDefinition(array( - 'class' => (string) $customGenerator['class'] - )); - } else if (isset($idElement->{'table-generator'})) { - throw MappingException::tableIdGeneratorNotImplemented($className); - } - } - - // Evaluate mappings - if (isset($xmlRoot->{'one-to-one'})) { - foreach ($xmlRoot->{'one-to-one'} as $oneToOneElement) { - $mapping = array( - 'fieldName' => (string)$oneToOneElement['field'], - 'targetEntity' => (string)$oneToOneElement['target-entity'] - ); - - if (isset($associationIds[$mapping['fieldName']])) { - $mapping['id'] = true; - } - - if (isset($oneToOneElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . (string)$oneToOneElement['fetch']); - } - - if (isset($oneToOneElement['mapped-by'])) { - $mapping['mappedBy'] = (string)$oneToOneElement['mapped-by']; - } else { - if (isset($oneToOneElement['inversed-by'])) { - $mapping['inversedBy'] = (string)$oneToOneElement['inversed-by']; - } - $joinColumns = array(); - - if (isset($oneToOneElement->{'join-column'})) { - $joinColumns[] = $this->joinColumnToArray($oneToOneElement->{'join-column'}); - } else if (isset($oneToOneElement->{'join-columns'})) { - foreach ($oneToOneElement->{'join-columns'}->{'join-column'} as $joinColumnElement) { - $joinColumns[] = $this->joinColumnToArray($joinColumnElement); - } - } - - $mapping['joinColumns'] = $joinColumns; - } - - if (isset($oneToOneElement->cascade)) { - $mapping['cascade'] = $this->_getCascadeMappings($oneToOneElement->cascade); - } - - if (isset($oneToOneElement['orphan-removal'])) { - $mapping['orphanRemoval'] = $this->evaluateBoolean($oneToOneElement['orphan-removal']); - } - - $metadata->mapOneToOne($mapping); - } - } - - // Evaluate mappings - if (isset($xmlRoot->{'one-to-many'})) { - foreach ($xmlRoot->{'one-to-many'} as $oneToManyElement) { - $mapping = array( - 'fieldName' => (string)$oneToManyElement['field'], - 'targetEntity' => (string)$oneToManyElement['target-entity'], - 'mappedBy' => (string)$oneToManyElement['mapped-by'] - ); - - if (isset($oneToManyElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . (string)$oneToManyElement['fetch']); - } - - if (isset($oneToManyElement->cascade)) { - $mapping['cascade'] = $this->_getCascadeMappings($oneToManyElement->cascade); - } - - if (isset($oneToManyElement['orphan-removal'])) { - $mapping['orphanRemoval'] = $this->evaluateBoolean($oneToManyElement['orphan-removal']); - } - - if (isset($oneToManyElement->{'order-by'})) { - $orderBy = array(); - foreach ($oneToManyElement->{'order-by'}->{'order-by-field'} as $orderByField) { - $orderBy[(string)$orderByField['name']] = (string)$orderByField['direction']; - } - $mapping['orderBy'] = $orderBy; - } - - if (isset($oneToManyElement['index-by'])) { - $mapping['indexBy'] = (string)$oneToManyElement['index-by']; - } else if (isset($oneToManyElement->{'index-by'})) { - throw new \InvalidArgumentException(" is not a valid tag"); - } - - $metadata->mapOneToMany($mapping); - } - } - - // Evaluate mappings - if (isset($xmlRoot->{'many-to-one'})) { - foreach ($xmlRoot->{'many-to-one'} as $manyToOneElement) { - $mapping = array( - 'fieldName' => (string)$manyToOneElement['field'], - 'targetEntity' => (string)$manyToOneElement['target-entity'] - ); - - if (isset($associationIds[$mapping['fieldName']])) { - $mapping['id'] = true; - } - - if (isset($manyToOneElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . (string)$manyToOneElement['fetch']); - } - - if (isset($manyToOneElement['inversed-by'])) { - $mapping['inversedBy'] = (string)$manyToOneElement['inversed-by']; - } - - $joinColumns = array(); - - if (isset($manyToOneElement->{'join-column'})) { - $joinColumns[] = $this->joinColumnToArray($manyToOneElement->{'join-column'}); - } else if (isset($manyToOneElement->{'join-columns'})) { - foreach ($manyToOneElement->{'join-columns'}->{'join-column'} as $joinColumnElement) { - $joinColumns[] = $this->joinColumnToArray($joinColumnElement); - } - } - - $mapping['joinColumns'] = $joinColumns; - - if (isset($manyToOneElement->cascade)) { - $mapping['cascade'] = $this->_getCascadeMappings($manyToOneElement->cascade); - } - - $metadata->mapManyToOne($mapping); - } - } - - // Evaluate mappings - if (isset($xmlRoot->{'many-to-many'})) { - foreach ($xmlRoot->{'many-to-many'} as $manyToManyElement) { - $mapping = array( - 'fieldName' => (string)$manyToManyElement['field'], - 'targetEntity' => (string)$manyToManyElement['target-entity'] - ); - - if (isset($manyToManyElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . (string)$manyToManyElement['fetch']); - } - - if (isset($manyToManyElement['orphan-removal'])) { - $mapping['orphanRemoval'] = $this->evaluateBoolean($manyToManyElement['orphan-removal']); - } - - if (isset($manyToManyElement['mapped-by'])) { - $mapping['mappedBy'] = (string)$manyToManyElement['mapped-by']; - } else if (isset($manyToManyElement->{'join-table'})) { - if (isset($manyToManyElement['inversed-by'])) { - $mapping['inversedBy'] = (string)$manyToManyElement['inversed-by']; - } - - $joinTableElement = $manyToManyElement->{'join-table'}; - $joinTable = array( - 'name' => (string)$joinTableElement['name'] - ); - - if (isset($joinTableElement['schema'])) { - $joinTable['schema'] = (string)$joinTableElement['schema']; - } - - foreach ($joinTableElement->{'join-columns'}->{'join-column'} as $joinColumnElement) { - $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - - foreach ($joinTableElement->{'inverse-join-columns'}->{'join-column'} as $joinColumnElement) { - $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - - $mapping['joinTable'] = $joinTable; - } - - if (isset($manyToManyElement->cascade)) { - $mapping['cascade'] = $this->_getCascadeMappings($manyToManyElement->cascade); - } - - if (isset($manyToManyElement->{'order-by'})) { - $orderBy = array(); - foreach ($manyToManyElement->{'order-by'}->{'order-by-field'} as $orderByField) { - $orderBy[(string)$orderByField['name']] = (string)$orderByField['direction']; - } - $mapping['orderBy'] = $orderBy; - } - - if (isset($manyToManyElement['index-by'])) { - $mapping['indexBy'] = (string)$manyToManyElement['index-by']; - } else if (isset($manyToManyElement->{'index-by'})) { - throw new \InvalidArgumentException(" is not a valid tag"); - } - - $metadata->mapManyToMany($mapping); - } - } - - // Evaluate association-overrides - if (isset($xmlRoot->{'attribute-overrides'})) { - foreach ($xmlRoot->{'attribute-overrides'}->{'attribute-override'} as $overrideElement) { - $fieldName = (string) $overrideElement['name']; - foreach ($overrideElement->field as $field) { - $mapping = $this->columnToArray($field); - $mapping['fieldName'] = $fieldName; - $metadata->setAttributeOverride($fieldName, $mapping); - } - } - } - - // Evaluate association-overrides - if (isset($xmlRoot->{'association-overrides'})) { - foreach ($xmlRoot->{'association-overrides'}->{'association-override'} as $overrideElement) { - $fieldName = (string) $overrideElement['name']; - $override = array(); - - // Check for join-columns - if (isset($overrideElement->{'join-columns'})) { - $joinColumns = array(); - foreach ($overrideElement->{'join-columns'}->{'join-column'} as $joinColumnElement) { - $joinColumns[] = $this->joinColumnToArray($joinColumnElement); - } - $override['joinColumns'] = $joinColumns; - } - - // Check for join-table - if ($overrideElement->{'join-table'}) { - $joinTable = null; - $joinTableElement = $overrideElement->{'join-table'}; - - $joinTable = array( - 'name' => (string) $joinTableElement['name'], - 'schema' => (string) $joinTableElement['schema'] - ); - - if (isset($joinTableElement->{'join-columns'})) { - foreach ($joinTableElement->{'join-columns'}->{'join-column'} as $joinColumnElement) { - $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - } - - if (isset($joinTableElement->{'inverse-join-columns'})) { - foreach ($joinTableElement->{'inverse-join-columns'}->{'join-column'} as $joinColumnElement) { - $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - } - - $override['joinTable'] = $joinTable; - } - - $metadata->setAssociationOverride($fieldName, $override); - } - } - - // Evaluate - if (isset($xmlRoot->{'lifecycle-callbacks'})) { - foreach ($xmlRoot->{'lifecycle-callbacks'}->{'lifecycle-callback'} as $lifecycleCallback) { - $metadata->addLifecycleCallback((string)$lifecycleCallback['method'], constant('Doctrine\ORM\Events::' . (string)$lifecycleCallback['type'])); - } - } - } - - /** - * Parses (nested) option elements. - * - * @param SimpleXMLElement $options the XML element. - * @return array The options array. - */ - private function _parseOptions(SimpleXMLElement $options) - { - $array = array(); - - /* @var $option SimpleXMLElement */ - foreach ($options as $option) { - if ($option->count()) { - $value = $this->_parseOptions($option->children()); - } else { - $value = (string) $option; - } - - $attr = $option->attributes(); - - if (isset($attr->name)) { - $array[(string) $attr->name] = $value; - } else { - $array[] = $value; - } - } - - return $array; - } - - /** - * Constructs a joinColumn mapping array based on the information - * found in the given SimpleXMLElement. - * - * @param SimpleXMLElement $joinColumnElement the XML element. - * @return array The mapping array. - */ - private function joinColumnToArray(SimpleXMLElement $joinColumnElement) - { - $joinColumn = array( - 'name' => (string)$joinColumnElement['name'], - 'referencedColumnName' => (string)$joinColumnElement['referenced-column-name'] - ); - - if (isset($joinColumnElement['unique'])) { - $joinColumn['unique'] = $this->evaluateBoolean($joinColumnElement['unique']); - } - - if (isset($joinColumnElement['nullable'])) { - $joinColumn['nullable'] = $this->evaluateBoolean($joinColumnElement['nullable']); - } - - if (isset($joinColumnElement['on-delete'])) { - $joinColumn['onDelete'] = (string)$joinColumnElement['on-delete']; - } - - if (isset($joinColumnElement['column-definition'])) { - $joinColumn['columnDefinition'] = (string)$joinColumnElement['column-definition']; - } - - return $joinColumn; - } - - /** - * Parse the given field as array - * - * @param SimpleXMLElement $fieldMapping - * @return array - */ - private function columnToArray(SimpleXMLElement $fieldMapping) - { - $mapping = array( - 'fieldName' => (string) $fieldMapping['name'], - ); - - if (isset($fieldMapping['type'])) { - $mapping['type'] = (string) $fieldMapping['type']; - } - - if (isset($fieldMapping['column'])) { - $mapping['columnName'] = (string) $fieldMapping['column']; - } - - if (isset($fieldMapping['length'])) { - $mapping['length'] = (int) $fieldMapping['length']; - } - - if (isset($fieldMapping['precision'])) { - $mapping['precision'] = (int) $fieldMapping['precision']; - } - - if (isset($fieldMapping['scale'])) { - $mapping['scale'] = (int) $fieldMapping['scale']; - } - - if (isset($fieldMapping['unique'])) { - $mapping['unique'] = $this->evaluateBoolean($fieldMapping['unique']); - } - - if (isset($fieldMapping['nullable'])) { - $mapping['nullable'] = $this->evaluateBoolean($fieldMapping['nullable']); - } - - if (isset($fieldMapping['version']) && $fieldMapping['version']) { - $mapping['version'] = $this->evaluateBoolean($fieldMapping['version']); - } - - if (isset($fieldMapping['column-definition'])) { - $mapping['columnDefinition'] = (string) $fieldMapping['column-definition']; - } - - if (isset($fieldMapping->options)) { - $mapping['options'] = $this->_parseOptions($fieldMapping->options->children()); - } - - return $mapping; - } - - /** - * Gathers a list of cascade options found in the given cascade element. - * - * @param SimpleXMLElement $cascadeElement the cascade element. - * @return array The list of cascade options. - */ - private function _getCascadeMappings($cascadeElement) - { - $cascades = array(); - /* @var $action SimpleXmlElement */ - foreach ($cascadeElement->children() as $action) { - // According to the JPA specifications, XML uses "cascade-persist" - // instead of "persist". Here, both variations - // are supported because both YAML and Annotation use "persist" - // and we want to make sure that this driver doesn't need to know - // anything about the supported cascading actions - $cascades[] = str_replace('cascade-', '', $action->getName()); - } - return $cascades; - } - - /** - * {@inheritDoc} - */ - protected function loadMappingFile($file) - { - $result = array(); - $xmlElement = simplexml_load_file($file); - - if (isset($xmlElement->entity)) { - foreach ($xmlElement->entity as $entityElement) { - $entityName = (string)$entityElement['name']; - $result[$entityName] = $entityElement; - } - } else if (isset($xmlElement->{'mapped-superclass'})) { - foreach ($xmlElement->{'mapped-superclass'} as $mappedSuperClass) { - $className = (string)$mappedSuperClass['name']; - $result[$className] = $mappedSuperClass; - } - } - - return $result; - } - - protected function evaluateBoolean($element) - { - $flag = (string)$element; - - return ($flag === true || $flag == "true" || $flag == "1"); - } -} - diff --git a/framework/library/Doctrine/ORM/Mapping/Driver/YamlDriver.php b/framework/library/Doctrine/ORM/Mapping/Driver/YamlDriver.php deleted file mode 100644 index f339045..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Driver/YamlDriver.php +++ /dev/null @@ -1,688 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping\Driver; - -use Doctrine\Common\Persistence\Mapping\ClassMetadata, - Doctrine\Common\Persistence\Mapping\Driver\FileDriver, - Doctrine\ORM\Mapping\MappingException, - Symfony\Component\Yaml\Yaml; - -/** - * The YamlDriver reads the mapping metadata from yaml schema files. - * - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan H. Wage - * @author Roman Borschel - */ -class YamlDriver extends FileDriver -{ - const DEFAULT_FILE_EXTENSION = '.dcm.yml'; - - /** - * {@inheritDoc} - */ - public function __construct($locator, $fileExtension = self::DEFAULT_FILE_EXTENSION) - { - parent::__construct($locator, $fileExtension); - } - - /** - * {@inheritDoc} - */ - public function loadMetadataForClass($className, ClassMetadata $metadata) - { - /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadataInfo */ - $element = $this->getElement($className); - - if ($element['type'] == 'entity') { - if (isset($element['repositoryClass'])) { - $metadata->setCustomRepositoryClass($element['repositoryClass']); - } - if (isset($element['readOnly']) && $element['readOnly'] == true) { - $metadata->markReadOnly(); - } - } else if ($element['type'] == 'mappedSuperclass') { - $metadata->setCustomRepositoryClass( - isset($element['repositoryClass']) ? $element['repositoryClass'] : null - ); - $metadata->isMappedSuperclass = true; - } else { - throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className); - } - - // Evaluate root level properties - $table = array(); - if (isset($element['table'])) { - $table['name'] = $element['table']; - } - $metadata->setPrimaryTable($table); - - // Evaluate named queries - if (isset($element['namedQueries'])) { - foreach ($element['namedQueries'] as $name => $queryMapping) { - if (is_string($queryMapping)) { - $queryMapping = array('query' => $queryMapping); - } - - if ( ! isset($queryMapping['name'])) { - $queryMapping['name'] = $name; - } - - $metadata->addNamedQuery($queryMapping); - } - } - - // Evaluate named native queries - if (isset($element['namedNativeQueries'])) { - foreach ($element['namedNativeQueries'] as $name => $mappingElement) { - if (!isset($mappingElement['name'])) { - $mappingElement['name'] = $name; - } - $metadata->addNamedNativeQuery(array( - 'name' => $mappingElement['name'], - 'query' => isset($mappingElement['query']) ? $mappingElement['query'] : null, - 'resultClass' => isset($mappingElement['resultClass']) ? $mappingElement['resultClass'] : null, - 'resultSetMapping' => isset($mappingElement['resultSetMapping']) ? $mappingElement['resultSetMapping'] : null, - )); - } - } - - // Evaluate sql result set mappings - if (isset($element['sqlResultSetMappings'])) { - foreach ($element['sqlResultSetMappings'] as $name => $resultSetMapping) { - if (!isset($resultSetMapping['name'])) { - $resultSetMapping['name'] = $name; - } - - $entities = array(); - $columns = array(); - if (isset($resultSetMapping['entityResult'])) { - foreach ($resultSetMapping['entityResult'] as $entityResultElement) { - $entityResult = array( - 'fields' => array(), - 'entityClass' => isset($entityResultElement['entityClass']) ? $entityResultElement['entityClass'] : null, - 'discriminatorColumn' => isset($entityResultElement['discriminatorColumn']) ? $entityResultElement['discriminatorColumn'] : null, - ); - - if (isset($entityResultElement['fieldResult'])) { - foreach ($entityResultElement['fieldResult'] as $fieldResultElement) { - $entityResult['fields'][] = array( - 'name' => isset($fieldResultElement['name']) ? $fieldResultElement['name'] : null, - 'column' => isset($fieldResultElement['column']) ? $fieldResultElement['column'] : null, - ); - } - } - - $entities[] = $entityResult; - } - } - - - if (isset($resultSetMapping['columnResult'])) { - foreach ($resultSetMapping['columnResult'] as $columnResultAnnot) { - $columns[] = array( - 'name' => isset($columnResultAnnot['name']) ? $columnResultAnnot['name'] : null, - ); - } - } - - $metadata->addSqlResultSetMapping(array( - 'name' => $resultSetMapping['name'], - 'entities' => $entities, - 'columns' => $columns - )); - } - } - - /* not implemented specially anyway. use table = schema.table - if (isset($element['schema'])) { - $metadata->table['schema'] = $element['schema']; - }*/ - - if (isset($element['inheritanceType'])) { - $metadata->setInheritanceType(constant('Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_' . strtoupper($element['inheritanceType']))); - - if ($metadata->inheritanceType != \Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_NONE) { - // Evaluate discriminatorColumn - if (isset($element['discriminatorColumn'])) { - $discrColumn = $element['discriminatorColumn']; - $metadata->setDiscriminatorColumn(array( - 'name' => isset($discrColumn['name']) ? (string)$discrColumn['name'] : null, - 'type' => isset($discrColumn['type']) ? (string)$discrColumn['type'] : null, - 'length' => isset($discrColumn['length']) ? (string)$discrColumn['length'] : null, - 'columnDefinition' => isset($discrColumn['columnDefinition']) ? (string)$discrColumn['columnDefinition'] : null - )); - } else { - $metadata->setDiscriminatorColumn(array('name' => 'dtype', 'type' => 'string', 'length' => 255)); - } - - // Evaluate discriminatorMap - if (isset($element['discriminatorMap'])) { - $metadata->setDiscriminatorMap($element['discriminatorMap']); - } - } - } - - - // Evaluate changeTrackingPolicy - if (isset($element['changeTrackingPolicy'])) { - $metadata->setChangeTrackingPolicy(constant('Doctrine\ORM\Mapping\ClassMetadata::CHANGETRACKING_' - . strtoupper($element['changeTrackingPolicy']))); - } - - // Evaluate indexes - if (isset($element['indexes'])) { - foreach ($element['indexes'] as $name => $index) { - if ( ! isset($index['name'])) { - $index['name'] = $name; - } - - if (is_string($index['columns'])) { - $columns = explode(',', $index['columns']); - $columns = array_map('trim', $columns); - } else { - $columns = $index['columns']; - } - - $metadata->table['indexes'][$index['name']] = array( - 'columns' => $columns - ); - } - } - - // Evaluate uniqueConstraints - if (isset($element['uniqueConstraints'])) { - foreach ($element['uniqueConstraints'] as $name => $unique) { - if ( ! isset($unique['name'])) { - $unique['name'] = $name; - } - - if (is_string($unique['columns'])) { - $columns = explode(',', $unique['columns']); - $columns = array_map('trim', $columns); - } else { - $columns = $unique['columns']; - } - - $metadata->table['uniqueConstraints'][$unique['name']] = array( - 'columns' => $columns - ); - } - } - - if (isset($element['options'])) { - $metadata->table['options'] = $element['options']; - } - - $associationIds = array(); - if (isset($element['id'])) { - // Evaluate identifier settings - foreach ($element['id'] as $name => $idElement) { - if (isset($idElement['associationKey']) && $idElement['associationKey'] == true) { - $associationIds[$name] = true; - continue; - } - - $mapping = array( - 'id' => true, - 'fieldName' => $name - ); - - if (isset($idElement['type'])) { - $mapping['type'] = $idElement['type']; - } - - if (isset($idElement['column'])) { - $mapping['columnName'] = $idElement['column']; - } - - if (isset($idElement['length'])) { - $mapping['length'] = $idElement['length']; - } - - if (isset($idElement['columnDefinition'])) { - $mapping['columnDefinition'] = $idElement['columnDefinition']; - } - - $metadata->mapField($mapping); - - if (isset($idElement['generator'])) { - $metadata->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' - . strtoupper($idElement['generator']['strategy']))); - } - // Check for SequenceGenerator/TableGenerator definition - if (isset($idElement['sequenceGenerator'])) { - $metadata->setSequenceGeneratorDefinition($idElement['sequenceGenerator']); - } else if (isset($idElement['customIdGenerator'])) { - $customGenerator = $idElement['customIdGenerator']; - $metadata->setCustomGeneratorDefinition(array( - 'class' => (string) $customGenerator['class'] - )); - } else if (isset($idElement['tableGenerator'])) { - throw MappingException::tableIdGeneratorNotImplemented($className); - } - } - } - - // Evaluate fields - if (isset($element['fields'])) { - foreach ($element['fields'] as $name => $fieldMapping) { - - $mapping = $this->columnToArray($name, $fieldMapping); - - if (isset($fieldMapping['id'])) { - $mapping['id'] = true; - if (isset($fieldMapping['generator']['strategy'])) { - $metadata->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' - . strtoupper($fieldMapping['generator']['strategy']))); - } - } - - if (isset($mapping['version'])) { - $metadata->setVersionMapping($mapping); - unset($mapping['version']); - } - - $metadata->mapField($mapping); - } - } - - // Evaluate oneToOne relationships - if (isset($element['oneToOne'])) { - foreach ($element['oneToOne'] as $name => $oneToOneElement) { - $mapping = array( - 'fieldName' => $name, - 'targetEntity' => $oneToOneElement['targetEntity'] - ); - - if (isset($associationIds[$mapping['fieldName']])) { - $mapping['id'] = true; - } - - if (isset($oneToOneElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $oneToOneElement['fetch']); - } - - if (isset($oneToOneElement['mappedBy'])) { - $mapping['mappedBy'] = $oneToOneElement['mappedBy']; - } else { - if (isset($oneToOneElement['inversedBy'])) { - $mapping['inversedBy'] = $oneToOneElement['inversedBy']; - } - - $joinColumns = array(); - - if (isset($oneToOneElement['joinColumn'])) { - $joinColumns[] = $this->joinColumnToArray($oneToOneElement['joinColumn']); - } else if (isset($oneToOneElement['joinColumns'])) { - foreach ($oneToOneElement['joinColumns'] as $joinColumnName => $joinColumnElement) { - if ( ! isset($joinColumnElement['name'])) { - $joinColumnElement['name'] = $joinColumnName; - } - - $joinColumns[] = $this->joinColumnToArray($joinColumnElement); - } - } - - $mapping['joinColumns'] = $joinColumns; - } - - if (isset($oneToOneElement['cascade'])) { - $mapping['cascade'] = $oneToOneElement['cascade']; - } - - if (isset($oneToOneElement['orphanRemoval'])) { - $mapping['orphanRemoval'] = (bool)$oneToOneElement['orphanRemoval']; - } - - $metadata->mapOneToOne($mapping); - } - } - - // Evaluate oneToMany relationships - if (isset($element['oneToMany'])) { - foreach ($element['oneToMany'] as $name => $oneToManyElement) { - $mapping = array( - 'fieldName' => $name, - 'targetEntity' => $oneToManyElement['targetEntity'], - 'mappedBy' => $oneToManyElement['mappedBy'] - ); - - if (isset($oneToManyElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $oneToManyElement['fetch']); - } - - if (isset($oneToManyElement['cascade'])) { - $mapping['cascade'] = $oneToManyElement['cascade']; - } - - if (isset($oneToManyElement['orphanRemoval'])) { - $mapping['orphanRemoval'] = (bool)$oneToManyElement['orphanRemoval']; - } - - if (isset($oneToManyElement['orderBy'])) { - $mapping['orderBy'] = $oneToManyElement['orderBy']; - } - - if (isset($oneToManyElement['indexBy'])) { - $mapping['indexBy'] = $oneToManyElement['indexBy']; - } - - $metadata->mapOneToMany($mapping); - } - } - - // Evaluate manyToOne relationships - if (isset($element['manyToOne'])) { - foreach ($element['manyToOne'] as $name => $manyToOneElement) { - $mapping = array( - 'fieldName' => $name, - 'targetEntity' => $manyToOneElement['targetEntity'] - ); - - if (isset($associationIds[$mapping['fieldName']])) { - $mapping['id'] = true; - } - - if (isset($manyToOneElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $manyToOneElement['fetch']); - } - - if (isset($manyToOneElement['inversedBy'])) { - $mapping['inversedBy'] = $manyToOneElement['inversedBy']; - } - - $joinColumns = array(); - - if (isset($manyToOneElement['joinColumn'])) { - $joinColumns[] = $this->joinColumnToArray($manyToOneElement['joinColumn']); - } else if (isset($manyToOneElement['joinColumns'])) { - foreach ($manyToOneElement['joinColumns'] as $joinColumnName => $joinColumnElement) { - if ( ! isset($joinColumnElement['name'])) { - $joinColumnElement['name'] = $joinColumnName; - } - - $joinColumns[] = $this->joinColumnToArray($joinColumnElement); - } - } - - $mapping['joinColumns'] = $joinColumns; - - if (isset($manyToOneElement['cascade'])) { - $mapping['cascade'] = $manyToOneElement['cascade']; - } - - $metadata->mapManyToOne($mapping); - } - } - - // Evaluate manyToMany relationships - if (isset($element['manyToMany'])) { - foreach ($element['manyToMany'] as $name => $manyToManyElement) { - $mapping = array( - 'fieldName' => $name, - 'targetEntity' => $manyToManyElement['targetEntity'] - ); - - if (isset($manyToManyElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $manyToManyElement['fetch']); - } - - if (isset($manyToManyElement['mappedBy'])) { - $mapping['mappedBy'] = $manyToManyElement['mappedBy']; - } else if (isset($manyToManyElement['joinTable'])) { - - $joinTableElement = $manyToManyElement['joinTable']; - $joinTable = array( - 'name' => $joinTableElement['name'] - ); - - if (isset($joinTableElement['schema'])) { - $joinTable['schema'] = $joinTableElement['schema']; - } - - foreach ($joinTableElement['joinColumns'] as $joinColumnName => $joinColumnElement) { - if ( ! isset($joinColumnElement['name'])) { - $joinColumnElement['name'] = $joinColumnName; - } - - $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - - foreach ($joinTableElement['inverseJoinColumns'] as $joinColumnName => $joinColumnElement) { - if ( ! isset($joinColumnElement['name'])) { - $joinColumnElement['name'] = $joinColumnName; - } - - $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - - $mapping['joinTable'] = $joinTable; - } - - if (isset($manyToManyElement['inversedBy'])) { - $mapping['inversedBy'] = $manyToManyElement['inversedBy']; - } - - if (isset($manyToManyElement['cascade'])) { - $mapping['cascade'] = $manyToManyElement['cascade']; - } - - if (isset($manyToManyElement['orderBy'])) { - $mapping['orderBy'] = $manyToManyElement['orderBy']; - } - - if (isset($manyToManyElement['indexBy'])) { - $mapping['indexBy'] = $manyToManyElement['indexBy']; - } - - if (isset($manyToManyElement['orphanRemoval'])) { - $mapping['orphanRemoval'] = (bool)$manyToManyElement['orphanRemoval']; - } - - $metadata->mapManyToMany($mapping); - } - } - - // Evaluate associationOverride - if (isset($element['associationOverride']) && is_array($element['associationOverride'])) { - - foreach ($element['associationOverride'] as $fieldName => $associationOverrideElement) { - $override = array(); - - // Check for joinColumn - if (isset($associationOverrideElement['joinColumn'])) { - $joinColumns = array(); - foreach ($associationOverrideElement['joinColumn'] as $name => $joinColumnElement) { - if ( ! isset($joinColumnElement['name'])) { - $joinColumnElement['name'] = $name; - } - $joinColumns[] = $this->joinColumnToArray($joinColumnElement); - } - $override['joinColumns'] = $joinColumns; - } - - // Check for joinTable - if (isset($associationOverrideElement['joinTable'])) { - - $joinTableElement = $associationOverrideElement['joinTable']; - $joinTable = array( - 'name' => $joinTableElement['name'] - ); - - if (isset($joinTableElement['schema'])) { - $joinTable['schema'] = $joinTableElement['schema']; - } - - foreach ($joinTableElement['joinColumns'] as $name => $joinColumnElement) { - if ( ! isset($joinColumnElement['name'])) { - $joinColumnElement['name'] = $name; - } - - $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - - foreach ($joinTableElement['inverseJoinColumns'] as $name => $joinColumnElement) { - if ( ! isset($joinColumnElement['name'])) { - $joinColumnElement['name'] = $name; - } - - $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - - $override['joinTable'] = $joinTable; - } - - $metadata->setAssociationOverride($fieldName, $override); - } - } - - // Evaluate associationOverride - if (isset($element['attributeOverride']) && is_array($element['attributeOverride'])) { - - foreach ($element['attributeOverride'] as $fieldName => $attributeOverrideElement) { - $mapping = $this->columnToArray($fieldName, $attributeOverrideElement); - $metadata->setAttributeOverride($fieldName, $mapping); - } - } - - // Evaluate lifeCycleCallbacks - if (isset($element['lifecycleCallbacks'])) { - foreach ($element['lifecycleCallbacks'] as $type => $methods) { - foreach ($methods as $method) { - $metadata->addLifecycleCallback($method, constant('Doctrine\ORM\Events::' . $type)); - } - } - } - } - - /** - * Constructs a joinColumn mapping array based on the information - * found in the given join column element. - * - * @param array $joinColumnElement The array join column element - * @return array The mapping array. - */ - private function joinColumnToArray($joinColumnElement) - { - $joinColumn = array(); - if (isset($joinColumnElement['referencedColumnName'])) { - $joinColumn['referencedColumnName'] = (string) $joinColumnElement['referencedColumnName']; - } - - if (isset($joinColumnElement['name'])) { - $joinColumn['name'] = (string) $joinColumnElement['name']; - } - - if (isset($joinColumnElement['fieldName'])) { - $joinColumn['fieldName'] = (string) $joinColumnElement['fieldName']; - } - - if (isset($joinColumnElement['unique'])) { - $joinColumn['unique'] = (bool) $joinColumnElement['unique']; - } - - if (isset($joinColumnElement['nullable'])) { - $joinColumn['nullable'] = (bool) $joinColumnElement['nullable']; - } - - if (isset($joinColumnElement['onDelete'])) { - $joinColumn['onDelete'] = $joinColumnElement['onDelete']; - } - - if (isset($joinColumnElement['columnDefinition'])) { - $joinColumn['columnDefinition'] = $joinColumnElement['columnDefinition']; - } - - return $joinColumn; - } - - /** - * Parse the given column as array - * - * @param string $fieldName - * @param array $column - * @return array - */ - private function columnToArray($fieldName, $column) - { - $mapping = array( - 'fieldName' => $fieldName - ); - - if (isset($column['type'])) { - $params = explode('(', $column['type']); - $column['type'] = $params[0]; - $mapping['type'] = $column['type']; - - if (isset($params[1])) { - $column['length'] = (integer) substr($params[1], 0, strlen($params[1]) - 1); - } - } - - if (isset($column['column'])) { - $mapping['columnName'] = $column['column']; - } - - if (isset($column['length'])) { - $mapping['length'] = $column['length']; - } - - if (isset($column['precision'])) { - $mapping['precision'] = $column['precision']; - } - - if (isset($column['scale'])) { - $mapping['scale'] = $column['scale']; - } - - if (isset($column['unique'])) { - $mapping['unique'] = (bool)$column['unique']; - } - - if (isset($column['options'])) { - $mapping['options'] = $column['options']; - } - - if (isset($column['nullable'])) { - $mapping['nullable'] = $column['nullable']; - } - - if (isset($column['version']) && $column['version']) { - $mapping['version'] = $column['version']; - } - - if (isset($column['columnDefinition'])) { - $mapping['columnDefinition'] = $column['columnDefinition']; - } - - return $mapping; - } - - /** - * {@inheritDoc} - */ - protected function loadMappingFile($file) - { - return Yaml::parse($file); - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/ElementCollection.php b/framework/library/Doctrine/ORM/Mapping/ElementCollection.php deleted file mode 100644 index f3f4f4c..0000000 --- a/framework/library/Doctrine/ORM/Mapping/ElementCollection.php +++ /dev/null @@ -1,31 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("ALL") - * @todo check available targets - */ -final class ElementCollection implements Annotation -{ - /** @var string */ - public $tableName; -} diff --git a/framework/library/Doctrine/ORM/Mapping/Entity.php b/framework/library/Doctrine/ORM/Mapping/Entity.php deleted file mode 100644 index d1b4eb2..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Entity.php +++ /dev/null @@ -1,32 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("CLASS") - */ -final class Entity implements Annotation -{ - /** @var string */ - public $repositoryClass; - /** @var boolean */ - public $readOnly = false; -} diff --git a/framework/library/Doctrine/ORM/Mapping/EntityResult.php b/framework/library/Doctrine/ORM/Mapping/EntityResult.php deleted file mode 100644 index af26a11..0000000 --- a/framework/library/Doctrine/ORM/Mapping/EntityResult.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * References an entity in the SELECT clause of a SQL query. - * If this annotation is used, the SQL statement should select all of the columns that are mapped to the entity object. - * This should include foreign key columns to related entities. - * The results obtained when insufficient data is available are undefined. - * - * @author Fabio B. Silva - * @since 2.3 - * - * @Annotation - * @Target("ANNOTATION") - */ -final class EntityResult implements Annotation -{ - - /** - * The class of the result - * - * @var string - */ - public $entityClass; - - /** - * Maps the columns specified in the SELECT list of the query to the properties or fields of the entity class. - * - * @var array<\Doctrine\ORM\Mapping\FieldResult> - */ - public $fields = array(); - - /** - * Specifies the column name of the column in the SELECT list that is used to determine the type of the entity instance. - * - * @var string - */ - public $discriminatorColumn; - -} diff --git a/framework/library/Doctrine/ORM/Mapping/FieldResult.php b/framework/library/Doctrine/ORM/Mapping/FieldResult.php deleted file mode 100644 index ee330b2..0000000 --- a/framework/library/Doctrine/ORM/Mapping/FieldResult.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * Is used to map the columns specified in the SELECT list of the query to the properties or fields of the entity class. - * - * @author Fabio B. Silva - * @since 2.3 - * - * @Annotation - * @Target("ANNOTATION") - */ -final class FieldResult implements Annotation -{ - - /** - * Name of the column in the SELECT clause. - * - * @var string - */ - public $name; - - /** - * Name of the persistent field or property of the class. - * - * @var string - */ - public $column; - -} diff --git a/framework/library/Doctrine/ORM/Mapping/GeneratedValue.php b/framework/library/Doctrine/ORM/Mapping/GeneratedValue.php deleted file mode 100644 index d128d16..0000000 --- a/framework/library/Doctrine/ORM/Mapping/GeneratedValue.php +++ /dev/null @@ -1,30 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("PROPERTY") - */ -final class GeneratedValue implements Annotation -{ - /** @var string */ - public $strategy = 'AUTO'; -} diff --git a/framework/library/Doctrine/ORM/Mapping/HasLifecycleCallbacks.php b/framework/library/Doctrine/ORM/Mapping/HasLifecycleCallbacks.php deleted file mode 100644 index 313ece3..0000000 --- a/framework/library/Doctrine/ORM/Mapping/HasLifecycleCallbacks.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("CLASS") - */ -final class HasLifecycleCallbacks implements Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/Id.php b/framework/library/Doctrine/ORM/Mapping/Id.php deleted file mode 100644 index 6c9bcef..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Id.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("PROPERTY") - */ -final class Id implements Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/Index.php b/framework/library/Doctrine/ORM/Mapping/Index.php deleted file mode 100644 index 51f037a..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Index.php +++ /dev/null @@ -1,32 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("ANNOTATION") - */ -final class Index implements Annotation -{ - /** @var string */ - public $name; - /** @var array */ - public $columns; -} diff --git a/framework/library/Doctrine/ORM/Mapping/InheritanceType.php b/framework/library/Doctrine/ORM/Mapping/InheritanceType.php deleted file mode 100644 index d9a2471..0000000 --- a/framework/library/Doctrine/ORM/Mapping/InheritanceType.php +++ /dev/null @@ -1,30 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("CLASS") - */ -final class InheritanceType implements Annotation -{ - /** @var string */ - public $value; -} diff --git a/framework/library/Doctrine/ORM/Mapping/JoinColumn.php b/framework/library/Doctrine/ORM/Mapping/JoinColumn.php deleted file mode 100644 index 8c9bc10..0000000 --- a/framework/library/Doctrine/ORM/Mapping/JoinColumn.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target({"PROPERTY","ANNOTATION"}) - */ -final class JoinColumn implements Annotation -{ - /** @var string */ - public $name; - /** @var string */ - public $referencedColumnName = 'id'; - /** @var boolean */ - public $unique = false; - /** @var boolean */ - public $nullable = true; - /** @var mixed */ - public $onDelete; - /** @var string */ - public $columnDefinition; - /** @var string */ - public $fieldName; // field name used in non-object hydration (array/scalar) -} diff --git a/framework/library/Doctrine/ORM/Mapping/JoinColumns.php b/framework/library/Doctrine/ORM/Mapping/JoinColumns.php deleted file mode 100644 index 8d4c045..0000000 --- a/framework/library/Doctrine/ORM/Mapping/JoinColumns.php +++ /dev/null @@ -1,30 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("PROPERTY") - */ -final class JoinColumns implements Annotation -{ - /** @var array<\Doctrine\ORM\Mapping\JoinColumn> */ - public $value; -} diff --git a/framework/library/Doctrine/ORM/Mapping/JoinTable.php b/framework/library/Doctrine/ORM/Mapping/JoinTable.php deleted file mode 100644 index 7fb69cb..0000000 --- a/framework/library/Doctrine/ORM/Mapping/JoinTable.php +++ /dev/null @@ -1,36 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target({"PROPERTY","ANNOTATION"}) - */ -final class JoinTable implements Annotation -{ - /** @var string */ - public $name; - /** @var string */ - public $schema; - /** @var array<\Doctrine\ORM\Mapping\JoinColumn> */ - public $joinColumns = array(); - /** @var array<\Doctrine\ORM\Mapping\JoinColumn> */ - public $inverseJoinColumns = array(); -} diff --git a/framework/library/Doctrine/ORM/Mapping/ManyToMany.php b/framework/library/Doctrine/ORM/Mapping/ManyToMany.php deleted file mode 100644 index 9c79689..0000000 --- a/framework/library/Doctrine/ORM/Mapping/ManyToMany.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("PROPERTY") - */ -final class ManyToMany implements Annotation -{ - /** @var string */ - public $targetEntity; - /** @var string */ - public $mappedBy; - /** @var string */ - public $inversedBy; - /** @var array */ - public $cascade; - /** @var string */ - public $fetch = 'LAZY'; - /** @var boolean */ - public $orphanRemoval = false; - /** @var string */ - public $indexBy; -} diff --git a/framework/library/Doctrine/ORM/Mapping/ManyToOne.php b/framework/library/Doctrine/ORM/Mapping/ManyToOne.php deleted file mode 100644 index eb09755..0000000 --- a/framework/library/Doctrine/ORM/Mapping/ManyToOne.php +++ /dev/null @@ -1,36 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("PROPERTY") - */ -final class ManyToOne implements Annotation -{ - /** @var string */ - public $targetEntity; - /** @var array */ - public $cascade; - /** @var string */ - public $fetch = 'LAZY'; - /** @var string */ - public $inversedBy; -} diff --git a/framework/library/Doctrine/ORM/Mapping/MappedSuperclass.php b/framework/library/Doctrine/ORM/Mapping/MappedSuperclass.php deleted file mode 100644 index b551610..0000000 --- a/framework/library/Doctrine/ORM/Mapping/MappedSuperclass.php +++ /dev/null @@ -1,30 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("CLASS") - */ -final class MappedSuperclass implements Annotation -{ - /** @var string */ - public $repositoryClass; -} diff --git a/framework/library/Doctrine/ORM/Mapping/MappingException.php b/framework/library/Doctrine/ORM/Mapping/MappingException.php deleted file mode 100644 index 9b97a1f..0000000 --- a/framework/library/Doctrine/ORM/Mapping/MappingException.php +++ /dev/null @@ -1,441 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * A MappingException indicates that something is wrong with the mapping setup. - * - * @since 2.0 - */ -class MappingException extends \Doctrine\ORM\ORMException -{ - public static function pathRequired() - { - return new self("Specifying the paths to your entities is required ". - "in the AnnotationDriver to retrieve all class names."); - } - - public static function identifierRequired($entityName) - { - if (false !== ($parent = get_parent_class($entityName))) { - return new self(sprintf( - 'No identifier/primary key specified for Entity "%s" sub class of "%s". Every Entity must have an identifier/primary key.', - $entityName, $parent - )); - } - - return new self(sprintf( - 'No identifier/primary key specified for Entity "%s". Every Entity must have an identifier/primary key.', - $entityName - )); - - } - - public static function invalidInheritanceType($entityName, $type) - { - return new self("The inheritance type '$type' specified for '$entityName' does not exist."); - } - - public static function generatorNotAllowedWithCompositeId() - { - return new self("Id generators can't be used with a composite id."); - } - - public static function missingFieldName($entity) - { - return new self("The field or association mapping misses the 'fieldName' attribute in entity '$entity'."); - } - - public static function missingTargetEntity($fieldName) - { - return new self("The association mapping '$fieldName' misses the 'targetEntity' attribute."); - } - - public static function missingSourceEntity($fieldName) - { - return new self("The association mapping '$fieldName' misses the 'sourceEntity' attribute."); - } - - public static function mappingFileNotFound($entityName, $fileName) - { - return new self("No mapping file found named '$fileName' for class '$entityName'."); - } - - /** - * Exception for invalid property name override. - * - * @param string $className The entity's name - * @param string $fieldName - */ - public static function invalidOverrideFieldName($className, $fieldName) - { - return new self("Invalid field override named '$fieldName' for class '$className'."); - } - - /** - * Exception for invalid property type override. - * - * @param string $className The entity's name - * @param string $fieldName - */ - public static function invalidOverrideFieldType($className, $fieldName) - { - return new self("The column type of attribute '$fieldName' on class '$className' could not be changed."); - } - - public static function mappingNotFound($className, $fieldName) - { - return new self("No mapping found for field '$fieldName' on class '$className'."); - } - - public static function queryNotFound($className, $queryName) - { - return new self("No query found named '$queryName' on class '$className'."); - } - - public static function resultMappingNotFound($className, $resultName) - { - return new self("No result set mapping found named '$resultName' on class '$className'."); - } - - public static function emptyQueryMapping($entity, $queryName) - { - return new self('Query named "'.$queryName.'" in "'.$entity.'" could not be empty.'); - } - - public static function nameIsMandatoryForQueryMapping($className) - { - return new self("Query name on entity class '$className' is not defined."); - } - - public static function missingQueryMapping($entity, $queryName) - { - return new self('Query named "'.$queryName.'" in "'.$entity.' requires a result class or result set mapping.'); - } - - public static function missingResultSetMappingEntity($entity, $resultName) - { - return new self('Result set mapping named "'.$resultName.'" in "'.$entity.' requires a entity class name.'); - } - - public static function missingResultSetMappingFieldName($entity, $resultName) - { - return new self('Result set mapping named "'.$resultName.'" in "'.$entity.' requires a field name.'); - } - - public static function nameIsMandatoryForSqlResultSetMapping($className) - { - return new self("Result set mapping name on entity class '$className' is not defined."); - } - - public static function oneToManyRequiresMappedBy($fieldName) - { - return new self("OneToMany mapping on field '$fieldName' requires the 'mappedBy' attribute."); - } - - public static function joinTableRequired($fieldName) - { - return new self("The mapping of field '$fieldName' requires an the 'joinTable' attribute."); - } - - /** - * Called if a required option was not found but is required - * - * @param string $field which field cannot be processed? - * @param string $expectedOption which option is required - * @param string $hint Can optionally be used to supply a tip for common mistakes, - * e.g. "Did you think of the plural s?" - * @return MappingException - */ - static function missingRequiredOption($field, $expectedOption, $hint = '') - { - $message = "The mapping of field '{$field}' is invalid: The option '{$expectedOption}' is required."; - - if ( ! empty($hint)) { - $message .= ' (Hint: ' . $hint . ')'; - } - - return new self($message); - } - - /** - * Generic exception for invalid mappings. - * - * @param string $fieldName - */ - public static function invalidMapping($fieldName) - { - return new self("The mapping of field '$fieldName' is invalid."); - } - - /** - * Exception for reflection exceptions - adds the entity name, - * because there might be long classnames that will be shortened - * within the stacktrace - * - * @param string $entity The entity's name - * @param \ReflectionException $previousException - */ - public static function reflectionFailure($entity, \ReflectionException $previousException) - { - return new self('An error occurred in ' . $entity, 0, $previousException); - } - - public static function joinColumnMustPointToMappedField($className, $joinColumn) - { - return new self('The column ' . $joinColumn . ' must be mapped to a field in class ' - . $className . ' since it is referenced by a join column of another class.'); - } - - public static function classIsNotAValidEntityOrMappedSuperClass($className) - { - if (false !== ($parent = get_parent_class($className))) { - return new self(sprintf( - 'Class "%s" sub class of "%s" is not a valid entity or mapped super class.', - $className, $parent - )); - } - - return new self(sprintf( - 'Class "%s" is not a valid entity or mapped super class.', - $className - )); - } - - public static function propertyTypeIsRequired($className, $propertyName) - { - return new self("The attribute 'type' is required for the column description of property ".$className."::\$".$propertyName."."); - } - - public static function tableIdGeneratorNotImplemented($className) - { - return new self("TableIdGenerator is not yet implemented for use with class ".$className); - } - - /** - * @param string $entity The entity's name - * @param string $fieldName The name of the field that was already declared - */ - public static function duplicateFieldMapping($entity, $fieldName) - { - return new self('Property "'.$fieldName.'" in "'.$entity.'" was already declared, but it must be declared only once'); - } - - public static function duplicateAssociationMapping($entity, $fieldName) - { - return new self('Property "'.$fieldName.'" in "'.$entity.'" was already declared, but it must be declared only once'); - } - - public static function duplicateQueryMapping($entity, $queryName) - { - return new self('Query named "'.$queryName.'" in "'.$entity.'" was already declared, but it must be declared only once'); - } - - public static function duplicateResultSetMapping($entity, $resultName) - { - return new self('Result set mapping named "'.$resultName.'" in "'.$entity.'" was already declared, but it must be declared only once'); - } - - public static function singleIdNotAllowedOnCompositePrimaryKey($entity) - { - return new self('Single id is not allowed on composite primary key in entity '.$entity); - } - - public static function unsupportedOptimisticLockingType($entity, $fieldName, $unsupportedType) - { - return new self('Locking type "'.$unsupportedType.'" (specified in "'.$entity.'", field "'.$fieldName.'") ' - .'is not supported by Doctrine.' - ); - } - - public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) - { - if ( ! empty($path)) { - $path = '[' . $path . ']'; - } - - return new self( - 'File mapping drivers must have a valid directory path, ' . - 'however the given path ' . $path . ' seems to be incorrect!' - ); - } - - /** - * Throws an exception that indicates that a class used in a discriminator map does not exist. - * An example would be an outdated (maybe renamed) classname. - * - * @param string $className The class that could not be found - * @param string $owningClass The class that declares the discriminator map. - * @return self - */ - public static function invalidClassInDiscriminatorMap($className, $owningClass) - { - return new self( - "Entity class '$className' used in the discriminator map of class '$owningClass' ". - "does not exist." - ); - } - - public static function duplicateDiscriminatorEntry($className, array $entries, array $map) - { - return new self( - "The entries " . implode(', ', $entries) . " in discriminator map of class '" . $className . "' is duplicated. " . - "If the discriminator map is automatically generated you have to convert it to an explicit discriminator map now. " . - "The entries of the current map are: @DiscriminatorMap({" . implode(', ', array_map( - function($a, $b) { return "'$a': '$b'"; }, array_keys($map), array_values($map) - )) . "})" - ); - } - - public static function missingDiscriminatorMap($className) - { - return new self("Entity class '$className' is using inheritance but no discriminator map was defined."); - } - - public static function missingDiscriminatorColumn($className) - { - return new self("Entity class '$className' is using inheritance but no discriminator column was defined."); - } - - public static function invalidDiscriminatorColumnType($className, $type) - { - return new self("Discriminator column type on entity class '$className' is not allowed to be '$type'. 'string' or 'integer' type variables are suggested!"); - } - - public static function nameIsMandatoryForDiscriminatorColumns($className) - { - return new self("Discriminator column name on entity class '$className' is not defined."); - } - - public static function cannotVersionIdField($className, $fieldName) - { - return new self("Setting Id field '$fieldName' as versionale in entity class '$className' is not supported."); - } - - public static function sqlConversionNotAllowedForIdentifiers($className, $fieldName, $type) - { - return new self("It is not possible to set id field '$fieldName' to type '$type' in entity class '$className'. The type '$type' requires conversion SQL which is not allowed for identifiers."); - } - - /** - * @param string $className - * @param string $columnName - * @return self - */ - public static function duplicateColumnName($className, $columnName) - { - return new self("Duplicate definition of column '".$columnName."' on entity '".$className."' in a field or discriminator column mapping."); - } - - public static function illegalToManyAssocationOnMappedSuperclass($className, $field) - { - return new self("It is illegal to put an inverse side one-to-many or many-to-many association on mapped superclass '".$className."#".$field."'."); - } - - /** - * @param string $className - * @param string $targetEntity - * @param string $targetField - * @return self - */ - public static function cannotMapCompositePrimaryKeyEntitiesAsForeignId($className, $targetEntity, $targetField) - { - return new self("It is not possible to map entity '".$className."' with a composite primary key ". - "as part of the primary key of another entity '".$targetEntity."#".$targetField."'."); - } - - public static function noSingleAssociationJoinColumnFound($className, $field) - { - return new self("'$className#$field' is not an association with a single join column."); - } - - public static function noFieldNameFoundForColumn($className, $column) - { - return new self("Cannot find a field on '$className' that is mapped to column '$column'. Either the ". - "field does not exist or an association exists but it has multiple join columns."); - } - - public static function illegalOrphanRemovalOnIdentifierAssociation($className, $field) - { - return new self("The orphan removal option is not allowed on an association that is ". - "part of the identifier in '$className#$field'."); - } - - public static function illegalOrphanRemoval($className, $field) - { - return new self("Orphan removal is only allowed on one-to-one and one-to-many ". - "associations, but " . $className."#" .$field . " is not."); - } - - public static function illegalInverseIdentifierAssocation($className, $field) - { - return new self("An inverse association is not allowed to be identifier in '$className#$field'."); - } - - public static function illegalToManyIdentifierAssoaction($className, $field) - { - return new self("Many-to-many or one-to-many associations are not allowed to be identifier in '$className#$field'."); - } - - public static function noInheritanceOnMappedSuperClass($className) - { - return new self("Its not supported to define inheritance information on a mapped superclass '" . $className . "'."); - } - - public static function mappedClassNotPartOfDiscriminatorMap($className, $rootClassName) - { - return new self( - "Entity '" . $className . "' has to be part of the discriminator map of '" . $rootClassName . "' " . - "to be properly mapped in the inheritance hierachy. Alternatively you can make '".$className."' an abstract class " . - "to avoid this exception from occuring." - ); - } - - public static function lifecycleCallbackMethodNotFound($className, $methodName) - { - return new self("Entity '" . $className . "' has no method '" . $methodName . "' to be registered as lifecycle callback."); - } - - public static function invalidFetchMode($className, $annotation) - { - return new self("Entity '" . $className . "' has a mapping with invalid fetch mode '" . $annotation . "'"); - } - - public static function compositeKeyAssignedIdGeneratorRequired($className) - { - return new self("Entity '". $className . "' has a composite identifier but uses an ID generator other than manually assigning (Identity, Sequence). This is not supported."); - } - - public static function invalidTargetEntityClass($targetEntity, $sourceEntity, $associationName) - { - return new self("The target-entity " . $targetEntity . " cannot be found in '" . $sourceEntity."#".$associationName."'."); - } - - public static function invalidCascadeOption(array $cascades, $className, $propertyName) - { - $cascades = implode(", ", array_map(function ($e) { return "'" . $e . "'"; }, $cascades)); - return new self(sprintf( - "You have specified invalid cascade options for %s::$%s: %s; available options: 'remove', 'persist', 'refresh', 'merge', and 'detach'", - $className, - $propertyName, - $cascades - )); - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/NamedNativeQueries.php b/framework/library/Doctrine/ORM/Mapping/NamedNativeQueries.php deleted file mode 100644 index 7f5460a..0000000 --- a/framework/library/Doctrine/ORM/Mapping/NamedNativeQueries.php +++ /dev/null @@ -1,40 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * Is used to specify an array of native SQL named queries. - * The NamedNativeQueries annotation can be applied to an entity or mapped superclass. - * - * @author Fabio B. Silva - * @since 2.3 - * - * @Annotation - * @Target("CLASS") - */ -final class NamedNativeQueries implements Annotation -{ - /** - * One or more NamedNativeQuery annotations. - * - * @var array<\Doctrine\ORM\Mapping\NamedNativeQuery> - */ - public $value = array(); -} diff --git a/framework/library/Doctrine/ORM/Mapping/NamedNativeQuery.php b/framework/library/Doctrine/ORM/Mapping/NamedNativeQuery.php deleted file mode 100644 index f0192ae..0000000 --- a/framework/library/Doctrine/ORM/Mapping/NamedNativeQuery.php +++ /dev/null @@ -1,63 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * Is used to specify a native SQL named query. - * The NamedNativeQuery annotation can be applied to an entity or mapped superclass. - * - * @author Fabio B. Silva - * @since 2.3 - * - * @Annotation - * @Target("ANNOTATION") - */ -final class NamedNativeQuery implements Annotation -{ - - /** - * The name used to refer to the query with the EntityManager methods that create query objects. - * - * @var string - */ - public $name; - - /** - * The SQL query string. - * - * @var string - */ - public $query; - - /** - * The class of the result. - * - * @var string - */ - public $resultClass; - - /** - * The name of a SqlResultSetMapping, as defined in metadata. - * - * @var string - */ - public $resultSetMapping; - -} diff --git a/framework/library/Doctrine/ORM/Mapping/NamedQueries.php b/framework/library/Doctrine/ORM/Mapping/NamedQueries.php deleted file mode 100644 index 14bb479..0000000 --- a/framework/library/Doctrine/ORM/Mapping/NamedQueries.php +++ /dev/null @@ -1,30 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("CLASS") - */ -final class NamedQueries implements Annotation -{ - /** @var array<\Doctrine\ORM\Mapping\NamedQuery> */ - public $value; -} diff --git a/framework/library/Doctrine/ORM/Mapping/NamedQuery.php b/framework/library/Doctrine/ORM/Mapping/NamedQuery.php deleted file mode 100644 index 2826820..0000000 --- a/framework/library/Doctrine/ORM/Mapping/NamedQuery.php +++ /dev/null @@ -1,32 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("ANNOTATION") - */ -final class NamedQuery implements Annotation -{ - /** @var string */ - public $name; - /** @var string */ - public $query; -} diff --git a/framework/library/Doctrine/ORM/Mapping/NamingStrategy.php b/framework/library/Doctrine/ORM/Mapping/NamingStrategy.php deleted file mode 100644 index a6acac2..0000000 --- a/framework/library/Doctrine/ORM/Mapping/NamingStrategy.php +++ /dev/null @@ -1,82 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * A set of rules for determining the physical column and table names - * - * - * @link www.doctrine-project.org - * @since 2.3 - * @author Fabio B. Silva - */ -interface NamingStrategy -{ - /** - * Return a table name for an entity class - * - * @param string $className The fully-qualified class name - * @return string A table name - */ - function classToTableName($className); - - /** - * Return a column name for a property - * - * @param string $propertyName A property - * @return string A column name - */ - function propertyToColumnName($propertyName); - - /** - * Return the default reference column name - * - * @return string A column name - */ - function referenceColumnName(); - - /** - * Return a join column name for a property - * - * @param string $propertyName A property - * @return string A join column name - */ - function joinColumnName($propertyName); - - /** - * Return a join table name - * - * @param string $sourceEntity The source entity - * @param string $targetEntity The target entity - * @param string $propertyName A property - * @return string A join table name - */ - function joinTableName($sourceEntity, $targetEntity, $propertyName = null); - - /** - * Return the foreign key column name for the given parameters - * - * @param string $entityName A entity - * @param string $referencedColumnName A property - * @return string A join column name - */ - function joinKeyColumnName($entityName, $referencedColumnName = null); -} diff --git a/framework/library/Doctrine/ORM/Mapping/OneToMany.php b/framework/library/Doctrine/ORM/Mapping/OneToMany.php deleted file mode 100644 index 233dc90..0000000 --- a/framework/library/Doctrine/ORM/Mapping/OneToMany.php +++ /dev/null @@ -1,40 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("PROPERTY") - */ -final class OneToMany implements Annotation -{ - /** @var string */ - public $mappedBy; - /** @var string */ - public $targetEntity; - /** @var array */ - public $cascade; - /** @var string */ - public $fetch = 'LAZY'; - /** @var boolean */ - public $orphanRemoval = false; - /** @var string */ - public $indexBy; -} diff --git a/framework/library/Doctrine/ORM/Mapping/OneToOne.php b/framework/library/Doctrine/ORM/Mapping/OneToOne.php deleted file mode 100644 index 68689ef..0000000 --- a/framework/library/Doctrine/ORM/Mapping/OneToOne.php +++ /dev/null @@ -1,40 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("PROPERTY") - */ -final class OneToOne implements Annotation -{ - /** @var string */ - public $targetEntity; - /** @var string */ - public $mappedBy; - /** @var string */ - public $inversedBy; - /** @var array */ - public $cascade; - /** @var string */ - public $fetch = 'LAZY'; - /** @var boolean */ - public $orphanRemoval = false; -} diff --git a/framework/library/Doctrine/ORM/Mapping/OrderBy.php b/framework/library/Doctrine/ORM/Mapping/OrderBy.php deleted file mode 100644 index 4041973..0000000 --- a/framework/library/Doctrine/ORM/Mapping/OrderBy.php +++ /dev/null @@ -1,30 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("PROPERTY") - */ -final class OrderBy implements Annotation -{ - /** @var array */ - public $value; -} diff --git a/framework/library/Doctrine/ORM/Mapping/PostLoad.php b/framework/library/Doctrine/ORM/Mapping/PostLoad.php deleted file mode 100644 index 2f8e993..0000000 --- a/framework/library/Doctrine/ORM/Mapping/PostLoad.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("METHOD") - */ -final class PostLoad implements Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/PostPersist.php b/framework/library/Doctrine/ORM/Mapping/PostPersist.php deleted file mode 100644 index 2aea719..0000000 --- a/framework/library/Doctrine/ORM/Mapping/PostPersist.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("METHOD") - */ -final class PostPersist implements Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/PostRemove.php b/framework/library/Doctrine/ORM/Mapping/PostRemove.php deleted file mode 100644 index 321c4bd..0000000 --- a/framework/library/Doctrine/ORM/Mapping/PostRemove.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("METHOD") - */ -final class PostRemove implements Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/PostUpdate.php b/framework/library/Doctrine/ORM/Mapping/PostUpdate.php deleted file mode 100644 index a55f707..0000000 --- a/framework/library/Doctrine/ORM/Mapping/PostUpdate.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("METHOD") - */ -final class PostUpdate implements Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/PreFlush.php b/framework/library/Doctrine/ORM/Mapping/PreFlush.php deleted file mode 100644 index 6697d37..0000000 --- a/framework/library/Doctrine/ORM/Mapping/PreFlush.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("METHOD") - */ -final class PreFlush implements Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/PrePersist.php b/framework/library/Doctrine/ORM/Mapping/PrePersist.php deleted file mode 100644 index fea05be..0000000 --- a/framework/library/Doctrine/ORM/Mapping/PrePersist.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("METHOD") - */ -final class PrePersist implements Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/PreRemove.php b/framework/library/Doctrine/ORM/Mapping/PreRemove.php deleted file mode 100644 index 29822ed..0000000 --- a/framework/library/Doctrine/ORM/Mapping/PreRemove.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("METHOD") - */ -final class PreRemove implements Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/PreUpdate.php b/framework/library/Doctrine/ORM/Mapping/PreUpdate.php deleted file mode 100644 index 290df72..0000000 --- a/framework/library/Doctrine/ORM/Mapping/PreUpdate.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("METHOD") - */ -final class PreUpdate implements Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/Mapping/QuoteStrategy.php b/framework/library/Doctrine/ORM/Mapping/QuoteStrategy.php deleted file mode 100644 index 52e846d..0000000 --- a/framework/library/Doctrine/ORM/Mapping/QuoteStrategy.php +++ /dev/null @@ -1,112 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * A set of rules for determining the column, alias and table quotes - * - * @since 2.3 - * @author Fabio B. Silva - */ -interface QuoteStrategy -{ - /** - * Gets the (possibly quoted) column name for safe use in an SQL statement. - * - * @param string $fieldName - * @param ClassMetadata $class - * @param AbstractPlatform $platform - * @return string - */ - function getColumnName($fieldName, ClassMetadata $class, AbstractPlatform $platform); - - /** - * Gets the (possibly quoted) primary table name for safe use in an SQL statement. - * - * @param ClassMetadata $class - * @param AbstractPlatform $platform - * @return string - */ - function getTableName(ClassMetadata $class, AbstractPlatform $platform); - - /** - * Gets the (possibly quoted) sequence name for safe use in an SQL statement. - * - * @param array $definition - * @param ClassMetadata $class - * @param AbstractPlatform $platform - * @return string - */ - function getSequenceName(array $definition, ClassMetadata $class, AbstractPlatform $platform); - - /** - * Gets the (possibly quoted) name of the join table. - * - * @param array $association - * @param ClassMetadata $class - * @param AbstractPlatform $platform - * @return string - */ - function getJoinTableName(array $association, ClassMetadata $class, AbstractPlatform $platform); - - /** - * Gets the (possibly quoted) join column name. - * - * @param array $joinColumn - * @param ClassMetadata $class - * @param AbstractPlatform $platform - * @return string - */ - function getJoinColumnName(array $joinColumn, ClassMetadata $class, AbstractPlatform $platform); - - /** - * Gets the (possibly quoted) join column name. - * - * @param array $joinColumn - * @param ClassMetadata $class - * @param AbstractPlatform $platform - * @return string - */ - function getReferencedJoinColumnName(array $joinColumn, ClassMetadata $class, AbstractPlatform $platform); - - /** - * Gets the (possibly quoted) identifier column names for safe use in an SQL statement. - * - * @param ClassMetadata $class - * @param AbstractPlatform $platform - * @return array - */ - function getIdentifierColumnNames(ClassMetadata $class, AbstractPlatform $platform); - - /** - * Gets the column alias. - * - * @param string $columnName - * @param integer $counter - * @param AbstractPlatform $platform - * @param ClassMetadata $class - * @return string - */ - function getColumnAlias($columnName, $counter, AbstractPlatform $platform, ClassMetadata $class = null); - -} \ No newline at end of file diff --git a/framework/library/Doctrine/ORM/Mapping/SequenceGenerator.php b/framework/library/Doctrine/ORM/Mapping/SequenceGenerator.php deleted file mode 100644 index 1acb498..0000000 --- a/framework/library/Doctrine/ORM/Mapping/SequenceGenerator.php +++ /dev/null @@ -1,34 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("PROPERTY") - */ -final class SequenceGenerator implements Annotation -{ - /** @var string */ - public $sequenceName; - /** @var integer */ - public $allocationSize = 1; - /** @var integer */ - public $initialValue = 1; -} diff --git a/framework/library/Doctrine/ORM/Mapping/SqlResultSetMapping.php b/framework/library/Doctrine/ORM/Mapping/SqlResultSetMapping.php deleted file mode 100644 index 881e873..0000000 --- a/framework/library/Doctrine/ORM/Mapping/SqlResultSetMapping.php +++ /dev/null @@ -1,56 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * The SqlResultSetMapping annotation is used to specify the mapping of the result of a native SQL query. - * The SqlResultSetMapping annotation can be applied to an entity or mapped superclass. - * - * @author Fabio B. Silva - * @since 2.3 - * - * @Annotation - * @Target("ANNOTATION") - */ -final class SqlResultSetMapping implements Annotation -{ - - /** - * The name given to the result set mapping, and used to refer to it in the methods of the Query API. - * - * @var string - */ - public $name; - - /** - * Specifies the result set mapping to entities. - * - * @var array<\Doctrine\ORM\Mapping\EntityResult> - */ - public $entities = array(); - - /** - * Specifies the result set mapping to scalar values. - * - * @var array<\Doctrine\ORM\Mapping\ColumnResult> - */ - public $columns = array(); - -} diff --git a/framework/library/Doctrine/ORM/Mapping/SqlResultSetMappings.php b/framework/library/Doctrine/ORM/Mapping/SqlResultSetMappings.php deleted file mode 100644 index c21b2ab..0000000 --- a/framework/library/Doctrine/ORM/Mapping/SqlResultSetMappings.php +++ /dev/null @@ -1,40 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * Is used to specify an array of mappings. - * The SqlResultSetMappings annotation can be applied to an entity or mapped superclass. - * - * @author Fabio B. Silva - * @since 2.3 - * - * @Annotation - * @Target("CLASS") - */ -final class SqlResultSetMappings implements Annotation -{ - /** - * One or more SqlResultSetMapping annotations. - * - * @var array<\Doctrine\ORM\Mapping\SqlResultSetMapping> - */ - public $value = array(); -} diff --git a/framework/library/Doctrine/ORM/Mapping/Table.php b/framework/library/Doctrine/ORM/Mapping/Table.php deleted file mode 100644 index 8f94f0c..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Table.php +++ /dev/null @@ -1,38 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("CLASS") - */ -final class Table implements Annotation -{ - /** @var string */ - public $name; - /** @var string */ - public $schema; - /** @var array<\Doctrine\ORM\Mapping\Index> */ - public $indexes; - /** @var array<\Doctrine\ORM\Mapping\UniqueConstraint> */ - public $uniqueConstraints; - /** @var array */ - public $options = array(); -} diff --git a/framework/library/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php b/framework/library/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php deleted file mode 100644 index 236ab5c..0000000 --- a/framework/library/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php +++ /dev/null @@ -1,135 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * Naming strategy implementing the underscore naming convention. - * Converts 'MyEntity' to 'my_entity' or 'MY_ENTITY'. - * - * - * @link www.doctrine-project.org - * @since 2.3 - * @author Fabio B. Silva - */ -class UnderscoreNamingStrategy implements NamingStrategy -{ - /** - * @var integer - */ - private $case; - - /** - * Underscore naming strategy construct - * - * @param integer $case CASE_LOWER | CASE_UPPER - */ - public function __construct($case = CASE_LOWER) - { - $this->case = $case; - } - - /** - * @return integer - */ - public function getCase() - { - return $this->case; - } - - /** - * Sets string case CASE_LOWER | CASE_UPPER - * Alphabetic characters converted to lowercase or uppercase - * - * @param integer $case - */ - public function setCase($case) - { - $this->case = $case; - } - - /** - * {@inheritdoc} - */ - public function classToTableName($className) - { - if (strpos($className, '\\') !== false) { - $className = substr($className, strrpos($className, '\\') + 1); - } - - return $this->underscore($className); - } - - /** - * {@inheritdoc} - */ - public function propertyToColumnName($propertyName) - { - return $this->underscore($propertyName); - } - - /** - * {@inheritdoc} - */ - public function referenceColumnName() - { - return $this->case === CASE_UPPER ? 'ID' : 'id'; - } - - /** - * {@inheritdoc} - */ - public function joinColumnName($propertyName) - { - return $this->underscore($propertyName) . '_' . $this->referenceColumnName(); - } - - /** - * {@inheritdoc} - */ - public function joinTableName($sourceEntity, $targetEntity, $propertyName = null) - { - return $this->classToTableName($sourceEntity) . '_' . $this->classToTableName($targetEntity); - } - - /** - * {@inheritdoc} - */ - public function joinKeyColumnName($entityName, $referencedColumnName = null) - { - return $this->classToTableName($entityName) . '_' . - ($referencedColumnName ?: $this->referenceColumnName()); - } - - /** - * @param string $string - * @return string - */ - private function underscore($string) - { - $string = preg_replace('/(?<=[a-z])([A-Z])/', '_$1', $string); - - if ($this->case === CASE_UPPER) { - return strtoupper($string); - } - - return strtolower($string); - } -} diff --git a/framework/library/Doctrine/ORM/Mapping/UniqueConstraint.php b/framework/library/Doctrine/ORM/Mapping/UniqueConstraint.php deleted file mode 100644 index 7df2a2c..0000000 --- a/framework/library/Doctrine/ORM/Mapping/UniqueConstraint.php +++ /dev/null @@ -1,32 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("ANNOTATION") - */ -final class UniqueConstraint implements Annotation -{ - /** @var string */ - public $name; - /** @var array */ - public $columns; -} diff --git a/framework/library/Doctrine/ORM/Mapping/Version.php b/framework/library/Doctrine/ORM/Mapping/Version.php deleted file mode 100644 index a237702..0000000 --- a/framework/library/Doctrine/ORM/Mapping/Version.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Mapping; - -/** - * @Annotation - * @Target("PROPERTY") - */ -final class Version implements Annotation -{ -} diff --git a/framework/library/Doctrine/ORM/NativeQuery.php b/framework/library/Doctrine/ORM/NativeQuery.php deleted file mode 100644 index 1b9b022..0000000 --- a/framework/library/Doctrine/ORM/NativeQuery.php +++ /dev/null @@ -1,87 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -/** - * Represents a native SQL query. - * - * @author Roman Borschel - * @since 2.0 - */ -final class NativeQuery extends AbstractQuery -{ - private $_sql; - - /** - * Sets the SQL of the query. - * - * @param string $sql - * @return NativeQuery This query instance. - */ - public function setSQL($sql) - { - $this->_sql = $sql; - - return $this; - } - - /** - * Gets the SQL query. - * - * @return mixed The built SQL query or an array of all SQL queries. - * @override - */ - public function getSQL() - { - return $this->_sql; - } - - /** - * {@inheritdoc} - */ - protected function _doExecute() - { - $parameters = array(); - $types = array(); - - foreach ($this->getParameters() as $parameter) { - $name = $parameter->getName(); - $value = $this->processParameterValue($parameter->getValue()); - $type = ($parameter->getValue() === $value) - ? $parameter->getType() - : Query\ParameterTypeInferer::inferType($value); - - $parameters[$name] = $value; - $types[$name] = $type; - } - - if ($parameters && is_int(key($parameters))) { - ksort($parameters); - ksort($types); - - $parameters = array_values($parameters); - $types = array_values($types); - } - - return $this->_em->getConnection()->executeQuery( - $this->_sql, $parameters, $types, $this->_queryCacheProfile - ); - } -} diff --git a/framework/library/Doctrine/ORM/NoResultException.php b/framework/library/Doctrine/ORM/NoResultException.php deleted file mode 100644 index 682cb3a..0000000 --- a/framework/library/Doctrine/ORM/NoResultException.php +++ /dev/null @@ -1,34 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -/** - * Exception thrown when an ORM query unexpectedly does not return any results. - * - * @author robo - * @since 2.0 - */ -class NoResultException extends UnexpectedResultException -{ - public function __construct() - { - parent::__construct('No result was found for query although at least one row was expected.'); - } -} diff --git a/framework/library/Doctrine/ORM/NonUniqueResultException.php b/framework/library/Doctrine/ORM/NonUniqueResultException.php deleted file mode 100644 index 4523af2..0000000 --- a/framework/library/Doctrine/ORM/NonUniqueResultException.php +++ /dev/null @@ -1,31 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -/** - * Exception thrown when an ORM query unexpectedly returns more than one result. - * - * @author robo - * @since 2.0 - */ -class NonUniqueResultException extends UnexpectedResultException -{ - -} diff --git a/framework/library/Doctrine/ORM/ORMException.php b/framework/library/Doctrine/ORM/ORMException.php deleted file mode 100644 index 2776753..0000000 --- a/framework/library/Doctrine/ORM/ORMException.php +++ /dev/null @@ -1,167 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -use Exception; - -/** - * Base exception class for all ORM exceptions. - * - * @author Roman Borschel - * @since 2.0 - */ -class ORMException extends Exception -{ - public static function missingMappingDriverImpl() - { - return new self("It's a requirement to specify a Metadata Driver and pass it ". - "to Doctrine\\ORM\\Configuration::setMetadataDriverImpl()."); - } - - public static function namedQueryNotFound($queryName) - { - return new self('Could not find a named query by the name "' . $queryName . '"'); - } - - public static function namedNativeQueryNotFound($nativeQueryName) - { - return new self('Could not find a named native query by the name "' . $nativeQueryName . '"'); - } - - public static function entityMissingForeignAssignedId($entity, $relatedEntity) - { - return new self( - "Entity of type " . get_class($entity) . " has identity through a foreign entity " . get_class($relatedEntity) . ", " . - "however this entity has no identity itself. You have to call EntityManager#persist() on the related entity " . - "and make sure that an identifier was generated before trying to persist '" . get_class($entity) . "'. In case " . - "of Post Insert ID Generation (such as MySQL Auto-Increment or PostgreSQL SERIAL) this means you have to call " . - "EntityManager#flush() between both persist operations." - ); - } - - public static function entityMissingAssignedIdForField($entity, $field) - { - return new self("Entity of type " . get_class($entity) . " is missing an assigned ID for field '" . $field . "'. " . - "The identifier generation strategy for this entity requires the ID field to be populated before ". - "EntityManager#persist() is called. If you want automatically generated identifiers instead " . - "you need to adjust the metadata mapping accordingly." - ); - } - - public static function unrecognizedField($field) - { - return new self("Unrecognized field: $field"); - } - - /** - * @param string $className - * @param string $field - */ - public static function invalidOrientation($className, $field) - { - return new self("Invalid order by orientation specified for " . $className . "#" . $field); - } - - public static function invalidFlushMode($mode) - { - return new self("'$mode' is an invalid flush mode."); - } - - public static function entityManagerClosed() - { - return new self("The EntityManager is closed."); - } - - public static function invalidHydrationMode($mode) - { - return new self("'$mode' is an invalid hydration mode."); - } - - public static function mismatchedEventManager() - { - return new self("Cannot use different EventManager instances for EntityManager and Connection."); - } - - public static function findByRequiresParameter($methodName) - { - return new self("You need to pass a parameter to '".$methodName."'"); - } - - public static function invalidFindByCall($entityName, $fieldName, $method) - { - return new self( - "Entity '".$entityName."' has no field '".$fieldName."'. ". - "You can therefore not call '".$method."' on the entities' repository" - ); - } - - public static function invalidFindByInverseAssociation($entityName, $associationFieldName) - { - return new self( - "You cannot search for the association field '".$entityName."#".$associationFieldName."', ". - "because it is the inverse side of an association. Find methods only work on owning side associations." - ); - } - - public static function invalidResultCacheDriver() { - return new self("Invalid result cache driver; it must implement Doctrine\\Common\\Cache\\Cache."); - } - - public static function notSupported() { - return new self("This behaviour is (currently) not supported by Doctrine 2"); - } - - public static function queryCacheNotConfigured() - { - return new self('Query Cache is not configured.'); - } - - public static function metadataCacheNotConfigured() - { - return new self('Class Metadata Cache is not configured.'); - } - - public static function proxyClassesAlwaysRegenerating() - { - return new self('Proxy Classes are always regenerating.'); - } - - public static function unknownEntityNamespace($entityNamespaceAlias) - { - return new self( - "Unknown Entity namespace alias '$entityNamespaceAlias'." - ); - } - - public static function invalidEntityRepository($className) - { - return new self("Invalid repository class '".$className."'. It must be a Doctrine\Common\Persistence\ObjectRepository."); - } - - public static function missingIdentifierField($className, $fieldName) - { - return new self("The identifier $fieldName is missing for a query of " . $className); - } - - public static function overwriteInternalDQLFunctionNotAllowed($functionName) - { - return new self("It is not allowed to overwrite internal function '$functionName' in the DQL parser through user-defined functions."); - } -} diff --git a/framework/library/Doctrine/ORM/ORMInvalidArgumentException.php b/framework/library/Doctrine/ORM/ORMInvalidArgumentException.php deleted file mode 100644 index d889173..0000000 --- a/framework/library/Doctrine/ORM/ORMInvalidArgumentException.php +++ /dev/null @@ -1,115 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -/** - * Contains exception messages for all invalid lifecycle state exceptions inside UnitOfWork - * - * @author Benjamin Eberlei - */ -class ORMInvalidArgumentException extends \InvalidArgumentException -{ - static public function scheduleInsertForManagedEntity($entity) - { - return new self("A managed+dirty entity " . self::objToStr($entity) . " can not be scheduled for insertion."); - } - - static public function scheduleInsertForRemovedEntity($entity) - { - return new self("Removed entity " . self::objToStr($entity) . " can not be scheduled for insertion."); - } - - static public function scheduleInsertTwice($entity) - { - return new self("Entity " . self::objToStr($entity) . " can not be scheduled for insertion twice."); - } - - static public function entityWithoutIdentity($className, $entity) - { - return new self( - "The given entity of type '" . $className . "' (".self::objToStr($entity).") has no identity/no " . - "id values set. It cannot be added to the identity map." - ); - } - - static public function readOnlyRequiresManagedEntity($entity) - { - return new self("Only managed entities can be marked or checked as read only. But " . self::objToStr($entity) . " is not"); - } - - static public function newEntityFoundThroughRelationship(array $assoc, $entry) - { - return new self("A new entity was found through the relationship '" - . $assoc['sourceEntity'] . "#" . $assoc['fieldName'] . "' that was not" - . " configured to cascade persist operations for entity: " . self::objToStr($entry) . "." - . " To solve this issue: Either explicitly call EntityManager#persist()" - . " on this unknown entity or configure cascade persist " - . " this association in the mapping for example @ManyToOne(..,cascade={\"persist\"})." - . (method_exists($entry, '__toString') ? - "": - " If you cannot find out which entity causes the problem" - ." implement '" . $assoc['targetEntity'] . "#__toString()' to get a clue.")); - } - - static public function detachedEntityFoundThroughRelationship(array $assoc, $entry) - { - return new self("A detached entity of type " . $assoc['targetEntity'] . " (" . self::objToStr($entry) . ") " - . " was found through the relationship '" . $assoc['sourceEntity'] . "#" . $assoc['fieldName'] . "' " - . "during cascading a persist operation."); - } - - static public function entityNotManaged($entity) - { - return new self("Entity " . self::objToStr($entity) . " is not managed. An entity is managed if its fetched " . - "from the database or registered as new through EntityManager#persist"); - } - - static public function entityHasNoIdentity($entity, $operation) - { - return new self("Entity has no identity, therefore " . $operation ." cannot be performed. " . self::objToStr($entity)); - } - - static public function entityIsRemoved($entity, $operation) - { - return new self("Entity is removed, therefore " . $operation ." cannot be performed. " . self::objToStr($entity)); - } - - static public function detachedEntityCannot($entity, $operation) - { - return new self("A detached entity was found during " . $operation . " " . self::objToStr($entity)); - } - - public static function invalidObject($context, $given, $parameterIndex = 1) - { - return new self($context .' expects parameter ' . $parameterIndex . - ' to be an entity object, '. gettype($given) . ' given.'); - } - - /** - * Helper method to show an object as string. - * - * @param object $obj - * @return string - */ - private static function objToStr($obj) - { - return method_exists($obj, '__toString') ? (string)$obj : get_class($obj).'@'.spl_object_hash($obj); - } -} diff --git a/framework/library/Doctrine/ORM/OptimisticLockException.php b/framework/library/Doctrine/ORM/OptimisticLockException.php deleted file mode 100644 index b425ac3..0000000 --- a/framework/library/Doctrine/ORM/OptimisticLockException.php +++ /dev/null @@ -1,64 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -/** - * An OptimisticLockException is thrown when a version check on an object - * that uses optimistic locking through a version field fails. - * - * @author Roman Borschel - * @author Benjamin Eberlei - * @since 2.0 - */ -class OptimisticLockException extends ORMException -{ - private $entity; - - public function __construct($msg, $entity) - { - parent::__construct($msg); - $this->entity = $entity; - } - - /** - * Gets the entity that caused the exception. - * - * @return object - */ - public function getEntity() - { - return $this->entity; - } - - public static function lockFailed($entity) - { - return new self("The optimistic lock on an entity failed.", $entity); - } - - public static function lockFailedVersionMissmatch($entity, $expectedLockVersion, $actualLockVersion) - { - return new self("The optimistic lock failed, version " . $expectedLockVersion . " was expected, but is actually ".$actualLockVersion, $entity); - } - - public static function notVersioned($entityName) - { - return new self("Cannot obtain optimistic lock on unversioned entity " . $entityName, null); - } -} diff --git a/framework/library/Doctrine/ORM/PersistentCollection.php b/framework/library/Doctrine/ORM/PersistentCollection.php deleted file mode 100644 index ed5d7df..0000000 --- a/framework/library/Doctrine/ORM/PersistentCollection.php +++ /dev/null @@ -1,836 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -use Doctrine\ORM\Mapping\ClassMetadata; - -use Doctrine\Common\Collections\Collection; -use Doctrine\Common\Collections\ArrayCollection; -use Doctrine\Common\Collections\Selectable; -use Doctrine\Common\Collections\Criteria; -use Doctrine\Common\Collections\ExpressionBuilder; - -use Closure; - -/** - * A PersistentCollection represents a collection of elements that have persistent state. - * - * Collections of entities represent only the associations (links) to those entities. - * That means, if the collection is part of a many-many mapping and you remove - * entities from the collection, only the links in the relation table are removed (on flush). - * Similarly, if you remove entities from a collection that is part of a one-many - * mapping this will only result in the nulling out of the foreign keys on flush. - * - * @since 2.0 - * @author Konsta Vesterinen - * @author Roman Borschel - * @author Giorgio Sironi - * @author Stefano Rodriguez - * @todo Design for inheritance to allow custom implementations? - */ -final class PersistentCollection implements Collection, Selectable -{ - /** - * A snapshot of the collection at the moment it was fetched from the database. - * This is used to create a diff of the collection at commit time. - * - * @var array - */ - private $snapshot = array(); - - /** - * The entity that owns this collection. - * - * @var object - */ - private $owner; - - /** - * The association mapping the collection belongs to. - * This is currently either a OneToManyMapping or a ManyToManyMapping. - * - * @var array - */ - private $association; - - /** - * The EntityManager that manages the persistence of the collection. - * - * @var \Doctrine\ORM\EntityManager - */ - private $em; - - /** - * The name of the field on the target entities that points to the owner - * of the collection. This is only set if the association is bi-directional. - * - * @var string - */ - private $backRefFieldName; - - /** - * The class descriptor of the collection's entity type. - */ - private $typeClass; - - /** - * Whether the collection is dirty and needs to be synchronized with the database - * when the UnitOfWork that manages its persistent state commits. - * - * @var boolean - */ - private $isDirty = false; - - /** - * Whether the collection has already been initialized. - * - * @var boolean - */ - private $initialized = true; - - /** - * The wrapped Collection instance. - * - * @var Collection - */ - private $coll; - - /** - * Creates a new persistent collection. - * - * @param EntityManager $em The EntityManager the collection will be associated with. - * @param ClassMetadata $class The class descriptor of the entity type of this collection. - * @param array The collection elements. - */ - public function __construct(EntityManager $em, $class, $coll) - { - $this->coll = $coll; - $this->em = $em; - $this->typeClass = $class; - } - - /** - * INTERNAL: - * Sets the collection's owning entity together with the AssociationMapping that - * describes the association between the owner and the elements of the collection. - * - * @param object $entity - * @param AssociationMapping $assoc - */ - public function setOwner($entity, array $assoc) - { - $this->owner = $entity; - $this->association = $assoc; - $this->backRefFieldName = $assoc['inversedBy'] ?: $assoc['mappedBy']; - } - - /** - * INTERNAL: - * Gets the collection owner. - * - * @return object - */ - public function getOwner() - { - return $this->owner; - } - - public function getTypeClass() - { - return $this->typeClass; - } - - /** - * INTERNAL: - * Adds an element to a collection during hydration. This will automatically - * complete bidirectional associations in the case of a one-to-many association. - * - * @param mixed $element The element to add. - */ - public function hydrateAdd($element) - { - $this->coll->add($element); - - // If _backRefFieldName is set and its a one-to-many association, - // we need to set the back reference. - if ($this->backRefFieldName && $this->association['type'] === ClassMetadata::ONE_TO_MANY) { - // Set back reference to owner - $this->typeClass->reflFields[$this->backRefFieldName]->setValue( - $element, $this->owner - ); - - $this->em->getUnitOfWork()->setOriginalEntityProperty( - spl_object_hash($element), $this->backRefFieldName, $this->owner - ); - } - } - - /** - * INTERNAL: - * Sets a keyed element in the collection during hydration. - * - * @param mixed $key The key to set. - * $param mixed $value The element to set. - */ - public function hydrateSet($key, $element) - { - $this->coll->set($key, $element); - - // If _backRefFieldName is set, then the association is bidirectional - // and we need to set the back reference. - if ($this->backRefFieldName && $this->association['type'] === ClassMetadata::ONE_TO_MANY) { - // Set back reference to owner - $this->typeClass->reflFields[$this->backRefFieldName]->setValue( - $element, $this->owner - ); - } - } - - /** - * Initializes the collection by loading its contents from the database - * if the collection is not yet initialized. - */ - public function initialize() - { - if ($this->initialized || ! $this->association) { - return; - } - - // Has NEW objects added through add(). Remember them. - $newObjects = array(); - - if ($this->isDirty) { - $newObjects = $this->coll->toArray(); - } - - $this->coll->clear(); - $this->em->getUnitOfWork()->loadCollection($this); - $this->takeSnapshot(); - - // Reattach NEW objects added through add(), if any. - if ($newObjects) { - foreach ($newObjects as $obj) { - $this->coll->add($obj); - } - - $this->isDirty = true; - } - - $this->initialized = true; - } - - /** - * INTERNAL: - * Tells this collection to take a snapshot of its current state. - */ - public function takeSnapshot() - { - $this->snapshot = $this->coll->toArray(); - $this->isDirty = false; - } - - /** - * INTERNAL: - * Returns the last snapshot of the elements in the collection. - * - * @return array The last snapshot of the elements. - */ - public function getSnapshot() - { - return $this->snapshot; - } - - /** - * INTERNAL: - * getDeleteDiff - * - * @return array - */ - public function getDeleteDiff() - { - return array_udiff_assoc( - $this->snapshot, - $this->coll->toArray(), - function($a, $b) { return $a === $b ? 0 : 1; } - ); - } - - /** - * INTERNAL: - * getInsertDiff - * - * @return array - */ - public function getInsertDiff() - { - return array_udiff_assoc( - $this->coll->toArray(), - $this->snapshot, - function($a, $b) { return $a === $b ? 0 : 1; } - ); - } - - /** - * INTERNAL: Gets the association mapping of the collection. - * - * @return array - */ - public function getMapping() - { - return $this->association; - } - - /** - * Marks this collection as changed/dirty. - */ - private function changed() - { - if ($this->isDirty) { - return; - } - - $this->isDirty = true; - - if ($this->association !== null && - $this->association['isOwningSide'] && - $this->association['type'] === ClassMetadata::MANY_TO_MANY && - $this->owner && - $this->em->getClassMetadata(get_class($this->owner))->isChangeTrackingNotify()) { - $this->em->getUnitOfWork()->scheduleForDirtyCheck($this->owner); - } - } - - /** - * Gets a boolean flag indicating whether this collection is dirty which means - * its state needs to be synchronized with the database. - * - * @return boolean TRUE if the collection is dirty, FALSE otherwise. - */ - public function isDirty() - { - return $this->isDirty; - } - - /** - * Sets a boolean flag, indicating whether this collection is dirty. - * - * @param boolean $dirty Whether the collection should be marked dirty or not. - */ - public function setDirty($dirty) - { - $this->isDirty = $dirty; - } - - /** - * Sets the initialized flag of the collection, forcing it into that state. - * - * @param boolean $bool - */ - public function setInitialized($bool) - { - $this->initialized = $bool; - } - - /** - * Checks whether this collection has been initialized. - * - * @return boolean - */ - public function isInitialized() - { - return $this->initialized; - } - - /** {@inheritdoc} */ - public function first() - { - $this->initialize(); - - return $this->coll->first(); - } - - /** {@inheritdoc} */ - public function last() - { - $this->initialize(); - - return $this->coll->last(); - } - - /** - * {@inheritdoc} - */ - public function remove($key) - { - // TODO: If the keys are persistent as well (not yet implemented) - // and the collection is not initialized and orphanRemoval is - // not used we can issue a straight SQL delete/update on the - // association (table). Without initializing the collection. - $this->initialize(); - - $removed = $this->coll->remove($key); - - if ( ! $removed) { - return $removed; - } - - $this->changed(); - - if ($this->association !== null && - $this->association['type'] & ClassMetadata::TO_MANY && - $this->owner && - $this->association['orphanRemoval']) { - $this->em->getUnitOfWork()->scheduleOrphanRemoval($removed); - } - - return $removed; - } - - /** - * {@inheritdoc} - */ - public function removeElement($element) - { - if ( ! $this->initialized && $this->association['fetch'] === Mapping\ClassMetadataInfo::FETCH_EXTRA_LAZY) { - if ($this->coll->contains($element)) { - return $this->coll->removeElement($element); - } - - $persister = $this->em->getUnitOfWork()->getCollectionPersister($this->association); - - if ($persister->removeElement($this, $element)) { - return $element; - } - - return null; - } - - $this->initialize(); - - $removed = $this->coll->removeElement($element); - - if ( ! $removed) { - return $removed; - } - - $this->changed(); - - if ($this->association !== null && - $this->association['type'] & ClassMetadata::TO_MANY && - $this->owner && - $this->association['orphanRemoval']) { - $this->em->getUnitOfWork()->scheduleOrphanRemoval($element); - } - - return $removed; - } - - /** - * {@inheritdoc} - */ - public function containsKey($key) - { - $this->initialize(); - - return $this->coll->containsKey($key); - } - - /** - * {@inheritdoc} - */ - public function contains($element) - { - if ( ! $this->initialized && $this->association['fetch'] === Mapping\ClassMetadataInfo::FETCH_EXTRA_LAZY) { - $persister = $this->em->getUnitOfWork()->getCollectionPersister($this->association); - - return $this->coll->contains($element) || $persister->contains($this, $element); - } - - $this->initialize(); - - return $this->coll->contains($element); - } - - /** - * {@inheritdoc} - */ - public function exists(Closure $p) - { - $this->initialize(); - - return $this->coll->exists($p); - } - - /** - * {@inheritdoc} - */ - public function indexOf($element) - { - $this->initialize(); - - return $this->coll->indexOf($element); - } - - /** - * {@inheritdoc} - */ - public function get($key) - { - $this->initialize(); - - return $this->coll->get($key); - } - - /** - * {@inheritdoc} - */ - public function getKeys() - { - $this->initialize(); - - return $this->coll->getKeys(); - } - - /** - * {@inheritdoc} - */ - public function getValues() - { - $this->initialize(); - - return $this->coll->getValues(); - } - - /** - * {@inheritdoc} - */ - public function count() - { - if ( ! $this->initialized && $this->association['fetch'] === Mapping\ClassMetadataInfo::FETCH_EXTRA_LAZY) { - $persister = $this->em->getUnitOfWork()->getCollectionPersister($this->association); - - return $persister->count($this) + ($this->isDirty ? $this->coll->count() : 0); - } - - $this->initialize(); - - return $this->coll->count(); - } - - /** - * {@inheritdoc} - */ - public function set($key, $value) - { - $this->initialize(); - - $this->coll->set($key, $value); - - $this->changed(); - } - - /** - * {@inheritdoc} - */ - public function add($value) - { - $this->coll->add($value); - - $this->changed(); - - return true; - } - - /** - * {@inheritdoc} - */ - public function isEmpty() - { - $this->initialize(); - - return $this->coll->isEmpty(); - } - - /** - * {@inheritdoc} - */ - public function getIterator() - { - $this->initialize(); - - return $this->coll->getIterator(); - } - - /** - * {@inheritdoc} - */ - public function map(Closure $func) - { - $this->initialize(); - - return $this->coll->map($func); - } - - /** - * {@inheritdoc} - */ - public function filter(Closure $p) - { - $this->initialize(); - - return $this->coll->filter($p); - } - - /** - * {@inheritdoc} - */ - public function forAll(Closure $p) - { - $this->initialize(); - - return $this->coll->forAll($p); - } - - /** - * {@inheritdoc} - */ - public function partition(Closure $p) - { - $this->initialize(); - - return $this->coll->partition($p); - } - - /** - * {@inheritdoc} - */ - public function toArray() - { - $this->initialize(); - - return $this->coll->toArray(); - } - - /** - * {@inheritdoc} - */ - public function clear() - { - if ($this->initialized && $this->isEmpty()) { - return; - } - - $uow = $this->em->getUnitOfWork(); - - if ($this->association['type'] & ClassMetadata::TO_MANY && - $this->association['orphanRemoval'] && - $this->owner) { - // we need to initialize here, as orphan removal acts like implicit cascadeRemove, - // hence for event listeners we need the objects in memory. - $this->initialize(); - - foreach ($this->coll as $element) { - $uow->scheduleOrphanRemoval($element); - } - } - - $this->coll->clear(); - - $this->initialized = true; // direct call, {@link initialize()} is too expensive - - if ($this->association['isOwningSide'] && $this->owner) { - $this->changed(); - - $uow->scheduleCollectionDeletion($this); - - $this->takeSnapshot(); - } - } - - /** - * Called by PHP when this collection is serialized. Ensures that only the - * elements are properly serialized. - * - * @internal Tried to implement Serializable first but that did not work well - * with circular references. This solution seems simpler and works well. - */ - public function __sleep() - { - return array('coll', 'initialized'); - } - - /* ArrayAccess implementation */ - - /** - * @see containsKey() - */ - public function offsetExists($offset) - { - return $this->containsKey($offset); - } - - /** - * @see get() - */ - public function offsetGet($offset) - { - return $this->get($offset); - } - - /** - * @see add() - * @see set() - */ - public function offsetSet($offset, $value) - { - if ( ! isset($offset)) { - return $this->add($value); - } - - return $this->set($offset, $value); - } - - /** - * @see remove() - */ - public function offsetUnset($offset) - { - return $this->remove($offset); - } - - public function key() - { - return $this->coll->key(); - } - - /** - * Gets the element of the collection at the current iterator position. - */ - public function current() - { - return $this->coll->current(); - } - - /** - * Moves the internal iterator position to the next element. - */ - public function next() - { - return $this->coll->next(); - } - - /** - * Retrieves the wrapped Collection instance. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function unwrap() - { - return $this->coll; - } - - /** - * Extract a slice of $length elements starting at position $offset from the Collection. - * - * If $length is null it returns all elements from $offset to the end of the Collection. - * Keys have to be preserved by this method. Calling this method will only return the - * selected slice and NOT change the elements contained in the collection slice is called on. - * - * @param int $offset - * @param int $length - * - * @return array - */ - public function slice($offset, $length = null) - { - if ( ! $this->initialized && ! $this->isDirty && $this->association['fetch'] === Mapping\ClassMetadataInfo::FETCH_EXTRA_LAZY) { - $persister = $this->em->getUnitOfWork()->getCollectionPersister($this->association); - - return $persister->slice($this, $offset, $length); - } - - $this->initialize(); - - return $this->coll->slice($offset, $length); - } - - /** - * Cleanup internal state of cloned persistent collection. - * - * The following problems have to be prevented: - * 1. Added entities are added to old PC - * 2. New collection is not dirty, if reused on other entity nothing - * changes. - * 3. Snapshot leads to invalid diffs being generated. - * 4. Lazy loading grabs entities from old owner object. - * 5. New collection is connected to old owner and leads to duplicate keys. - */ - public function __clone() - { - if (is_object($this->coll)) { - $this->coll = clone $this->coll; - } - - $this->initialize(); - - $this->owner = null; - $this->snapshot = array(); - - $this->changed(); - } - - /** - * Select all elements from a selectable that match the expression and - * return a new collection containing these elements. - * - * @param \Doctrine\Common\Collections\Criteria $criteria - * @return Collection - */ - public function matching(Criteria $criteria) - { - if ($this->isDirty) { - $this->initialize(); - } - - if ($this->initialized) { - return $this->coll->matching($criteria); - } - - if ($this->association['type'] !== ClassMetadata::ONE_TO_MANY) { - throw new \RuntimeException("Matching Criteria on PersistentCollection only works on OneToMany assocations at the moment."); - } - - $id = $this->em - ->getClassMetadata(get_class($this->owner)) - ->getSingleIdReflectionProperty() - ->getValue($this->owner); - $builder = Criteria::expr(); - $ownerExpression = $builder->eq($this->backRefFieldName, $id); - $expression = $criteria->getWhereExpression(); - $expression = $expression ? $builder->andX($expression, $ownerExpression) : $ownerExpression; - - $criteria->where($expression); - - $persister = $this->em->getUnitOfWork()->getEntityPersister($this->association['targetEntity']); - - return new ArrayCollection($persister->loadCriteria($criteria)); - } -} - diff --git a/framework/library/Doctrine/ORM/Persisters/AbstractCollectionPersister.php b/framework/library/Doctrine/ORM/Persisters/AbstractCollectionPersister.php deleted file mode 100644 index 2728918..0000000 --- a/framework/library/Doctrine/ORM/Persisters/AbstractCollectionPersister.php +++ /dev/null @@ -1,223 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Persisters; - -use Doctrine\ORM\EntityManager, - Doctrine\ORM\PersistentCollection; - -/** - * Base class for all collection persisters. - * - * @since 2.0 - * @author Roman Borschel - */ -abstract class AbstractCollectionPersister -{ - /** - * @var EntityManager - */ - protected $_em; - - /** - * @var \Doctrine\DBAL\Connection - */ - protected $_conn; - - /** - * @var \Doctrine\ORM\UnitOfWork - */ - protected $_uow; - - /** - * The database platform. - * - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - protected $platform; - - /** - * The quote strategy. - * - * @var \Doctrine\ORM\Mapping\QuoteStrategy - */ - protected $quoteStrategy; - - /** - * Initializes a new instance of a class derived from AbstractCollectionPersister. - * - * @param \Doctrine\ORM\EntityManager $em - */ - public function __construct(EntityManager $em) - { - $this->_em = $em; - $this->_uow = $em->getUnitOfWork(); - $this->_conn = $em->getConnection(); - $this->platform = $this->_conn->getDatabasePlatform(); - $this->quoteStrategy = $em->getConfiguration()->getQuoteStrategy(); - } - - /** - * Deletes the persistent state represented by the given collection. - * - * @param PersistentCollection $coll - */ - public function delete(PersistentCollection $coll) - { - $mapping = $coll->getMapping(); - - if ( ! $mapping['isOwningSide']) { - return; // ignore inverse side - } - - $sql = $this->_getDeleteSQL($coll); - $this->_conn->executeUpdate($sql, $this->_getDeleteSQLParameters($coll)); - } - - /** - * Gets the SQL statement for deleting the given collection. - * - * @param PersistentCollection $coll - */ - abstract protected function _getDeleteSQL(PersistentCollection $coll); - - /** - * Gets the SQL parameters for the corresponding SQL statement to delete - * the given collection. - * - * @param PersistentCollection $coll - */ - abstract protected function _getDeleteSQLParameters(PersistentCollection $coll); - - /** - * Updates the given collection, synchronizing it's state with the database - * by inserting, updating and deleting individual elements. - * - * @param PersistentCollection $coll - */ - public function update(PersistentCollection $coll) - { - $mapping = $coll->getMapping(); - - if ( ! $mapping['isOwningSide']) { - return; // ignore inverse side - } - - $this->deleteRows($coll); - //$this->updateRows($coll); - $this->insertRows($coll); - } - - public function deleteRows(PersistentCollection $coll) - { - $deleteDiff = $coll->getDeleteDiff(); - $sql = $this->_getDeleteRowSQL($coll); - - foreach ($deleteDiff as $element) { - $this->_conn->executeUpdate($sql, $this->_getDeleteRowSQLParameters($coll, $element)); - } - } - - //public function updateRows(PersistentCollection $coll) - //{} - - public function insertRows(PersistentCollection $coll) - { - $insertDiff = $coll->getInsertDiff(); - $sql = $this->_getInsertRowSQL($coll); - - foreach ($insertDiff as $element) { - $this->_conn->executeUpdate($sql, $this->_getInsertRowSQLParameters($coll, $element)); - } - } - - public function count(PersistentCollection $coll) - { - throw new \BadMethodCallException("Counting the size of this persistent collection is not supported by this CollectionPersister."); - } - - public function slice(PersistentCollection $coll, $offset, $length = null) - { - throw new \BadMethodCallException("Slicing elements is not supported by this CollectionPersister."); - } - - public function contains(PersistentCollection $coll, $element) - { - throw new \BadMethodCallException("Checking for existance of an element is not supported by this CollectionPersister."); - } - - public function containsKey(PersistentCollection $coll, $key) - { - throw new \BadMethodCallException("Checking for existance of a key is not supported by this CollectionPersister."); - } - - public function removeElement(PersistentCollection $coll, $element) - { - throw new \BadMethodCallException("Removing an element is not supported by this CollectionPersister."); - } - - public function removeKey(PersistentCollection $coll, $key) - { - throw new \BadMethodCallException("Removing a key is not supported by this CollectionPersister."); - } - - public function get(PersistentCollection $coll, $index) - { - throw new \BadMethodCallException("Selecting a collection by index is not supported by this CollectionPersister."); - } - - /** - * Gets the SQL statement used for deleting a row from the collection. - * - * @param PersistentCollection $coll - */ - abstract protected function _getDeleteRowSQL(PersistentCollection $coll); - - /** - * Gets the SQL parameters for the corresponding SQL statement to delete the given - * element from the given collection. - * - * @param PersistentCollection $coll - * @param mixed $element - */ - abstract protected function _getDeleteRowSQLParameters(PersistentCollection $coll, $element); - - /** - * Gets the SQL statement used for updating a row in the collection. - * - * @param PersistentCollection $coll - */ - abstract protected function _getUpdateRowSQL(PersistentCollection $coll); - - /** - * Gets the SQL statement used for inserting a row in the collection. - * - * @param PersistentCollection $coll - */ - abstract protected function _getInsertRowSQL(PersistentCollection $coll); - - /** - * Gets the SQL parameters for the corresponding SQL statement to insert the given - * element of the given collection into the database. - * - * @param PersistentCollection $coll - * @param mixed $element - */ - abstract protected function _getInsertRowSQLParameters(PersistentCollection $coll, $element); -} diff --git a/framework/library/Doctrine/ORM/Persisters/AbstractEntityInheritancePersister.php b/framework/library/Doctrine/ORM/Persisters/AbstractEntityInheritancePersister.php deleted file mode 100644 index 19e77a4..0000000 --- a/framework/library/Doctrine/ORM/Persisters/AbstractEntityInheritancePersister.php +++ /dev/null @@ -1,83 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Persisters; - -use Doctrine\ORM\Mapping\ClassMetadata, - Doctrine\DBAL\Types\Type; - -/** - * Base class for entity persisters that implement a certain inheritance mapping strategy. - * All these persisters are assumed to use a discriminator column to discriminate entity - * types in the hierarchy. - * - * @author Roman Borschel - * @author Benjamin Eberlei - * @since 2.0 - */ -abstract class AbstractEntityInheritancePersister extends BasicEntityPersister -{ - /** - * {@inheritdoc} - */ - protected function _prepareInsertData($entity) - { - $data = parent::_prepareInsertData($entity); - - // Populate the discriminator column - $discColumn = $this->_class->discriminatorColumn; - $this->_columnTypes[$discColumn['name']] = $discColumn['type']; - $data[$this->_getDiscriminatorColumnTableName()][$discColumn['name']] = $this->_class->discriminatorValue; - - return $data; - } - - /** - * Gets the name of the table that contains the discriminator column. - * - * @return string The table name. - */ - abstract protected function _getDiscriminatorColumnTableName(); - - /** - * {@inheritdoc} - */ - protected function _getSelectColumnSQL($field, ClassMetadata $class, $alias = 'r') - { - $columnName = $class->columnNames[$field]; - $sql = $this->_getSQLTableAlias($class->name, $alias == 'r' ? '' : $alias) . '.' . $this->quoteStrategy->getColumnName($field, $class, $this->_platform); - $columnAlias = $this->getSQLColumnAlias($columnName); - $this->_rsm->addFieldResult($alias, $columnAlias, $field, $class->name); - - if (isset($class->fieldMappings[$field]['requireSQLConversion'])) { - $type = Type::getType($class->getTypeOfField($field)); - $sql = $type->convertToPHPValueSQL($sql, $this->_platform); - } - - return $sql . ' AS ' . $columnAlias; - } - - protected function getSelectJoinColumnSQL($tableAlias, $joinColumnName, $className) - { - $columnAlias = $this->getSQLColumnAlias($joinColumnName); - $this->_rsm->addMetaResult('r', $columnAlias, $joinColumnName); - - return $tableAlias . '.' . $joinColumnName . ' AS ' . $columnAlias; - } -} diff --git a/framework/library/Doctrine/ORM/Persisters/BasicEntityPersister.php b/framework/library/Doctrine/ORM/Persisters/BasicEntityPersister.php deleted file mode 100644 index 839602c..0000000 --- a/framework/library/Doctrine/ORM/Persisters/BasicEntityPersister.php +++ /dev/null @@ -1,1796 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Persisters; - -use PDO; - -use Doctrine\DBAL\LockMode; -use Doctrine\DBAL\Types\Type; -use Doctrine\DBAL\Connection; - -use Doctrine\ORM\ORMException; -use Doctrine\ORM\OptimisticLockException; -use Doctrine\ORM\EntityManager; -use Doctrine\ORM\UnitOfWork; -use Doctrine\ORM\Query; -use Doctrine\ORM\PersistentCollection; -use Doctrine\ORM\Mapping\MappingException; -use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\ORM\Events; -use Doctrine\ORM\Event\LifecycleEventArgs; - -use Doctrine\Common\Util\ClassUtils; -use Doctrine\Common\Collections\Criteria; -use Doctrine\Common\Collections\Expr\Comparison; - -/** - * A BasicEntityPersiter maps an entity to a single table in a relational database. - * - * A persister is always responsible for a single entity type. - * - * EntityPersisters are used during a UnitOfWork to apply any changes to the persistent - * state of entities onto a relational database when the UnitOfWork is committed, - * as well as for basic querying of entities and their associations (not DQL). - * - * The persisting operations that are invoked during a commit of a UnitOfWork to - * persist the persistent entity state are: - * - * - {@link addInsert} : To schedule an entity for insertion. - * - {@link executeInserts} : To execute all scheduled insertions. - * - {@link update} : To update the persistent state of an entity. - * - {@link delete} : To delete the persistent state of an entity. - * - * As can be seen from the above list, insertions are batched and executed all at once - * for increased efficiency. - * - * The querying operations invoked during a UnitOfWork, either through direct find - * requests or lazy-loading, are the following: - * - * - {@link load} : Loads (the state of) a single, managed entity. - * - {@link loadAll} : Loads multiple, managed entities. - * - {@link loadOneToOneEntity} : Loads a one/many-to-one entity association (lazy-loading). - * - {@link loadOneToManyCollection} : Loads a one-to-many entity association (lazy-loading). - * - {@link loadManyToManyCollection} : Loads a many-to-many entity association (lazy-loading). - * - * The BasicEntityPersister implementation provides the default behavior for - * persisting and querying entities that are mapped to a single database table. - * - * Subclasses can be created to provide custom persisting and querying strategies, - * i.e. spanning multiple tables. - * - * @author Roman Borschel - * @author Giorgio Sironi - * @author Benjamin Eberlei - * @author Alexander - * @since 2.0 - */ -class BasicEntityPersister -{ - /** - * @var array - */ - static private $comparisonMap = array( - Comparison::EQ => '= %s', - Comparison::IS => 'IS %s', - Comparison::NEQ => '!= %s', - Comparison::GT => '> %s', - Comparison::GTE => '>= %s', - Comparison::LT => '< %s', - Comparison::LTE => '<= %s', - Comparison::IN => 'IN (%s)', - Comparison::NIN => 'NOT IN (%s)', - ); - - /** - * Metadata object that describes the mapping of the mapped entity class. - * - * @var \Doctrine\ORM\Mapping\ClassMetadata - */ - protected $_class; - - /** - * The underlying DBAL Connection of the used EntityManager. - * - * @var \Doctrine\DBAL\Connection $conn - */ - protected $_conn; - - /** - * The database platform. - * - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - protected $_platform; - - /** - * The EntityManager instance. - * - * @var \Doctrine\ORM\EntityManager - */ - protected $_em; - - /** - * Queued inserts. - * - * @var array - */ - protected $_queuedInserts = array(); - - /** - * ResultSetMapping that is used for all queries. Is generated lazily once per request. - * - * TODO: Evaluate Caching in combination with the other cached SQL snippets. - * - * @var Query\ResultSetMapping - */ - protected $_rsm; - - /** - * The map of column names to DBAL mapping types of all prepared columns used - * when INSERTing or UPDATEing an entity. - * - * @var array - * @see _prepareInsertData($entity) - * @see _prepareUpdateData($entity) - */ - protected $_columnTypes = array(); - - /** - * The map of quoted column names. - * - * @var array - * @see _prepareInsertData($entity) - * @see _prepareUpdateData($entity) - */ - protected $quotedColumns = array(); - - /** - * The INSERT SQL statement used for entities handled by this persister. - * This SQL is only generated once per request, if at all. - * - * @var string - */ - private $_insertSql; - - /** - * The SELECT column list SQL fragment used for querying entities by this persister. - * This SQL fragment is only generated once per request, if at all. - * - * @var string - */ - protected $_selectColumnListSql; - - /** - * The JOIN SQL fragement used to eagerly load all many-to-one and one-to-one - * associations configured as FETCH_EAGER, aswell as all inverse one-to-one associations. - * - * @var string - */ - protected $_selectJoinSql; - - /** - * Counter for creating unique SQL table and column aliases. - * - * @var integer - */ - protected $_sqlAliasCounter = 0; - - /** - * Map from class names (FQCN) to the corresponding generated SQL table aliases. - * - * @var array - */ - protected $_sqlTableAliases = array(); - - /** - * The quote strategy. - * - * @var \Doctrine\ORM\Mapping\QuoteStrategy - */ - protected $quoteStrategy; - - /** - * Initializes a new BasicEntityPersister that uses the given EntityManager - * and persists instances of the class described by the given ClassMetadata descriptor. - * - * @param \Doctrine\ORM\EntityManager $em - * @param \Doctrine\ORM\Mapping\ClassMetadata $class - */ - public function __construct(EntityManager $em, ClassMetadata $class) - { - $this->_em = $em; - $this->_class = $class; - $this->_conn = $em->getConnection(); - $this->_platform = $this->_conn->getDatabasePlatform(); - $this->quoteStrategy = $em->getConfiguration()->getQuoteStrategy(); - } - - /** - * @return \Doctrine\ORM\Mapping\ClassMetadata - */ - public function getClassMetadata() - { - return $this->_class; - } - - /** - * Adds an entity to the queued insertions. - * The entity remains queued until {@link executeInserts} is invoked. - * - * @param object $entity The entity to queue for insertion. - */ - public function addInsert($entity) - { - $this->_queuedInserts[spl_object_hash($entity)] = $entity; - } - - /** - * Executes all queued entity insertions and returns any generated post-insert - * identifiers that were created as a result of the insertions. - * - * If no inserts are queued, invoking this method is a NOOP. - * - * @return array An array of any generated post-insert IDs. This will be an empty array - * if the entity class does not use the IDENTITY generation strategy. - */ - public function executeInserts() - { - if ( ! $this->_queuedInserts) { - return; - } - - $postInsertIds = array(); - $idGen = $this->_class->idGenerator; - $isPostInsertId = $idGen->isPostInsertGenerator(); - - $stmt = $this->_conn->prepare($this->_getInsertSQL()); - $tableName = $this->_class->getTableName(); - - foreach ($this->_queuedInserts as $entity) { - $insertData = $this->_prepareInsertData($entity); - - if (isset($insertData[$tableName])) { - $paramIndex = 1; - - foreach ($insertData[$tableName] as $column => $value) { - $stmt->bindValue($paramIndex++, $value, $this->_columnTypes[$column]); - } - } - - $stmt->execute(); - - if ($isPostInsertId) { - $id = $idGen->generate($this->_em, $entity); - $postInsertIds[$id] = $entity; - } else { - $id = $this->_class->getIdentifierValues($entity); - } - - if ($this->_class->isVersioned) { - $this->assignDefaultVersionValue($entity, $id); - } - } - - $stmt->closeCursor(); - $this->_queuedInserts = array(); - - return $postInsertIds; - } - - /** - * Retrieves the default version value which was created - * by the preceding INSERT statement and assigns it back in to the - * entities version field. - * - * @param object $entity - * @param mixed $id - */ - protected function assignDefaultVersionValue($entity, $id) - { - $value = $this->fetchVersionValue($this->_class, $id); - $this->_class->setFieldValue($entity, $this->_class->versionField, $value); - } - - /** - * Fetch the current version value of a versioned entity. - * - * @param \Doctrine\ORM\Mapping\ClassMetadata $versionedClass - * @param mixed $id - * @return mixed - */ - protected function fetchVersionValue($versionedClass, $id) - { - $versionField = $versionedClass->versionField; - $identifier = $this->quoteStrategy->getIdentifierColumnNames($versionedClass, $this->_platform); - - $versionFieldColumnName = $this->quoteStrategy->getColumnName($versionField, $versionedClass, $this->_platform); - - //FIXME: Order with composite keys might not be correct - $sql = 'SELECT ' . $versionFieldColumnName - . ' FROM ' . $this->quoteStrategy->getTableName($versionedClass, $this->_platform) - . ' WHERE ' . implode(' = ? AND ', $identifier) . ' = ?'; - $value = $this->_conn->fetchColumn($sql, array_values((array)$id)); - - return Type::getType($versionedClass->fieldMappings[$versionField]['type'])->convertToPHPValue($value, $this->_platform); - } - - /** - * Updates a managed entity. The entity is updated according to its current changeset - * in the running UnitOfWork. If there is no changeset, nothing is updated. - * - * The data to update is retrieved through {@link _prepareUpdateData}. - * Subclasses that override this method are supposed to obtain the update data - * in the same way, through {@link _prepareUpdateData}. - * - * Subclasses are also supposed to take care of versioning when overriding this method, - * if necessary. The {@link _updateTable} method can be used to apply the data retrieved - * from {@_prepareUpdateData} on the target tables, thereby optionally applying versioning. - * - * @param object $entity The entity to update. - */ - public function update($entity) - { - $updateData = $this->_prepareUpdateData($entity); - $tableName = $this->_class->getTableName(); - - if (isset($updateData[$tableName]) && $updateData[$tableName]) { - $this->_updateTable( - $entity, $this->quoteStrategy->getTableName($this->_class, $this->_platform), - $updateData[$tableName], $this->_class->isVersioned - ); - - if ($this->_class->isVersioned) { - $id = $this->_em->getUnitOfWork()->getEntityIdentifier($entity); - $this->assignDefaultVersionValue($entity, $id); - } - } - } - - /** - * Performs an UPDATE statement for an entity on a specific table. - * The UPDATE can optionally be versioned, which requires the entity to have a version field. - * - * @param object $entity The entity object being updated. - * @param string $quotedTableName The quoted name of the table to apply the UPDATE on. - * @param array $updateData The map of columns to update (column => value). - * @param boolean $versioned Whether the UPDATE should be versioned. - */ - protected final function _updateTable($entity, $quotedTableName, array $updateData, $versioned = false) - { - $set = $params = $types = array(); - - foreach ($updateData as $columnName => $value) { - $column = $columnName; - $placeholder = '?'; - - if (isset($this->_class->fieldNames[$columnName])) { - $column = $this->quoteStrategy->getColumnName($this->_class->fieldNames[$columnName], $this->_class, $this->_platform); - - if (isset($this->_class->fieldMappings[$this->_class->fieldNames[$columnName]]['requireSQLConversion'])) { - $type = Type::getType($this->_columnTypes[$columnName]); - $placeholder = $type->convertToDatabaseValueSQL('?', $this->_platform); - } - } else if (isset($this->quotedColumns[$columnName])) { - $column = $this->quotedColumns[$columnName]; - } - - $set[] = $column . ' = ' . $placeholder; - $params[] = $value; - $types[] = $this->_columnTypes[$columnName]; - } - - $where = array(); - $id = $this->_em->getUnitOfWork()->getEntityIdentifier($entity); - - foreach ($this->_class->identifier as $idField) { - if (isset($this->_class->associationMappings[$idField])) { - $targetMapping = $this->_em->getClassMetadata($this->_class->associationMappings[$idField]['targetEntity']); - $where[] = $this->_class->associationMappings[$idField]['joinColumns'][0]['name']; - $params[] = $id[$idField]; - - switch (true) { - case (isset($targetMapping->fieldMappings[$targetMapping->identifier[0]])): - $types[] = $targetMapping->fieldMappings[$targetMapping->identifier[0]]['type']; - break; - - case (isset($targetMapping->associationMappings[$targetMapping->identifier[0]])): - $types[] = $targetMapping->associationMappings[$targetMapping->identifier[0]]['type']; - break; - - default: - throw ORMException::unrecognizedField($targetMapping->identifier[0]); - } - } else { - $where[] = $this->quoteStrategy->getColumnName($idField, $this->_class, $this->_platform); - $params[] = $id[$idField]; - $types[] = $this->_class->fieldMappings[$idField]['type']; - } - } - - if ($versioned) { - $versionField = $this->_class->versionField; - $versionFieldType = $this->_class->fieldMappings[$versionField]['type']; - $versionColumn = $this->quoteStrategy->getColumnName($versionField, $this->_class, $this->_platform); - - if ($versionFieldType == Type::INTEGER) { - $set[] = $versionColumn . ' = ' . $versionColumn . ' + 1'; - } else if ($versionFieldType == Type::DATETIME) { - $set[] = $versionColumn . ' = CURRENT_TIMESTAMP'; - } - - $where[] = $versionColumn; - $params[] = $this->_class->reflFields[$versionField]->getValue($entity); - $types[] = $this->_class->fieldMappings[$versionField]['type']; - } - - $sql = 'UPDATE ' . $quotedTableName - . ' SET ' . implode(', ', $set) - . ' WHERE ' . implode(' = ? AND ', $where) . ' = ?'; - - $result = $this->_conn->executeUpdate($sql, $params, $types); - - if ($versioned && ! $result) { - throw OptimisticLockException::lockFailed($entity); - } - } - - /** - * @todo Add check for platform if it supports foreign keys/cascading. - * @param array $identifier - * @return void - */ - protected function deleteJoinTableRecords($identifier) - { - foreach ($this->_class->associationMappings as $mapping) { - if ($mapping['type'] == ClassMetadata::MANY_TO_MANY) { - // @Todo this only covers scenarios with no inheritance or of the same level. Is there something - // like self-referential relationship between different levels of an inheritance hierachy? I hope not! - $selfReferential = ($mapping['targetEntity'] == $mapping['sourceEntity']); - $otherKeys = array(); - $keys = array(); - - if ( ! $mapping['isOwningSide']) { - $relatedClass = $this->_em->getClassMetadata($mapping['targetEntity']); - $mapping = $relatedClass->associationMappings[$mapping['mappedBy']]; - - foreach ($mapping['joinTable']['inverseJoinColumns'] as $joinColumn) { - $keys[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $relatedClass, $this->_platform); - } - - if ($selfReferential) { - foreach ($mapping['joinTable']['joinColumns'] as $joinColumn) { - $otherKeys[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $relatedClass, $this->_platform); - } - } - } else { - - foreach ($mapping['joinTable']['joinColumns'] as $joinColumn) { - $keys[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $this->_class, $this->_platform); - } - - if ($selfReferential) { - foreach ($mapping['joinTable']['inverseJoinColumns'] as $joinColumn) { - $otherKeys[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $this->_class, $this->_platform); - } - } - } - - if ( ! isset($mapping['isOnDeleteCascade'])) { - - $joinTableName = $this->quoteStrategy->getJoinTableName($mapping, $this->_class, $this->_platform); - - $this->_conn->delete($joinTableName, array_combine($keys, $identifier)); - - if ($selfReferential) { - $this->_conn->delete($joinTableName, array_combine($otherKeys, $identifier)); - } - } - } - } - } - - /** - * Deletes a managed entity. - * - * The entity to delete must be managed and have a persistent identifier. - * The deletion happens instantaneously. - * - * Subclasses may override this method to customize the semantics of entity deletion. - * - * @param object $entity The entity to delete. - */ - public function delete($entity) - { - $identifier = $this->_em->getUnitOfWork()->getEntityIdentifier($entity); - - $this->deleteJoinTableRecords($identifier); - - $id = array_combine($this->quoteStrategy->getIdentifierColumnNames($this->_class, $this->_platform), $identifier); - - $this->_conn->delete($this->quoteStrategy->getTableName($this->_class, $this->_platform), $id); - } - - /** - * Prepares the changeset of an entity for database insertion (UPDATE). - * - * The changeset is obtained from the currently running UnitOfWork. - * - * During this preparation the array that is passed as the second parameter is filled with - * => pairs, grouped by table name. - * - * Example: - * - * array( - * 'foo_table' => array('column1' => 'value1', 'column2' => 'value2', ...), - * 'bar_table' => array('columnX' => 'valueX', 'columnY' => 'valueY', ...), - * ... - * ) - * - * - * @param object $entity The entity for which to prepare the data. - * @return array The prepared data. - */ - protected function _prepareUpdateData($entity) - { - $result = array(); - $uow = $this->_em->getUnitOfWork(); - - if (($versioned = $this->_class->isVersioned) != false) { - $versionField = $this->_class->versionField; - } - - foreach ($uow->getEntityChangeSet($entity) as $field => $change) { - if ($versioned && $versionField == $field) { - continue; - } - - $newVal = $change[1]; - - if (isset($this->_class->associationMappings[$field])) { - $assoc = $this->_class->associationMappings[$field]; - - // Only owning side of x-1 associations can have a FK column. - if ( ! $assoc['isOwningSide'] || ! ($assoc['type'] & ClassMetadata::TO_ONE)) { - continue; - } - - if ($newVal !== null) { - $oid = spl_object_hash($newVal); - - if (isset($this->_queuedInserts[$oid]) || $uow->isScheduledForInsert($newVal)) { - // The associated entity $newVal is not yet persisted, so we must - // set $newVal = null, in order to insert a null value and schedule an - // extra update on the UnitOfWork. - $uow->scheduleExtraUpdate($entity, array( - $field => array(null, $newVal) - )); - $newVal = null; - } - } - - if ($newVal !== null) { - $newValId = $uow->getEntityIdentifier($newVal); - } - - $targetClass = $this->_em->getClassMetadata($assoc['targetEntity']); - $owningTable = $this->getOwningTable($field); - - foreach ($assoc['joinColumns'] as $joinColumn) { - $sourceColumn = $joinColumn['name']; - $targetColumn = $joinColumn['referencedColumnName']; - $quotedColumn = $this->quoteStrategy->getJoinColumnName($joinColumn, $this->_class, $this->_platform); - - $this->quotedColumns[$sourceColumn] = $quotedColumn; - - if ($newVal === null) { - $result[$owningTable][$sourceColumn] = null; - } else if ($targetClass->containsForeignIdentifier) { - $result[$owningTable][$sourceColumn] = $newValId[$targetClass->getFieldForColumn($targetColumn)]; - } else { - $result[$owningTable][$sourceColumn] = $newValId[$targetClass->fieldNames[$targetColumn]]; - } - - $this->_columnTypes[$sourceColumn] = $targetClass->getTypeOfColumn($targetColumn); - } - } else { - $columnName = $this->_class->columnNames[$field]; - $this->_columnTypes[$columnName] = $this->_class->fieldMappings[$field]['type']; - $result[$this->getOwningTable($field)][$columnName] = $newVal; - } - } - - return $result; - } - - /** - * Prepares the data changeset of a managed entity for database insertion (initial INSERT). - * The changeset of the entity is obtained from the currently running UnitOfWork. - * - * The default insert data preparation is the same as for updates. - * - * @param object $entity The entity for which to prepare the data. - * @return array The prepared data for the tables to update. - * @see _prepareUpdateData - */ - protected function _prepareInsertData($entity) - { - return $this->_prepareUpdateData($entity); - } - - /** - * Gets the name of the table that owns the column the given field is mapped to. - * - * The default implementation in BasicEntityPersister always returns the name - * of the table the entity type of this persister is mapped to, since an entity - * is always persisted to a single table with a BasicEntityPersister. - * - * @param string $fieldName The field name. - * @return string The table name. - */ - public function getOwningTable($fieldName) - { - return $this->_class->getTableName(); - } - - /** - * Loads an entity by a list of field criteria. - * - * @param array $criteria The criteria by which to load the entity. - * @param object $entity The entity to load the data into. If not specified, - * a new entity is created. - * @param $assoc The association that connects the entity to load to another entity, if any. - * @param array $hints Hints for entity creation. - * @param int $lockMode - * @param int $limit Limit number of results - * @param array $orderBy Criteria to order by - * @return object The loaded and managed entity instance or NULL if the entity can not be found. - * @todo Check identity map? loadById method? Try to guess whether $criteria is the id? - */ - public function load(array $criteria, $entity = null, $assoc = null, array $hints = array(), $lockMode = 0, $limit = null, array $orderBy = null) - { - $sql = $this->_getSelectEntitiesSQL($criteria, $assoc, $lockMode, $limit, null, $orderBy); - list($params, $types) = $this->expandParameters($criteria); - $stmt = $this->_conn->executeQuery($sql, $params, $types); - - if ($entity !== null) { - $hints[Query::HINT_REFRESH] = true; - $hints[Query::HINT_REFRESH_ENTITY] = $entity; - } - - $hydrator = $this->_em->newHydrator($this->_selectJoinSql ? Query::HYDRATE_OBJECT : Query::HYDRATE_SIMPLEOBJECT); - $entities = $hydrator->hydrateAll($stmt, $this->_rsm, $hints); - - return $entities ? $entities[0] : null; - } - - /** - * Loads an entity of this persister's mapped class as part of a single-valued - * association from another entity. - * - * @param array $assoc The association to load. - * @param object $sourceEntity The entity that owns the association (not necessarily the "owning side"). - * @param array $identifier The identifier of the entity to load. Must be provided if - * the association to load represents the owning side, otherwise - * the identifier is derived from the $sourceEntity. - * @return object The loaded and managed entity instance or NULL if the entity can not be found. - */ - public function loadOneToOneEntity(array $assoc, $sourceEntity, array $identifier = array()) - { - if (($foundEntity = $this->_em->getUnitOfWork()->tryGetById($identifier, $assoc['targetEntity'])) != false) { - return $foundEntity; - } - - $targetClass = $this->_em->getClassMetadata($assoc['targetEntity']); - - 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 ($isInverseSingleValued) { - $hints['fetched']["r"][$assoc['inversedBy']] = true; - } - - /* cascade read-only status - if ($this->_em->getUnitOfWork()->isReadOnly($sourceEntity)) { - $hints[Query::HINT_READ_ONLY] = true; - } - */ - - $targetEntity = $this->load($identifier, null, $assoc, $hints); - - // Complete bidirectional association, if necessary - if ($targetEntity !== null && $isInverseSingleValued) { - $targetClass->reflFields[$assoc['inversedBy']]->setValue($targetEntity, $sourceEntity); - } - } else { - $sourceClass = $this->_em->getClassMetadata($assoc['sourceEntity']); - $owningAssoc = $targetClass->getAssociationMapping($assoc['mappedBy']); - - // TRICKY: since the association is specular source and target are flipped - foreach ($owningAssoc['targetToSourceKeyColumns'] as $sourceKeyColumn => $targetKeyColumn) { - if ( ! isset($sourceClass->fieldNames[$sourceKeyColumn])) { - throw MappingException::joinColumnMustPointToMappedField( - $sourceClass->name, $sourceKeyColumn - ); - } - - // unset the old value and set the new sql aliased value here. By definition - // unset($identifier[$targetKeyColumn] works here with how UnitOfWork::createEntity() calls this method. - $identifier[$this->_getSQLTableAlias($targetClass->name) . "." . $targetKeyColumn] = - $sourceClass->reflFields[$sourceClass->fieldNames[$sourceKeyColumn]]->getValue($sourceEntity); - - unset($identifier[$targetKeyColumn]); - } - - $targetEntity = $this->load($identifier, null, $assoc); - - if ($targetEntity !== null) { - $targetClass->setFieldValue($targetEntity, $assoc['mappedBy'], $sourceEntity); - } - } - - return $targetEntity; - } - - /** - * Refreshes a managed entity. - * - * @param array $id The identifier of the entity as an associative array from - * column or field names to values. - * @param object $entity The entity to refresh. - */ - public function refresh(array $id, $entity, $lockMode = 0) - { - $sql = $this->_getSelectEntitiesSQL($id, null, $lockMode); - list($params, $types) = $this->expandParameters($id); - $stmt = $this->_conn->executeQuery($sql, $params, $types); - - $hydrator = $this->_em->newHydrator(Query::HYDRATE_OBJECT); - $hydrator->hydrateAll($stmt, $this->_rsm, array(Query::HINT_REFRESH => true)); - } - - /** - * Load Entities matching the given Criteria object - * - * @param \Doctrine\Common\Collections\Criteria $criteria - * - * @return array - */ - public function loadCriteria(Criteria $criteria) - { - $orderBy = $criteria->getOrderings(); - $limit = $criteria->getMaxResults(); - $offset = $criteria->getFirstResult(); - - $sql = $this->_getSelectEntitiesSQL($criteria, null, 0, $limit, $offset, $orderBy); - - list($params, $types) = $this->expandCriteriaParameters($criteria); - - $stmt = $this->_conn->executeQuery($sql, $params, $types); - - $hydrator = $this->_em->newHydrator(($this->_selectJoinSql) ? Query::HYDRATE_OBJECT : Query::HYDRATE_SIMPLEOBJECT); - - return $hydrator->hydrateAll($stmt, $this->_rsm, array('deferEagerLoads' => true)); - } - - /** - * Expand Criteria Parameters by walking the expressions and grabbing all - * parameters and types from it. - * - * @param \Doctrine\Common\Collections\Criteria $criteria - * - * @return array(array(), array()) - */ - private function expandCriteriaParameters(Criteria $criteria) - { - $expression = $criteria->getWhereExpression(); - - if ($expression === null) { - return array(array(), array()); - } - - $valueVisitor = new SqlValueVisitor(); - $valueVisitor->dispatch($expression); - - list($values, $types) = $valueVisitor->getParamsAndTypes(); - - $sqlValues = array(); - foreach ($values as $value) { - $sqlValues[] = $this->getValue($value); - } - - $sqlTypes = array(); - foreach ($types as $type) { - list($field, $value) = $type; - $sqlTypes[] = $this->getType($field, $value); - } - - return array($sqlValues, $sqlTypes); - } - - /** - * Loads a list of entities by a list of field criteria. - * - * @param array $criteria - * @param array $orderBy - * @param int $limit - * @param int $offset - * @return array - */ - public function loadAll(array $criteria = array(), array $orderBy = null, $limit = null, $offset = null) - { - $sql = $this->_getSelectEntitiesSQL($criteria, null, 0, $limit, $offset, $orderBy); - list($params, $types) = $this->expandParameters($criteria); - $stmt = $this->_conn->executeQuery($sql, $params, $types); - - $hydrator = $this->_em->newHydrator(($this->_selectJoinSql) ? Query::HYDRATE_OBJECT : Query::HYDRATE_SIMPLEOBJECT); - - return $hydrator->hydrateAll($stmt, $this->_rsm, array('deferEagerLoads' => true)); - } - - /** - * Get (sliced or full) elements of the given collection. - * - * @param array $assoc - * @param object $sourceEntity - * @param int|null $offset - * @param int|null $limit - * @return array - */ - public function getManyToManyCollection(array $assoc, $sourceEntity, $offset = null, $limit = null) - { - $stmt = $this->getManyToManyStatement($assoc, $sourceEntity, $offset, $limit); - - return $this->loadArrayFromStatement($assoc, $stmt); - } - - /** - * Load an array of entities from a given dbal statement. - * - * @param array $assoc - * @param \Doctrine\DBAL\Statement $stmt - * - * @return array - */ - private function loadArrayFromStatement($assoc, $stmt) - { - $hints = array('deferEagerLoads' => true); - - if (isset($assoc['indexBy'])) { - $rsm = clone ($this->_rsm); // this is necessary because the "default rsm" should be changed. - $rsm->addIndexBy('r', $assoc['indexBy']); - } else { - $rsm = $this->_rsm; - } - - $hydrator = $this->_em->newHydrator(Query::HYDRATE_OBJECT); - - return $hydrator->hydrateAll($stmt, $rsm, $hints); - } - - /** - * Hydrate a collection from a given dbal statement. - * - * @param array $assoc - * @param \Doctrine\DBAL\Statement $stmt - * @param PersistentCollection $coll - * - * @return array - */ - private function loadCollectionFromStatement($assoc, $stmt, $coll) - { - $hints = array('deferEagerLoads' => true, 'collection' => $coll); - - if (isset($assoc['indexBy'])) { - $rsm = clone ($this->_rsm); // this is necessary because the "default rsm" should be changed. - $rsm->addIndexBy('r', $assoc['indexBy']); - } else { - $rsm = $this->_rsm; - } - - $hydrator = $this->_em->newHydrator(Query::HYDRATE_OBJECT); - - return $hydrator->hydrateAll($stmt, $rsm, $hints); - } - - /** - * Loads a collection of entities of a many-to-many association. - * - * @param ManyToManyMapping $assoc The association mapping of the association being loaded. - * @param object $sourceEntity The entity that owns the collection. - * @param PersistentCollection $coll The collection to fill. - * @param int|null $offset - * @param int|null $limit - * @return array - */ - public function loadManyToManyCollection(array $assoc, $sourceEntity, PersistentCollection $coll) - { - $stmt = $this->getManyToManyStatement($assoc, $sourceEntity); - - return $this->loadCollectionFromStatement($assoc, $stmt, $coll); - } - - private function getManyToManyStatement(array $assoc, $sourceEntity, $offset = null, $limit = null) - { - $criteria = array(); - $sourceClass = $this->_em->getClassMetadata($assoc['sourceEntity']); - - if ($assoc['isOwningSide']) { - $quotedJoinTable = $this->quoteStrategy->getJoinTableName($assoc, $sourceClass, $this->_platform); - - foreach ($assoc['joinTable']['joinColumns'] as $joinColumn) { - $relationKeyColumn = $joinColumn['name']; - $sourceKeyColumn = $joinColumn['referencedColumnName']; - $quotedKeyColumn = $this->quoteStrategy->getJoinColumnName($joinColumn, $sourceClass, $this->_platform); - - if ($sourceClass->containsForeignIdentifier) { - $field = $sourceClass->getFieldForColumn($sourceKeyColumn); - $value = $sourceClass->reflFields[$field]->getValue($sourceEntity); - - if (isset($sourceClass->associationMappings[$field])) { - $value = $this->_em->getUnitOfWork()->getEntityIdentifier($value); - $value = $value[$this->_em->getClassMetadata($sourceClass->associationMappings[$field]['targetEntity'])->identifier[0]]; - } - - $criteria[$quotedJoinTable . "." . $quotedKeyColumn] = $value; - } else if (isset($sourceClass->fieldNames[$sourceKeyColumn])) { - $criteria[$quotedJoinTable . "." . $quotedKeyColumn] = $sourceClass->reflFields[$sourceClass->fieldNames[$sourceKeyColumn]]->getValue($sourceEntity); - } else { - throw MappingException::joinColumnMustPointToMappedField( - $sourceClass->name, $sourceKeyColumn - ); - } - } - } else { - $owningAssoc = $this->_em->getClassMetadata($assoc['targetEntity'])->associationMappings[$assoc['mappedBy']]; - $quotedJoinTable = $this->quoteStrategy->getJoinTableName($owningAssoc, $sourceClass, $this->_platform); - - // TRICKY: since the association is inverted source and target are flipped - foreach ($owningAssoc['joinTable']['inverseJoinColumns'] as $joinColumn) { - $relationKeyColumn = $joinColumn['name']; - $sourceKeyColumn = $joinColumn['referencedColumnName']; - $quotedKeyColumn = $this->quoteStrategy->getJoinColumnName($joinColumn, $sourceClass, $this->_platform); - - if ($sourceClass->containsForeignIdentifier) { - $field = $sourceClass->getFieldForColumn($sourceKeyColumn); - $value = $sourceClass->reflFields[$field]->getValue($sourceEntity); - - if (isset($sourceClass->associationMappings[$field])) { - $value = $this->_em->getUnitOfWork()->getEntityIdentifier($value); - $value = $value[$this->_em->getClassMetadata($sourceClass->associationMappings[$field]['targetEntity'])->identifier[0]]; - } - - $criteria[$quotedJoinTable . "." . $quotedKeyColumn] = $value; - } else if (isset($sourceClass->fieldNames[$sourceKeyColumn])) { - $criteria[$quotedJoinTable . "." . $quotedKeyColumn] = $sourceClass->reflFields[$sourceClass->fieldNames[$sourceKeyColumn]]->getValue($sourceEntity); - } else { - throw MappingException::joinColumnMustPointToMappedField( - $sourceClass->name, $sourceKeyColumn - ); - } - } - } - - $sql = $this->_getSelectEntitiesSQL($criteria, $assoc, 0, $limit, $offset); - list($params, $types) = $this->expandParameters($criteria); - - return $this->_conn->executeQuery($sql, $params, $types); - } - - /** - * Gets the SELECT SQL to select one or more entities by a set of field criteria. - * - * @param array|\Doctrine\Common\Collections\Criteria $criteria - * @param AssociationMapping $assoc - * @param string $orderBy - * @param int $lockMode - * @param int $limit - * @param int $offset - * @param array $orderBy - * @return string - * @todo Refactor: _getSelectSQL(...) - */ - protected function _getSelectEntitiesSQL($criteria, $assoc = null, $lockMode = 0, $limit = null, $offset = null, array $orderBy = null) - { - $joinSql = ($assoc != null && $assoc['type'] == ClassMetadata::MANY_TO_MANY) ? $this->_getSelectManyToManyJoinSQL($assoc) : ''; - $conditionSql = ($criteria instanceof Criteria) - ? $this->_getSelectConditionCriteriaSQL($criteria) - : $this->_getSelectConditionSQL($criteria, $assoc); - - $orderBy = ($assoc !== null && isset($assoc['orderBy'])) ? $assoc['orderBy'] : $orderBy; - $orderBySql = $orderBy ? $this->_getOrderBySQL($orderBy, $this->_getSQLTableAlias($this->_class->name)) : ''; - - $lockSql = ''; - - if ($lockMode == LockMode::PESSIMISTIC_READ) { - $lockSql = ' ' . $this->_platform->getReadLockSql(); - } else if ($lockMode == LockMode::PESSIMISTIC_WRITE) { - $lockSql = ' ' . $this->_platform->getWriteLockSql(); - } - - $alias = $this->_getSQLTableAlias($this->_class->name); - - if ($filterSql = $this->generateFilterConditionSQL($this->_class, $alias)) { - if ($conditionSql) { - $conditionSql .= ' AND '; - } - - $conditionSql .= $filterSql; - } - - return $this->_platform->modifyLimitQuery('SELECT ' . $this->_getSelectColumnListSQL() - . $this->_platform->appendLockHint(' FROM ' . $this->quoteStrategy->getTableName($this->_class, $this->_platform) . ' ' - . $alias, $lockMode) - . $this->_selectJoinSql . $joinSql - . ($conditionSql ? ' WHERE ' . $conditionSql : '') - . $orderBySql, $limit, $offset) - . $lockSql; - } - - /** - * Gets the ORDER BY SQL snippet for ordered collections. - * - * @param array $orderBy - * @param string $baseTableAlias - * @return string - */ - protected final function _getOrderBySQL(array $orderBy, $baseTableAlias) - { - $orderBySql = ''; - - foreach ($orderBy as $fieldName => $orientation) { - if ( ! isset($this->_class->fieldMappings[$fieldName])) { - throw ORMException::unrecognizedField($fieldName); - } - - $orientation = strtoupper(trim($orientation)); - if ($orientation != 'ASC' && $orientation != 'DESC') { - throw ORMException::invalidOrientation($this->_class->name, $fieldName); - } - - $tableAlias = isset($this->_class->fieldMappings[$fieldName]['inherited']) ? - $this->_getSQLTableAlias($this->_class->fieldMappings[$fieldName]['inherited']) - : $baseTableAlias; - - $columnName = $this->quoteStrategy->getColumnName($fieldName, $this->_class, $this->_platform); - - $orderBySql .= $orderBySql ? ', ' : ' ORDER BY '; - $orderBySql .= $tableAlias . '.' . $columnName . ' ' . $orientation; - } - - return $orderBySql; - } - - /** - * Gets the SQL fragment with the list of columns to select when querying for - * an entity in this persister. - * - * Subclasses should override this method to alter or change the select column - * list SQL fragment. Note that in the implementation of BasicEntityPersister - * the resulting SQL fragment is generated only once and cached in {@link _selectColumnListSql}. - * Subclasses may or may not do the same. - * - * @return string The SQL fragment. - * @todo Rename: _getSelectColumnsSQL() - */ - protected function _getSelectColumnListSQL() - { - if ($this->_selectColumnListSql !== null) { - return $this->_selectColumnListSql; - } - - $columnList = ''; - $this->_rsm = new Query\ResultSetMapping(); - $this->_rsm->addEntityResult($this->_class->name, 'r'); // r for root - - // Add regular columns to select list - foreach ($this->_class->fieldNames as $field) { - if ($columnList) $columnList .= ', '; - - $columnList .= $this->_getSelectColumnSQL($field, $this->_class); - } - - $this->_selectJoinSql = ''; - $eagerAliasCounter = 0; - - foreach ($this->_class->associationMappings as $assocField => $assoc) { - $assocColumnSQL = $this->_getSelectColumnAssociationSQL($assocField, $assoc, $this->_class); - - if ($assocColumnSQL) { - if ($columnList) $columnList .= ', '; - - $columnList .= $assocColumnSQL; - } - - if ($assoc['type'] & ClassMetadata::TO_ONE && ($assoc['fetch'] == ClassMetadata::FETCH_EAGER || !$assoc['isOwningSide'])) { - $eagerEntity = $this->_em->getClassMetadata($assoc['targetEntity']); - - if ($eagerEntity->inheritanceType != ClassMetadata::INHERITANCE_TYPE_NONE) { - continue; // now this is why you shouldn't use inheritance - } - - $assocAlias = 'e' . ($eagerAliasCounter++); - $this->_rsm->addJoinedEntityResult($assoc['targetEntity'], $assocAlias, 'r', $assocField); - - foreach ($eagerEntity->fieldNames as $field) { - if ($columnList) $columnList .= ', '; - - $columnList .= $this->_getSelectColumnSQL($field, $eagerEntity, $assocAlias); - } - - foreach ($eagerEntity->associationMappings as $assoc2Field => $assoc2) { - $assoc2ColumnSQL = $this->_getSelectColumnAssociationSQL($assoc2Field, $assoc2, $eagerEntity, $assocAlias); - - if ($assoc2ColumnSQL) { - if ($columnList) $columnList .= ', '; - $columnList .= $assoc2ColumnSQL; - } - } - $first = true; - - if ($assoc['isOwningSide']) { - $this->_selectJoinSql .= ' ' . $this->getJoinSQLForJoinColumns($assoc['joinColumns']); - $this->_selectJoinSql .= ' ' . $this->quoteStrategy->getTableName($eagerEntity, $this->_platform) . ' ' . $this->_getSQLTableAlias($eagerEntity->name, $assocAlias) .' ON '; - - $tableAlias = $this->_getSQLTableAlias($assoc['targetEntity'], $assocAlias); - foreach ($assoc['joinColumns'] as $joinColumn) { - $sourceCol = $this->quoteStrategy->getJoinColumnName($joinColumn, $this->_class, $this->_platform); - $targetCol = $this->quoteStrategy->getReferencedJoinColumnName($joinColumn, $this->_class, $this->_platform); - - if ( ! $first) { - $this->_selectJoinSql .= ' AND '; - } - $this->_selectJoinSql .= $this->_getSQLTableAlias($assoc['sourceEntity']) . '.' . $sourceCol . ' = ' - . $tableAlias . '.' . $targetCol; - $first = false; - } - - // Add filter SQL - if ($filterSql = $this->generateFilterConditionSQL($eagerEntity, $tableAlias)) { - $this->_selectJoinSql .= ' AND ' . $filterSql; - } - } else { - $eagerEntity = $this->_em->getClassMetadata($assoc['targetEntity']); - $owningAssoc = $eagerEntity->getAssociationMapping($assoc['mappedBy']); - - $this->_selectJoinSql .= ' LEFT JOIN'; - $this->_selectJoinSql .= ' ' . $this->quoteStrategy->getTableName($eagerEntity, $this->_platform) . ' ' - . $this->_getSQLTableAlias($eagerEntity->name, $assocAlias) . ' ON '; - - foreach ($owningAssoc['sourceToTargetKeyColumns'] as $sourceCol => $targetCol) { - if ( ! $first) { - $this->_selectJoinSql .= ' AND '; - } - - $this->_selectJoinSql .= $this->_getSQLTableAlias($owningAssoc['sourceEntity'], $assocAlias) . '.' . $sourceCol . ' = ' - . $this->_getSQLTableAlias($owningAssoc['targetEntity']) . '.' . $targetCol; - $first = false; - } - } - } - } - - $this->_selectColumnListSql = $columnList; - - return $this->_selectColumnListSql; - } - - /** - * Gets the SQL join fragment used when selecting entities from an association. - * - * @param string $field - * @param array $assoc - * @param ClassMetadata $class - * @param string $alias - * - * @return string - */ - protected function _getSelectColumnAssociationSQL($field, $assoc, ClassMetadata $class, $alias = 'r') - { - $columnList = array(); - - if ($assoc['isOwningSide'] && $assoc['type'] & ClassMetadata::TO_ONE) { - - foreach ($assoc['joinColumns'] as $joinColumn) { - - $quotedColumn = $this->quoteStrategy->getJoinColumnName($joinColumn, $this->_class, $this->_platform); - $resultColumnName = $this->getSQLColumnAlias($joinColumn['name']); - $columnList[] = $this->_getSQLTableAlias($class->name, ($alias == 'r' ? '' : $alias) ) - . '.' . $quotedColumn . ' AS ' . $resultColumnName; - - $this->_rsm->addMetaResult($alias, $resultColumnName, $quotedColumn, isset($assoc['id']) && $assoc['id'] === true); - } - } - - return implode(', ', $columnList); - } - - /** - * Gets the SQL join fragment used when selecting entities from a - * many-to-many association. - * - * @param ManyToManyMapping $manyToMany - * @return string - */ - protected function _getSelectManyToManyJoinSQL(array $manyToMany) - { - $conditions = array(); - $association = $manyToMany; - $sourceTableAlias = $this->_getSQLTableAlias($this->_class->name); - - if ( ! $manyToMany['isOwningSide']) { - $targetEntity = $this->_em->getClassMetadata($manyToMany['targetEntity']); - $association = $targetEntity->associationMappings[$manyToMany['mappedBy']]; - } - - $joinTableName = $this->quoteStrategy->getJoinTableName($association, $this->_class, $this->_platform); - $joinColumns = ($manyToMany['isOwningSide']) - ? $association['joinTable']['inverseJoinColumns'] - : $association['joinTable']['joinColumns']; - - foreach ($joinColumns as $joinColumn) { - $quotedSourceColumn = $this->quoteStrategy->getJoinColumnName($joinColumn, $this->_class, $this->_platform); - $quotedTargetColumn = $this->quoteStrategy->getReferencedJoinColumnName($joinColumn, $this->_class, $this->_platform); - $conditions[] = $sourceTableAlias . '.' . $quotedTargetColumn . ' = ' . $joinTableName . '.' . $quotedSourceColumn; - } - - return ' INNER JOIN ' . $joinTableName . ' ON ' . implode(' AND ', $conditions); - } - - /** - * Gets the INSERT SQL used by the persister to persist a new entity. - * - * @return string - */ - protected function _getInsertSQL() - { - if ($this->_insertSql === null) { - $insertSql = ''; - $columns = $this->_getInsertColumnList(); - - if (empty($columns)) { - $insertSql = $this->_platform->getEmptyIdentityInsertSQL( - $this->quoteStrategy->getTableName($this->_class, $this->_platform), - $this->quoteStrategy->getColumnName($this->_class->identifier[0], $this->_class, $this->_platform) - ); - } else { - $columns = array_unique($columns); - - $values = array(); - foreach ($columns as $column) { - $placeholder = '?'; - - if (isset($this->_class->fieldNames[$column]) && - isset($this->_columnTypes[$this->_class->fieldNames[$column]]) && - isset($this->_class->fieldMappings[$this->_class->fieldNames[$column]]['requireSQLConversion'])) { - $type = Type::getType($this->_columnTypes[$this->_class->fieldNames[$column]]); - $placeholder = $type->convertToDatabaseValueSQL('?', $this->_platform); - } - - $values[] = $placeholder; - } - - $insertSql = 'INSERT INTO ' . $this->quoteStrategy->getTableName($this->_class, $this->_platform) - . ' (' . implode(', ', $columns) . ') VALUES (' . implode(', ', $values) . ')'; - } - - $this->_insertSql = $insertSql; - } - - return $this->_insertSql; - } - - /** - * Gets the list of columns to put in the INSERT SQL statement. - * - * Subclasses should override this method to alter or change the list of - * columns placed in the INSERT statements used by the persister. - * - * @return array The list of columns. - */ - protected function _getInsertColumnList() - { - $columns = array(); - - foreach ($this->_class->reflFields as $name => $field) { - if ($this->_class->isVersioned && $this->_class->versionField == $name) { - continue; - } - - if (isset($this->_class->associationMappings[$name])) { - $assoc = $this->_class->associationMappings[$name]; - if ($assoc['isOwningSide'] && $assoc['type'] & ClassMetadata::TO_ONE) { - foreach ($assoc['joinColumns'] as $joinColumn) { - $columns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $this->_class, $this->_platform); - } - } - } else if ($this->_class->generatorType != ClassMetadata::GENERATOR_TYPE_IDENTITY || $this->_class->identifier[0] != $name) { - $columns[] = $this->quoteStrategy->getColumnName($name, $this->_class, $this->_platform); - $this->_columnTypes[$name] = $this->_class->fieldMappings[$name]['type']; - } - } - - return $columns; - } - - /** - * Gets the SQL snippet of a qualified column name for the given field name. - * - * @param string $field The field name. - * @param ClassMetadata $class The class that declares this field. The table this class is - * mapped to must own the column for the given field. - * @param string $alias - */ - protected function _getSelectColumnSQL($field, ClassMetadata $class, $alias = 'r') - { - $sql = $this->_getSQLTableAlias($class->name, $alias == 'r' ? '' : $alias) - . '.' . $this->quoteStrategy->getColumnName($field, $class, $this->_platform); - $columnAlias = $this->getSQLColumnAlias($class->columnNames[$field]); - - $this->_rsm->addFieldResult($alias, $columnAlias, $field); - - if (isset($class->fieldMappings[$field]['requireSQLConversion'])) { - $type = Type::getType($class->getTypeOfField($field)); - $sql = $type->convertToPHPValueSQL($sql, $this->_platform); - } - - return $sql . ' AS ' . $columnAlias; - } - - /** - * Gets the SQL table alias for the given class name. - * - * @param string $className - * @return string The SQL table alias. - * @todo Reconsider. Binding table aliases to class names is not such a good idea. - */ - protected function _getSQLTableAlias($className, $assocName = '') - { - if ($assocName) { - $className .= '#' . $assocName; - } - - if (isset($this->_sqlTableAliases[$className])) { - return $this->_sqlTableAliases[$className]; - } - - $tableAlias = 't' . $this->_sqlAliasCounter++; - - $this->_sqlTableAliases[$className] = $tableAlias; - - return $tableAlias; - } - - /** - * Lock all rows of this entity matching the given criteria with the specified pessimistic lock mode - * - * @param array $criteria - * @param int $lockMode - * @return void - */ - public function lock(array $criteria, $lockMode) - { - $conditionSql = $this->_getSelectConditionSQL($criteria); - - if ($lockMode == LockMode::PESSIMISTIC_READ) { - $lockSql = $this->_platform->getReadLockSql(); - } else if ($lockMode == LockMode::PESSIMISTIC_WRITE) { - $lockSql = $this->_platform->getWriteLockSql(); - } - - $sql = 'SELECT 1 ' - . $this->_platform->appendLockHint($this->getLockTablesSql(), $lockMode) - . ($conditionSql ? ' WHERE ' . $conditionSql : '') . ' ' . $lockSql; - - list($params, $types) = $this->expandParameters($criteria); - - $this->_conn->executeQuery($sql, $params, $types); - } - - /** - * Get the FROM and optionally JOIN conditions to lock the entity managed by this persister. - * - * @return string - */ - protected function getLockTablesSql() - { - return 'FROM ' . $this->quoteStrategy->getTableName($this->_class, $this->_platform) . ' ' - . $this->_getSQLTableAlias($this->_class->name); - } - - /** - * Get the Select Where Condition from a Criteria object. - * - * @param \Doctrine\Common\Collections\Criteria $criteria - * @return string - */ - protected function _getSelectConditionCriteriaSQL(Criteria $criteria) - { - $expression = $criteria->getWhereExpression(); - - if ($expression === null) { - return ''; - } - - $visitor = new SqlExpressionVisitor($this); - - return $visitor->dispatch($expression); - } - - /** - * Get the SQL WHERE condition for matching a field with a given value. - * - * @param string $field - * @param mixed $value - * @param array|null $assoc - * @param string $comparison - * - * @return string - */ - public function getSelectConditionStatementSQL($field, $value, $assoc = null, $comparison = null) - { - $conditionSql = $this->getSelectConditionStatementColumnSQL($field, $assoc); - $placeholder = '?'; - - if (isset($this->_class->fieldMappings[$field]['requireSQLConversion'])) { - $type = Type::getType($this->_class->getTypeOfField($field)); - $placeholder = $type->convertToDatabaseValueSQL($placeholder, $this->_platform); - } - - $conditionSql .= ($comparison === null) - ? ((is_array($value)) ? ' IN (?)' : (($value === null) ? ' IS NULL' : ' = ' . $placeholder)) - : ' ' . sprintf(self::$comparisonMap[$comparison], $placeholder); - - - return $conditionSql; - } - - /** - * Build the left-hand-side of a where condition statement. - * - * @param string $field - * @param array $assoc - * - * @return string - */ - protected function getSelectConditionStatementColumnSQL($field, $assoc = null) - { - switch (true) { - case (isset($this->_class->columnNames[$field])): - $className = (isset($this->_class->fieldMappings[$field]['inherited'])) - ? $this->_class->fieldMappings[$field]['inherited'] - : $this->_class->name; - - return $this->_getSQLTableAlias($className) . '.' . $this->quoteStrategy->getColumnName($field, $this->_class, $this->_platform); - - case (isset($this->_class->associationMappings[$field])): - if ( ! $this->_class->associationMappings[$field]['isOwningSide']) { - throw ORMException::invalidFindByInverseAssociation($this->_class->name, $field); - } - - $className = (isset($this->_class->associationMappings[$field]['inherited'])) - ? $this->_class->associationMappings[$field]['inherited'] - : $this->_class->name; - - return $this->_getSQLTableAlias($className) . '.' . $this->_class->associationMappings[$field]['joinColumns'][0]['name']; - - case ($assoc !== null && strpos($field, " ") === false && strpos($field, "(") === false): - // very careless developers could potentially open up this normally hidden api for userland attacks, - // therefore checking for spaces and function calls which are not allowed. - - // found a join column condition, not really a "field" - return $field; - } - - throw ORMException::unrecognizedField($field); - } - - /** - * Gets the conditional SQL fragment used in the WHERE clause when selecting - * entities in this persister. - * - * Subclasses are supposed to override this method if they intend to change - * or alter the criteria by which entities are selected. - * - * @param array $criteria - * @param AssociationMapping $assoc - * @return string - */ - protected function _getSelectConditionSQL(array $criteria, $assoc = null) - { - $conditionSql = ''; - - foreach ($criteria as $field => $value) { - $conditionSql .= $conditionSql ? ' AND ' : ''; - $conditionSql .= $this->getSelectConditionStatementSQL($field, $value, $assoc); - } - - return $conditionSql; - } - - /** - * Return an array with (sliced or full list) of elements in the specified collection. - * - * @param array $assoc - * @param object $sourceEntity - * @param int $offset - * @param int $limit - * @return array - */ - public function getOneToManyCollection(array $assoc, $sourceEntity, $offset = null, $limit = null) - { - $stmt = $this->getOneToManyStatement($assoc, $sourceEntity, $offset, $limit); - - return $this->loadArrayFromStatement($assoc, $stmt); - } - - /** - * Loads a collection of entities in a one-to-many association. - * - * @param array $assoc - * @param object $sourceEntity - * @param PersistentCollection $coll The collection to load/fill. - * @param int|null $offset - * @param int|null $limit - */ - public function loadOneToManyCollection(array $assoc, $sourceEntity, PersistentCollection $coll) - { - $stmt = $this->getOneToManyStatement($assoc, $sourceEntity); - - return $this->loadCollectionFromStatement($assoc, $stmt, $coll); - } - - /** - * Build criteria and execute SQL statement to fetch the one to many entities from. - * - * @param array $assoc - * @param object $sourceEntity - * @param int|null $offset - * @param int|null $limit - * @return \Doctrine\DBAL\Statement - */ - private function getOneToManyStatement(array $assoc, $sourceEntity, $offset = null, $limit = null) - { - $criteria = array(); - $owningAssoc = $this->_class->associationMappings[$assoc['mappedBy']]; - $sourceClass = $this->_em->getClassMetadata($assoc['sourceEntity']); - - $tableAlias = $this->_getSQLTableAlias(isset($owningAssoc['inherited']) ? $owningAssoc['inherited'] : $this->_class->name); - - foreach ($owningAssoc['targetToSourceKeyColumns'] as $sourceKeyColumn => $targetKeyColumn) { - if ($sourceClass->containsForeignIdentifier) { - $field = $sourceClass->getFieldForColumn($sourceKeyColumn); - $value = $sourceClass->reflFields[$field]->getValue($sourceEntity); - - if (isset($sourceClass->associationMappings[$field])) { - $value = $this->_em->getUnitOfWork()->getEntityIdentifier($value); - $value = $value[$this->_em->getClassMetadata($sourceClass->associationMappings[$field]['targetEntity'])->identifier[0]]; - } - - $criteria[$tableAlias . "." . $targetKeyColumn] = $value; - } else { - $criteria[$tableAlias . "." . $targetKeyColumn] = $sourceClass->reflFields[$sourceClass->fieldNames[$sourceKeyColumn]]->getValue($sourceEntity); - } - } - - $sql = $this->_getSelectEntitiesSQL($criteria, $assoc, 0, $limit, $offset); - list($params, $types) = $this->expandParameters($criteria); - - return $this->_conn->executeQuery($sql, $params, $types); - } - - /** - * Expand the parameters from the given criteria and use the correct binding types if found. - * - * @param array $criteria - * @return array - */ - private function expandParameters($criteria) - { - $params = $types = array(); - - foreach ($criteria as $field => $value) { - if ($value === null) { - continue; // skip null values. - } - - $types[] = $this->getType($field, $value); - $params[] = $this->getValue($value); - } - - return array($params, $types); - } - - /** - * Infer field type to be used by parameter type casting. - * - * @param string $field - * @param mixed $value - * @return integer - */ - private function getType($field, $value) - { - switch (true) { - case (isset($this->_class->fieldMappings[$field])): - $type = $this->_class->fieldMappings[$field]['type']; - break; - - case (isset($this->_class->associationMappings[$field])): - $assoc = $this->_class->associationMappings[$field]; - - if (count($assoc['sourceToTargetKeyColumns']) > 1) { - throw Query\QueryException::associationPathCompositeKeyNotSupported(); - } - - $targetClass = $this->_em->getClassMetadata($assoc['targetEntity']); - $targetColumn = $assoc['joinColumns'][0]['referencedColumnName']; - $type = null; - - if (isset($targetClass->fieldNames[$targetColumn])) { - $type = $targetClass->fieldMappings[$targetClass->fieldNames[$targetColumn]]['type']; - } - - break; - - default: - $type = null; - } - if (is_array($value)) { - $type = Type::getType( $type )->getBindingType(); - $type += Connection::ARRAY_PARAM_OFFSET; - } - - return $type; - } - - /** - * Retrieve parameter value - * - * @param mixed $value - * @return mixed - */ - private function getValue($value) - { - if (is_array($value)) { - $newValue = array(); - - foreach ($value as $itemValue) { - $newValue[] = $this->getIndividualValue($itemValue); - } - - return $newValue; - } - - return $this->getIndividualValue($value); - } - - /** - * Retrieve an invidiual parameter value - * - * @param mixed $value - * @return mixed - */ - private function getIndividualValue($value) - { - if (is_object($value) && $this->_em->getMetadataFactory()->hasMetadataFor(ClassUtils::getClass($value))) { - if ($this->_em->getUnitOfWork()->getEntityState($value) === UnitOfWork::STATE_MANAGED) { - $idValues = $this->_em->getUnitOfWork()->getEntityIdentifier($value); - } else { - $class = $this->_em->getClassMetadata(get_class($value)); - $idValues = $class->getIdentifierValues($value); - } - - $key = key($idValues); - - if (null !== $key){ - $value = $idValues[$key]; - } - } - - return $value; - } - - /** - * Checks whether the given managed entity exists in the database. - * - * @param object $entity - * @return boolean TRUE if the entity exists in the database, FALSE otherwise. - */ - public function exists($entity, array $extraConditions = array()) - { - $criteria = $this->_class->getIdentifierValues($entity); - - if ( ! $criteria) { - return false; - } - - if ($extraConditions) { - $criteria = array_merge($criteria, $extraConditions); - } - - $alias = $this->_getSQLTableAlias($this->_class->name); - - $sql = 'SELECT 1 ' - . $this->getLockTablesSql() - . ' WHERE ' . $this->_getSelectConditionSQL($criteria); - - if ($filterSql = $this->generateFilterConditionSQL($this->_class, $alias)) { - $sql .= ' AND ' . $filterSql; - } - - list($params) = $this->expandParameters($criteria); - - return (bool) $this->_conn->fetchColumn($sql, $params); - } - - /** - * Generates the appropriate join SQL for the given join column. - * - * @param array $joinColumns The join columns definition of an association. - * @return string LEFT JOIN if one of the columns is nullable, INNER JOIN otherwise. - */ - protected function getJoinSQLForJoinColumns($joinColumns) - { - // if one of the join columns is nullable, return left join - foreach ($joinColumns as $joinColumn) { - if ( ! isset($joinColumn['nullable']) || $joinColumn['nullable']) { - return 'LEFT JOIN'; - } - } - - return 'INNER JOIN'; - } - - /** - * Gets an SQL column alias for a column name. - * - * @param string $columnName - * @return string - */ - public function getSQLColumnAlias($columnName) - { - return $this->quoteStrategy->getColumnAlias($columnName, $this->_sqlAliasCounter++, $this->_platform); - } - - /** - * Generates the filter SQL for a given entity and table alias. - * - * @param ClassMetadata $targetEntity Metadata of the target entity. - * @param string $targetTableAlias The table alias of the joined/selected table. - * - * @return string The SQL query part to add to a query. - */ - protected function generateFilterConditionSQL(ClassMetadata $targetEntity, $targetTableAlias) - { - $filterClauses = array(); - - foreach ($this->_em->getFilters()->getEnabledFilters() as $filter) { - if ('' !== $filterExpr = $filter->addFilterConstraint($targetEntity, $targetTableAlias)) { - $filterClauses[] = '(' . $filterExpr . ')'; - } - } - - $sql = implode(' AND ', $filterClauses); - return $sql ? "(" . $sql . ")" : ""; // Wrap again to avoid "X or Y and FilterConditionSQL" - } -} diff --git a/framework/library/Doctrine/ORM/Persisters/ElementCollectionPersister.php b/framework/library/Doctrine/ORM/Persisters/ElementCollectionPersister.php deleted file mode 100644 index 0b0354a..0000000 --- a/framework/library/Doctrine/ORM/Persisters/ElementCollectionPersister.php +++ /dev/null @@ -1,30 +0,0 @@ -. - */ -namespace Doctrine\ORM\Persisters; - -/** - * Persister for collections of basic elements / value types. - * - * @author robo - * @todo Implementation once support for collections of basic elements (i.e. strings) is added. - */ -abstract class ElementCollectionPersister extends AbstractCollectionPersister -{ - //put your code here -} diff --git a/framework/library/Doctrine/ORM/Persisters/JoinedSubclassPersister.php b/framework/library/Doctrine/ORM/Persisters/JoinedSubclassPersister.php deleted file mode 100644 index 2d8967c..0000000 --- a/framework/library/Doctrine/ORM/Persisters/JoinedSubclassPersister.php +++ /dev/null @@ -1,495 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Persisters; - -use Doctrine\ORM\ORMException; -use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\ORM\Query\ResultSetMapping; - -use Doctrine\DBAL\LockMode; -use Doctrine\DBAL\Types\Type; - -use Doctrine\Common\Collections\Criteria; - -/** - * The joined subclass persister maps a single entity instance to several tables in the - * database as it is defined by the Class Table Inheritance strategy. - * - * @author Roman Borschel - * @author Benjamin Eberlei - * @author Alexander - * @since 2.0 - * @see http://martinfowler.com/eaaCatalog/classTableInheritance.html - */ -class JoinedSubclassPersister extends AbstractEntityInheritancePersister -{ - /** - * Map that maps column names to the table names that own them. - * This is mainly a temporary cache, used during a single request. - * - * @var array - */ - private $_owningTableMap = array(); - - /** - * Map of table to quoted table names. - * - * @var array - */ - private $_quotedTableMap = array(); - - /** - * {@inheritdoc} - */ - protected function _getDiscriminatorColumnTableName() - { - $class = ($this->_class->name !== $this->_class->rootEntityName) - ? $this->_em->getClassMetadata($this->_class->rootEntityName) - : $this->_class; - - return $class->getTableName(); - } - - /** - * This function finds the ClassMetadata instance in an inheritance hierarchy - * that is responsible for enabling versioning. - * - * @return \Doctrine\ORM\Mapping\ClassMetadata - */ - private function _getVersionedClassMetadata() - { - if (isset($this->_class->fieldMappings[$this->_class->versionField]['inherited'])) { - $definingClassName = $this->_class->fieldMappings[$this->_class->versionField]['inherited']; - - return $this->_em->getClassMetadata($definingClassName); - } - - return $this->_class; - } - - /** - * Gets the name of the table that owns the column the given field is mapped to. - * - * @param string $fieldName - * @return string - * @override - */ - public function getOwningTable($fieldName) - { - if (isset($this->_owningTableMap[$fieldName])) { - return $this->_owningTableMap[$fieldName]; - } - - if (isset($this->_class->associationMappings[$fieldName]['inherited'])) { - $cm = $this->_em->getClassMetadata($this->_class->associationMappings[$fieldName]['inherited']); - } else if (isset($this->_class->fieldMappings[$fieldName]['inherited'])) { - $cm = $this->_em->getClassMetadata($this->_class->fieldMappings[$fieldName]['inherited']); - } else { - $cm = $this->_class; - } - - $tableName = $cm->getTableName(); - - $this->_owningTableMap[$fieldName] = $tableName; - $this->_quotedTableMap[$tableName] = $this->quoteStrategy->getTableName($cm, $this->_platform); - - return $tableName; - } - - /** - * {@inheritdoc} - */ - public function executeInserts() - { - if ( ! $this->_queuedInserts) { - return; - } - - $postInsertIds = array(); - $idGen = $this->_class->idGenerator; - $isPostInsertId = $idGen->isPostInsertGenerator(); - - // Prepare statement for the root table - $rootClass = ($this->_class->name !== $this->_class->rootEntityName) ? $this->_em->getClassMetadata($this->_class->rootEntityName) : $this->_class; - $rootPersister = $this->_em->getUnitOfWork()->getEntityPersister($rootClass->name); - $rootTableName = $rootClass->getTableName(); - $rootTableStmt = $this->_conn->prepare($rootPersister->_getInsertSQL()); - - // Prepare statements for sub tables. - $subTableStmts = array(); - - if ($rootClass !== $this->_class) { - $subTableStmts[$this->_class->getTableName()] = $this->_conn->prepare($this->_getInsertSQL()); - } - - foreach ($this->_class->parentClasses as $parentClassName) { - $parentClass = $this->_em->getClassMetadata($parentClassName); - $parentTableName = $parentClass->getTableName(); - - if ($parentClass !== $rootClass) { - $parentPersister = $this->_em->getUnitOfWork()->getEntityPersister($parentClassName); - $subTableStmts[$parentTableName] = $this->_conn->prepare($parentPersister->_getInsertSQL()); - } - } - - // Execute all inserts. For each entity: - // 1) Insert on root table - // 2) Insert on sub tables - foreach ($this->_queuedInserts as $entity) { - $insertData = $this->_prepareInsertData($entity); - - // Execute insert on root table - $paramIndex = 1; - - foreach ($insertData[$rootTableName] as $columnName => $value) { - $rootTableStmt->bindValue($paramIndex++, $value, $this->_columnTypes[$columnName]); - } - - $rootTableStmt->execute(); - - if ($isPostInsertId) { - $id = $idGen->generate($this->_em, $entity); - $postInsertIds[$id] = $entity; - } else { - $id = $this->_em->getUnitOfWork()->getEntityIdentifier($entity); - } - - // Execute inserts on subtables. - // The order doesn't matter because all child tables link to the root table via FK. - foreach ($subTableStmts as $tableName => $stmt) { - $data = isset($insertData[$tableName]) ? $insertData[$tableName] : array(); - $paramIndex = 1; - - foreach ((array) $id as $idName => $idVal) { - $type = isset($this->_columnTypes[$idName]) ? $this->_columnTypes[$idName] : Type::STRING; - - $stmt->bindValue($paramIndex++, $idVal, $type); - } - - foreach ($data as $columnName => $value) { - $stmt->bindValue($paramIndex++, $value, $this->_columnTypes[$columnName]); - } - - $stmt->execute(); - } - } - - $rootTableStmt->closeCursor(); - - foreach ($subTableStmts as $stmt) { - $stmt->closeCursor(); - } - - if ($this->_class->isVersioned) { - $this->assignDefaultVersionValue($entity, $id); - } - - $this->_queuedInserts = array(); - - return $postInsertIds; - } - - /** - * {@inheritdoc} - */ - public function update($entity) - { - $updateData = $this->_prepareUpdateData($entity); - - if (($isVersioned = $this->_class->isVersioned) != false) { - $versionedClass = $this->_getVersionedClassMetadata(); - $versionedTable = $versionedClass->getTableName(); - } - - if ($updateData) { - foreach ($updateData as $tableName => $data) { - $this->_updateTable( - $entity, $this->_quotedTableMap[$tableName], $data, $isVersioned && $versionedTable == $tableName - ); - } - - // Make sure the table with the version column is updated even if no columns on that - // table were affected. - if ($isVersioned) { - if ( ! isset($updateData[$versionedTable])) { - $this->_updateTable($entity, $this->quoteStrategy->getTableName($versionedClass, $this->_platform), array(), true); - } - - $id = $this->_em->getUnitOfWork()->getEntityIdentifier($entity); - $this->assignDefaultVersionValue($entity, $id); - } - } - } - - /** - * {@inheritdoc} - */ - public function delete($entity) - { - $identifier = $this->_em->getUnitOfWork()->getEntityIdentifier($entity); - $this->deleteJoinTableRecords($identifier); - - $id = array_combine($this->_class->getIdentifierColumnNames(), $identifier); - - // If the database platform supports FKs, just - // delete the row from the root table. Cascades do the rest. - if ($this->_platform->supportsForeignKeyConstraints()) { - $this->_conn->delete( - $this->quoteStrategy->getTableName($this->_em->getClassMetadata($this->_class->rootEntityName), $this->_platform), $id - ); - } else { - // Delete from all tables individually, starting from this class' table up to the root table. - $this->_conn->delete($this->quoteStrategy->getTableName($this->_class, $this->_platform), $id); - - foreach ($this->_class->parentClasses as $parentClass) { - $this->_conn->delete( - $this->quoteStrategy->getTableName($this->_em->getClassMetadata($parentClass), $this->_platform), $id - ); - } - } - } - - /** - * {@inheritdoc} - */ - protected function _getSelectEntitiesSQL($criteria, $assoc = null, $lockMode = 0, $limit = null, $offset = null, array $orderBy = null) - { - $idColumns = $this->_class->getIdentifierColumnNames(); - $baseTableAlias = $this->_getSQLTableAlias($this->_class->name); - - // Create the column list fragment only once - if ($this->_selectColumnListSql === null) { - - $this->_rsm = new ResultSetMapping(); - $this->_rsm->addEntityResult($this->_class->name, 'r'); - - // Add regular columns - $columnList = ''; - - foreach ($this->_class->fieldMappings as $fieldName => $mapping) { - if ($columnList != '') $columnList .= ', '; - - $columnList .= $this->_getSelectColumnSQL( - $fieldName, - isset($mapping['inherited']) ? $this->_em->getClassMetadata($mapping['inherited']) : $this->_class - ); - } - - // Add foreign key columns - foreach ($this->_class->associationMappings as $assoc2) { - if ($assoc2['isOwningSide'] && $assoc2['type'] & ClassMetadata::TO_ONE) { - $tableAlias = isset($assoc2['inherited']) ? $this->_getSQLTableAlias($assoc2['inherited']) : $baseTableAlias; - - foreach ($assoc2['targetToSourceKeyColumns'] as $srcColumn) { - if ($columnList != '') $columnList .= ', '; - - $columnList .= $this->getSelectJoinColumnSQL( - $tableAlias, - $srcColumn, - isset($assoc2['inherited']) ? $assoc2['inherited'] : $this->_class->name - ); - } - } - } - - // Add discriminator column (DO NOT ALIAS, see AbstractEntityInheritancePersister#_processSQLResult). - $discrColumn = $this->_class->discriminatorColumn['name']; - $tableAlias = ($this->_class->rootEntityName == $this->_class->name) ? $baseTableAlias : $this->_getSQLTableAlias($this->_class->rootEntityName); - $columnList .= ', ' . $tableAlias . '.' . $discrColumn; - - $resultColumnName = $this->_platform->getSQLResultCasing($discrColumn); - - $this->_rsm->setDiscriminatorColumn('r', $resultColumnName); - $this->_rsm->addMetaResult('r', $resultColumnName, $discrColumn); - } - - // INNER JOIN parent tables - $joinSql = ''; - - foreach ($this->_class->parentClasses as $parentClassName) { - $parentClass = $this->_em->getClassMetadata($parentClassName); - $tableAlias = $this->_getSQLTableAlias($parentClassName); - $joinSql .= ' INNER JOIN ' . $this->quoteStrategy->getTableName($parentClass, $this->_platform) . ' ' . $tableAlias . ' ON '; - $first = true; - - foreach ($idColumns as $idColumn) { - if ($first) $first = false; else $joinSql .= ' AND '; - - $joinSql .= $baseTableAlias . '.' . $idColumn . ' = ' . $tableAlias . '.' . $idColumn; - } - } - - // OUTER JOIN sub tables - foreach ($this->_class->subClasses as $subClassName) { - $subClass = $this->_em->getClassMetadata($subClassName); - $tableAlias = $this->_getSQLTableAlias($subClassName); - - if ($this->_selectColumnListSql === null) { - // Add subclass columns - foreach ($subClass->fieldMappings as $fieldName => $mapping) { - if (isset($mapping['inherited'])) continue; - - $columnList .= ', ' . $this->_getSelectColumnSQL($fieldName, $subClass); - } - - // Add join columns (foreign keys) - foreach ($subClass->associationMappings as $assoc2) { - if ($assoc2['isOwningSide'] && $assoc2['type'] & ClassMetadata::TO_ONE && ! isset($assoc2['inherited'])) { - foreach ($assoc2['targetToSourceKeyColumns'] as $srcColumn) { - if ($columnList != '') $columnList .= ', '; - - $columnList .= $this->getSelectJoinColumnSQL( - $tableAlias, - $srcColumn, - isset($assoc2['inherited']) ? $assoc2['inherited'] : $subClass->name - ); - } - } - } - } - - // Add LEFT JOIN - $joinSql .= ' LEFT JOIN ' . $this->quoteStrategy->getTableName($subClass, $this->_platform) . ' ' . $tableAlias . ' ON '; - $first = true; - - foreach ($idColumns as $idColumn) { - if ($first) $first = false; else $joinSql .= ' AND '; - - $joinSql .= $baseTableAlias . '.' . $idColumn . ' = ' . $tableAlias . '.' . $idColumn; - } - } - - $joinSql .= ($assoc != null && $assoc['type'] == ClassMetadata::MANY_TO_MANY) ? $this->_getSelectManyToManyJoinSQL($assoc) : ''; - - $conditionSql = ($criteria instanceof Criteria) - ? $this->_getSelectConditionCriteriaSQL($criteria) - : $this->_getSelectConditionSQL($criteria, $assoc); - - // If the current class in the root entity, add the filters - if ($filterSql = $this->generateFilterConditionSQL($this->_em->getClassMetadata($this->_class->rootEntityName), $this->_getSQLTableAlias($this->_class->rootEntityName))) { - if ($conditionSql) { - $conditionSql .= ' AND '; - } - - $conditionSql .= $filterSql; - } - - $orderBy = ($assoc !== null && isset($assoc['orderBy'])) ? $assoc['orderBy'] : $orderBy; - $orderBySql = $orderBy ? $this->_getOrderBySQL($orderBy, $baseTableAlias) : ''; - - if ($this->_selectColumnListSql === null) { - $this->_selectColumnListSql = $columnList; - } - - $lockSql = ''; - - if ($lockMode == LockMode::PESSIMISTIC_READ) { - $lockSql = ' ' . $this->_platform->getReadLockSql(); - } else if ($lockMode == LockMode::PESSIMISTIC_WRITE) { - $lockSql = ' ' . $this->_platform->getWriteLockSql(); - } - - return $this->_platform->modifyLimitQuery('SELECT ' . $this->_selectColumnListSql - . ' FROM ' . $this->quoteStrategy->getTableName($this->_class, $this->_platform) . ' ' . $baseTableAlias - . $joinSql - . ($conditionSql != '' ? ' WHERE ' . $conditionSql : '') . $orderBySql, $limit, $offset) - . $lockSql; - } - - /** - * Get the FROM and optionally JOIN conditions to lock the entity managed by this persister. - * - * @return string - */ - public function getLockTablesSql() - { - $idColumns = $this->_class->getIdentifierColumnNames(); - $baseTableAlias = $this->_getSQLTableAlias($this->_class->name); - - // INNER JOIN parent tables - $joinSql = ''; - - foreach ($this->_class->parentClasses as $parentClassName) { - $parentClass = $this->_em->getClassMetadata($parentClassName); - $tableAlias = $this->_getSQLTableAlias($parentClassName); - $joinSql .= ' INNER JOIN ' . $this->quoteStrategy->getTableName($parentClass, $this->_platform) . ' ' . $tableAlias . ' ON '; - $first = true; - - foreach ($idColumns as $idColumn) { - if ($first) $first = false; else $joinSql .= ' AND '; - - $joinSql .= $baseTableAlias . '.' . $idColumn . ' = ' . $tableAlias . '.' . $idColumn; - } - } - - return 'FROM ' .$this->quoteStrategy->getTableName($this->_class, $this->_platform) . ' ' . $baseTableAlias . $joinSql; - } - - /* Ensure this method is never called. This persister overrides _getSelectEntitiesSQL directly. */ - protected function _getSelectColumnListSQL() - { - throw new \BadMethodCallException("Illegal invocation of ".__METHOD__."."); - } - - /** {@inheritdoc} */ - protected function _getInsertColumnList() - { - // Identifier columns must always come first in the column list of subclasses. - $columns = $this->_class->parentClasses ? $this->_class->getIdentifierColumnNames() : array(); - - foreach ($this->_class->reflFields as $name => $field) { - if (isset($this->_class->fieldMappings[$name]['inherited']) && ! isset($this->_class->fieldMappings[$name]['id']) - || isset($this->_class->associationMappings[$name]['inherited']) - || ($this->_class->isVersioned && $this->_class->versionField == $name)) { - continue; - } - - if (isset($this->_class->associationMappings[$name])) { - $assoc = $this->_class->associationMappings[$name]; - if ($assoc['type'] & ClassMetadata::TO_ONE && $assoc['isOwningSide']) { - foreach ($assoc['targetToSourceKeyColumns'] as $sourceCol) { - $columns[] = $sourceCol; - } - } - } else if ($this->_class->name != $this->_class->rootEntityName || - ! $this->_class->isIdGeneratorIdentity() || $this->_class->identifier[0] != $name) { - $columns[] = $this->quoteStrategy->getColumnName($name, $this->_class, $this->_platform); - $this->_columnTypes[$name] = $this->_class->fieldMappings[$name]['type']; - } - } - - // Add discriminator column if it is the topmost class. - if ($this->_class->name == $this->_class->rootEntityName) { - $columns[] = $this->_class->discriminatorColumn['name']; - } - - return $columns; - } - - /** - * {@inheritdoc} - */ - protected function assignDefaultVersionValue($entity, $id) - { - $value = $this->fetchVersionValue($this->_getVersionedClassMetadata(), $id); - $this->_class->setFieldValue($entity, $this->_class->versionField, $value); - } - -} diff --git a/framework/library/Doctrine/ORM/Persisters/ManyToManyPersister.php b/framework/library/Doctrine/ORM/Persisters/ManyToManyPersister.php deleted file mode 100644 index 3f0f1f8..0000000 --- a/framework/library/Doctrine/ORM/Persisters/ManyToManyPersister.php +++ /dev/null @@ -1,446 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Persisters; - -use Doctrine\ORM\Mapping\ClassMetadata, - Doctrine\ORM\PersistentCollection, - Doctrine\ORM\UnitOfWork; - -/** - * Persister for many-to-many collections. - * - * @author Roman Borschel - * @author Guilherme Blanco - * @author Alexander - * @since 2.0 - */ -class ManyToManyPersister extends AbstractCollectionPersister -{ - /** - * {@inheritdoc} - * - * @override - */ - protected function _getDeleteRowSQL(PersistentCollection $coll) - { - $columns = array(); - $mapping = $coll->getMapping(); - $class = $this->_em->getClassMetadata(get_class($coll->getOwner())); - - foreach ($mapping['joinTable']['joinColumns'] as $joinColumn) { - $columns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform); - } - - foreach ($mapping['joinTable']['inverseJoinColumns'] as $joinColumn) { - $columns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform); - } - - return 'DELETE FROM ' . $this->quoteStrategy->getJoinTableName($mapping, $class, $this->platform) - . ' WHERE ' . implode(' = ? AND ', $columns) . ' = ?'; - } - - /** - * {@inheritdoc} - * - * @override - * @internal Order of the parameters must be the same as the order of the columns in - * _getDeleteRowSql. - */ - protected function _getDeleteRowSQLParameters(PersistentCollection $coll, $element) - { - return $this->_collectJoinTableColumnParameters($coll, $element); - } - - /** - * {@inheritdoc} - * - * @override - */ - protected function _getUpdateRowSQL(PersistentCollection $coll) - {} - - /** - * {@inheritdoc} - * - * @override - * @internal Order of the parameters must be the same as the order of the columns in - * _getInsertRowSql. - */ - protected function _getInsertRowSQL(PersistentCollection $coll) - { - $columns = array(); - $mapping = $coll->getMapping(); - $class = $this->_em->getClassMetadata(get_class($coll->getOwner())); - $joinTable = $this->quoteStrategy->getJoinTableName($mapping, $class, $this->platform); - - foreach ($mapping['joinTable']['joinColumns'] as $joinColumn) { - $columns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform); - } - - foreach ($mapping['joinTable']['inverseJoinColumns'] as $joinColumn) { - $columns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform); - } - - return 'INSERT INTO ' . $joinTable . ' (' . implode(', ', $columns) . ')' - . ' VALUES (' . implode(', ', array_fill(0, count($columns), '?')) . ')'; - } - - /** - * {@inheritdoc} - * - * @override - * @internal Order of the parameters must be the same as the order of the columns in - * _getInsertRowSql. - */ - protected function _getInsertRowSQLParameters(PersistentCollection $coll, $element) - { - return $this->_collectJoinTableColumnParameters($coll, $element); - } - - /** - * Collects the parameters for inserting/deleting on the join table in the order - * of the join table columns as specified in ManyToManyMapping#joinTableColumns. - * - * @param $coll - * @param $element - * @return array - */ - private function _collectJoinTableColumnParameters(PersistentCollection $coll, $element) - { - $params = array(); - $mapping = $coll->getMapping(); - $isComposite = count($mapping['joinTableColumns']) > 2; - - $identifier1 = $this->_uow->getEntityIdentifier($coll->getOwner()); - $identifier2 = $this->_uow->getEntityIdentifier($element); - - if ($isComposite) { - $class1 = $this->_em->getClassMetadata(get_class($coll->getOwner())); - $class2 = $coll->getTypeClass(); - } - - foreach ($mapping['joinTableColumns'] as $joinTableColumn) { - $isRelationToSource = isset($mapping['relationToSourceKeyColumns'][$joinTableColumn]); - - if ( ! $isComposite) { - $params[] = $isRelationToSource ? array_pop($identifier1) : array_pop($identifier2); - - continue; - } - - if ($isRelationToSource) { - $params[] = $identifier1[$class1->getFieldForColumn($mapping['relationToSourceKeyColumns'][$joinTableColumn])]; - - continue; - } - - $params[] = $identifier2[$class2->getFieldForColumn($mapping['relationToTargetKeyColumns'][$joinTableColumn])]; - } - - return $params; - } - - /** - * {@inheritdoc} - * - * @override - */ - protected function _getDeleteSQL(PersistentCollection $coll) - { - $columns = array(); - $mapping = $coll->getMapping(); - $class = $this->_em->getClassMetadata(get_class($coll->getOwner())); - $joinTable = $this->quoteStrategy->getJoinTableName($mapping, $class, $this->platform); - - foreach ($mapping['joinTable']['joinColumns'] as $joinColumn) { - $columns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform); - } - - return 'DELETE FROM ' . $joinTable - . ' WHERE ' . implode(' = ? AND ', $columns) . ' = ?'; - } - - /** - * {@inheritdoc} - * - * @override - * @internal Order of the parameters must be the same as the order of the columns in - * _getDeleteSql. - */ - protected function _getDeleteSQLParameters(PersistentCollection $coll) - { - $identifier = $this->_uow->getEntityIdentifier($coll->getOwner()); - $mapping = $coll->getMapping(); - $params = array(); - - // Optimization for single column identifier - if (count($mapping['relationToSourceKeyColumns']) === 1) { - $params[] = array_pop($identifier); - - return $params; - } - - // Composite identifier - $sourceClass = $this->_em->getClassMetadata(get_class($coll->getOwner())); - - foreach ($mapping['relationToSourceKeyColumns'] as $srcColumn) { - $params[] = $identifier[$sourceClass->fieldNames[$srcColumn]]; - } - - return $params; - } - - /** - * {@inheritdoc} - */ - public function count(PersistentCollection $coll) - { - $conditions = array(); - $params = array(); - $mapping = $coll->getMapping(); - $association = $mapping; - $class = $this->_em->getClassMetadata($mapping['sourceEntity']); - $id = $this->_em->getUnitOfWork()->getEntityIdentifier($coll->getOwner()); - - if ( ! $mapping['isOwningSide']) { - $targetEntity = $this->_em->getClassMetadata($mapping['targetEntity']); - $association = $targetEntity->associationMappings[$mapping['mappedBy']]; - } - - $joinColumns = ( ! $mapping['isOwningSide']) - ? $association['joinTable']['inverseJoinColumns'] - : $association['joinTable']['joinColumns']; - - foreach ($joinColumns as $joinColumn) { - $columnName = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform); - $referencedName = $joinColumn['referencedColumnName']; - $conditions[] = $columnName . ' = ?'; - $params[] = ($class->containsForeignIdentifier) - ? $id[$class->getFieldForColumn($referencedName)] - : $id[$class->fieldNames[$referencedName]]; - } - - $joinTableName = $this->quoteStrategy->getJoinTableName($association, $class, $this->platform); - list($joinTargetEntitySQL, $filterSql) = $this->getFilterSql($mapping); - - if ($filterSql) { - $conditions[] = $filterSql; - } - - $sql = 'SELECT COUNT(*)' - . ' FROM ' . $joinTableName . ' t' - . $joinTargetEntitySQL - . ' WHERE ' . implode(' AND ', $conditions); - - return $this->_conn->fetchColumn($sql, $params); - } - - /** - * @param PersistentCollection $coll - * @param int $offset - * @param int $length - * @return array - */ - public function slice(PersistentCollection $coll, $offset, $length = null) - { - $mapping = $coll->getMapping(); - - return $this->_em->getUnitOfWork()->getEntityPersister($mapping['targetEntity'])->getManyToManyCollection($mapping, $coll->getOwner(), $offset, $length); - } - - /** - * @param PersistentCollection $coll - * @param object $element - * @return boolean - */ - public function contains(PersistentCollection $coll, $element) - { - $uow = $this->_em->getUnitOfWork(); - - // Shortcut for new entities - $entityState = $uow->getEntityState($element, UnitOfWork::STATE_NEW); - - if ($entityState === UnitOfWork::STATE_NEW) { - return false; - } - - // Entity is scheduled for inclusion - if ($entityState === UnitOfWork::STATE_MANAGED && $uow->isScheduledForInsert($element)) { - return false; - } - - list($quotedJoinTable, $whereClauses, $params) = $this->getJoinTableRestrictions($coll, $element, true); - - $sql = 'SELECT 1 FROM ' . $quotedJoinTable . ' WHERE ' . implode(' AND ', $whereClauses); - - return (bool) $this->_conn->fetchColumn($sql, $params); - } - - /** - * @param PersistentCollection $coll - * @param object $element - * @return boolean - */ - public function removeElement(PersistentCollection $coll, $element) - { - $uow = $this->_em->getUnitOfWork(); - - // shortcut for new entities - $entityState = $uow->getEntityState($element, UnitOfWork::STATE_NEW); - - if ($entityState === UnitOfWork::STATE_NEW) { - return false; - } - - // If Entity is scheduled for inclusion, it is not in this collection. - // We can assure that because it would have return true before on array check - if ($entityState === UnitOfWork::STATE_MANAGED && $uow->isScheduledForInsert($element)) { - return false; - } - - list($quotedJoinTable, $whereClauses, $params) = $this->getJoinTableRestrictions($coll, $element, false); - - $sql = 'DELETE FROM ' . $quotedJoinTable . ' WHERE ' . implode(' AND ', $whereClauses); - - return (bool) $this->_conn->executeUpdate($sql, $params); - } - - /** - * @param \Doctrine\ORM\PersistentCollection $coll - * @param object $element - * @param boolean $addFilters Whether the filter SQL should be included or not. - * @return array - */ - private function getJoinTableRestrictions(PersistentCollection $coll, $element, $addFilters) - { - $uow = $this->_em->getUnitOfWork(); - $mapping = $filterMapping = $coll->getMapping(); - - if ( ! $mapping['isOwningSide']) { - $sourceClass = $this->_em->getClassMetadata($mapping['targetEntity']); - $targetClass = $this->_em->getClassMetadata($mapping['sourceEntity']); - $sourceId = $uow->getEntityIdentifier($element); - $targetId = $uow->getEntityIdentifier($coll->getOwner()); - - $mapping = $sourceClass->associationMappings[$mapping['mappedBy']]; - } else { - $sourceClass = $this->_em->getClassMetadata($mapping['sourceEntity']); - $targetClass = $this->_em->getClassMetadata($mapping['targetEntity']); - $sourceId = $uow->getEntityIdentifier($coll->getOwner()); - $targetId = $uow->getEntityIdentifier($element); - } - - $quotedJoinTable = $this->quoteStrategy->getJoinTableName($mapping, $sourceClass, $this->platform); - $whereClauses = array(); - $params = array(); - - foreach ($mapping['joinTableColumns'] as $joinTableColumn) { - $whereClauses[] = $joinTableColumn . ' = ?'; - - if (isset($mapping['relationToTargetKeyColumns'][$joinTableColumn])) { - $params[] = ($targetClass->containsForeignIdentifier) - ? $targetId[$targetClass->getFieldForColumn($mapping['relationToTargetKeyColumns'][$joinTableColumn])] - : $targetId[$targetClass->fieldNames[$mapping['relationToTargetKeyColumns'][$joinTableColumn]]]; - continue; - } - - // relationToSourceKeyColumns - $params[] = ($sourceClass->containsForeignIdentifier) - ? $sourceId[$sourceClass->getFieldForColumn($mapping['relationToSourceKeyColumns'][$joinTableColumn])] - : $sourceId[$sourceClass->fieldNames[$mapping['relationToSourceKeyColumns'][$joinTableColumn]]]; - } - - if ($addFilters) { - list($joinTargetEntitySQL, $filterSql) = $this->getFilterSql($filterMapping); - if ($filterSql) { - $quotedJoinTable .= ' t ' . $joinTargetEntitySQL; - $whereClauses[] = $filterSql; - } - } - - return array($quotedJoinTable, $whereClauses, $params); - } - - /** - * Generates the filter SQL for a given mapping. - * - * This method is not used for actually grabbing the related entities - * but when the extra-lazy collection methods are called on a filtered - * association. This is why besides the many to many table we also - * have to join in the actual entities table leading to additional - * JOIN. - * - * @param array $mapping Array containing mapping information. - * - * @return string The SQL query part to add to a query. - */ - public function getFilterSql($mapping) - { - $targetClass = $this->_em->getClassMetadata($mapping['targetEntity']); - - if ($mapping['isOwningSide']) { - $joinColumns = $mapping['relationToTargetKeyColumns']; - } else { - $mapping = $targetClass->associationMappings[$mapping['mappedBy']]; - $joinColumns = $mapping['relationToSourceKeyColumns']; - } - - $targetClass = $this->_em->getClassMetadata($targetClass->rootEntityName); - - // A join is needed if there is filtering on the target entity - $joinTargetEntitySQL = ''; - if ($filterSql = $this->generateFilterConditionSQL($targetClass, 'te')) { - $joinTargetEntitySQL = ' JOIN ' - . $this->quoteStrategy->getTableName($targetClass, $this->platform) . ' te' - . ' ON'; - - $joinTargetEntitySQLClauses = array(); - foreach ($joinColumns as $joinTableColumn => $targetTableColumn) { - $joinTargetEntitySQLClauses[] = ' t.' . $joinTableColumn . ' = ' . 'te.' . $targetTableColumn; - } - - $joinTargetEntitySQL .= implode(' AND ', $joinTargetEntitySQLClauses); - } - - return array($joinTargetEntitySQL, $filterSql); - } - - /** - * Generates the filter SQL for a given entity and table alias. - * - * @param ClassMetadata $targetEntity Metadata of the target entity. - * @param string $targetTableAlias The table alias of the joined/selected table. - * - * @return string The SQL query part to add to a query. - */ - protected function generateFilterConditionSQL(ClassMetadata $targetEntity, $targetTableAlias) - { - $filterClauses = array(); - - foreach ($this->_em->getFilters()->getEnabledFilters() as $filter) { - if ($filterExpr = $filter->addFilterConstraint($targetEntity, $targetTableAlias)) { - $filterClauses[] = '(' . $filterExpr . ')'; - } - } - - $sql = implode(' AND ', $filterClauses); - return $sql ? "(" . $sql . ")" : ""; - } -} diff --git a/framework/library/Doctrine/ORM/Persisters/OneToManyPersister.php b/framework/library/Doctrine/ORM/Persisters/OneToManyPersister.php deleted file mode 100644 index aa0208f..0000000 --- a/framework/library/Doctrine/ORM/Persisters/OneToManyPersister.php +++ /dev/null @@ -1,212 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Persisters; - -use Doctrine\ORM\PersistentCollection, - Doctrine\ORM\UnitOfWork; - -/** - * Persister for one-to-many collections. - * - * @author Roman Borschel - * @author Guilherme Blanco - * @author Alexander - * @since 2.0 - */ -class OneToManyPersister extends AbstractCollectionPersister -{ - /** - * Generates the SQL UPDATE that updates a particular row's foreign - * key to null. - * - * @param PersistentCollection $coll - * @return string - * @override - */ - protected function _getDeleteRowSQL(PersistentCollection $coll) - { - $mapping = $coll->getMapping(); - $class = $this->_em->getClassMetadata($mapping['targetEntity']); - - return 'DELETE FROM ' . $this->quoteStrategy->getTableName($class, $this->platform) - . ' WHERE ' . implode('= ? AND ', $class->getIdentifierColumnNames()) . ' = ?'; - } - - /** - * {@inheritdoc} - * - */ - protected function _getDeleteRowSQLParameters(PersistentCollection $coll, $element) - { - return array_values($this->_uow->getEntityIdentifier($element)); - } - - protected function _getInsertRowSQL(PersistentCollection $coll) - { - return "UPDATE xxx SET foreign_key = yyy WHERE foreign_key = zzz"; - } - - /** - * Gets the SQL parameters for the corresponding SQL statement to insert the given - * element of the given collection into the database. - * - * @param PersistentCollection $coll - * @param mixed $element - */ - protected function _getInsertRowSQLParameters(PersistentCollection $coll, $element) - {} - - /* Not used for OneToManyPersister */ - protected function _getUpdateRowSQL(PersistentCollection $coll) - { - return; - } - - /** - * Generates the SQL UPDATE that updates all the foreign keys to null. - * - * @param PersistentCollection $coll - */ - protected function _getDeleteSQL(PersistentCollection $coll) - { - - } - - /** - * Gets the SQL parameters for the corresponding SQL statement to delete - * the given collection. - * - * @param PersistentCollection $coll - */ - protected function _getDeleteSQLParameters(PersistentCollection $coll) - {} - - /** - * {@inheritdoc} - */ - public function count(PersistentCollection $coll) - { - $mapping = $coll->getMapping(); - $targetClass = $this->_em->getClassMetadata($mapping['targetEntity']); - $sourceClass = $this->_em->getClassMetadata($mapping['sourceEntity']); - $id = $this->_em->getUnitOfWork()->getEntityIdentifier($coll->getOwner()); - - $whereClauses = array(); - $params = array(); - - foreach ($targetClass->associationMappings[$mapping['mappedBy']]['joinColumns'] as $joinColumn) { - $whereClauses[] = $joinColumn['name'] . ' = ?'; - - $params[] = ($targetClass->containsForeignIdentifier) - ? $id[$sourceClass->getFieldForColumn($joinColumn['referencedColumnName'])] - : $id[$sourceClass->fieldNames[$joinColumn['referencedColumnName']]]; - } - - $filterTargetClass = $this->_em->getClassMetadata($targetClass->rootEntityName); - foreach ($this->_em->getFilters()->getEnabledFilters() as $filter) { - if ($filterExpr = $filter->addFilterConstraint($filterTargetClass, 't')) { - $whereClauses[] = '(' . $filterExpr . ')'; - } - } - - $sql = 'SELECT count(*)' - . ' FROM ' . $this->quoteStrategy->getTableName($targetClass, $this->platform) . ' t' - . ' WHERE ' . implode(' AND ', $whereClauses); - - return $this->_conn->fetchColumn($sql, $params); - } - - /** - * @param PersistentCollection $coll - * @param int $offset - * @param int $length - * @return \Doctrine\Common\Collections\ArrayCollection - */ - public function slice(PersistentCollection $coll, $offset, $length = null) - { - $mapping = $coll->getMapping(); - $uow = $this->_em->getUnitOfWork(); - $persister = $uow->getEntityPersister($mapping['targetEntity']); - - return $persister->getOneToManyCollection($mapping, $coll->getOwner(), $offset, $length); - } - - /** - * @param PersistentCollection $coll - * @param object $element - * @return boolean - */ - public function contains(PersistentCollection $coll, $element) - { - $mapping = $coll->getMapping(); - $uow = $this->_em->getUnitOfWork(); - - // shortcut for new entities - $entityState = $uow->getEntityState($element, UnitOfWork::STATE_NEW); - - if ($entityState === UnitOfWork::STATE_NEW) { - return false; - } - - // Entity is scheduled for inclusion - if ($entityState === UnitOfWork::STATE_MANAGED && $uow->isScheduledForInsert($element)) { - return false; - } - - $persister = $uow->getEntityPersister($mapping['targetEntity']); - - // only works with single id identifier entities. Will throw an - // exception in Entity Persisters if that is not the case for the - // 'mappedBy' field. - $id = current( $uow->getEntityIdentifier($coll->getOwner())); - - return $persister->exists($element, array($mapping['mappedBy'] => $id)); - } - - /** - * @param PersistentCollection $coll - * @param object $element - * @return boolean - */ - public function removeElement(PersistentCollection $coll, $element) - { - $uow = $this->_em->getUnitOfWork(); - - // shortcut for new entities - $entityState = $uow->getEntityState($element, UnitOfWork::STATE_NEW); - - if ($entityState === UnitOfWork::STATE_NEW) { - return false; - } - - // If Entity is scheduled for inclusion, it is not in this collection. - // We can assure that because it would have return true before on array check - if ($entityState === UnitOfWork::STATE_MANAGED && $uow->isScheduledForInsert($element)) { - return false; - } - - $mapping = $coll->getMapping(); - $class = $this->_em->getClassMetadata($mapping['targetEntity']); - $sql = 'DELETE FROM ' . $this->quoteStrategy->getTableName($class, $this->platform) - . ' WHERE ' . implode('= ? AND ', $class->getIdentifierColumnNames()) . ' = ?'; - - return (bool) $this->_conn->executeUpdate($sql, $this->_getDeleteRowSQLParameters($coll, $element)); - } -} diff --git a/framework/library/Doctrine/ORM/Persisters/SingleTablePersister.php b/framework/library/Doctrine/ORM/Persisters/SingleTablePersister.php deleted file mode 100644 index 9fedcaa..0000000 --- a/framework/library/Doctrine/ORM/Persisters/SingleTablePersister.php +++ /dev/null @@ -1,163 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Persisters; - -use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\Common\Collections\Criteria; - -/** - * Persister for entities that participate in a hierarchy mapped with the - * SINGLE_TABLE strategy. - * - * @author Roman Borschel - * @author Benjamin Eberlei - * @author Alexander - * @since 2.0 - * @link http://martinfowler.com/eaaCatalog/singleTableInheritance.html - */ -class SingleTablePersister extends AbstractEntityInheritancePersister -{ - /** {@inheritdoc} */ - protected function _getDiscriminatorColumnTableName() - { - return $this->_class->getTableName(); - } - - /** {@inheritdoc} */ - protected function _getSelectColumnListSQL() - { - if ($this->_selectColumnListSql !== null) { - return $this->_selectColumnListSql; - } - - $columnList = parent::_getSelectColumnListSQL(); - - $rootClass = $this->_em->getClassMetadata($this->_class->rootEntityName); - $tableAlias = $this->_getSQLTableAlias($rootClass->name); - - // Append discriminator column - $discrColumn = $this->_class->discriminatorColumn['name']; - $columnList .= ', ' . $tableAlias . '.' . $discrColumn; - - $resultColumnName = $this->_platform->getSQLResultCasing($discrColumn); - - $this->_rsm->setDiscriminatorColumn('r', $resultColumnName); - $this->_rsm->addMetaResult('r', $resultColumnName, $discrColumn); - - // Append subclass columns - foreach ($this->_class->subClasses as $subClassName) { - $subClass = $this->_em->getClassMetadata($subClassName); - - // Regular columns - foreach ($subClass->fieldMappings as $fieldName => $mapping) { - if ( ! isset($mapping['inherited'])) { - $columnList .= ', ' . $this->_getSelectColumnSQL($fieldName, $subClass); - } - } - - // Foreign key columns - foreach ($subClass->associationMappings as $assoc) { - if ($assoc['isOwningSide'] && $assoc['type'] & ClassMetadata::TO_ONE && ! isset($assoc['inherited'])) { - foreach ($assoc['targetToSourceKeyColumns'] as $srcColumn) { - if ($columnList != '') $columnList .= ', '; - - $columnList .= $this->getSelectJoinColumnSQL( - $tableAlias, - $srcColumn, - isset($assoc['inherited']) ? $assoc['inherited'] : $this->_class->name - ); - } - } - } - } - - $this->_selectColumnListSql = $columnList; - return $this->_selectColumnListSql; - } - - /** {@inheritdoc} */ - protected function _getInsertColumnList() - { - $columns = parent::_getInsertColumnList(); - - // Add discriminator column to the INSERT SQL - $columns[] = $this->_class->discriminatorColumn['name']; - - return $columns; - } - - /** {@inheritdoc} */ - protected function _getSQLTableAlias($className, $assocName = '') - { - return parent::_getSQLTableAlias($this->_class->rootEntityName, $assocName); - } - - /** {@inheritdoc} */ - protected function _getSelectConditionSQL(array $criteria, $assoc = null) - { - $conditionSql = parent::_getSelectConditionSQL($criteria, $assoc); - - if ($conditionSql) { - $conditionSql .= ' AND '; - } - - return $conditionSql . $this->_getSelectConditionDiscriminatorValueSQL(); - } - - /** {@inheritdoc} */ - protected function _getSelectConditionCriteriaSQL(Criteria $criteria) - { - $conditionSql = parent::_getSelectConditionCriteriaSQL($criteria); - - if ($conditionSql) { - $conditionSql .= ' AND '; - } - - return $conditionSql . $this->_getSelectConditionDiscriminatorValueSQL(); - } - - protected function _getSelectConditionDiscriminatorValueSQL() - { - $values = array(); - - if ($this->_class->discriminatorValue !== null) { // discriminators can be 0 - $values[] = $this->_conn->quote($this->_class->discriminatorValue); - } - - $discrValues = array_flip($this->_class->discriminatorMap); - - foreach ($this->_class->subClasses as $subclassName) { - $values[] = $this->_conn->quote($discrValues[$subclassName]); - } - - return $this->_getSQLTableAlias($this->_class->name) . '.' . $this->_class->discriminatorColumn['name'] - . ' IN (' . implode(', ', $values) . ')'; - } - - /** {@inheritdoc} */ - protected function generateFilterConditionSQL(ClassMetadata $targetEntity, $targetTableAlias) - { - // Ensure that the filters are applied to the root entity of the inheritance tree - $targetEntity = $this->_em->getClassMetadata($targetEntity->rootEntityName); - // we dont care about the $targetTableAlias, in a STI there is only one table. - - return parent::generateFilterConditionSQL($targetEntity, $targetTableAlias); - } -} diff --git a/framework/library/Doctrine/ORM/Persisters/SqlExpressionVisitor.php b/framework/library/Doctrine/ORM/Persisters/SqlExpressionVisitor.php deleted file mode 100644 index 2fb685f..0000000 --- a/framework/library/Doctrine/ORM/Persisters/SqlExpressionVisitor.php +++ /dev/null @@ -1,102 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Persisters; - -use Doctrine\Common\Collections\Expr\ExpressionVisitor; -use Doctrine\Common\Collections\Expr\Comparison; -use Doctrine\Common\Collections\Expr\Value; -use Doctrine\Common\Collections\Expr\CompositeExpression; - -/** - * Visit Expressions and generate SQL WHERE conditions from them. - * - * @author Benjamin Eberlei - * @since 2.3 - */ -class SqlExpressionVisitor extends ExpressionVisitor -{ - /** - * @var \Doctrine\ORM\Persisters\BasicEntityPersister - */ - private $persister; - - /** - * @param \Doctrine\ORM\Persisters\BasicEntityPersister $persister - */ - public function __construct(BasicEntityPersister $persister) - { - $this->persister = $persister; - } - - /** - * Convert a comparison expression into the target query language output - * - * @param \Doctrine\Common\Collections\Expr\Comparison $comparison - * - * @return mixed - */ - public function walkComparison(Comparison $comparison) - { - $field = $comparison->getField(); - $value = $comparison->getValue()->getValue(); // shortcut for walkValue() - - return $this->persister->getSelectConditionStatementSQL($field, $value, null, $comparison->getOperator()); - } - - /** - * Convert a composite expression into the target query language output - * - * @param \Doctrine\Common\Collections\Expr\CompositeExpression $expr - * - * @return mixed - */ - public function walkCompositeExpression(CompositeExpression $expr) - { - $expressionList = array(); - - foreach ($expr->getExpressionList() as $child) { - $expressionList[] = $this->dispatch($child); - } - - switch($expr->getType()) { - case CompositeExpression::TYPE_AND: - return '(' . implode(' AND ', $expressionList) . ')'; - - case CompositeExpression::TYPE_OR: - return '(' . implode(' OR ', $expressionList) . ')'; - - default: - throw new \RuntimeException("Unknown composite " . $expr->getType()); - } - } - - /** - * Convert a value expression into the target query language part. - * - * @param \Doctrine\Common\Collections\Expr\Value $value - * - * @return mixed - */ - public function walkValue(Value $value) - { - return '?'; - } -} - diff --git a/framework/library/Doctrine/ORM/Persisters/SqlValueVisitor.php b/framework/library/Doctrine/ORM/Persisters/SqlValueVisitor.php deleted file mode 100644 index aa4d68d..0000000 --- a/framework/library/Doctrine/ORM/Persisters/SqlValueVisitor.php +++ /dev/null @@ -1,100 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Persisters; - -use Doctrine\Common\Collections\Expr\ExpressionVisitor; -use Doctrine\Common\Collections\Expr\Comparison; -use Doctrine\Common\Collections\Expr\Value; -use Doctrine\Common\Collections\Expr\CompositeExpression; - -use Doctrine\ORM\Mapping\ClassMetadata; - -use Doctrine\DBAL\Types\Type; -use Doctrine\DBAL\Connection; - -/** - * Extract the values from a criteria/expression - * - * @author Benjamin Eberlei - */ -class SqlValueVisitor extends ExpressionVisitor -{ - /** - * @var array - */ - private $values = array(); - - /** - * @var array - */ - private $types = array(); - - /** - * Convert a comparison expression into the target query language output - * - * @param \Doctrine\Common\Collections\Expr\Comparison $comparison - * - * @return mixed - */ - public function walkComparison(Comparison $comparison) - { - $value = $comparison->getValue()->getValue(); - $field = $comparison->getField(); - - $this->values[] = $value; - $this->types[] = array($field, $value); - } - - /** - * Convert a composite expression into the target query language output - * - * @param \Doctrine\Common\Collections\Expr\CompositeExpression $expr - * - * @return mixed - */ - public function walkCompositeExpression(CompositeExpression $expr) - { - foreach ($expr->getExpressionList() as $child) { - $this->dispatch($child); - } - } - - /** - * Convert a value expression into the target query language part. - * - * @param \Doctrine\Common\Collections\Expr\Value $value - * - * @return mixed - */ - public function walkValue(Value $value) - { - return; - } - - /** - * Return the Parameters and Types necessary for matching the last visited expression. - * - * @return array - */ - public function getParamsAndTypes() - { - return array($this->values, $this->types); - } -} diff --git a/framework/library/Doctrine/ORM/Persisters/UnionSubclassPersister.php b/framework/library/Doctrine/ORM/Persisters/UnionSubclassPersister.php deleted file mode 100644 index ef844a7..0000000 --- a/framework/library/Doctrine/ORM/Persisters/UnionSubclassPersister.php +++ /dev/null @@ -1,8 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -/** - * Pessimistic Lock Exception - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @author Benjamin Eberlei - * @author Roman Borschel - */ -class PessimisticLockException extends ORMException -{ - public static function lockFailed() - { - return new self("The pessimistic lock failed."); - } -} diff --git a/framework/library/Doctrine/ORM/Proxy/Autoloader.php b/framework/library/Doctrine/ORM/Proxy/Autoloader.php deleted file mode 100644 index 0b4d9a0..0000000 --- a/framework/library/Doctrine/ORM/Proxy/Autoloader.php +++ /dev/null @@ -1,78 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Proxy; - -/** - * Special Autoloader for Proxy classes because them not being PSR-0 compatible. - * - * @author Benjamin Eberlei - */ -class Autoloader -{ - /** - * Resolve proxy class name to a filename based on the following pattern. - * - * 1. Remove Proxy namespace from class name - * 2. Remove namespace seperators from remaining class name. - * 3. Return PHP filename from proxy-dir with the result from 2. - * - * @param string $proxyDir - * @param string $proxyNamespace - * @param string $className - * @return string - */ - static public function resolveFile($proxyDir, $proxyNamespace, $className) - { - if (0 !== strpos($className, $proxyNamespace)) { - throw ProxyException::notProxyClass($className, $proxyNamespace); - } - - $className = str_replace('\\', '', substr($className, strlen($proxyNamespace) +1)); - return $proxyDir . DIRECTORY_SEPARATOR . $className.'.php'; - } - - /** - * Register and return autoloader callback for the given proxy dir and - * namespace. - * - * @param string $proxyDir - * @param string $proxyNamespace - * @param Closure $notFoundCallback Invoked when the proxy file is not found. - * @return Closure - */ - static public function register($proxyDir, $proxyNamespace, \Closure $notFoundCallback = null) - { - $proxyNamespace = ltrim($proxyNamespace, "\\"); - $autoloader = function($className) use ($proxyDir, $proxyNamespace, $notFoundCallback) { - if (0 === strpos($className, $proxyNamespace)) { - $file = Autoloader::resolveFile($proxyDir, $proxyNamespace, $className); - - if ($notFoundCallback && ! file_exists($file)) { - $notFoundCallback($proxyDir, $proxyNamespace, $className); - } - - require $file; - } - }; - spl_autoload_register($autoloader); - return $autoloader; - } -} - diff --git a/framework/library/Doctrine/ORM/Proxy/Proxy.php b/framework/library/Doctrine/ORM/Proxy/Proxy.php deleted file mode 100644 index 47cda90..0000000 --- a/framework/library/Doctrine/ORM/Proxy/Proxy.php +++ /dev/null @@ -1,30 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Proxy; - -use Doctrine\Common\Persistence\Proxy as BaseProxy; - -/** - * Interface for proxy classes. - * - * @author Roman Borschel - * @since 2.0 - */ -interface Proxy extends BaseProxy {} diff --git a/framework/library/Doctrine/ORM/Proxy/ProxyException.php b/framework/library/Doctrine/ORM/Proxy/ProxyException.php deleted file mode 100644 index 4e26d86..0000000 --- a/framework/library/Doctrine/ORM/Proxy/ProxyException.php +++ /dev/null @@ -1,52 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Proxy; - -/** - * ORM Proxy Exception - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @author Benjamin Eberlei - */ -class ProxyException extends \Doctrine\ORM\ORMException { - - public static function proxyDirectoryRequired() { - return new self("You must configure a proxy directory. See docs for details"); - } - - public static function proxyDirectoryNotWritable() { - return new self("Your proxy directory must be writable."); - } - - public static function proxyNamespaceRequired() { - return new self("You must configure a proxy namespace. See docs for details"); - } - - public static function notProxyClass($className, $proxyNamespace) - { - return new self(sprintf( - "The class %s is not part of the proxy namespace %s", - $className, $proxyNamespace - )); - } - -} diff --git a/framework/library/Doctrine/ORM/Proxy/ProxyFactory.php b/framework/library/Doctrine/ORM/Proxy/ProxyFactory.php deleted file mode 100644 index df74207..0000000 --- a/framework/library/Doctrine/ORM/Proxy/ProxyFactory.php +++ /dev/null @@ -1,410 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Proxy; - -use Doctrine\ORM\EntityManager, - Doctrine\ORM\Mapping\ClassMetadata, - Doctrine\Common\Util\ClassUtils; - -/** - * This factory is used to create proxy objects for entities at runtime. - * - * @author Roman Borschel - * @author Giorgio Sironi - * @since 2.0 - */ -class ProxyFactory -{ - /** The EntityManager this factory is bound to. */ - private $_em; - /** Whether to automatically (re)generate proxy classes. */ - private $_autoGenerate; - /** The namespace that contains all proxy classes. */ - private $_proxyNamespace; - /** The directory that contains all proxy classes. */ - private $_proxyDir; - - /** - * Used to match very simple id methods that don't need - * to be proxied since the identifier is known. - * - * @var string - */ - const PATTERN_MATCH_ID_METHOD = '((public\s)?(function\s{1,}%s\s?\(\)\s{1,})\s{0,}{\s{0,}return\s{0,}\$this->%s;\s{0,}})i'; - - /** - * Initializes a new instance of the ProxyFactory class that is - * connected to the given EntityManager. - * - * @param EntityManager $em The EntityManager the new factory works for. - * @param string $proxyDir The directory to use for the proxy classes. It must exist. - * @param string $proxyNs The namespace to use for the proxy classes. - * @param boolean $autoGenerate Whether to automatically generate proxy classes. - */ - public function __construct(EntityManager $em, $proxyDir, $proxyNs, $autoGenerate = false) - { - if ( ! $proxyDir) { - throw ProxyException::proxyDirectoryRequired(); - } - if ( ! $proxyNs) { - throw ProxyException::proxyNamespaceRequired(); - } - $this->_em = $em; - $this->_proxyDir = $proxyDir; - $this->_autoGenerate = $autoGenerate; - $this->_proxyNamespace = $proxyNs; - } - - /** - * Gets a reference proxy instance for the entity of the given type and identified by - * the given identifier. - * - * @param string $className - * @param mixed $identifier - * @return object - */ - public function getProxy($className, $identifier) - { - $fqn = ClassUtils::generateProxyClassName($className, $this->_proxyNamespace); - - if (! class_exists($fqn, false)) { - $fileName = $this->getProxyFileName($className); - if ($this->_autoGenerate) { - $this->_generateProxyClass($this->_em->getClassMetadata($className), $fileName, self::$_proxyClassTemplate); - } - require $fileName; - } - - $entityPersister = $this->_em->getUnitOfWork()->getEntityPersister($className); - - return new $fqn($entityPersister, $identifier); - } - - /** - * Generate the Proxy file name - * - * @param string $className - * @param string $baseDir Optional base directory for proxy file name generation. - * If not specified, the directory configured on the Configuration of the - * EntityManager will be used by this factory. - * @return string - */ - private function getProxyFileName($className, $baseDir = null) - { - $proxyDir = $baseDir ?: $this->_proxyDir; - - return $proxyDir . DIRECTORY_SEPARATOR . '__CG__' . str_replace('\\', '', $className) . '.php'; - } - - /** - * Generates proxy classes for all given classes. - * - * @param array $classes The classes (ClassMetadata instances) for which to generate proxies. - * @param string $toDir The target directory of the proxy classes. If not specified, the - * directory configured on the Configuration of the EntityManager used - * by this factory is used. - * @return int Number of generated proxies. - */ - public function generateProxyClasses(array $classes, $toDir = null) - { - $proxyDir = $toDir ?: $this->_proxyDir; - $proxyDir = rtrim($proxyDir, DIRECTORY_SEPARATOR); - $num = 0; - - foreach ($classes as $class) { - /* @var $class ClassMetadata */ - if ($class->isMappedSuperclass || $class->reflClass->isAbstract()) { - continue; - } - - $proxyFileName = $this->getProxyFileName($class->name, $proxyDir); - - $this->_generateProxyClass($class, $proxyFileName, self::$_proxyClassTemplate); - $num++; - } - - return $num; - } - - /** - * Generates a proxy class file. - * - * @param ClassMetadata $class Metadata for the original class - * @param string $fileName Filename (full path) for the generated class - * @param string $file The proxy class template data - */ - private function _generateProxyClass(ClassMetadata $class, $fileName, $file) - { - $methods = $this->_generateMethods($class); - $sleepImpl = $this->_generateSleep($class); - $cloneImpl = $class->reflClass->hasMethod('__clone') ? 'parent::__clone();' : ''; // hasMethod() checks case-insensitive - - $placeholders = array( - '', - '', '', - '', '', '' - ); - - $className = ltrim($class->name, '\\'); - $proxyClassName = ClassUtils::generateProxyClassName($class->name, $this->_proxyNamespace); - $parts = explode('\\', strrev($proxyClassName), 2); - $proxyClassNamespace = strrev($parts[1]); - $proxyClassName = strrev($parts[0]); - - $replacements = array( - $proxyClassNamespace, - $proxyClassName, - $className, - $methods, - $sleepImpl, - $cloneImpl - ); - - $file = str_replace($placeholders, $replacements, $file); - - $parentDirectory = dirname($fileName); - - if ( ! is_dir($parentDirectory)) { - if (false === @mkdir($parentDirectory, 0775, true)) { - throw ProxyException::proxyDirectoryNotWritable(); - } - } else if ( ! is_writable($parentDirectory)) { - throw ProxyException::proxyDirectoryNotWritable(); - } - - $tmpFileName = $fileName . '.' . uniqid("", true); - file_put_contents($tmpFileName, $file); - rename($tmpFileName, $fileName); - } - - /** - * Generates the methods of a proxy class. - * - * @param ClassMetadata $class - * @return string The code of the generated methods. - */ - private function _generateMethods(ClassMetadata $class) - { - $methods = ''; - - $methodNames = array(); - foreach ($class->reflClass->getMethods() as $method) { - /* @var $method ReflectionMethod */ - if ($method->isConstructor() || in_array(strtolower($method->getName()), array("__sleep", "__clone")) || isset($methodNames[$method->getName()])) { - continue; - } - $methodNames[$method->getName()] = true; - - if ($method->isPublic() && ! $method->isFinal() && ! $method->isStatic()) { - $methods .= "\n" . ' public function '; - if ($method->returnsReference()) { - $methods .= '&'; - } - $methods .= $method->getName() . '('; - $firstParam = true; - $parameterString = $argumentString = ''; - - foreach ($method->getParameters() as $param) { - if ($firstParam) { - $firstParam = false; - } else { - $parameterString .= ', '; - $argumentString .= ', '; - } - - // We need to pick the type hint class too - if (($paramClass = $param->getClass()) !== null) { - $parameterString .= '\\' . $paramClass->getName() . ' '; - } else if ($param->isArray()) { - $parameterString .= 'array '; - } - - if ($param->isPassedByReference()) { - $parameterString .= '&'; - } - - $parameterString .= '$' . $param->getName(); - $argumentString .= '$' . $param->getName(); - - if ($param->isDefaultValueAvailable()) { - $parameterString .= ' = ' . var_export($param->getDefaultValue(), true); - } - } - - $methods .= $parameterString . ')'; - $methods .= "\n" . ' {' . "\n"; - if ($this->isShortIdentifierGetter($method, $class)) { - $identifier = lcfirst(substr($method->getName(), 3)); - - $cast = in_array($class->fieldMappings[$identifier]['type'], array('integer', 'smallint')) ? '(int) ' : ''; - - $methods .= ' if ($this->__isInitialized__ === false) {' . "\n"; - $methods .= ' return ' . $cast . '$this->_identifier["' . $identifier . '"];' . "\n"; - $methods .= ' }' . "\n"; - } - $methods .= ' $this->__load();' . "\n"; - $methods .= ' return parent::' . $method->getName() . '(' . $argumentString . ');'; - $methods .= "\n" . ' }' . "\n"; - } - } - - return $methods; - } - - /** - * Check if the method is a short identifier getter. - * - * What does this mean? For proxy objects the identifier is already known, - * however accessing the getter for this identifier usually triggers the - * lazy loading, leading to a query that may not be necessary if only the - * ID is interesting for the userland code (for example in views that - * generate links to the entity, but do not display anything else). - * - * @param ReflectionMethod $method - * @param ClassMetadata $class - * @return bool - */ - private function isShortIdentifierGetter($method, ClassMetadata $class) - { - $identifier = lcfirst(substr($method->getName(), 3)); - $cheapCheck = ( - $method->getNumberOfParameters() == 0 && - substr($method->getName(), 0, 3) == "get" && - in_array($identifier, $class->identifier, true) && - $class->hasField($identifier) && - (($method->getEndLine() - $method->getStartLine()) <= 4) - && in_array($class->fieldMappings[$identifier]['type'], array('integer', 'bigint', 'smallint', 'string')) - ); - - if ($cheapCheck) { - $code = file($method->getDeclaringClass()->getFileName()); - $code = trim(implode(" ", array_slice($code, $method->getStartLine() - 1, $method->getEndLine() - $method->getStartLine() + 1))); - - $pattern = sprintf(self::PATTERN_MATCH_ID_METHOD, $method->getName(), $identifier); - - if (preg_match($pattern, $code)) { - return true; - } - } - return false; - } - - /** - * Generates the code for the __sleep method for a proxy class. - * - * @param $class - * @return string - */ - private function _generateSleep(ClassMetadata $class) - { - $sleepImpl = ''; - - if ($class->reflClass->hasMethod('__sleep')) { - $sleepImpl .= "return array_merge(array('__isInitialized__'), parent::__sleep());"; - } else { - $sleepImpl .= "return array('__isInitialized__', "; - $first = true; - - foreach ($class->getReflectionProperties() as $name => $prop) { - if ($first) { - $first = false; - } else { - $sleepImpl .= ', '; - } - - $sleepImpl .= "'" . $name . "'"; - } - - $sleepImpl .= ');'; - } - - return $sleepImpl; - } - - /** Proxy class code template */ - private static $_proxyClassTemplate = -'; - -/** - * THIS CLASS WAS GENERATED BY THE DOCTRINE ORM. DO NOT EDIT THIS FILE. - */ -class extends \ implements \Doctrine\ORM\Proxy\Proxy -{ - private $_entityPersister; - private $_identifier; - public $__isInitialized__ = false; - public function __construct($entityPersister, $identifier) - { - $this->_entityPersister = $entityPersister; - $this->_identifier = $identifier; - } - /** @private */ - public function __load() - { - if (!$this->__isInitialized__ && $this->_entityPersister) { - $this->__isInitialized__ = true; - - if (method_exists($this, "__wakeup")) { - // call this after __isInitialized__to avoid infinite recursion - // but before loading to emulate what ClassMetadata::newInstance() - // provides. - $this->__wakeup(); - } - - if ($this->_entityPersister->load($this->_identifier, $this) === null) { - throw new \Doctrine\ORM\EntityNotFoundException(); - } - unset($this->_entityPersister, $this->_identifier); - } - } - - /** @private */ - public function __isInitialized() - { - return $this->__isInitialized__; - } - - - - public function __sleep() - { - - } - - public function __clone() - { - if (!$this->__isInitialized__ && $this->_entityPersister) { - $this->__isInitialized__ = true; - $class = $this->_entityPersister->getClassMetadata(); - $original = $this->_entityPersister->load($this->_identifier); - if ($original === null) { - throw new \Doctrine\ORM\EntityNotFoundException(); - } - foreach ($class->reflFields as $field => $reflProperty) { - $reflProperty->setValue($this, $reflProperty->getValue($original)); - } - unset($this->_entityPersister, $this->_identifier); - } - - } -}'; -} diff --git a/framework/library/Doctrine/ORM/Query.php b/framework/library/Doctrine/ORM/Query.php deleted file mode 100644 index 2e1b817..0000000 --- a/framework/library/Doctrine/ORM/Query.php +++ /dev/null @@ -1,626 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -use Doctrine\Common\Collections\ArrayCollection; - -use Doctrine\DBAL\LockMode; - -use Doctrine\ORM\Query\Parser; -use Doctrine\ORM\Query\ParserResult; -use Doctrine\ORM\Query\QueryException; - -/** - * A Query object represents a DQL query. - * - * @since 1.0 - * @author Guilherme Blanco - * @author Konsta Vesterinen - * @author Roman Borschel - */ -final class Query extends AbstractQuery -{ - /** - * A query object is in CLEAN state when it has NO unparsed/unprocessed DQL parts. - */ - const STATE_CLEAN = 1; - /** - * A query object is in state DIRTY when it has DQL parts that have not yet been - * parsed/processed. This is automatically defined as DIRTY when addDqlQueryPart - * is called. - */ - const STATE_DIRTY = 2; - - /* Query HINTS */ - /** - * The refresh hint turns any query into a refresh query with the result that - * any local changes in entities are overridden with the fetched values. - * - * @var string - */ - const HINT_REFRESH = 'doctrine.refresh'; - - - /** - * Internal hint: is set to the proxy entity that is currently triggered for loading - * - * @var string - */ - const HINT_REFRESH_ENTITY = 'doctrine.refresh.entity'; - - /** - * The forcePartialLoad query hint forces a particular query to return - * partial objects. - * - * @var string - * @todo Rename: HINT_OPTIMIZE - */ - const HINT_FORCE_PARTIAL_LOAD = 'doctrine.forcePartialLoad'; - /** - * The includeMetaColumns query hint causes meta columns like foreign keys and - * discriminator columns to be selected and returned as part of the query result. - * - * This hint does only apply to non-object queries. - * - * @var string - */ - const HINT_INCLUDE_META_COLUMNS = 'doctrine.includeMetaColumns'; - - /** - * An array of class names that implement \Doctrine\ORM\Query\TreeWalker and - * are iterated and executed after the DQL has been parsed into an AST. - * - * @var string - */ - const HINT_CUSTOM_TREE_WALKERS = 'doctrine.customTreeWalkers'; - - /** - * A string with a class name that implements \Doctrine\ORM\Query\TreeWalker - * and is used for generating the target SQL from any DQL AST tree. - * - * @var string - */ - const HINT_CUSTOM_OUTPUT_WALKER = 'doctrine.customOutputWalker'; - - //const HINT_READ_ONLY = 'doctrine.readOnly'; - - /** - * @var string - */ - const HINT_INTERNAL_ITERATION = 'doctrine.internal.iteration'; - - /** - * @var string - */ - const HINT_LOCK_MODE = 'doctrine.lockMode'; - - - /** - * @var integer $_state The current state of this query. - */ - private $_state = self::STATE_CLEAN; - - /** - * @var string $_dql Cached DQL query. - */ - private $_dql = null; - - /** - * @var \Doctrine\ORM\Query\ParserResult The parser result that holds DQL => SQL information. - */ - private $_parserResult; - - /** - * @var integer The first result to return (the "offset"). - */ - private $_firstResult = null; - - /** - * @var integer The maximum number of results to return (the "limit"). - */ - private $_maxResults = null; - - /** - * @var CacheDriver The cache driver used for caching queries. - */ - private $_queryCache; - - /** - * @var boolean Boolean value that indicates whether or not expire the query cache. - */ - private $_expireQueryCache = false; - - /** - * @var int Query Cache lifetime. - */ - private $_queryCacheTTL; - - /** - * @var boolean Whether to use a query cache, if available. Defaults to TRUE. - */ - private $_useQueryCache = true; - - /** - * Initializes a new Query instance. - * - * @param \Doctrine\ORM\EntityManager $entityManager - */ - /*public function __construct(EntityManager $entityManager) - { - parent::__construct($entityManager); - }*/ - - /** - * Gets the SQL query/queries that correspond to this DQL query. - * - * @return mixed The built sql query or an array of all sql queries. - * @override - */ - public function getSQL() - { - return $this->_parse()->getSQLExecutor()->getSQLStatements(); - } - - /** - * Returns the corresponding AST for this DQL query. - * - * @return \Doctrine\ORM\Query\AST\SelectStatement | - * \Doctrine\ORM\Query\AST\UpdateStatement | - * \Doctrine\ORM\Query\AST\DeleteStatement - */ - public function getAST() - { - $parser = new Parser($this); - - return $parser->getAST(); - } - - /** - * Parses the DQL query, if necessary, and stores the parser result. - * - * Note: Populates $this->_parserResult as a side-effect. - * - * @return \Doctrine\ORM\Query\ParserResult - */ - private function _parse() - { - // Return previous parser result if the query and the filter collection are both clean - if ($this->_state === self::STATE_CLEAN && $this->_em->isFiltersStateClean()) { - return $this->_parserResult; - } - - $this->_state = self::STATE_CLEAN; - - // Check query cache. - if ( ! ($this->_useQueryCache && ($queryCache = $this->getQueryCacheDriver()))) { - $parser = new Parser($this); - - $this->_parserResult = $parser->parse(); - - return $this->_parserResult; - } - - $hash = $this->_getQueryCacheId(); - $cached = $this->_expireQueryCache ? false : $queryCache->fetch($hash); - - if ($cached instanceof ParserResult) { - // Cache hit. - $this->_parserResult = $cached; - - return $this->_parserResult; - } - - // Cache miss. - $parser = new Parser($this); - - $this->_parserResult = $parser->parse(); - - $queryCache->save($hash, $this->_parserResult, $this->_queryCacheTTL); - - return $this->_parserResult; - } - - /** - * {@inheritdoc} - */ - protected function _doExecute() - { - $executor = $this->_parse()->getSqlExecutor(); - - if ($this->_queryCacheProfile) { - $executor->setQueryCacheProfile($this->_queryCacheProfile); - } - - // Prepare parameters - $paramMappings = $this->_parserResult->getParameterMappings(); - - if (count($paramMappings) != count($this->parameters)) { - throw QueryException::invalidParameterNumber(); - } - - list($sqlParams, $types) = $this->processParameterMappings($paramMappings); - - if ($this->_resultSetMapping === null) { - $this->_resultSetMapping = $this->_parserResult->getResultSetMapping(); - } - - return $executor->execute($this->_em->getConnection(), $sqlParams, $types); - } - - /** - * Processes query parameter mappings - * - * @param array $paramMappings - * @return array - */ - private function processParameterMappings($paramMappings) - { - $sqlParams = array(); - $types = array(); - - foreach ($this->parameters as $parameter) { - $key = $parameter->getName(); - - if ( ! isset($paramMappings[$key])) { - throw QueryException::unknownParameter($key); - } - - $value = $this->processParameterValue($parameter->getValue()); - $type = ($parameter->getValue() === $value) - ? $parameter->getType() - : Query\ParameterTypeInferer::inferType($value); - - foreach ($paramMappings[$key] as $position) { - $types[$position] = $type; - } - - $sqlPositions = $paramMappings[$key]; - - // optimized multi value sql positions away for now, - // they are not allowed in DQL anyways. - $value = array($value); - $countValue = count($value); - - for ($i = 0, $l = count($sqlPositions); $i < $l; $i++) { - $sqlParams[$sqlPositions[$i]] = $value[($i % $countValue)]; - } - } - - if (count($sqlParams) != count($types)) { - throw QueryException::parameterTypeMissmatch(); - } - - if ($sqlParams) { - ksort($sqlParams); - $sqlParams = array_values($sqlParams); - - ksort($types); - $types = array_values($types); - } - - return array($sqlParams, $types); - } - - /** - * Defines a cache driver to be used for caching queries. - * - * @param Doctrine_Cache_Interface|null $driver Cache driver - * @return Query This query instance. - */ - public function setQueryCacheDriver($queryCache) - { - $this->_queryCache = $queryCache; - - return $this; - } - - /** - * Defines whether the query should make use of a query cache, if available. - * - * @param boolean $bool - * @return @return Query This query instance. - */ - public function useQueryCache($bool) - { - $this->_useQueryCache = $bool; - - return $this; - } - - /** - * Returns the cache driver used for query caching. - * - * @return CacheDriver The cache driver used for query caching or NULL, if - * this Query does not use query caching. - */ - public function getQueryCacheDriver() - { - if ($this->_queryCache) { - return $this->_queryCache; - } - - return $this->_em->getConfiguration()->getQueryCacheImpl(); - } - - /** - * Defines how long the query cache will be active before expire. - * - * @param integer $timeToLive How long the cache entry is valid - * @return Query This query instance. - */ - public function setQueryCacheLifetime($timeToLive) - { - if ($timeToLive !== null) { - $timeToLive = (int) $timeToLive; - } - - $this->_queryCacheTTL = $timeToLive; - - return $this; - } - - /** - * Retrieves the lifetime of resultset cache. - * - * @return int - */ - public function getQueryCacheLifetime() - { - return $this->_queryCacheTTL; - } - - /** - * Defines if the query cache is active or not. - * - * @param boolean $expire Whether or not to force query cache expiration. - * @return Query This query instance. - */ - public function expireQueryCache($expire = true) - { - $this->_expireQueryCache = $expire; - - return $this; - } - - /** - * Retrieves if the query cache is active or not. - * - * @return bool - */ - public function getExpireQueryCache() - { - return $this->_expireQueryCache; - } - - /** - * @override - */ - public function free() - { - parent::free(); - - $this->_dql = null; - $this->_state = self::STATE_CLEAN; - } - - /** - * Sets a DQL query string. - * - * @param string $dqlQuery DQL Query - * @return \Doctrine\ORM\AbstractQuery - */ - public function setDQL($dqlQuery) - { - if ($dqlQuery !== null) { - $this->_dql = $dqlQuery; - $this->_state = self::STATE_DIRTY; - } - - return $this; - } - - /** - * Returns the DQL query that is represented by this query object. - * - * @return string DQL query - */ - public function getDQL() - { - return $this->_dql; - } - - /** - * Returns the state of this query object - * By default the type is Doctrine_ORM_Query_Abstract::STATE_CLEAN but if it appears any unprocessed DQL - * part, it is switched to Doctrine_ORM_Query_Abstract::STATE_DIRTY. - * - * @see AbstractQuery::STATE_CLEAN - * @see AbstractQuery::STATE_DIRTY - * - * @return integer Return the query state - */ - public function getState() - { - return $this->_state; - } - - /** - * Method to check if an arbitrary piece of DQL exists - * - * @param string $dql Arbitrary piece of DQL to check for - * @return boolean - */ - public function contains($dql) - { - return stripos($this->getDQL(), $dql) === false ? false : true; - } - - /** - * Sets the position of the first result to retrieve (the "offset"). - * - * @param integer $firstResult The first result to return. - * @return Query This query object. - */ - public function setFirstResult($firstResult) - { - $this->_firstResult = $firstResult; - $this->_state = self::STATE_DIRTY; - - return $this; - } - - /** - * Gets the position of the first result the query object was set to retrieve (the "offset"). - * Returns NULL if {@link setFirstResult} was not applied to this query. - * - * @return integer The position of the first result. - */ - public function getFirstResult() - { - return $this->_firstResult; - } - - /** - * Sets the maximum number of results to retrieve (the "limit"). - * - * @param integer $maxResults - * @return Query This query object. - */ - public function setMaxResults($maxResults) - { - $this->_maxResults = $maxResults; - $this->_state = self::STATE_DIRTY; - - return $this; - } - - /** - * Gets the maximum number of results the query object was set to retrieve (the "limit"). - * Returns NULL if {@link setMaxResults} was not applied to this query. - * - * @return integer Maximum number of results. - */ - public function getMaxResults() - { - return $this->_maxResults; - } - - /** - * Executes the query and returns an IterableResult that can be used to incrementally - * iterated over the result. - * - * @param \Doctrine\Common\Collections\ArrayCollection|array $parameters The query parameters. - * @param integer $hydrationMode The hydration mode to use. - * @return \Doctrine\ORM\Internal\Hydration\IterableResult - */ - public function iterate($parameters = null, $hydrationMode = self::HYDRATE_OBJECT) - { - $this->setHint(self::HINT_INTERNAL_ITERATION, true); - - return parent::iterate($parameters, $hydrationMode); - } - - /** - * {@inheritdoc} - */ - public function setHint($name, $value) - { - $this->_state = self::STATE_DIRTY; - - return parent::setHint($name, $value); - } - - /** - * {@inheritdoc} - */ - public function setHydrationMode($hydrationMode) - { - $this->_state = self::STATE_DIRTY; - - return parent::setHydrationMode($hydrationMode); - } - - /** - * Set the lock mode for this Query. - * - * @see \Doctrine\DBAL\LockMode - * @param int $lockMode - * @return Query - */ - public function setLockMode($lockMode) - { - if (in_array($lockMode, array(LockMode::PESSIMISTIC_READ, LockMode::PESSIMISTIC_WRITE))) { - if ( ! $this->_em->getConnection()->isTransactionActive()) { - throw TransactionRequiredException::transactionRequired(); - } - } - - $this->setHint(self::HINT_LOCK_MODE, $lockMode); - - return $this; - } - - /** - * Get the current lock mode for this query. - * - * @return int - */ - public function getLockMode() - { - $lockMode = $this->getHint(self::HINT_LOCK_MODE); - - if ( ! $lockMode) { - return LockMode::NONE; - } - - return $lockMode; - } - - /** - * Generate a cache id for the query cache - reusing the Result-Cache-Id generator. - * - * The query cache - * - * @return string - */ - protected function _getQueryCacheId() - { - ksort($this->_hints); - - return md5( - $this->getDql() . var_export($this->_hints, true) . - ($this->_em->hasFilters() ? $this->_em->getFilters()->getHash() : '') . - '&firstResult=' . $this->_firstResult . '&maxResult=' . $this->_maxResults . - '&hydrationMode='.$this->_hydrationMode.'DOCTRINE_QUERY_CACHE_SALT' - ); - } - - /** - * Cleanup Query resource when clone is called. - * - * @return void - */ - public function __clone() - { - parent::__clone(); - - $this->_state = self::STATE_DIRTY; - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/ASTException.php b/framework/library/Doctrine/ORM/Query/AST/ASTException.php deleted file mode 100644 index 4633322..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/ASTException.php +++ /dev/null @@ -1,33 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -use Doctrine\ORM\Query\QueryException; - -/** - * Base exception class for AST exceptions. - */ -class ASTException extends QueryException -{ - public static function noDispatchForNode($node) - { - return new self("Double-dispatch for node " . get_class($node) . " is not supported."); - } -} \ No newline at end of file diff --git a/framework/library/Doctrine/ORM/Query/AST/AggregateExpression.php b/framework/library/Doctrine/ORM/Query/AST/AggregateExpression.php deleted file mode 100644 index ec91ada..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/AggregateExpression.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * Description of AggregateExpression - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class AggregateExpression extends Node -{ - public $functionName; - public $pathExpression; - public $isDistinct = false; // Some aggregate expressions support distinct, eg COUNT - - public function __construct($functionName, $pathExpression, $isDistinct) - { - $this->functionName = $functionName; - $this->pathExpression = $pathExpression; - $this->isDistinct = $isDistinct; - } - - public function dispatch($walker) - { - return $walker->walkAggregateExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/ArithmeticExpression.php b/framework/library/Doctrine/ORM/Query/AST/ArithmeticExpression.php deleted file mode 100644 index 55a6b06..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/ArithmeticExpression.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * ArithmeticExpression ::= SimpleArithmeticExpression | "(" Subselect ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ArithmeticExpression extends Node -{ - public $simpleArithmeticExpression; - public $subselect; - - public function isSimpleArithmeticExpression() - { - return (bool) $this->simpleArithmeticExpression; - } - - public function isSubselect() - { - return (bool) $this->subselect; - } - - public function dispatch($walker) - { - return $walker->walkArithmeticExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/ArithmeticFactor.php b/framework/library/Doctrine/ORM/Query/AST/ArithmeticFactor.php deleted file mode 100644 index 8d595ef..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/ArithmeticFactor.php +++ /dev/null @@ -1,64 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * ArithmeticFactor ::= [("+" | "-")] ArithmeticPrimary - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ArithmeticFactor extends Node -{ - /** - * @var ArithmeticPrimary - */ - public $arithmeticPrimary; - - /** - * @var null|boolean NULL represents no sign, TRUE means positive and FALSE means negative sign - */ - public $sign; - - public function __construct($arithmeticPrimary, $sign = null) - { - $this->arithmeticPrimary = $arithmeticPrimary; - $this->sign = $sign; - } - - public function isPositiveSigned() - { - return $this->sign === true; - } - - public function isNegativeSigned() - { - return $this->sign === false; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkArithmeticFactor($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/ArithmeticTerm.php b/framework/library/Doctrine/ORM/Query/AST/ArithmeticTerm.php deleted file mode 100644 index ced25e9..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/ArithmeticTerm.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * ArithmeticTerm ::= ArithmeticFactor {("*" | "/") ArithmeticFactor}* - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ArithmeticTerm extends Node -{ - public $arithmeticFactors; - - public function __construct(array $arithmeticFactors) - { - $this->arithmeticFactors = $arithmeticFactors; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkArithmeticTerm($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/BetweenExpression.php b/framework/library/Doctrine/ORM/Query/AST/BetweenExpression.php deleted file mode 100644 index 83ba6ca..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/BetweenExpression.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * Description of BetweenExpression - * - - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class BetweenExpression extends Node -{ - public $expression; - public $leftBetweenExpression; - public $rightBetweenExpression; - public $not; - - public function __construct($expr, $leftExpr, $rightExpr) - { - $this->expression = $expr; - $this->leftBetweenExpression = $leftExpr; - $this->rightBetweenExpression = $rightExpr; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkBetweenExpression($this); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/CoalesceExpression.php b/framework/library/Doctrine/ORM/Query/AST/CoalesceExpression.php deleted file mode 100644 index 731d45e..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/CoalesceExpression.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * CoalesceExpression ::= "COALESCE" "(" ScalarExpression {"," ScalarExpression}* ")" - * - * @since 2.1 - * - * @link www.doctrine-project.org - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class CoalesceExpression extends Node -{ - public $scalarExpressions = array(); - - - public function __construct(array $scalarExpressions) - { - $this->scalarExpressions = $scalarExpressions; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkCoalesceExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/CollectionMemberExpression.php b/framework/library/Doctrine/ORM/Query/AST/CollectionMemberExpression.php deleted file mode 100644 index b8c7b53..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/CollectionMemberExpression.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * CollectionMemberExpression ::= EntityExpression ["NOT"] "MEMBER" ["OF"] CollectionValuedPathExpression - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class CollectionMemberExpression extends Node -{ - public $entityExpression; - public $collectionValuedPathExpression; - public $not; - - public function __construct($entityExpr, $collValuedPathExpr) - { - $this->entityExpression = $entityExpr; - $this->collectionValuedPathExpression = $collValuedPathExpr; - } - - public function dispatch($walker) - { - return $walker->walkCollectionMemberExpression($this); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/ComparisonExpression.php b/framework/library/Doctrine/ORM/Query/AST/ComparisonExpression.php deleted file mode 100644 index d3105a1..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/ComparisonExpression.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * ComparisonExpression ::= ArithmeticExpression ComparisonOperator ( QuantifiedExpression | ArithmeticExpression ) | - * StringExpression ComparisonOperator (StringExpression | QuantifiedExpression) | - * BooleanExpression ("=" | "<>" | "!=") (BooleanExpression | QuantifiedExpression) | - * EnumExpression ("=" | "<>" | "!=") (EnumExpression | QuantifiedExpression) | - * DatetimeExpression ComparisonOperator (DatetimeExpression | QuantifiedExpression) | - * EntityExpression ("=" | "<>") (EntityExpression | QuantifiedExpression) - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ComparisonExpression extends Node -{ - public $leftExpression; - public $rightExpression; - public $operator; - - public function __construct($leftExpr, $operator, $rightExpr) - { - $this->leftExpression = $leftExpr; - $this->rightExpression = $rightExpr; - $this->operator = $operator; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkComparisonExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/ConditionalExpression.php b/framework/library/Doctrine/ORM/Query/AST/ConditionalExpression.php deleted file mode 100644 index c302aa2..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/ConditionalExpression.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * ConditionalExpression ::= ConditionalTerm {"OR" ConditionalTerm}* - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ConditionalExpression extends Node -{ - public $conditionalTerms = array(); - - public function __construct(array $conditionalTerms) - { - $this->conditionalTerms = $conditionalTerms; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkConditionalExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/ConditionalFactor.php b/framework/library/Doctrine/ORM/Query/AST/ConditionalFactor.php deleted file mode 100644 index b17089b..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/ConditionalFactor.php +++ /dev/null @@ -1,46 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * ConditionalFactor ::= ["NOT"] ConditionalPrimary - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ConditionalFactor extends Node -{ - public $not = false; - public $conditionalPrimary; - - public function __construct($conditionalPrimary) - { - $this->conditionalPrimary = $conditionalPrimary; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkConditionalFactor($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/ConditionalPrimary.php b/framework/library/Doctrine/ORM/Query/AST/ConditionalPrimary.php deleted file mode 100644 index 8a7c0b7..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/ConditionalPrimary.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * ConditionalPrimary ::= SimpleConditionalExpression | "(" ConditionalExpression ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ConditionalPrimary extends Node -{ - public $simpleConditionalExpression; - public $conditionalExpression; - - public function isSimpleConditionalExpression() - { - return (bool) $this->simpleConditionalExpression; - } - - public function isConditionalExpression() - { - return (bool) $this->conditionalExpression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkConditionalPrimary($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/ConditionalTerm.php b/framework/library/Doctrine/ORM/Query/AST/ConditionalTerm.php deleted file mode 100644 index d24defc..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/ConditionalTerm.php +++ /dev/null @@ -1,44 +0,0 @@ -. - */ -namespace Doctrine\ORM\Query\AST; - -/** - * ConditionalTerm ::= ConditionalFactor {"AND" ConditionalFactor}* - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ConditionalTerm extends Node -{ - public $conditionalFactors = array(); - - public function __construct(array $conditionalFactors) - { - $this->conditionalFactors = $conditionalFactors; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkConditionalTerm($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/DeleteClause.php b/framework/library/Doctrine/ORM/Query/AST/DeleteClause.php deleted file mode 100644 index a05e52f..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/DeleteClause.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * DeleteClause ::= "DELETE" ["FROM"] AbstractSchemaName [["AS"] AliasIdentificationVariable] - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class DeleteClause extends Node -{ - public $abstractSchemaName; - public $aliasIdentificationVariable; - - public function __construct($abstractSchemaName) - { - $this->abstractSchemaName = $abstractSchemaName; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkDeleteClause($this); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/DeleteStatement.php b/framework/library/Doctrine/ORM/Query/AST/DeleteStatement.php deleted file mode 100644 index f6e8cb3..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/DeleteStatement.php +++ /dev/null @@ -1,46 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * DeleteStatement = DeleteClause [WhereClause] - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class DeleteStatement extends Node -{ - public $deleteClause; - public $whereClause; - - public function __construct($deleteClause) - { - $this->deleteClause = $deleteClause; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkDeleteStatement($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/EmptyCollectionComparisonExpression.php b/framework/library/Doctrine/ORM/Query/AST/EmptyCollectionComparisonExpression.php deleted file mode 100644 index fbe504c..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/EmptyCollectionComparisonExpression.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * EmptyCollectionComparisonExpression ::= CollectionValuedPathExpression "IS" ["NOT"] "EMPTY" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class EmptyCollectionComparisonExpression extends Node -{ - public $expression; - public $not; - - public function __construct($expression) - { - $this->expression = $expression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkEmptyCollectionComparisonExpression($this); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/ExistsExpression.php b/framework/library/Doctrine/ORM/Query/AST/ExistsExpression.php deleted file mode 100644 index 94ee55d..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/ExistsExpression.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * ExistsExpression ::= ["NOT"] "EXISTS" "(" Subselect ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ExistsExpression extends Node -{ - public $not; - public $subselect; - - public function __construct($subselect) - { - $this->subselect = $subselect; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkExistsExpression($this); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/FromClause.php b/framework/library/Doctrine/ORM/Query/AST/FromClause.php deleted file mode 100644 index 32c7a73..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/FromClause.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * FromClause ::= "FROM" IdentificationVariableDeclaration {"," IdentificationVariableDeclaration} - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class FromClause extends Node -{ - public $identificationVariableDeclarations = array(); - - public function __construct(array $identificationVariableDeclarations) - { - $this->identificationVariableDeclarations = $identificationVariableDeclarations; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkFromClause($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/AbsFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/AbsFunction.php deleted file mode 100644 index d771f05..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/AbsFunction.php +++ /dev/null @@ -1,62 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "ABS" "(" SimpleArithmeticExpression ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class AbsFunction extends FunctionNode -{ - public $simpleArithmeticExpression; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - return 'ABS(' . $sqlWalker->walkSimpleArithmeticExpression( - $this->simpleArithmeticExpression - ) . ')'; - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->simpleArithmeticExpression = $parser->SimpleArithmeticExpression(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/BitAndFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/BitAndFunction.php deleted file mode 100644 index 0e5edd5..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/BitAndFunction.php +++ /dev/null @@ -1,63 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "BIT_AND" "(" ArithmeticPrimary "," ArithmeticPrimary ")" - * - * - * @link www.doctrine-project.org - * @since 2.2 - * @author Fabio B. Silva - */ -class BitAndFunction extends FunctionNode -{ - public $firstArithmetic; - public $secondArithmetic; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - $platform = $sqlWalker->getConnection()->getDatabasePlatform(); - return $platform->getBitAndComparisonExpression( - $this->firstArithmetic->dispatch($sqlWalker), - $this->secondArithmetic->dispatch($sqlWalker) - ); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->firstArithmetic = $parser->ArithmeticPrimary(); - $parser->match(Lexer::T_COMMA); - $this->secondArithmetic = $parser->ArithmeticPrimary(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/BitOrFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/BitOrFunction.php deleted file mode 100644 index 1d9c2df..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/BitOrFunction.php +++ /dev/null @@ -1,63 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "BIT_OR" "(" ArithmeticPrimary "," ArithmeticPrimary ")" - * - * - * @link www.doctrine-project.org - * @since 2.2 - * @author Fabio B. Silva - */ -class BitOrFunction extends FunctionNode -{ - public $firstArithmetic; - public $secondArithmetic; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - $platform = $sqlWalker->getConnection()->getDatabasePlatform(); - return $platform->getBitOrComparisonExpression( - $this->firstArithmetic->dispatch($sqlWalker), - $this->secondArithmetic->dispatch($sqlWalker) - ); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->firstArithmetic = $parser->ArithmeticPrimary(); - $parser->match(Lexer::T_COMMA); - $this->secondArithmetic = $parser->ArithmeticPrimary(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/ConcatFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/ConcatFunction.php deleted file mode 100644 index 39ecd2d..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/ConcatFunction.php +++ /dev/null @@ -1,67 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "CONCAT" "(" StringPrimary "," StringPrimary ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class ConcatFunction extends FunctionNode -{ - public $firstStringPrimary; - public $secondStringPriamry; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - $platform = $sqlWalker->getConnection()->getDatabasePlatform(); - return $platform->getConcatExpression( - $sqlWalker->walkStringPrimary($this->firstStringPrimary), - $sqlWalker->walkStringPrimary($this->secondStringPrimary) - ); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->firstStringPrimary = $parser->StringPrimary(); - $parser->match(Lexer::T_COMMA); - $this->secondStringPrimary = $parser->StringPrimary(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/CurrentDateFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/CurrentDateFunction.php deleted file mode 100644 index 8e8ce1c..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/CurrentDateFunction.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "CURRENT_DATE" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class CurrentDateFunction extends FunctionNode -{ - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - return $sqlWalker->getConnection()->getDatabasePlatform()->getCurrentDateSQL(); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/CurrentTimeFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/CurrentTimeFunction.php deleted file mode 100644 index 4bab247..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/CurrentTimeFunction.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "CURRENT_TIME" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class CurrentTimeFunction extends FunctionNode -{ - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - return $sqlWalker->getConnection()->getDatabasePlatform()->getCurrentTimeSQL(); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/CurrentTimestampFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/CurrentTimestampFunction.php deleted file mode 100644 index 8a9b418..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/CurrentTimestampFunction.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "CURRENT_TIMESTAMP" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class CurrentTimestampFunction extends FunctionNode -{ - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - return $sqlWalker->getConnection()->getDatabasePlatform()->getCurrentTimestampSQL(); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/DateAddFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/DateAddFunction.php deleted file mode 100644 index bf56785..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/DateAddFunction.php +++ /dev/null @@ -1,77 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; -use Doctrine\ORM\Query\SqlWalker; -use Doctrine\ORM\Query\Parser; -use Doctrine\ORM\Query\QueryException; - -/** - * "DATE_ADD" "(" ArithmeticPrimary "," ArithmeticPrimary "," StringPrimary ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Benjamin Eberlei - */ -class DateAddFunction extends FunctionNode -{ - public $firstDateExpression = null; - public $intervalExpression = null; - public $unit = null; - - public function getSql(SqlWalker $sqlWalker) - { - switch (strtolower($this->unit->value)) { - case 'day': - return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddDaysExpression( - $this->firstDateExpression->dispatch($sqlWalker), - $this->intervalExpression->dispatch($sqlWalker) - ); - - case 'month': - return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddMonthExpression( - $this->firstDateExpression->dispatch($sqlWalker), - $this->intervalExpression->dispatch($sqlWalker) - ); - - default: - throw QueryException::semanticalError( - 'DATE_ADD() only supports units of type day and month.' - ); - } - } - - public function parse(Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->firstDateExpression = $parser->ArithmeticPrimary(); - $parser->match(Lexer::T_COMMA); - $this->intervalExpression = $parser->ArithmeticPrimary(); - $parser->match(Lexer::T_COMMA); - $this->unit = $parser->StringPrimary(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/DateDiffFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/DateDiffFunction.php deleted file mode 100644 index f21b9a0..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/DateDiffFunction.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; -use Doctrine\ORM\Query\SqlWalker; -use Doctrine\ORM\Query\Parser; - -/** - * "DATE_DIFF" "(" ArithmeticPrimary "," ArithmeticPrimary ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - */ -class DateDiffFunction extends FunctionNode -{ - public $date1; - public $date2; - - public function getSql(SqlWalker $sqlWalker) - { - return $sqlWalker->getConnection()->getDatabasePlatform()->getDateDiffExpression( - $this->date1->dispatch($sqlWalker), - $this->date2->dispatch($sqlWalker) - ); - } - - public function parse(Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->date1 = $parser->ArithmeticPrimary(); - $parser->match(Lexer::T_COMMA); - $this->date2 = $parser->ArithmeticPrimary(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/DateSubFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/DateSubFunction.php deleted file mode 100644 index 0cc0730..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/DateSubFunction.php +++ /dev/null @@ -1,57 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\SqlWalker; -use Doctrine\ORM\Query\QueryException; - -/** - * "DATE_ADD(date1, interval, unit)" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Benjamin Eberlei - */ -class DateSubFunction extends DateAddFunction -{ - public function getSql(SqlWalker $sqlWalker) - { - switch (strtolower($this->unit->value)) { - case 'day': - return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubDaysExpression( - $this->firstDateExpression->dispatch($sqlWalker), - $this->intervalExpression->dispatch($sqlWalker) - ); - - case 'month': - return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubMonthExpression( - $this->firstDateExpression->dispatch($sqlWalker), - $this->intervalExpression->dispatch($sqlWalker) - ); - - default: - throw QueryException::semanticalError( - 'DATE_SUB() only supports units of type day and month.' - ); - } - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/FunctionNode.php b/framework/library/Doctrine/ORM/Query/AST/Functions/FunctionNode.php deleted file mode 100644 index bd8b607..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/FunctionNode.php +++ /dev/null @@ -1,52 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\AST\Node; - -/** - * Abtract Function Node. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -abstract class FunctionNode extends Node -{ - public $name; - - public function __construct($name) - { - $this->name = $name; - } - - abstract public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker); - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkFunction($this); - } - - abstract public function parse(\Doctrine\ORM\Query\Parser $parser); -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/IdentityFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/IdentityFunction.php deleted file mode 100644 index 2733399..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/IdentityFunction.php +++ /dev/null @@ -1,67 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "IDENTITY" "(" SingleValuedAssociationPathExpression ")" - * - * - * @link www.doctrine-project.org - * @since 2.2 - * @author Guilherme Blanco - * @author Benjamin Eberlei - */ -class IdentityFunction extends FunctionNode -{ - public $pathExpression; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - $dqlAlias = $this->pathExpression->identificationVariable; - $assocField = $this->pathExpression->field; - - $qComp = $sqlWalker->getQueryComponent($dqlAlias); - $class = $qComp['metadata']; - $assoc = $class->associationMappings[$assocField]; - - $tableAlias = $sqlWalker->getSQLTableAlias($class->getTableName(), $dqlAlias); - - return $tableAlias . '.' . reset($assoc['targetToSourceKeyColumns']);; - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->pathExpression = $parser->SingleValuedAssociationPathExpression(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/LengthFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/LengthFunction.php deleted file mode 100644 index 9c6f770..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/LengthFunction.php +++ /dev/null @@ -1,62 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "LENGTH" "(" StringPrimary ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class LengthFunction extends FunctionNode -{ - public $stringPrimary; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - return $sqlWalker->getConnection()->getDatabasePlatform()->getLengthExpression( - $sqlWalker->walkSimpleArithmeticExpression($this->stringPrimary) - ); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->stringPrimary = $parser->StringPrimary(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/LocateFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/LocateFunction.php deleted file mode 100644 index a189082..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/LocateFunction.php +++ /dev/null @@ -1,81 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "LOCATE" "(" StringPrimary "," StringPrimary ["," SimpleArithmeticExpression]")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class LocateFunction extends FunctionNode -{ - public $firstStringPrimary; - public $secondStringPrimary; - public $simpleArithmeticExpression = false; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - - return $sqlWalker->getConnection()->getDatabasePlatform()->getLocateExpression( - $sqlWalker->walkStringPrimary($this->secondStringPrimary), // its the other way around in platform - $sqlWalker->walkStringPrimary($this->firstStringPrimary), - (($this->simpleArithmeticExpression) - ? $sqlWalker->walkSimpleArithmeticExpression($this->simpleArithmeticExpression) - : false - ) - ); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->firstStringPrimary = $parser->StringPrimary(); - - $parser->match(Lexer::T_COMMA); - - $this->secondStringPrimary = $parser->StringPrimary(); - - $lexer = $parser->getLexer(); - if ($lexer->isNextToken(Lexer::T_COMMA)) { - $parser->match(Lexer::T_COMMA); - - $this->simpleArithmeticExpression = $parser->SimpleArithmeticExpression(); - } - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/LowerFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/LowerFunction.php deleted file mode 100644 index 12c6745..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/LowerFunction.php +++ /dev/null @@ -1,62 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "LOWER" "(" StringPrimary ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class LowerFunction extends FunctionNode -{ - public $stringPrimary; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - return $sqlWalker->getConnection()->getDatabasePlatform()->getLowerExpression( - $sqlWalker->walkSimpleArithmeticExpression($this->stringPrimary) - ); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->stringPrimary = $parser->StringPrimary(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/ModFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/ModFunction.php deleted file mode 100644 index 27d252e..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/ModFunction.php +++ /dev/null @@ -1,68 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "MOD" "(" SimpleArithmeticExpression "," SimpleArithmeticExpression ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class ModFunction extends FunctionNode -{ - public $firstSimpleArithmeticExpression; - public $secondSimpleArithmeticExpression; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - return $sqlWalker->getConnection()->getDatabasePlatform()->getModExpression( - $sqlWalker->walkSimpleArithmeticExpression($this->firstSimpleArithmeticExpression), - $sqlWalker->walkSimpleArithmeticExpression($this->secondSimpleArithmeticExpression) - ); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->firstSimpleArithmeticExpression = $parser->SimpleArithmeticExpression(); - - $parser->match(Lexer::T_COMMA); - - $this->secondSimpleArithmeticExpression = $parser->SimpleArithmeticExpression(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/SizeFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/SizeFunction.php deleted file mode 100644 index bffff29..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/SizeFunction.php +++ /dev/null @@ -1,121 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "SIZE" "(" CollectionValuedPathExpression ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class SizeFunction extends FunctionNode -{ - public $collectionPathExpression; - - /** - * @override - * @todo If the collection being counted is already joined, the SQL can be simpler (more efficient). - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - $platform = $sqlWalker->getEntityManager()->getConnection()->getDatabasePlatform(); - $quoteStrategy = $sqlWalker->getEntityManager()->getConfiguration()->getQuoteStrategy(); - $dqlAlias = $this->collectionPathExpression->identificationVariable; - $assocField = $this->collectionPathExpression->field; - - $qComp = $sqlWalker->getQueryComponent($dqlAlias); - $class = $qComp['metadata']; - $assoc = $class->associationMappings[$assocField]; - $sql = 'SELECT COUNT(*) FROM '; - - if ($assoc['type'] == \Doctrine\ORM\Mapping\ClassMetadata::ONE_TO_MANY) { - $targetClass = $sqlWalker->getEntityManager()->getClassMetadata($assoc['targetEntity']); - $targetTableAlias = $sqlWalker->getSQLTableAlias($targetClass->getTableName()); - $sourceTableAlias = $sqlWalker->getSQLTableAlias($class->getTableName(), $dqlAlias); - - $sql .= $quoteStrategy->getTableName($targetClass, $platform) . ' ' . $targetTableAlias . ' WHERE '; - - $owningAssoc = $targetClass->associationMappings[$assoc['mappedBy']]; - - $first = true; - - foreach ($owningAssoc['targetToSourceKeyColumns'] as $targetColumn => $sourceColumn) { - if ($first) $first = false; else $sql .= ' AND '; - - $sql .= $targetTableAlias . '.' . $sourceColumn - . ' = ' - . $sourceTableAlias . '.' . $quoteStrategy->getColumnName($class->fieldNames[$targetColumn], $class, $platform); - } - } else { // many-to-many - $targetClass = $sqlWalker->getEntityManager()->getClassMetadata($assoc['targetEntity']); - - $owningAssoc = $assoc['isOwningSide'] ? $assoc : $targetClass->associationMappings[$assoc['mappedBy']]; - $joinTable = $owningAssoc['joinTable']; - - // SQL table aliases - $joinTableAlias = $sqlWalker->getSQLTableAlias($joinTable['name']); - $sourceTableAlias = $sqlWalker->getSQLTableAlias($class->getTableName(), $dqlAlias); - - // join to target table - $sql .= $quoteStrategy->getJoinTableName($owningAssoc, $targetClass, $platform) . ' ' . $joinTableAlias . ' WHERE '; - - $joinColumns = $assoc['isOwningSide'] - ? $joinTable['joinColumns'] - : $joinTable['inverseJoinColumns']; - - $first = true; - - foreach ($joinColumns as $joinColumn) { - if ($first) $first = false; else $sql .= ' AND '; - - $sourceColumnName = $quoteStrategy->getColumnName( - $class->fieldNames[$joinColumn['referencedColumnName']], $class, $platform - ); - - $sql .= $joinTableAlias . '.' . $joinColumn['name'] - . ' = ' - . $sourceTableAlias . '.' . $sourceColumnName; - } - } - - return '(' . $sql . ')'; - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->collectionPathExpression = $parser->CollectionValuedPathExpression(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/SqrtFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/SqrtFunction.php deleted file mode 100644 index cf8c27b..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/SqrtFunction.php +++ /dev/null @@ -1,62 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "SQRT" "(" SimpleArithmeticExpression ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class SqrtFunction extends FunctionNode -{ - public $simpleArithmeticExpression; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - return $sqlWalker->getConnection()->getDatabasePlatform()->getSqrtExpression( - $sqlWalker->walkSimpleArithmeticExpression($this->simpleArithmeticExpression) - ); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->simpleArithmeticExpression = $parser->SimpleArithmeticExpression(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/SubstringFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/SubstringFunction.php deleted file mode 100644 index 6f3dfbe..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/SubstringFunction.php +++ /dev/null @@ -1,82 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "SUBSTRING" "(" StringPrimary "," SimpleArithmeticExpression "," SimpleArithmeticExpression ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class SubstringFunction extends FunctionNode -{ - public $stringPrimary; - public $firstSimpleArithmeticExpression; - public $secondSimpleArithmeticExpression = null; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - $optionalSecondSimpleArithmeticExpression = null; - if ($this->secondSimpleArithmeticExpression !== null) { - $optionalSecondSimpleArithmeticExpression = $sqlWalker->walkSimpleArithmeticExpression($this->secondSimpleArithmeticExpression); - } - - return $sqlWalker->getConnection()->getDatabasePlatform()->getSubstringExpression( - $sqlWalker->walkStringPrimary($this->stringPrimary), - $sqlWalker->walkSimpleArithmeticExpression($this->firstSimpleArithmeticExpression), - $optionalSecondSimpleArithmeticExpression - ); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->stringPrimary = $parser->StringPrimary(); - - $parser->match(Lexer::T_COMMA); - - $this->firstSimpleArithmeticExpression = $parser->SimpleArithmeticExpression(); - - $lexer = $parser->getLexer(); - if ($lexer->isNextToken(Lexer::T_COMMA)) { - $parser->match(Lexer::T_COMMA); - - $this->secondSimpleArithmeticExpression = $parser->SimpleArithmeticExpression(); - } - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/TrimFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/TrimFunction.php deleted file mode 100644 index 0c60ab0..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/TrimFunction.php +++ /dev/null @@ -1,100 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; -use Doctrine\DBAL\Platforms\AbstractPlatform; - -/** - * "TRIM" "(" [["LEADING" | "TRAILING" | "BOTH"] [char] "FROM"] StringPrimary ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class TrimFunction extends FunctionNode -{ - public $leading; - public $trailing; - public $both; - public $trimChar = false; - public $stringPrimary; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - $pos = AbstractPlatform::TRIM_UNSPECIFIED; - if ($this->leading) { - $pos = AbstractPlatform::TRIM_LEADING; - } else if ($this->trailing) { - $pos = AbstractPlatform::TRIM_TRAILING; - } else if ($this->both) { - $pos = AbstractPlatform::TRIM_BOTH; - } - - return $sqlWalker->getConnection()->getDatabasePlatform()->getTrimExpression( - $sqlWalker->walkStringPrimary($this->stringPrimary), - $pos, - ($this->trimChar != false) ? $sqlWalker->getConnection()->quote($this->trimChar) : false - ); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $lexer = $parser->getLexer(); - - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - if (strcasecmp('leading', $lexer->lookahead['value']) === 0) { - $parser->match(Lexer::T_LEADING); - $this->leading = true; - } else if (strcasecmp('trailing', $lexer->lookahead['value']) === 0) { - $parser->match(Lexer::T_TRAILING); - $this->trailing = true; - } else if (strcasecmp('both', $lexer->lookahead['value']) === 0) { - $parser->match(Lexer::T_BOTH); - $this->both = true; - } - - if ($lexer->isNextToken(Lexer::T_STRING)) { - $parser->match(Lexer::T_STRING); - $this->trimChar = $lexer->token['value']; - } - - if ($this->leading || $this->trailing || $this->both || $this->trimChar) { - $parser->match(Lexer::T_FROM); - } - - $this->stringPrimary = $parser->StringPrimary(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } - -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Functions/UpperFunction.php b/framework/library/Doctrine/ORM/Query/AST/Functions/UpperFunction.php deleted file mode 100644 index 26c8f0d..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Functions/UpperFunction.php +++ /dev/null @@ -1,62 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST\Functions; - -use Doctrine\ORM\Query\Lexer; - -/** - * "UPPER" "(" StringPrimary ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class UpperFunction extends FunctionNode -{ - public $stringPrimary; - - /** - * @override - */ - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) - { - return $sqlWalker->getConnection()->getDatabasePlatform()->getUpperExpression( - $sqlWalker->walkSimpleArithmeticExpression($this->stringPrimary) - ); - } - - /** - * @override - */ - public function parse(\Doctrine\ORM\Query\Parser $parser) - { - $parser->match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - - $this->stringPrimary = $parser->StringPrimary(); - - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/GeneralCaseExpression.php b/framework/library/Doctrine/ORM/Query/AST/GeneralCaseExpression.php deleted file mode 100644 index ee4b418..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/GeneralCaseExpression.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * GeneralCaseExpression ::= "CASE" WhenClause {WhenClause}* "ELSE" ScalarExpression "END" - * - * @since 2.2 - * - * @link www.doctrine-project.org - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class GeneralCaseExpression extends Node -{ - public $whenClauses = array(); - public $elseScalarExpression = null; - - public function __construct(array $whenClauses, $elseScalarExpression) - { - $this->whenClauses = $whenClauses; - $this->elseScalarExpression = $elseScalarExpression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkGeneralCaseExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/GroupByClause.php b/framework/library/Doctrine/ORM/Query/AST/GroupByClause.php deleted file mode 100644 index 06350f0..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/GroupByClause.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * Description of GroupByClause - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class GroupByClause extends Node -{ - public $groupByItems = array(); - - public function __construct(array $groupByItems) - { - $this->groupByItems = $groupByItems; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkGroupByClause($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/HavingClause.php b/framework/library/Doctrine/ORM/Query/AST/HavingClause.php deleted file mode 100644 index 971e919..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/HavingClause.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * Description of HavingClause - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class HavingClause extends Node -{ - public $conditionalExpression; - - public function __construct($conditionalExpression) - { - $this->conditionalExpression = $conditionalExpression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkHavingClause($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/IdentificationVariableDeclaration.php b/framework/library/Doctrine/ORM/Query/AST/IdentificationVariableDeclaration.php deleted file mode 100644 index 6bbdaaa..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/IdentificationVariableDeclaration.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * IdentificationVariableDeclaration ::= RangeVariableDeclaration [IndexBy] {JoinVariableDeclaration}* - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class IdentificationVariableDeclaration extends Node -{ - public $rangeVariableDeclaration = null; - public $indexBy = null; - public $joins = array(); - - public function __construct($rangeVariableDecl, $indexBy, array $joins) - { - $this->rangeVariableDeclaration = $rangeVariableDecl; - $this->indexBy = $indexBy; - $this->joins = $joins; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkIdentificationVariableDeclaration($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/InExpression.php b/framework/library/Doctrine/ORM/Query/AST/InExpression.php deleted file mode 100644 index 39501a4..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/InExpression.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ -namespace Doctrine\ORM\Query\AST; - -/** - * InExpression ::= StateFieldPathExpression ["NOT"] "IN" "(" (Literal {"," Literal}* | Subselect) ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class InExpression extends Node -{ - public $not; - public $expression; - public $literals = array(); - public $subselect; - - public function __construct($expression) - { - $this->expression = $expression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkInExpression($this); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/IndexBy.php b/framework/library/Doctrine/ORM/Query/AST/IndexBy.php deleted file mode 100644 index 08e9e6a..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/IndexBy.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * IndexBy ::= "INDEX" "BY" SimpleStateFieldPathExpression - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class IndexBy extends Node -{ - public $simpleStateFieldPathExpression = null; - - public function __construct($simpleStateFieldPathExpression) - { - $this->simpleStateFieldPathExpression = $simpleStateFieldPathExpression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkIndexBy($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/InputParameter.php b/framework/library/Doctrine/ORM/Query/AST/InputParameter.php deleted file mode 100644 index d575df7..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/InputParameter.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * Description of InputParameter - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class InputParameter extends Node -{ - public $isNamed; - public $name; - - /** - * @param string $value - */ - public function __construct($value) - { - if (strlen($value) == 1) { - throw \Doctrine\ORM\Query\QueryException::invalidParameterFormat($value); - } - - $param = substr($value, 1); - $this->isNamed = ! is_numeric($param); - $this->name = $param; - } - - public function dispatch($walker) - { - return $walker->walkInputParameter($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/InstanceOfExpression.php b/framework/library/Doctrine/ORM/Query/AST/InstanceOfExpression.php deleted file mode 100644 index c022cd6..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/InstanceOfExpression.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * InstanceOfExpression ::= IdentificationVariable ["NOT"] "INSTANCE" ["OF"] (InstanceOfParameter | "(" InstanceOfParameter {"," InstanceOfParameter}* ")") - * InstanceOfParameter ::= AbstractSchemaName | InputParameter - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class InstanceOfExpression extends Node -{ - public $not; - public $identificationVariable; - public $value; - - public function __construct($identVariable) - { - $this->identificationVariable = $identVariable; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkInstanceOfExpression($this); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/Join.php b/framework/library/Doctrine/ORM/Query/AST/Join.php deleted file mode 100644 index 6724f9e..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Join.php +++ /dev/null @@ -1,52 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * Join ::= ["LEFT" ["OUTER"] | "INNER"] "JOIN" JoinAssociationPathExpression - * ["AS"] AliasIdentificationVariable [("ON" | "WITH") ConditionalExpression] - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Join extends Node -{ - const JOIN_TYPE_LEFT = 1; - const JOIN_TYPE_LEFTOUTER = 2; - const JOIN_TYPE_INNER = 3; - - public $joinType = self::JOIN_TYPE_INNER; - public $joinAssociationDeclaration = null; - public $conditionalExpression = null; - - public function __construct($joinType, $joinAssociationDeclaration) - { - $this->joinType = $joinType; - $this->joinAssociationDeclaration = $joinAssociationDeclaration; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkJoin($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/JoinAssociationDeclaration.php b/framework/library/Doctrine/ORM/Query/AST/JoinAssociationDeclaration.php deleted file mode 100644 index 8e97353..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/JoinAssociationDeclaration.php +++ /dev/null @@ -1,46 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * JoinAssociationDeclaration ::= JoinAssociationPathExpression ["AS"] AliasIdentificationVariable - * - * @link www.doctrine-project.org - * @since 2.3 - * @author Guilherme Blanco - */ -class JoinAssociationDeclaration extends Node -{ - public $joinAssociationPathExpression; - public $aliasIdentificationVariable; - public $indexBy; - - public function __construct($joinAssociationPathExpression, $aliasIdentificationVariable, $indexBy) - { - $this->joinAssociationPathExpression = $joinAssociationPathExpression; - $this->aliasIdentificationVariable = $aliasIdentificationVariable; - $this->indexBy = $indexBy; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkJoinAssociationDeclaration($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/JoinAssociationPathExpression.php b/framework/library/Doctrine/ORM/Query/AST/JoinAssociationPathExpression.php deleted file mode 100644 index 57bd052..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/JoinAssociationPathExpression.php +++ /dev/null @@ -1,46 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * JoinAssociationPathExpression ::= IdentificationVariable "." (SingleValuedAssociationField | CollectionValuedAssociationField) - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class JoinAssociationPathExpression extends Node -{ - public $identificationVariable; - public $associationField; - - public function __construct($identificationVariable, $associationField) - { - $this->identificationVariable = $identificationVariable; - $this->associationField = $associationField; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkPathExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/JoinClassPathExpression.php b/framework/library/Doctrine/ORM/Query/AST/JoinClassPathExpression.php deleted file mode 100644 index a6bafea..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/JoinClassPathExpression.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * JoinClassPathExpression ::= AbstractSchemaName ["AS"] AliasIdentificationVariable - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.org - * @since 2.3 - * @author Alexander - */ -class JoinClassPathExpression extends Node -{ - public $abstractSchemaName; - public $aliasIdentificationVariable; - - public function __construct($abstractSchemaName, $aliasIdentificationVar) - { - $this->abstractSchemaName = $abstractSchemaName; - $this->aliasIdentificationVariable = $aliasIdentificationVar; - } - - public function dispatch($walker) - { - return $walker->walkJoinPathExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/LikeExpression.php b/framework/library/Doctrine/ORM/Query/AST/LikeExpression.php deleted file mode 100644 index 68f8635..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/LikeExpression.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ -namespace Doctrine\ORM\Query\AST; - -/** - * LikeExpression ::= StringExpression ["NOT"] "LIKE" string ["ESCAPE" char] - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class LikeExpression extends Node -{ - public $not; - public $stringExpression; - public $stringPattern; - public $escapeChar; - - public function __construct($stringExpression, $stringPattern, $escapeChar = null) - { - $this->stringExpression = $stringExpression; - $this->stringPattern = $stringPattern; - $this->escapeChar = $escapeChar; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkLikeExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Literal.php b/framework/library/Doctrine/ORM/Query/AST/Literal.php deleted file mode 100644 index 26337cb..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Literal.php +++ /dev/null @@ -1,41 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -class Literal extends Node -{ - const STRING = 1; - const BOOLEAN = 2; - const NUMERIC = 3; - - public $type; - public $value; - - public function __construct($type, $value) - { - $this->type = $type; - $this->value = $value; - } - - public function dispatch($walker) - { - return $walker->walkLiteral($this); - } -} \ No newline at end of file diff --git a/framework/library/Doctrine/ORM/Query/AST/Node.php b/framework/library/Doctrine/ORM/Query/AST/Node.php deleted file mode 100644 index d50e0d0..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Node.php +++ /dev/null @@ -1,95 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * Abstract class of an AST node - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -abstract class Node -{ - /** - * Double-dispatch method, supposed to dispatch back to the walker. - * - * Implementation is not mandatory for all nodes. - * - * @param $walker - */ - public function dispatch($walker) - { - throw ASTException::noDispatchForNode($this); - } - - /** - * Dumps the AST Node into a string representation for information purpose only - * - * @return string - */ - public function __toString() - { - return $this->dump($this); - } - - public function dump($obj) - { - static $ident = 0; - - $str = ''; - - if ($obj instanceof Node) { - $str .= get_class($obj) . '(' . PHP_EOL; - $props = get_object_vars($obj); - - foreach ($props as $name => $prop) { - $ident += 4; - $str .= str_repeat(' ', $ident) . '"' . $name . '": ' - . $this->dump($prop) . ',' . PHP_EOL; - $ident -= 4; - } - - $str .= str_repeat(' ', $ident) . ')'; - } else if (is_array($obj)) { - $ident += 4; - $str .= 'array('; - $some = false; - - foreach ($obj as $k => $v) { - $str .= PHP_EOL . str_repeat(' ', $ident) . '"' - . $k . '" => ' . $this->dump($v) . ','; - $some = true; - } - - $ident -= 4; - $str .= ($some ? PHP_EOL . str_repeat(' ', $ident) : '') . ')'; - } else if (is_object($obj)) { - $str .= 'instanceof(' . get_class($obj) . ')'; - } else { - $str .= var_export($obj, true); - } - - return $str; - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/NullComparisonExpression.php b/framework/library/Doctrine/ORM/Query/AST/NullComparisonExpression.php deleted file mode 100644 index d0fb8bf..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/NullComparisonExpression.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * NullComparisonExpression ::= (SingleValuedPathExpression | InputParameter) "IS" ["NOT"] "NULL" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class NullComparisonExpression extends Node -{ - public $not; - public $expression; - - public function __construct($expression) - { - $this->expression = $expression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkNullComparisonExpression($this); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/NullIfExpression.php b/framework/library/Doctrine/ORM/Query/AST/NullIfExpression.php deleted file mode 100644 index 2c85ddd..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/NullIfExpression.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * NullIfExpression ::= "NULLIF" "(" ScalarExpression "," ScalarExpression ")" - * - * @since 2.1 - * - * @link www.doctrine-project.org - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class NullIfExpression extends Node -{ - public $firstExpression; - - public $secondExpression; - - public function __construct($firstExpression, $secondExpression) - { - $this->firstExpression = $firstExpression; - $this->secondExpression = $secondExpression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkNullIfExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/OrderByClause.php b/framework/library/Doctrine/ORM/Query/AST/OrderByClause.php deleted file mode 100644 index 311a9ed..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/OrderByClause.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * OrderByClause ::= "ORDER" "BY" OrderByItem {"," OrderByItem}* - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class OrderByClause extends Node -{ - public $orderByItems = array(); - - public function __construct(array $orderByItems) - { - $this->orderByItems = $orderByItems; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkOrderByClause($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/OrderByItem.php b/framework/library/Doctrine/ORM/Query/AST/OrderByItem.php deleted file mode 100644 index 5d48077..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/OrderByItem.php +++ /dev/null @@ -1,56 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * OrderByItem ::= (ResultVariable | StateFieldPathExpression) ["ASC" | "DESC"] - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class OrderByItem extends Node -{ - public $expression; - public $type; - - public function __construct($expression) - { - $this->expression = $expression; - } - - public function isAsc() - { - return strtoupper($this->type) == 'ASC'; - } - - public function isDesc() - { - return strtoupper($this->type) == 'DESC'; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkOrderByItem($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/PartialObjectExpression.php b/framework/library/Doctrine/ORM/Query/AST/PartialObjectExpression.php deleted file mode 100644 index 8a0e0d0..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/PartialObjectExpression.php +++ /dev/null @@ -1,32 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -class PartialObjectExpression extends Node -{ - public $identificationVariable; - public $partialFieldSet; - - public function __construct($identificationVariable, array $partialFieldSet) - { - $this->identificationVariable = $identificationVariable; - $this->partialFieldSet = $partialFieldSet; - } -} \ No newline at end of file diff --git a/framework/library/Doctrine/ORM/Query/AST/PathExpression.php b/framework/library/Doctrine/ORM/Query/AST/PathExpression.php deleted file mode 100644 index 1b27742..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/PathExpression.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * AssociationPathExpression ::= CollectionValuedPathExpression | SingleValuedAssociationPathExpression - * SingleValuedPathExpression ::= StateFieldPathExpression | SingleValuedAssociationPathExpression - * StateFieldPathExpression ::= SimpleStateFieldPathExpression | SimpleStateFieldAssociationPathExpression - * SingleValuedAssociationPathExpression ::= IdentificationVariable "." SingleValuedAssociationField - * CollectionValuedPathExpression ::= IdentificationVariable "." CollectionValuedAssociationField - * StateField ::= {EmbeddedClassStateField "."}* SimpleStateField - * SimpleStateFieldPathExpression ::= IdentificationVariable "." StateField - * - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class PathExpression extends Node -{ - const TYPE_COLLECTION_VALUED_ASSOCIATION = 2; - const TYPE_SINGLE_VALUED_ASSOCIATION = 4; - const TYPE_STATE_FIELD = 8; - - public $type; - public $expectedType; - public $identificationVariable; - public $field; - - public function __construct($expectedType, $identificationVariable, $field = null) - { - $this->expectedType = $expectedType; - $this->identificationVariable = $identificationVariable; - $this->field = $field; - } - - public function dispatch($walker) - { - return $walker->walkPathExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/QuantifiedExpression.php b/framework/library/Doctrine/ORM/Query/AST/QuantifiedExpression.php deleted file mode 100644 index 64a764e..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/QuantifiedExpression.php +++ /dev/null @@ -1,64 +0,0 @@ -. - */ -namespace Doctrine\ORM\Query\AST; - -/** - * QuantifiedExpression ::= ("ALL" | "ANY" | "SOME") "(" Subselect ")" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class QuantifiedExpression extends Node -{ - public $type; - public $subselect; - - public function __construct($subselect) - { - $this->subselect = $subselect; - } - - public function isAll() - { - return strtoupper($this->type) == 'ALL'; - } - - public function isAny() - { - return strtoupper($this->type) == 'ANY'; - } - - public function isSome() - { - return strtoupper($this->type) == 'SOME'; - } - - /** - * @override - */ - public function dispatch($sqlWalker) - { - return $sqlWalker->walkQuantifiedExpression($this); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/RangeVariableDeclaration.php b/framework/library/Doctrine/ORM/Query/AST/RangeVariableDeclaration.php deleted file mode 100644 index facd0bb..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/RangeVariableDeclaration.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * RangeVariableDeclaration ::= AbstractSchemaName ["AS"] AliasIdentificationVariable - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class RangeVariableDeclaration extends Node -{ - public $abstractSchemaName; - public $aliasIdentificationVariable; - - public function __construct($abstractSchemaName, $aliasIdentificationVar) - { - $this->abstractSchemaName = $abstractSchemaName; - $this->aliasIdentificationVariable = $aliasIdentificationVar; - } - - public function dispatch($walker) - { - return $walker->walkRangeVariableDeclaration($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/SelectClause.php b/framework/library/Doctrine/ORM/Query/AST/SelectClause.php deleted file mode 100644 index be76a4f..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/SelectClause.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * SelectClause = "SELECT" ["DISTINCT"] SelectExpression {"," SelectExpression} - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class SelectClause extends Node -{ - public $isDistinct; - public $selectExpressions = array(); - - public function __construct(array $selectExpressions, $isDistinct) - { - $this->isDistinct = $isDistinct; - $this->selectExpressions = $selectExpressions; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkSelectClause($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/SelectExpression.php b/framework/library/Doctrine/ORM/Query/AST/SelectExpression.php deleted file mode 100644 index 14ca850..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/SelectExpression.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * SelectExpression ::= IdentificationVariable ["." "*"] | StateFieldPathExpression | - * (AggregateExpression | "(" Subselect ")") [["AS"] ["HIDDEN"] FieldAliasIdentificationVariable] - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class SelectExpression extends Node -{ - public $expression; - public $fieldIdentificationVariable; - public $hiddenAliasResultVariable; - - public function __construct($expression, $fieldIdentificationVariable, $hiddenAliasResultVariable = false) - { - $this->expression = $expression; - $this->fieldIdentificationVariable = $fieldIdentificationVariable; - $this->hiddenAliasResultVariable = $hiddenAliasResultVariable; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkSelectExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/SelectStatement.php b/framework/library/Doctrine/ORM/Query/AST/SelectStatement.php deleted file mode 100644 index d91d26f..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/SelectStatement.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * SelectStatement = SelectClause FromClause [WhereClause] [GroupByClause] [HavingClause] [OrderByClause] - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class SelectStatement extends Node -{ - public $selectClause; - public $fromClause; - public $whereClause; - public $groupByClause; - public $havingClause; - public $orderByClause; - - public function __construct($selectClause, $fromClause) { - $this->selectClause = $selectClause; - $this->fromClause = $fromClause; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkSelectStatement($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/SimpleArithmeticExpression.php b/framework/library/Doctrine/ORM/Query/AST/SimpleArithmeticExpression.php deleted file mode 100644 index 8d91c9b..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/SimpleArithmeticExpression.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * SimpleArithmeticExpression ::= ArithmeticTerm {("+" | "-") ArithmeticTerm}* - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class SimpleArithmeticExpression extends Node -{ - public $arithmeticTerms = array(); - - public function __construct(array $arithmeticTerms) - { - $this->arithmeticTerms = $arithmeticTerms; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkSimpleArithmeticExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/SimpleCaseExpression.php b/framework/library/Doctrine/ORM/Query/AST/SimpleCaseExpression.php deleted file mode 100644 index bd593ee..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/SimpleCaseExpression.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * SimpleCaseExpression ::= "CASE" CaseOperand SimpleWhenClause {SimpleWhenClause}* "ELSE" ScalarExpression "END" - * - * @since 2.2 - * - * @link www.doctrine-project.org - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class SimpleCaseExpression extends Node -{ - public $caseOperand = null; - public $simpleWhenClauses = array(); - public $elseScalarExpression = null; - - public function __construct($caseOperand, array $simpleWhenClauses, $elseScalarExpression) - { - $this->caseOperand = $caseOperand; - $this->simpleWhenClauses = $simpleWhenClauses; - $this->elseScalarExpression = $elseScalarExpression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkSimpleCaseExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/SimpleSelectClause.php b/framework/library/Doctrine/ORM/Query/AST/SimpleSelectClause.php deleted file mode 100644 index 95a6198..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/SimpleSelectClause.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * SimpleSelectClause ::= "SELECT" ["DISTINCT"] SimpleSelectExpression - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class SimpleSelectClause extends Node -{ - public $isDistinct = false; - public $simpleSelectExpression; - - public function __construct($simpleSelectExpression, $isDistinct) - { - $this->simpleSelectExpression = $simpleSelectExpression; - $this->isDistinct = $isDistinct; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkSimpleSelectClause($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/SimpleSelectExpression.php b/framework/library/Doctrine/ORM/Query/AST/SimpleSelectExpression.php deleted file mode 100644 index 25e927e..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/SimpleSelectExpression.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * SimpleSelectExpression ::= StateFieldPathExpression | IdentificationVariable - * | (AggregateExpression [["AS"] FieldAliasIdentificationVariable]) - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class SimpleSelectExpression extends Node -{ - public $expression; - public $fieldIdentificationVariable; - - public function __construct($expression) - { - $this->expression = $expression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkSimpleSelectExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/SimpleWhenClause.php b/framework/library/Doctrine/ORM/Query/AST/SimpleWhenClause.php deleted file mode 100644 index fabe449..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/SimpleWhenClause.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * SimpleWhenClause ::= "WHEN" ScalarExpression "THEN" ScalarExpression - * - * @since 2.2 - * - * @link www.doctrine-project.org - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class SimpleWhenClause extends Node -{ - public $caseScalarExpression = null; - public $thenScalarExpression = null; - - public function __construct($caseScalarExpression, $thenScalarExpression) - { - $this->caseScalarExpression = $caseScalarExpression; - $this->thenScalarExpression = $thenScalarExpression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkWhenClauseExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/Subselect.php b/framework/library/Doctrine/ORM/Query/AST/Subselect.php deleted file mode 100644 index 46c0e96..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/Subselect.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * Subselect ::= SimpleSelectClause SubselectFromClause [WhereClause] [GroupByClause] [HavingClause] [OrderByClause] - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Subselect extends Node -{ - public $simpleSelectClause; - public $subselectFromClause; - public $whereClause; - public $groupByClause; - public $havingClause; - public $orderByClause; - - public function __construct($simpleSelectClause, $subselectFromClause) - { - $this->simpleSelectClause = $simpleSelectClause; - $this->subselectFromClause = $subselectFromClause; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkSubselect($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/SubselectFromClause.php b/framework/library/Doctrine/ORM/Query/AST/SubselectFromClause.php deleted file mode 100644 index 3a6b547..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/SubselectFromClause.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * SubselectFromClause ::= "FROM" SubselectIdentificationVariableDeclaration {"," SubselectIdentificationVariableDeclaration}* - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class SubselectFromClause extends Node -{ - public $identificationVariableDeclarations = array(); - - public function __construct(array $identificationVariableDeclarations) - { - $this->identificationVariableDeclarations = $identificationVariableDeclarations; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkSubselectFromClause($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/UpdateClause.php b/framework/library/Doctrine/ORM/Query/AST/UpdateClause.php deleted file mode 100644 index 4188cf5..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/UpdateClause.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * UpdateClause ::= "UPDATE" AbstractSchemaName [["AS"] AliasIdentificationVariable] "SET" UpdateItem {"," UpdateItem}* - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class UpdateClause extends Node -{ - public $abstractSchemaName; - public $aliasIdentificationVariable; - public $updateItems = array(); - - public function __construct($abstractSchemaName, array $updateItems) - { - $this->abstractSchemaName = $abstractSchemaName; - $this->updateItems = $updateItems; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkUpdateClause($this); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/UpdateItem.php b/framework/library/Doctrine/ORM/Query/AST/UpdateItem.php deleted file mode 100644 index 2a13391..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/UpdateItem.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * UpdateItem ::= [IdentificationVariable "."] {StateField | SingleValuedAssociationField} "=" NewValue - * NewValue ::= SimpleArithmeticExpression | StringPrimary | DatetimePrimary | BooleanPrimary | - * EnumPrimary | SimpleEntityExpression | "NULL" - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class UpdateItem extends Node -{ - public $pathExpression; - public $newValue; - - public function __construct($pathExpression, $newValue) - { - $this->pathExpression = $pathExpression; - $this->newValue = $newValue; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkUpdateItem($this); - } -} - diff --git a/framework/library/Doctrine/ORM/Query/AST/UpdateStatement.php b/framework/library/Doctrine/ORM/Query/AST/UpdateStatement.php deleted file mode 100644 index 9e25d83..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/UpdateStatement.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ -namespace Doctrine\ORM\Query\AST; - -/** - * UpdateStatement = UpdateClause [WhereClause] - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class UpdateStatement extends Node -{ - public $updateClause; - public $whereClause; - - public function __construct($updateClause) - { - $this->updateClause = $updateClause; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkUpdateStatement($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/WhenClause.php b/framework/library/Doctrine/ORM/Query/AST/WhenClause.php deleted file mode 100644 index ca91f57..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/WhenClause.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * WhenClause ::= "WHEN" ConditionalExpression "THEN" ScalarExpression - * - * @since 2.2 - * - * @link www.doctrine-project.org - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class WhenClause extends Node -{ - public $caseConditionExpression = null; - public $thenScalarExpression = null; - - public function __construct($caseConditionExpression, $thenScalarExpression) - { - $this->caseConditionExpression = $caseConditionExpression; - $this->thenScalarExpression = $thenScalarExpression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkWhenClauseExpression($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/AST/WhereClause.php b/framework/library/Doctrine/ORM/Query/AST/WhereClause.php deleted file mode 100644 index 0b9f160..0000000 --- a/framework/library/Doctrine/ORM/Query/AST/WhereClause.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\AST; - -/** - * WhereClause ::= "WHERE" ConditionalExpression - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class WhereClause extends Node -{ - public $conditionalExpression; - - public function __construct($conditionalExpression) - { - $this->conditionalExpression = $conditionalExpression; - } - - public function dispatch($sqlWalker) - { - return $sqlWalker->walkWhereClause($this); - } -} diff --git a/framework/library/Doctrine/ORM/Query/Exec/AbstractSqlExecutor.php b/framework/library/Doctrine/ORM/Query/Exec/AbstractSqlExecutor.php deleted file mode 100644 index d20905a..0000000 --- a/framework/library/Doctrine/ORM/Query/Exec/AbstractSqlExecutor.php +++ /dev/null @@ -1,70 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Exec; - -use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Cache\QueryCacheProfile; - -/** - * Base class for SQL statement executors. - * - * @author Roman Borschel - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link http://www.doctrine-project.org - * @since 2.0 - * @todo Rename: AbstractSQLExecutor - */ -abstract class AbstractSqlExecutor -{ - /** - * @var array - */ - protected $_sqlStatements; - - /** - * @var QueryCacheProfile - */ - protected $queryCacheProfile; - - /** - * Gets the SQL statements that are executed by the executor. - * - * @return array All the SQL update statements. - */ - public function getSqlStatements() - { - return $this->_sqlStatements; - } - - public function setQueryCacheProfile(QueryCacheProfile $qcp) - { - $this->queryCacheProfile = $qcp; - } - - /** - * Executes all sql statements. - * - * @param \Doctrine\DBAL\Connection $conn The database connection that is used to execute the queries. - * @param array $params The parameters. - * @param array $types The parameter types. - * @return \Doctrine\DBAL\Driver\Statement - */ - abstract public function execute(Connection $conn, array $params, array $types); -} diff --git a/framework/library/Doctrine/ORM/Query/Exec/MultiTableDeleteExecutor.php b/framework/library/Doctrine/ORM/Query/Exec/MultiTableDeleteExecutor.php deleted file mode 100644 index d40b37e..0000000 --- a/framework/library/Doctrine/ORM/Query/Exec/MultiTableDeleteExecutor.php +++ /dev/null @@ -1,133 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Exec; - -use Doctrine\DBAL\Connection, - Doctrine\ORM\Query\AST; - -/** - * Executes the SQL statements for bulk DQL DELETE statements on classes in - * Class Table Inheritance (JOINED). - * - * @author Roman Borschel - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link http://www.doctrine-project.org - * @since 2.0 - */ -class MultiTableDeleteExecutor extends AbstractSqlExecutor -{ - private $_createTempTableSql; - private $_dropTempTableSql; - private $_insertSql; - - /** - * Initializes a new MultiTableDeleteExecutor. - * - * @param Node $AST The root AST node of the DQL query. - * @param SqlWalker $sqlWalker The walker used for SQL generation from the AST. - * @internal Any SQL construction and preparation takes place in the constructor for - * best performance. With a query cache the executor will be cached. - */ - public function __construct(AST\Node $AST, $sqlWalker) - { - $em = $sqlWalker->getEntityManager(); - $conn = $em->getConnection(); - $platform = $conn->getDatabasePlatform(); - $quoteStrategy = $em->getConfiguration()->getQuoteStrategy(); - - $primaryClass = $em->getClassMetadata($AST->deleteClause->abstractSchemaName); - $primaryDqlAlias = $AST->deleteClause->aliasIdentificationVariable; - $rootClass = $em->getClassMetadata($primaryClass->rootEntityName); - - $tempTable = $platform->getTemporaryTableName($rootClass->getTemporaryIdTableName()); - $idColumnNames = $rootClass->getIdentifierColumnNames(); - $idColumnList = implode(', ', $idColumnNames); - - // 1. Create an INSERT INTO temptable ... SELECT identifiers WHERE $AST->getWhereClause() - $sqlWalker->setSQLTableAlias($primaryClass->getTableName(), 't0', $primaryDqlAlias); - - $this->_insertSql = 'INSERT INTO ' . $tempTable . ' (' . $idColumnList . ')' - . ' SELECT t0.' . implode(', t0.', $idColumnNames); - - $rangeDecl = new AST\RangeVariableDeclaration($primaryClass->name, $primaryDqlAlias); - $fromClause = new AST\FromClause(array(new AST\IdentificationVariableDeclaration($rangeDecl, null, array()))); - $this->_insertSql .= $sqlWalker->walkFromClause($fromClause); - - // Append WHERE clause, if there is one. - if ($AST->whereClause) { - $this->_insertSql .= $sqlWalker->walkWhereClause($AST->whereClause); - } - - // 2. Create ID subselect statement used in DELETE ... WHERE ... IN (subselect) - $idSubselect = 'SELECT ' . $idColumnList . ' FROM ' . $tempTable; - - // 3. Create and store DELETE statements - $classNames = array_merge($primaryClass->parentClasses, array($primaryClass->name), $primaryClass->subClasses); - foreach (array_reverse($classNames) as $className) { - $tableName = $quoteStrategy->getTableName($em->getClassMetadata($className), $platform); - $this->_sqlStatements[] = 'DELETE FROM ' . $tableName - . ' WHERE (' . $idColumnList . ') IN (' . $idSubselect . ')'; - } - - // 4. Store DDL for temporary identifier table. - $columnDefinitions = array(); - foreach ($idColumnNames as $idColumnName) { - $columnDefinitions[$idColumnName] = array( - 'notnull' => true, - 'type' => \Doctrine\DBAL\Types\Type::getType($rootClass->getTypeOfColumn($idColumnName)) - ); - } - $this->_createTempTableSql = $platform->getCreateTemporaryTableSnippetSQL() . ' ' . $tempTable . ' (' - . $platform->getColumnDeclarationListSQL($columnDefinitions) . ')'; - $this->_dropTempTableSql = $platform->getDropTemporaryTableSQL($tempTable); - } - - /** - * {@inheritDoc} - */ - public function execute(Connection $conn, array $params, array $types) - { - $numDeleted = 0; - - // Create temporary id table - $conn->executeUpdate($this->_createTempTableSql); - - try { - // Insert identifiers - $numDeleted = $conn->executeUpdate($this->_insertSql, $params, $types); - - // Execute DELETE statements - foreach ($this->_sqlStatements as $sql) { - $conn->executeUpdate($sql); - } - } catch (\Exception $exception) { - // FAILURE! Drop temporary table to avoid possible collisions - $conn->executeUpdate($this->_dropTempTableSql); - - // Re-throw exception - throw $exception; - } - - // Drop temporary table - $conn->executeUpdate($this->_dropTempTableSql); - - return $numDeleted; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Exec/MultiTableUpdateExecutor.php b/framework/library/Doctrine/ORM/Query/Exec/MultiTableUpdateExecutor.php deleted file mode 100644 index 60951ee..0000000 --- a/framework/library/Doctrine/ORM/Query/Exec/MultiTableUpdateExecutor.php +++ /dev/null @@ -1,186 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Exec; - -use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Types\Type; - -use Doctrine\ORM\Query\ParameterTypeInferer; -use Doctrine\ORM\Query\AST; - -/** - * Executes the SQL statements for bulk DQL UPDATE statements on classes in - * Class Table Inheritance (JOINED). - * - * @author Roman Borschel - * @since 2.0 - */ -class MultiTableUpdateExecutor extends AbstractSqlExecutor -{ - private $_createTempTableSql; - private $_dropTempTableSql; - private $_insertSql; - private $_sqlParameters = array(); - private $_numParametersInUpdateClause = 0; - - /** - * Initializes a new MultiTableUpdateExecutor. - * - * @param Node $AST The root AST node of the DQL query. - * @param SqlWalker $sqlWalker The walker used for SQL generation from the AST. - * @internal Any SQL construction and preparation takes place in the constructor for - * best performance. With a query cache the executor will be cached. - */ - public function __construct(AST\Node $AST, $sqlWalker) - { - $em = $sqlWalker->getEntityManager(); - $conn = $em->getConnection(); - $platform = $conn->getDatabasePlatform(); - $quoteStrategy = $em->getConfiguration()->getQuoteStrategy(); - - $updateClause = $AST->updateClause; - $primaryClass = $sqlWalker->getEntityManager()->getClassMetadata($updateClause->abstractSchemaName); - $rootClass = $em->getClassMetadata($primaryClass->rootEntityName); - - $updateItems = $updateClause->updateItems; - - $tempTable = $platform->getTemporaryTableName($rootClass->getTemporaryIdTableName()); - $idColumnNames = $rootClass->getIdentifierColumnNames(); - $idColumnList = implode(', ', $idColumnNames); - - // 1. Create an INSERT INTO temptable ... SELECT identifiers WHERE $AST->getWhereClause() - $sqlWalker->setSQLTableAlias($primaryClass->getTableName(), 't0', $updateClause->aliasIdentificationVariable); - - $this->_insertSql = 'INSERT INTO ' . $tempTable . ' (' . $idColumnList . ')' - . ' SELECT t0.' . implode(', t0.', $idColumnNames); - - $rangeDecl = new AST\RangeVariableDeclaration($primaryClass->name, $updateClause->aliasIdentificationVariable); - $fromClause = new AST\FromClause(array(new AST\IdentificationVariableDeclaration($rangeDecl, null, array()))); - - $this->_insertSql .= $sqlWalker->walkFromClause($fromClause); - - // 2. Create ID subselect statement used in UPDATE ... WHERE ... IN (subselect) - $idSubselect = 'SELECT ' . $idColumnList . ' FROM ' . $tempTable; - - // 3. Create and store UPDATE statements - $classNames = array_merge($primaryClass->parentClasses, array($primaryClass->name), $primaryClass->subClasses); - $i = -1; - - foreach (array_reverse($classNames) as $className) { - $affected = false; - $class = $em->getClassMetadata($className); - $updateSql = 'UPDATE ' . $quoteStrategy->getTableName($class, $platform) . ' SET '; - - foreach ($updateItems as $updateItem) { - $field = $updateItem->pathExpression->field; - - if (isset($class->fieldMappings[$field]) && ! isset($class->fieldMappings[$field]['inherited']) || - isset($class->associationMappings[$field]) && ! isset($class->associationMappings[$field]['inherited'])) { - $newValue = $updateItem->newValue; - - if ( ! $affected) { - $affected = true; - ++$i; - } else { - $updateSql .= ', '; - } - - $updateSql .= $sqlWalker->walkUpdateItem($updateItem); - - if ($newValue instanceof AST\InputParameter) { - $this->_sqlParameters[$i][] = $newValue->name; - - ++$this->_numParametersInUpdateClause; - } - } - } - - if ($affected) { - $this->_sqlStatements[$i] = $updateSql . ' WHERE (' . $idColumnList . ') IN (' . $idSubselect . ')'; - } - } - - // Append WHERE clause to insertSql, if there is one. - if ($AST->whereClause) { - $this->_insertSql .= $sqlWalker->walkWhereClause($AST->whereClause); - } - - // 4. Store DDL for temporary identifier table. - $columnDefinitions = array(); - - foreach ($idColumnNames as $idColumnName) { - $columnDefinitions[$idColumnName] = array( - 'notnull' => true, - 'type' => Type::getType($rootClass->getTypeOfColumn($idColumnName)) - ); - } - - $this->_createTempTableSql = $platform->getCreateTemporaryTableSnippetSQL() . ' ' . $tempTable . ' (' - . $platform->getColumnDeclarationListSQL($columnDefinitions) . ')'; - - $this->_dropTempTableSql = $platform->getDropTemporaryTableSQL($tempTable); - } - - /** - * {@inheritDoc} - */ - public function execute(Connection $conn, array $params, array $types) - { - $numUpdated = 0; - - // Create temporary id table - $conn->executeUpdate($this->_createTempTableSql); - - try { - // Insert identifiers. Parameters from the update clause are cut off. - $numUpdated = $conn->executeUpdate( - $this->_insertSql, - array_slice($params, $this->_numParametersInUpdateClause), - array_slice($types, $this->_numParametersInUpdateClause) - ); - - // Execute UPDATE statements - foreach ($this->_sqlStatements as $key => $statement) { - $paramValues = array(); - $paramTypes = array(); - - if (isset($this->_sqlParameters[$key])) { - foreach ($this->_sqlParameters[$key] as $parameterKey => $parameterName) { - $paramValues[] = $params[$parameterKey]; - $paramTypes[] = isset($types[$parameterKey]) ? $types[$parameterKey] : ParameterTypeInferer::inferType($params[$parameterKey]); - } - } - - $conn->executeUpdate($statement, $paramValues, $paramTypes); - } - } catch (\Exception $exception) { - // FAILURE! Drop temporary table to avoid possible collisions - $conn->executeUpdate($this->_dropTempTableSql); - - // Re-throw exception - throw $exception; - } - - // Drop temporary table - $conn->executeUpdate($this->_dropTempTableSql); - - return $numUpdated; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Exec/SingleSelectExecutor.php b/framework/library/Doctrine/ORM/Query/Exec/SingleSelectExecutor.php deleted file mode 100644 index 61ae2fa..0000000 --- a/framework/library/Doctrine/ORM/Query/Exec/SingleSelectExecutor.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Exec; - -use Doctrine\DBAL\Connection, - Doctrine\ORM\Query\AST\SelectStatement, - Doctrine\ORM\Query\SqlWalker; - -/** - * Executor that executes the SQL statement for simple DQL SELECT statements. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @author Roman Borschel - * @link www.doctrine-project.org - * @since 2.0 - */ -class SingleSelectExecutor extends AbstractSqlExecutor -{ - public function __construct(SelectStatement $AST, SqlWalker $sqlWalker) - { - $this->_sqlStatements = $sqlWalker->walkSelectStatement($AST); - } - - /** - * {@inheritDoc} - */ - public function execute(Connection $conn, array $params, array $types) - { - return $conn->executeQuery($this->_sqlStatements, $params, $types, $this->queryCacheProfile); - } -} diff --git a/framework/library/Doctrine/ORM/Query/Exec/SingleTableDeleteUpdateExecutor.php b/framework/library/Doctrine/ORM/Query/Exec/SingleTableDeleteUpdateExecutor.php deleted file mode 100644 index b9bfd6f..0000000 --- a/framework/library/Doctrine/ORM/Query/Exec/SingleTableDeleteUpdateExecutor.php +++ /dev/null @@ -1,53 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Exec; - -use Doctrine\DBAL\Connection, - Doctrine\ORM\Query\AST; - -/** - * Executor that executes the SQL statements for DQL DELETE/UPDATE statements on classes - * that are mapped to a single table. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @author Roman Borschel - * @link www.doctrine-project.org - * @since 2.0 - * @todo This is exactly the same as SingleSelectExecutor. Unify in SingleStatementExecutor. - */ -class SingleTableDeleteUpdateExecutor extends AbstractSqlExecutor -{ - public function __construct(AST\Node $AST, $sqlWalker) - { - if ($AST instanceof AST\UpdateStatement) { - $this->_sqlStatements = $sqlWalker->walkUpdateStatement($AST); - } else if ($AST instanceof AST\DeleteStatement) { - $this->_sqlStatements = $sqlWalker->walkDeleteStatement($AST); - } - } - - /** - * {@inheritDoc} - */ - public function execute(Connection $conn, array $params, array $types) - { - return $conn->executeUpdate($this->_sqlStatements, $params, $types); - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr.php b/framework/library/Doctrine/ORM/Query/Expr.php deleted file mode 100644 index 5ffedba..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr.php +++ /dev/null @@ -1,595 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -/** - * This class is used to generate DQL expressions via a set of PHP static functions - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - * @todo Rename: ExpressionBuilder - */ -class Expr -{ - /** - * Creates a conjunction of the given boolean expressions. - * - * Example: - * - * [php] - * // (u.type = ?1) AND (u.role = ?2) - * $expr->andX($expr->eq('u.type', ':1'), $expr->eq('u.role', ':2')); - * - * @param \Doctrine\ORM\Query\Expr\Comparison | - * \Doctrine\ORM\Query\Expr\Func | - * \Doctrine\ORM\Query\Expr\Orx - * $x Optional clause. Defaults = null, but requires at least one defined when converting to string. - * @return Expr\Andx - */ - public function andX($x = null) - { - return new Expr\Andx(func_get_args()); - } - - /** - * Creates a disjunction of the given boolean expressions. - * - * Example: - * - * [php] - * // (u.type = ?1) OR (u.role = ?2) - * $q->where($q->expr()->orX('u.type = ?1', 'u.role = ?2')); - * - * @param mixed $x Optional clause. Defaults = null, but requires - * at least one defined when converting to string. - * @return Expr\Orx - */ - public function orX($x = null) - { - return new Expr\Orx(func_get_args()); - } - - /** - * Creates an ASCending order expression. - * - * @param $sort - * @return Expr\OrderBy - */ - public function asc($expr) - { - return new Expr\OrderBy($expr, 'ASC'); - } - - /** - * Creates a DESCending order expression. - * - * @param $sort - * @return Expr\OrderBy - */ - public function desc($expr) - { - return new Expr\OrderBy($expr, 'DESC'); - } - - /** - * 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: - * - * [php] - * // u.id = ?1 - * $expr->eq('u.id', '?1'); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return Expr\Comparison - */ - public function eq($x, $y) - { - return new Expr\Comparison($x, Expr\Comparison::EQ, $y); - } - - /** - * Creates an instance of Expr\Comparison, 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: - * - * [php] - * // u.id <> ?1 - * $q->where($q->expr()->neq('u.id', '?1')); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return Expr\Comparison - */ - public function neq($x, $y) - { - return new Expr\Comparison($x, Expr\Comparison::NEQ, $y); - } - - /** - * Creates an instance of Expr\Comparison, 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: - * - * [php] - * // u.id < ?1 - * $q->where($q->expr()->lt('u.id', '?1')); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return Expr\Comparison - */ - public function lt($x, $y) - { - return new Expr\Comparison($x, Expr\Comparison::LT, $y); - } - - /** - * Creates an instance of Expr\Comparison, 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: - * - * [php] - * // u.id <= ?1 - * $q->where($q->expr()->lte('u.id', '?1')); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return Expr\Comparison - */ - public function lte($x, $y) - { - return new Expr\Comparison($x, Expr\Comparison::LTE, $y); - } - - /** - * Creates an instance of Expr\Comparison, 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: - * - * [php] - * // u.id > ?1 - * $q->where($q->expr()->gt('u.id', '?1')); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return Expr\Comparison - */ - public function gt($x, $y) - { - return new Expr\Comparison($x, Expr\Comparison::GT, $y); - } - - /** - * Creates an instance of Expr\Comparison, 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: - * - * [php] - * // u.id >= ?1 - * $q->where($q->expr()->gte('u.id', '?1')); - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return Expr\Comparison - */ - public function gte($x, $y) - { - return new Expr\Comparison($x, Expr\Comparison::GTE, $y); - } - - /** - * Creates an instance of AVG() function, with the given argument. - * - * @param mixed $x Argument to be used in AVG() function. - * @return Expr\Func - */ - public function avg($x) - { - return new Expr\Func('AVG', array($x)); - } - - /** - * Creates an instance of MAX() function, with the given argument. - * - * @param mixed $x Argument to be used in MAX() function. - * @return Expr\Func - */ - public function max($x) - { - return new Expr\Func('MAX', array($x)); - } - - /** - * Creates an instance of MIN() function, with the given argument. - * - * @param mixed $x Argument to be used in MIN() function. - * @return Expr\Func - */ - public function min($x) - { - return new Expr\Func('MIN', array($x)); - } - - /** - * Creates an instance of COUNT() function, with the given argument. - * - * @param mixed $x Argument to be used in COUNT() function. - * @return Expr\Func - */ - public function count($x) - { - return new Expr\Func('COUNT', array($x)); - } - - /** - * Creates an instance of COUNT(DISTINCT) function, with the given argument. - * - * @param mixed $x Argument to be used in COUNT(DISTINCT) function. - * @return string - */ - public function countDistinct($x) - { - return 'COUNT(DISTINCT ' . implode(', ', func_get_args()) . ')'; - } - - /** - * Creates an instance of EXISTS() function, with the given DQL Subquery. - * - * @param mixed $subquery DQL Subquery to be used in EXISTS() function. - * @return Expr\Func - */ - public function exists($subquery) - { - return new Expr\Func('EXISTS', array($subquery)); - } - - /** - * Creates an instance of ALL() function, with the given DQL Subquery. - * - * @param mixed $subquery DQL Subquery to be used in ALL() function. - * @return Expr\Func - */ - public function all($subquery) - { - return new Expr\Func('ALL', array($subquery)); - } - - /** - * Creates a SOME() function expression with the given DQL subquery. - * - * @param mixed $subquery DQL Subquery to be used in SOME() function. - * @return Expr\Func - */ - public function some($subquery) - { - return new Expr\Func('SOME', array($subquery)); - } - - /** - * Creates an ANY() function expression with the given DQL subquery. - * - * @param mixed $subquery DQL Subquery to be used in ANY() function. - * @return Expr\Func - */ - public function any($subquery) - { - return new Expr\Func('ANY', array($subquery)); - } - - /** - * Creates a negation expression of the given restriction. - * - * @param mixed $restriction Restriction to be used in NOT() function. - * @return Expr\Func - */ - public function not($restriction) - { - return new Expr\Func('NOT', array($restriction)); - } - - /** - * Creates an ABS() function expression with the given argument. - * - * @param mixed $x Argument to be used in ABS() function. - * @return Expr\Func - */ - public function abs($x) - { - return new Expr\Func('ABS', array($x)); - } - - /** - * 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: - * - * [php] - * // u.salary * u.percentAnualSalaryIncrease - * $q->expr()->prod('u.salary', 'u.percentAnualSalaryIncrease') - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return Expr\Math - */ - public function prod($x, $y) - { - return new Expr\Math($x, '*', $y); - } - - /** - * Creates a difference 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: - * - * [php] - * // u.monthlySubscriptionCount - 1 - * $q->expr()->diff('u.monthlySubscriptionCount', '1') - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return Expr\Math - */ - public function diff($x, $y) - { - return new Expr\Math($x, '-', $y); - } - - /** - * Creates a sum 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: - * - * [php] - * // u.numChildren + 1 - * $q->expr()->diff('u.numChildren', '1') - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return Expr\Math - */ - public function sum($x, $y) - { - return new Expr\Math($x, '+', $y); - } - - /** - * Creates a quotient 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: - * - * [php] - * // u.total / u.period - * $expr->quot('u.total', 'u.period') - * - * @param mixed $x Left expression - * @param mixed $y Right expression - * @return Expr\Math - */ - public function quot($x, $y) - { - return new Expr\Math($x, '/', $y); - } - - /** - * Creates a SQRT() function expression with the given argument. - * - * @param mixed $x Argument to be used in SQRT() function. - * @return Expr\Func - */ - public function sqrt($x) - { - return new Expr\Func('SQRT', array($x)); - } - - /** - * Creates an IN() expression with the given arguments. - * - * @param string $x Field in string format to be restricted by IN() function - * @param mixed $y Argument to be used in IN() function. - * @return Expr\Func - */ - public function in($x, $y) - { - if (is_array($y)) { - foreach ($y as &$literal) { - if ( ! ($literal instanceof Expr\Literal)) { - $literal = $this->_quoteLiteral($literal); - } - } - } - return new Expr\Func($x . ' IN', (array) $y); - } - - /** - * Creates a NOT IN() expression with the given arguments. - * - * @param string $x Field in string format to be restricted by NOT IN() function - * @param mixed $y Argument to be used in NOT IN() function. - * @return Expr\Func - */ - public function notIn($x, $y) - { - if (is_array($y)) { - foreach ($y as &$literal) { - if ( ! ($literal instanceof Expr\Literal)) { - $literal = $this->_quoteLiteral($literal); - } - } - } - return new Expr\Func($x . ' NOT IN', (array) $y); - } - - /** - * Creates an IS NULL expression with the given arguments. - * - * @param string $x Field in string format to be restricted by IS NULL - * @return string - */ - public function isNull($x) - { - return $x . ' IS NULL'; - } - - /** - * Creates an IS NOT NULL expression with the given arguments. - * - * @param string $x Field in string format to be restricted by IS NOT NULL - * @return string - */ - public function isNotNull($x) - { - return $x . ' IS NOT NULL'; - } - - /** - * Creates a LIKE() comparison expression with the given arguments. - * - * @param string $x Field in string format to be inspected by LIKE() comparison. - * @param mixed $y Argument to be used in LIKE() comparison. - * @return Expr\Comparison - */ - public function like($x, $y) - { - return new Expr\Comparison($x, 'LIKE', $y); - } - - /** - * Creates a CONCAT() function expression with the given arguments. - * - * @param mixed $x First argument to be used in CONCAT() function. - * @param mixed $x Second argument to be used in CONCAT() function. - * @return Expr\Func - */ - public function concat($x, $y) - { - return new Expr\Func('CONCAT', array($x, $y)); - } - - /** - * Creates a SUBSTRING() function expression with the given arguments. - * - * @param mixed $x Argument to be used as string to be cropped by SUBSTRING() function. - * @param integer $from Initial offset to start cropping string. May accept negative values. - * @param integer $len Length of crop. May accept negative values. - * @return Expr\Func - */ - public function substring($x, $from, $len = null) - { - $args = array($x, $from); - if (null !== $len) { - $args[] = $len; - } - return new Expr\Func('SUBSTRING', $args); - } - - /** - * Creates a LOWER() function expression with the given argument. - * - * @param mixed $x Argument to be used in LOWER() function. - * @return Expr\Func A LOWER function expression. - */ - public function lower($x) - { - return new Expr\Func('LOWER', array($x)); - } - - /** - * Creates an UPPER() function expression with the given argument. - * - * @param mixed $x Argument to be used in UPPER() function. - * @return Expr\Func An UPPER function expression. - */ - public function upper($x) - { - return new Expr\Func('UPPER', array($x)); - } - - /** - * Creates a LENGTH() function expression with the given argument. - * - * @param mixed $x Argument to be used as argument of LENGTH() function. - * @return Expr\Func A LENGTH function expression. - */ - public function length($x) - { - return new Expr\Func('LENGTH', array($x)); - } - - /** - * Creates a literal expression of the given argument. - * - * @param mixed $literal Argument to be converted to literal. - * @return Expr\Literal - */ - public function literal($literal) - { - 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) && !is_string($literal)) { - return (string) $literal; - } else if (is_bool($literal)) { - return $literal ? "true" : "false"; - } else { - return "'" . str_replace("'", "''", $literal) . "'"; - } - } - - /** - * Creates an instance of BETWEEN() function, with the given argument. - * - * @param mixed $val Valued to be inspected by range values. - * @param integer $x Starting range value to be used in BETWEEN() function. - * @param integer $y End point value to be used in BETWEEN() function. - * @return Expr\Func A BETWEEN expression. - */ - public function between($val, $x, $y) - { - return $val . ' BETWEEN ' . $x . ' AND ' . $y; - } - - /** - * Creates an instance of TRIM() function, with the given argument. - * - * @param mixed $x Argument to be used as argument of TRIM() function. - * @return Expr\Func a TRIM expression. - */ - public function trim($x) - { - return new Expr\Func('TRIM', $x); - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/Andx.php b/framework/library/Doctrine/ORM/Query/Expr/Andx.php deleted file mode 100644 index 10b5e8e..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/Andx.php +++ /dev/null @@ -1,56 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for building DQL and parts - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Andx extends Composite -{ - /** - * @var string - */ - protected $separator = ' AND '; - - /** - * @var array - */ - protected $allowedClasses = array( - 'Doctrine\ORM\Query\Expr\Comparison', - 'Doctrine\ORM\Query\Expr\Func', - 'Doctrine\ORM\Query\Expr\Orx', - 'Doctrine\ORM\Query\Expr\Andx', - ); - - /** - * @return array - */ - public function getParts() - { - return $this->parts; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/Base.php b/framework/library/Doctrine/ORM/Query/Expr/Base.php deleted file mode 100644 index 0fee7b2..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/Base.php +++ /dev/null @@ -1,121 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Abstract base Expr class for building DQL parts - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -abstract class Base -{ - /** - * @var string - */ - protected $preSeparator = '('; - - /** - * @var string - */ - protected $separator = ', '; - - /** - * @var string - */ - protected $postSeparator = ')'; - - /** - * @var array - */ - protected $allowedClasses = array(); - - /** - * @var array - */ - protected $parts = array(); - - /** - * @param array $args - */ - public function __construct($args = array()) - { - $this->addMultiple($args); - } - - /** - * @param array $args - * @return Base - */ - public function addMultiple($args = array()) - { - foreach ((array) $args as $arg) { - $this->add($arg); - } - - return $this; - } - - /** - * @param mixed $arg - * @return Base - */ - public function add($arg) - { - if ( $arg !== null && (!$arg instanceof self || $arg->count() > 0) ) { - // If we decide to keep Expr\Base instances, we can use this check - if ( ! is_string($arg)) { - $class = get_class($arg); - - if ( ! in_array($class, $this->allowedClasses)) { - throw new \InvalidArgumentException("Expression of type '$class' not allowed in this context."); - } - } - - $this->parts[] = $arg; - } - - return $this; - } - - /** - * @return integer - */ - public function count() - { - return count($this->parts); - } - - /** - * @return string - */ - public function __toString() - { - if ($this->count() == 1) { - return (string) $this->parts[0]; - } - - return $this->preSeparator . implode($this->separator, $this->parts) . $this->postSeparator; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/Comparison.php b/framework/library/Doctrine/ORM/Query/Expr/Comparison.php deleted file mode 100644 index 52070df..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/Comparison.php +++ /dev/null @@ -1,101 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for DQL comparison expressions - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Comparison -{ - const EQ = '='; - const NEQ = '<>'; - const LT = '<'; - const LTE = '<='; - const GT = '>'; - const GTE = '>='; - - /** - * @var mixed - */ - protected $leftExpr; - - /** - * @var string - */ - protected $operator; - - /** - * @var mixed - */ - protected $rightExpr; - - /** - * Creates a comparison expression with the given arguments. - * - * @param mixed $leftExpr - * @param string $operator - * @param mixed $rightExpr - */ - public function __construct($leftExpr, $operator, $rightExpr) - { - $this->leftExpr = $leftExpr; - $this->operator = $operator; - $this->rightExpr = $rightExpr; - } - - /** - * @return mixed - */ - public function getLeftExpr() - { - return $this->leftExpr; - } - - /** - * @return string - */ - public function getOperator() - { - return $this->operator; - } - - /** - * @return mixed - */ - public function getRightExpr() - { - return $this->rightExpr; - } - - /** - * @return string - */ - public function __toString() - { - return $this->leftExpr . ' ' . $this->operator . ' ' . $this->rightExpr; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/Composite.php b/framework/library/Doctrine/ORM/Query/Expr/Composite.php deleted file mode 100644 index cc0e0e8..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/Composite.php +++ /dev/null @@ -1,72 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for building DQL and parts - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Composite extends Base -{ - /** - * @return string - */ - public function __toString() - { - if ($this->count() === 1) { - return (string) $this->parts[0]; - } - - $components = array(); - - foreach ($this->parts as $part) { - $components[] = $this->processQueryPart($part); - } - - return implode($this->separator, $components); - } - - - /** - * @param string $part - * @return string - */ - private function processQueryPart($part) - { - $queryPart = (string) $part; - - if (is_object($part) && $part instanceof self && $part->count() > 1) { - return $this->preSeparator . $queryPart . $this->postSeparator; - } - - // Fixes DDC-1237: User may have added a where item containing nested expression (with "OR" or "AND") - if (stripos($queryPart, ' OR ') !== false || stripos($queryPart, ' AND ') !== false) { - return $this->preSeparator . $queryPart . $this->postSeparator; - } - - return $queryPart; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/From.php b/framework/library/Doctrine/ORM/Query/Expr/From.php deleted file mode 100644 index 3a37703..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/From.php +++ /dev/null @@ -1,93 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for DQL from - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class From -{ - /** - * @var string - */ - protected $from; - - /** - * @var string - */ - protected $alias; - - /** - * @var string - */ - protected $indexBy; - - /** - * @param string $from The class name. - * @param string $alias The alias of the class. - * @param string $indexBy The index for the from. - */ - public function __construct($from, $alias, $indexBy = null) - { - $this->from = $from; - $this->alias = $alias; - $this->indexBy = $indexBy; - } - - /** - * @return string - */ - public function getFrom() - { - return $this->from; - } - - /** - * @return string - */ - public function getAlias() - { - return $this->alias; - } - - /** - * @return string - */ - public function getIndexBy() - { - return $this->indexBy; - } - - /** - * @return string - */ - public function __toString() - { - return $this->from . ' ' . $this->alias . - ($this->indexBy ? ' INDEX BY ' . $this->indexBy : ''); - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/Func.php b/framework/library/Doctrine/ORM/Query/Expr/Func.php deleted file mode 100644 index 6917dd2..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/Func.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for generating DQL functions - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Func -{ - /** - * @var string - */ - protected $name; - - /** - * @var array - */ - protected $arguments; - - /** - * Creates a function, with the given argument. - * - * @param string $name - * @param array $arguments - */ - public function __construct($name, $arguments) - { - $this->name = $name; - $this->arguments = (array) $arguments; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * @return array - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * @return string - */ - public function __toString() - { - return $this->name . '(' . implode(', ', $this->arguments) . ')'; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/GroupBy.php b/framework/library/Doctrine/ORM/Query/Expr/GroupBy.php deleted file mode 100644 index 40bb838..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/GroupBy.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for building DQL Group By parts - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class GroupBy extends Base -{ - /** - * @var string - */ - protected $preSeparator = ''; - - /** - * @var string - */ - protected $postSeparator = ''; - - /** - * @return array - */ - public function getParts() - { - return $this->parts; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/Join.php b/framework/library/Doctrine/ORM/Query/Expr/Join.php deleted file mode 100644 index 41f454f..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/Join.php +++ /dev/null @@ -1,147 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for DQL from - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Join -{ - const INNER_JOIN = 'INNER'; - const LEFT_JOIN = 'LEFT'; - - const ON = 'ON'; - const WITH = 'WITH'; - - /** - * @var string - */ - protected $joinType; - - /** - * @var string - */ - protected $join; - - /** - * @var string - */ - protected $alias; - - /** - * @var string - */ - protected $conditionType; - - /** - * @var string - */ - protected $condition; - - /** - * @var string - */ - protected $indexBy; - - /** - * @param string $joinType The condition type constant. Either INNER_JOIN or LEFT_JOIN. - * @param string $join The relationship to join - * @param string $alias The alias of the join - * @param string $conditionType The condition type constant. Either ON or WITH. - * @param string $condition The condition for the join - * @param string $indexBy The index for the join - */ - public function __construct($joinType, $join, $alias = null, $conditionType = null, $condition = null, $indexBy = null) - { - $this->joinType = $joinType; - $this->join = $join; - $this->alias = $alias; - $this->conditionType = $conditionType; - $this->condition = $condition; - $this->indexBy = $indexBy; - } - - /** - * @return string - */ - public function getJoinType() - { - return $this->joinType; - } - - /** - * @return string - */ - public function getJoin() - { - return $this->join; - } - - /** - * @return string - */ - public function getAlias() - { - return $this->alias; - } - - /** - * @return string - */ - public function getConditionType() - { - return $this->conditionType; - } - - /** - * @return string - */ - public function getCondition() - { - return $this->condition; - } - - /** - * @return string - */ - public function getIndexBy() - { - return $this->indexBy; - } - - - /** - * @return string - */ - public function __toString() - { - return strtoupper($this->joinType) . ' JOIN ' . $this->join - . ($this->alias ? ' ' . $this->alias : '') - . ($this->condition ? ' ' . strtoupper($this->conditionType) . ' ' . $this->condition : '') - . ($this->indexBy ? ' INDEX BY ' . $this->indexBy : ''); - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/Literal.php b/framework/library/Doctrine/ORM/Query/Expr/Literal.php deleted file mode 100644 index 991b044..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/Literal.php +++ /dev/null @@ -1,52 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for generating DQL functions - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Literal extends Base -{ - /** - * @var string - */ - protected $preSeparator = ''; - - /** - * @var string - */ - protected $postSeparator = ''; - - /** - * @return array - */ - public function getParts() - { - return $this->parts; - } - -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/Math.php b/framework/library/Doctrine/ORM/Query/Expr/Math.php deleted file mode 100644 index a41c848..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/Math.php +++ /dev/null @@ -1,108 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for DQL math statements - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Math -{ - /** - * @var mixed - */ - protected $leftExpr; - - /** - * @var string - */ - protected $operator; - - /** - * @var mixed - */ - protected $rightExpr; - - /** - * Creates a mathematical expression with the given arguments. - * - * @param mixed $leftExpr - * @param string $operator - * @param mixed $rightExpr - */ - public function __construct($leftExpr, $operator, $rightExpr) - { - $this->leftExpr = $leftExpr; - $this->operator = $operator; - $this->rightExpr = $rightExpr; - } - - /** - * @return mixed - */ - public function getLeftExpr() - { - return $this->leftExpr; - } - - /** - * @return string - */ - public function getOperator() - { - return $this->operator; - } - - /** - * @return mixed - */ - public function getRightExpr() - { - return $this->rightExpr; - } - - /** - * @return string - */ - public function __toString() - { - // Adjusting Left Expression - $leftExpr = (string) $this->leftExpr; - - if ($this->leftExpr instanceof Math) { - $leftExpr = '(' . $leftExpr . ')'; - } - - // Adjusting Right Expression - $rightExpr = (string) $this->rightExpr; - - if ($this->rightExpr instanceof Math) { - $rightExpr = '(' . $rightExpr . ')'; - } - - return $leftExpr . ' ' . $this->operator . ' ' . $rightExpr; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/OrderBy.php b/framework/library/Doctrine/ORM/Query/Expr/OrderBy.php deleted file mode 100644 index e0e7ffc..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/OrderBy.php +++ /dev/null @@ -1,103 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for building DQL Order By parts - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class OrderBy -{ - /** - * @var string - */ - protected $preSeparator = ''; - - /** - * @var string - */ - protected $separator = ', '; - - /** - * @var string - */ - protected $postSeparator = ''; - - /** - * @var array - */ - protected $allowedClasses = array(); - - /** - * @var array - */ - protected $parts = array(); - - /** - * @param string $sort - * @param string $order - */ - public function __construct($sort = null, $order = null) - { - if ($sort) { - $this->add($sort, $order); - } - } - - /** - * @param string $sort - * @param string $order - */ - public function add($sort, $order = null) - { - $order = ! $order ? 'ASC' : $order; - $this->parts[] = $sort . ' '. $order; - } - - /** - * @return integer - */ - public function count() - { - return count($this->parts); - } - - /** - * @return array - */ - public function getParts() - { - return $this->parts; - } - - /** - * @return string - */ - public function __tostring() - { - return $this->preSeparator . implode($this->separator, $this->parts) . $this->postSeparator; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/Orx.php b/framework/library/Doctrine/ORM/Query/Expr/Orx.php deleted file mode 100644 index caecba6..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/Orx.php +++ /dev/null @@ -1,56 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for building DQL OR clauses - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Orx extends Composite -{ - /** - * @var string - */ - protected $separator = ' OR '; - - /** - * @var array - */ - protected $allowedClasses = array( - 'Doctrine\ORM\Query\Expr\Comparison', - 'Doctrine\ORM\Query\Expr\Func', - 'Doctrine\ORM\Query\Expr\Andx', - 'Doctrine\ORM\Query\Expr\Orx', - ); - - /** - * @return array - */ - public function getParts() - { - return $this->parts; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Expr/Select.php b/framework/library/Doctrine/ORM/Query/Expr/Select.php deleted file mode 100644 index 804d797..0000000 --- a/framework/library/Doctrine/ORM/Query/Expr/Select.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Expr; - -/** - * Expression class for building DQL select statements - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Select extends Base -{ - /** - * @var string - */ - protected $preSeparator = ''; - - /** - * @var string - */ - protected $postSeparator = ''; - - /** - * @var array - */ - protected $allowedClasses = array( - 'Doctrine\ORM\Query\Expr\Func' - ); - - /** - * @return array - */ - public function getParts() - { - return $this->parts; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Filter/SQLFilter.php b/framework/library/Doctrine/ORM/Query/Filter/SQLFilter.php deleted file mode 100644 index 5d6692b..0000000 --- a/framework/library/Doctrine/ORM/Query/Filter/SQLFilter.php +++ /dev/null @@ -1,122 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query\Filter; - -use Doctrine\ORM\EntityManager, - Doctrine\ORM\Mapping\ClassMetaData, - Doctrine\ORM\Query\ParameterTypeInferer; - -/** - * The base class that user defined filters should extend. - * - * Handles the setting and escaping of parameters. - * - * @author Alexander - * @author Benjamin Eberlei - * @abstract - */ -abstract class SQLFilter -{ - /** - * The entity manager. - * @var EntityManager - */ - private $em; - - /** - * Parameters for the filter. - * @var array - */ - private $parameters; - - /** - * Constructs the SQLFilter object. - * - * @param EntityManager $em The EM - */ - final public function __construct(EntityManager $em) - { - $this->em = $em; - } - - /** - * Sets a parameter that can be used by the filter. - * - * @param string $name Name of the parameter. - * @param string $value Value of the parameter. - * @param string $type The parameter type. If specified, the given value will be run through - * the type conversion of this type. This is usually not needed for - * strings and numeric types. - * - * @return SQLFilter The current SQL filter. - */ - final public function setParameter($name, $value, $type = null) - { - if (null === $type) { - $type = ParameterTypeInferer::inferType($value); - } - - $this->parameters[$name] = array('value' => $value, 'type' => $type); - - // Keep the parameters sorted for the hash - ksort($this->parameters); - - // The filter collection of the EM is now dirty - $this->em->getFilters()->setFiltersStateDirty(); - - return $this; - } - - /** - * Gets a parameter to use in a query. - * - * The function is responsible for the right output escaping to use the - * value in a query. - * - * @param string $name Name of the parameter. - * - * @return string The SQL escaped parameter to use in a query. - */ - final public function getParameter($name) - { - if (!isset($this->parameters[$name])) { - throw new \InvalidArgumentException("Parameter '" . $name . "' does not exist."); - } - - return $this->em->getConnection()->quote($this->parameters[$name]['value'], $this->parameters[$name]['type']); - } - - /** - * Returns as string representation of the SQLFilter parameters (the state). - * - * @return string String representation of the SQLFilter. - */ - final public function __toString() - { - return serialize($this->parameters); - } - - /** - * Gets the SQL query part to add to a query. - * - * @return string The constraint SQL if there is available, empty string otherwise - */ - abstract public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias); -} diff --git a/framework/library/Doctrine/ORM/Query/FilterCollection.php b/framework/library/Doctrine/ORM/Query/FilterCollection.php deleted file mode 100644 index fc47eb1..0000000 --- a/framework/library/Doctrine/ORM/Query/FilterCollection.php +++ /dev/null @@ -1,198 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -use Doctrine\ORM\Configuration, - Doctrine\ORM\EntityManager; - -/** - * Collection class for all the query filters. - * - * @author Alexander - */ -class FilterCollection -{ - /* Filter STATES */ - /** - * A filter object is in CLEAN state when it has no changed parameters. - */ - const FILTERS_STATE_CLEAN = 1; - - /** - * A filter object is in DIRTY state when it has changed parameters. - */ - const FILTERS_STATE_DIRTY = 2; - - /** - * The used Configuration. - * - * @var Doctrine\ORM\Configuration - */ - private $config; - - /** - * The EntityManager that "owns" this FilterCollection instance. - * - * @var Doctrine\ORM\EntityManager - */ - private $em; - - /** - * Instances of enabled filters. - * - * @var array - */ - private $enabledFilters = array(); - - /** - * @var string The filter hash from the last time the query was parsed. - */ - private $filterHash; - - /** - * @var integer $state The current state of this filter - */ - private $filtersState = self::FILTERS_STATE_CLEAN; - - /** - * Constructor. - * - * @param EntityManager $em - */ - public function __construct(EntityManager $em) - { - $this->em = $em; - $this->config = $em->getConfiguration(); - } - - /** - * Get all the enabled filters. - * - * @return array The enabled filters. - */ - public function getEnabledFilters() - { - return $this->enabledFilters; - } - - /** - * Enables a filter from the collection. - * - * @param string $name Name of the filter. - * - * @throws \InvalidArgumentException If the filter does not exist. - * - * @return SQLFilter The enabled filter. - */ - public function enable($name) - { - if (null === $filterClass = $this->config->getFilterClassName($name)) { - throw new \InvalidArgumentException("Filter '" . $name . "' does not exist."); - } - - if (!isset($this->enabledFilters[$name])) { - $this->enabledFilters[$name] = new $filterClass($this->em); - - // Keep the enabled filters sorted for the hash - ksort($this->enabledFilters); - - // Now the filter collection is dirty - $this->filtersState = self::FILTERS_STATE_DIRTY; - } - - return $this->enabledFilters[$name]; - } - - /** - * Disables a filter. - * - * @param string $name Name of the filter. - * - * @return SQLFilter The disabled filter. - * - * @throws \InvalidArgumentException If the filter does not exist. - */ - public function disable($name) - { - // Get the filter to return it - $filter = $this->getFilter($name); - - unset($this->enabledFilters[$name]); - - // Now the filter collection is dirty - $this->filtersState = self::FILTERS_STATE_DIRTY; - - return $filter; - } - - /** - * Get an enabled filter from the collection. - * - * @param string $name Name of the filter. - * - * @return SQLFilter The filter. - * - * @throws \InvalidArgumentException If the filter is not enabled. - */ - public function getFilter($name) - { - if (!isset($this->enabledFilters[$name])) { - throw new \InvalidArgumentException("Filter '" . $name . "' is not enabled."); - } - - return $this->enabledFilters[$name]; - } - - /** - * @return boolean True, if the filter collection is clean. - */ - public function isClean() - { - return self::FILTERS_STATE_CLEAN === $this->filtersState; - } - - /** - * Generates a string of currently enabled filters to use for the cache id. - * - * @return string - */ - public function getHash() - { - // If there are only clean filters, the previous hash can be returned - if (self::FILTERS_STATE_CLEAN === $this->filtersState) { - return $this->filterHash; - } - - $filterHash = ''; - foreach ($this->enabledFilters as $name => $filter) { - $filterHash .= $name . $filter; - } - - return $filterHash; - } - - /** - * Set the filter state to dirty. - */ - public function setFiltersStateDirty() - { - $this->filtersState = self::FILTERS_STATE_DIRTY; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Lexer.php b/framework/library/Doctrine/ORM/Query/Lexer.php deleted file mode 100644 index beafa7d..0000000 --- a/framework/library/Doctrine/ORM/Query/Lexer.php +++ /dev/null @@ -1,206 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -/** - * Scans a DQL query for tokens. - * - * @author Guilherme Blanco - * @author Janne Vanhala - * @author Roman Borschel - * @since 2.0 - */ -class Lexer extends \Doctrine\Common\Lexer -{ - // All tokens that are not valid identifiers must be < 100 - const T_NONE = 1; - const T_INTEGER = 2; - const T_STRING = 3; - const T_INPUT_PARAMETER = 4; - const T_FLOAT = 5; - const T_CLOSE_PARENTHESIS = 6; - const T_OPEN_PARENTHESIS = 7; - const T_COMMA = 8; - const T_DIVIDE = 9; - const T_DOT = 10; - const T_EQUALS = 11; - const T_GREATER_THAN = 12; - const T_LOWER_THAN = 13; - const T_MINUS = 14; - const T_MULTIPLY = 15; - const T_NEGATE = 16; - const T_PLUS = 17; - const T_OPEN_CURLY_BRACE = 18; - const T_CLOSE_CURLY_BRACE = 19; - - // All tokens that are also identifiers should be >= 100 - const T_IDENTIFIER = 100; - const T_ALL = 101; - const T_AND = 102; - const T_ANY = 103; - const T_AS = 104; - const T_ASC = 105; - const T_AVG = 106; - const T_BETWEEN = 107; - const T_BOTH = 108; - const T_BY = 109; - const T_CASE = 110; - const T_COALESCE = 111; - const T_COUNT = 112; - const T_DELETE = 113; - const T_DESC = 114; - const T_DISTINCT = 115; - const T_ELSE = 116; - const T_EMPTY = 117; - const T_END = 118; - const T_ESCAPE = 119; - const T_EXISTS = 120; - const T_FALSE = 121; - const T_FROM = 122; - const T_GROUP = 123; - const T_HAVING = 124; - const T_HIDDEN = 125; - const T_IN = 126; - const T_INDEX = 127; - const T_INNER = 128; - const T_INSTANCE = 129; - const T_IS = 130; - const T_JOIN = 131; - const T_LEADING = 132; - const T_LEFT = 133; - const T_LIKE = 134; - const T_MAX = 135; - const T_MEMBER = 136; - const T_MIN = 137; - const T_NOT = 138; - const T_NULL = 139; - const T_NULLIF = 140; - const T_OF = 141; - const T_OR = 142; - const T_ORDER = 143; - const T_OUTER = 144; - const T_SELECT = 145; - const T_SET = 146; - const T_SOME = 147; - const T_SUM = 148; - const T_THEN = 149; - const T_TRAILING = 150; - const T_TRUE = 151; - const T_UPDATE = 152; - const T_WHEN = 153; - const T_WHERE = 154; - const T_WITH = 155; - const T_PARTIAL = 156; - - /** - * Creates a new query scanner object. - * - * @param string $input a query string - */ - public function __construct($input) - { - $this->setInput($input); - } - - /** - * @inheritdoc - */ - protected function getCatchablePatterns() - { - return array( - '[a-z_\\\][a-z0-9_\:\\\]*[a-z0-9_]{1}', - '(?:[0-9]+(?:[\.][0-9]+)*)(?:e[+-]?[0-9]+)?', - "'(?:[^']|'')*'", - '\?[0-9]*|:[a-z]{1}[a-z0-9_]{0,}' - ); - } - - /** - * @inheritdoc - */ - protected function getNonCatchablePatterns() - { - return array('\s+', '(.)'); - } - - /** - * @inheritdoc - */ - protected function getType(&$value) - { - $type = self::T_NONE; - - switch (true) { - // Recognize numeric values - case (is_numeric($value)): - if (strpos($value, '.') !== false || stripos($value, 'e') !== false) { - return self::T_FLOAT; - } - - return self::T_INTEGER; - - // Recognize quoted strings - case ($value[0] === "'"): - $value = str_replace("''", "'", substr($value, 1, strlen($value) - 2)); - - return self::T_STRING; - - // Recognize identifiers - case (ctype_alpha($value[0]) || $value[0] === '_'): - $name = 'Doctrine\ORM\Query\Lexer::T_' . strtoupper($value); - - if (defined($name)) { - $type = constant($name); - - if ($type > 100) { - return $type; - } - } - - return self::T_IDENTIFIER; - - // Recognize input parameters - case ($value[0] === '?' || $value[0] === ':'): - return self::T_INPUT_PARAMETER; - - // Recognize symbols - case ($value === '.'): return self::T_DOT; - case ($value === ','): return self::T_COMMA; - case ($value === '('): return self::T_OPEN_PARENTHESIS; - case ($value === ')'): return self::T_CLOSE_PARENTHESIS; - case ($value === '='): return self::T_EQUALS; - case ($value === '>'): return self::T_GREATER_THAN; - case ($value === '<'): return self::T_LOWER_THAN; - case ($value === '+'): return self::T_PLUS; - case ($value === '-'): return self::T_MINUS; - case ($value === '*'): return self::T_MULTIPLY; - case ($value === '/'): return self::T_DIVIDE; - case ($value === '!'): return self::T_NEGATE; - case ($value === '{'): return self::T_OPEN_CURLY_BRACE; - case ($value === '}'): return self::T_CLOSE_CURLY_BRACE; - - // Default - default: - // Do nothing - } - - return $type; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Parameter.php b/framework/library/Doctrine/ORM/Query/Parameter.php deleted file mode 100644 index 57813cb..0000000 --- a/framework/library/Doctrine/ORM/Query/Parameter.php +++ /dev/null @@ -1,101 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -/** - * Define a Query Parameter - * - * @link www.doctrine-project.org - * @since 2.3 - * @author Guilherme Blanco - */ -class Parameter -{ - /** - * @var string Parameter name - */ - private $name; - - /** - * @var mixed Parameter value - */ - private $value; - - /** - * @var mixed Parameter type - */ - private $type; - - /** - * Constructor. - * - * @param string $name Parameter name - * @param mixed $value Parameter value - * @param mixed $type Parameter type - */ - public function __construct($name, $value, $type = null) - { - $this->name = trim($name, ':'); - - $this->setValue($value, $type); - } - - /** - * Retrieve the Parameter name. - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Retrieve the Parameter value. - * - * @return mixed - */ - public function getValue() - { - return $this->value; - } - - /** - * Retrieve the Parameter type. - * - * @return mixed - */ - public function getType() - { - return $this->type; - } - - /** - * Define the Parameter value. - * - * @param mixed $value Parameter value - * @param mixed $type Parameter type - */ - public function setValue($value, $type = null) - { - $this->value = $value; - $this->type = $type ?: ParameterTypeInferer::inferType($value); - } -} diff --git a/framework/library/Doctrine/ORM/Query/ParameterTypeInferer.php b/framework/library/Doctrine/ORM/Query/ParameterTypeInferer.php deleted file mode 100644 index 45a0aab..0000000 --- a/framework/library/Doctrine/ORM/Query/ParameterTypeInferer.php +++ /dev/null @@ -1,65 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Types\Type; - -/** - * Provides an enclosed support for parameter infering. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ParameterTypeInferer -{ - /** - * Infer type of a given value, returning a compatible constant: - * - Type (\Doctrine\DBAL\Types\Type::*) - * - Connection (\Doctrine\DBAL\Connection::PARAM_*) - * - * @param mixed $value Parameter value - * - * @return mixed Parameter type constant - */ - public static function inferType($value) - { - if (is_integer($value)) { - return Type::INTEGER; - } - - if ($value instanceof \DateTime) { - return Type::DATETIME; - } - - if (is_array($value)) { - return is_integer(current($value)) - ? Connection::PARAM_INT_ARRAY - : Connection::PARAM_STR_ARRAY; - } - - return \PDO::PARAM_STR; - } -} \ No newline at end of file diff --git a/framework/library/Doctrine/ORM/Query/Parser.php b/framework/library/Doctrine/ORM/Query/Parser.php deleted file mode 100644 index 1e1919d..0000000 --- a/framework/library/Doctrine/ORM/Query/Parser.php +++ /dev/null @@ -1,3132 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -use Doctrine\ORM\Query; -use Doctrine\ORM\Mapping\ClassMetadata; - -/** - * An LL(*) recursive-descent parser for the context-free grammar of the Doctrine Query Language. - * Parses a DQL query, reports any errors in it, and generates an AST. - * - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Janne Vanhala - */ -class Parser -{ - /** READ-ONLY: Maps BUILT-IN string function names to AST class names. */ - private static $_STRING_FUNCTIONS = array( - 'concat' => 'Doctrine\ORM\Query\AST\Functions\ConcatFunction', - 'substring' => 'Doctrine\ORM\Query\AST\Functions\SubstringFunction', - 'trim' => 'Doctrine\ORM\Query\AST\Functions\TrimFunction', - 'lower' => 'Doctrine\ORM\Query\AST\Functions\LowerFunction', - 'upper' => 'Doctrine\ORM\Query\AST\Functions\UpperFunction', - 'identity' => 'Doctrine\ORM\Query\AST\Functions\IdentityFunction', - ); - - /** READ-ONLY: Maps BUILT-IN numeric function names to AST class names. */ - private static $_NUMERIC_FUNCTIONS = array( - 'length' => 'Doctrine\ORM\Query\AST\Functions\LengthFunction', - 'locate' => 'Doctrine\ORM\Query\AST\Functions\LocateFunction', - 'abs' => 'Doctrine\ORM\Query\AST\Functions\AbsFunction', - 'sqrt' => 'Doctrine\ORM\Query\AST\Functions\SqrtFunction', - 'mod' => 'Doctrine\ORM\Query\AST\Functions\ModFunction', - 'size' => 'Doctrine\ORM\Query\AST\Functions\SizeFunction', - 'date_diff' => 'Doctrine\ORM\Query\AST\Functions\DateDiffFunction', - 'bit_and' => 'Doctrine\ORM\Query\AST\Functions\BitAndFunction', - 'bit_or' => 'Doctrine\ORM\Query\AST\Functions\BitOrFunction', - ); - - /** READ-ONLY: Maps BUILT-IN datetime function names to AST class names. */ - private static $_DATETIME_FUNCTIONS = array( - 'current_date' => 'Doctrine\ORM\Query\AST\Functions\CurrentDateFunction', - 'current_time' => 'Doctrine\ORM\Query\AST\Functions\CurrentTimeFunction', - 'current_timestamp' => 'Doctrine\ORM\Query\AST\Functions\CurrentTimestampFunction', - 'date_add' => 'Doctrine\ORM\Query\AST\Functions\DateAddFunction', - 'date_sub' => 'Doctrine\ORM\Query\AST\Functions\DateSubFunction', - ); - - /** - * Expressions that were encountered during parsing of identifiers and expressions - * and still need to be validated. - */ - private $_deferredIdentificationVariables = array(); - private $_deferredPartialObjectExpressions = array(); - private $_deferredPathExpressions = array(); - private $_deferredResultVariables = array(); - - /** - * The lexer. - * - * @var \Doctrine\ORM\Query\Lexer - */ - private $_lexer; - - /** - * The parser result. - * - * @var \Doctrine\ORM\Query\ParserResult - */ - private $_parserResult; - - /** - * The EntityManager. - * - * @var EnityManager - */ - private $_em; - - /** - * The Query to parse. - * - * @var Query - */ - private $_query; - - /** - * Map of declared query components in the parsed query. - * - * @var array - */ - private $_queryComponents = array(); - - /** - * Keeps the nesting level of defined ResultVariables - * - * @var integer - */ - private $_nestingLevel = 0; - - /** - * Any additional custom tree walkers that modify the AST. - * - * @var array - */ - private $_customTreeWalkers = array(); - - /** - * The custom last tree walker, if any, that is responsible for producing the output. - * - * @var TreeWalker - */ - private $_customOutputWalker; - - /** - * @var array - */ - private $_identVariableExpressions = array(); - - /** - * Check if a function is internally defined. Used to prevent overwriting - * of built-in functions through user-defined functions. - * - * @param string $functionName - * @return bool - */ - static public function isInternalFunction($functionName) - { - $functionName = strtolower($functionName); - - return isset(self::$_STRING_FUNCTIONS[$functionName]) - || isset(self::$_DATETIME_FUNCTIONS[$functionName]) - || isset(self::$_NUMERIC_FUNCTIONS[$functionName]); - } - - /** - * Creates a new query parser object. - * - * @param Query $query The Query to parse. - */ - public function __construct(Query $query) - { - $this->_query = $query; - $this->_em = $query->getEntityManager(); - $this->_lexer = new Lexer($query->getDql()); - $this->_parserResult = new ParserResult(); - } - - /** - * Sets a custom tree walker that produces output. - * This tree walker will be run last over the AST, after any other walkers. - * - * @param string $className - */ - public function setCustomOutputTreeWalker($className) - { - $this->_customOutputWalker = $className; - } - - /** - * Adds a custom tree walker for modifying the AST. - * - * @param string $className - */ - public function addCustomTreeWalker($className) - { - $this->_customTreeWalkers[] = $className; - } - - /** - * Gets the lexer used by the parser. - * - * @return \Doctrine\ORM\Query\Lexer - */ - public function getLexer() - { - return $this->_lexer; - } - - /** - * Gets the ParserResult that is being filled with information during parsing. - * - * @return \Doctrine\ORM\Query\ParserResult - */ - public function getParserResult() - { - return $this->_parserResult; - } - - /** - * Gets the EntityManager used by the parser. - * - * @return EntityManager - */ - public function getEntityManager() - { - return $this->_em; - } - - /** - * Parse and build AST for the given Query. - * - * @return \Doctrine\ORM\Query\AST\SelectStatement | - * \Doctrine\ORM\Query\AST\UpdateStatement | - * \Doctrine\ORM\Query\AST\DeleteStatement - */ - public function getAST() - { - // Parse & build AST - $AST = $this->QueryLanguage(); - - // Process any deferred validations of some nodes in the AST. - // This also allows post-processing of the AST for modification purposes. - $this->_processDeferredIdentificationVariables(); - - if ($this->_deferredPartialObjectExpressions) { - $this->_processDeferredPartialObjectExpressions(); - } - - if ($this->_deferredPathExpressions) { - $this->_processDeferredPathExpressions($AST); - } - - if ($this->_deferredResultVariables) { - $this->_processDeferredResultVariables(); - } - - $this->_processRootEntityAliasSelected(); - - // TODO: Is there a way to remove this? It may impact the mixed hydration resultset a lot! - $this->fixIdentificationVariableOrder($AST); - - return $AST; - } - - /** - * 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 token type - * @return void - * @throws QueryException If the tokens dont match. - */ - public function match($token) - { - $lookaheadType = $this->_lexer->lookahead['type']; - - // short-circuit on first condition, usually types match - if ($lookaheadType !== $token && $token !== Lexer::T_IDENTIFIER && $lookaheadType <= Lexer::T_IDENTIFIER) { - $this->syntaxError($this->_lexer->getLiteral($token)); - } - - $this->_lexer->moveNext(); - } - - /** - * Free this parser enabling it to be reused - * - * @param boolean $deep Whether to clean peek and reset errors - * @param integer $position Position to reset - */ - public function free($deep = false, $position = 0) - { - // WARNING! Use this method with care. It resets the scanner! - $this->_lexer->resetPosition($position); - - // Deep = true cleans peek and also any previously defined errors - if ($deep) { - $this->_lexer->resetPeek(); - } - - $this->_lexer->token = null; - $this->_lexer->lookahead = null; - } - - /** - * Parses a query string. - * - * @return ParserResult - */ - public function parse() - { - $AST = $this->getAST(); - - if (($customWalkers = $this->_query->getHint(Query::HINT_CUSTOM_TREE_WALKERS)) !== false) { - $this->_customTreeWalkers = $customWalkers; - } - - if (($customOutputWalker = $this->_query->getHint(Query::HINT_CUSTOM_OUTPUT_WALKER)) !== false) { - $this->_customOutputWalker = $customOutputWalker; - } - - // Run any custom tree walkers over the AST - if ($this->_customTreeWalkers) { - $treeWalkerChain = new TreeWalkerChain($this->_query, $this->_parserResult, $this->_queryComponents); - - foreach ($this->_customTreeWalkers as $walker) { - $treeWalkerChain->addTreeWalker($walker); - } - - switch (true) { - case ($AST instanceof AST\UpdateStatement): - $treeWalkerChain->walkUpdateStatement($AST); - break; - - case ($AST instanceof AST\DeleteStatement): - $treeWalkerChain->walkDeleteStatement($AST); - break; - - case ($AST instanceof AST\SelectStatement): - default: - $treeWalkerChain->walkSelectStatement($AST); - } - } - - $outputWalkerClass = $this->_customOutputWalker ?: __NAMESPACE__ . '\SqlWalker'; - $outputWalker = new $outputWalkerClass($this->_query, $this->_parserResult, $this->_queryComponents); - - // Assign an SQL executor to the parser result - $this->_parserResult->setSqlExecutor($outputWalker->getExecutor($AST)); - - return $this->_parserResult; - } - - /** - * Fix order of identification variables. - * - * They have to appear in the select clause in the same order as the - * declarations (from ... x join ... y join ... z ...) appear in the query - * as the hydration process relies on that order for proper operation. - * - * @param AST\SelectStatement|AST\DeleteStatement|AST\UpdateStatement $AST - * @return void - */ - private function fixIdentificationVariableOrder($AST) - { - if (count($this->_identVariableExpressions) <= 1) { - return; - } - - foreach ($this->_queryComponents as $dqlAlias => $qComp) { - if ( ! isset($this->_identVariableExpressions[$dqlAlias])) { - continue; - } - - $expr = $this->_identVariableExpressions[$dqlAlias]; - $key = array_search($expr, $AST->selectClause->selectExpressions); - - unset($AST->selectClause->selectExpressions[$key]); - - $AST->selectClause->selectExpressions[] = $expr; - } - } - - /** - * Generates a new syntax error. - * - * @param string $expected Expected string. - * @param array $token Got token. - * - * @throws \Doctrine\ORM\Query\QueryException - */ - public function syntaxError($expected = '', $token = null) - { - if ($token === null) { - $token = $this->_lexer->lookahead; - } - - $tokenPos = (isset($token['position'])) ? $token['position'] : '-1'; - - $message = "line 0, col {$tokenPos}: Error: "; - $message .= ($expected !== '') ? "Expected {$expected}, got " : 'Unexpected '; - $message .= ($this->_lexer->lookahead === null) ? 'end of string.' : "'{$token['value']}'"; - - throw QueryException::syntaxError($message, QueryException::dqlError($this->_query->getDQL())); - } - - /** - * Generates a new semantical error. - * - * @param string $message Optional message. - * @param array $token Optional token. - * - * @throws \Doctrine\ORM\Query\QueryException - */ - public function semanticalError($message = '', $token = null) - { - if ($token === null) { - $token = $this->_lexer->lookahead; - } - - // Minimum exposed chars ahead of token - $distance = 12; - - // Find a position of a final word to display in error string - $dql = $this->_query->getDql(); - $length = strlen($dql); - $pos = $token['position'] + $distance; - $pos = strpos($dql, ' ', ($length > $pos) ? $pos : $length); - $length = ($pos !== false) ? $pos - $token['position'] : $distance; - - $tokenPos = (isset($token['position']) && $token['position'] > 0) ? $token['position'] : '-1'; - $tokenStr = substr($dql, $token['position'], $length); - - // Building informative message - $message = 'line 0, col ' . $tokenPos . " near '" . $tokenStr . "': Error: " . $message; - - throw QueryException::semanticalError($message, QueryException::dqlError($this->_query->getDQL())); - } - - /** - * Peek beyond the matched closing parenthesis and return the first token after that one. - * - * @param boolean $resetPeek Reset peek after finding the closing parenthesis - * @return array - */ - private function _peekBeyondClosingParenthesis($resetPeek = true) - { - $token = $this->_lexer->peek(); - $numUnmatched = 1; - - while ($numUnmatched > 0 && $token !== null) { - switch ($token['type']) { - case Lexer::T_OPEN_PARENTHESIS: - ++$numUnmatched; - break; - - case Lexer::T_CLOSE_PARENTHESIS: - --$numUnmatched; - break; - - default: - // Do nothing - } - - $token = $this->_lexer->peek(); - } - - if ($resetPeek) { - $this->_lexer->resetPeek(); - } - - return $token; - } - - /** - * Checks if the given token indicates a mathematical operator. - * - * @return boolean TRUE if the token is a mathematical operator, FALSE otherwise. - */ - private function _isMathOperator($token) - { - return in_array($token['type'], array(Lexer::T_PLUS, Lexer::T_MINUS, Lexer::T_DIVIDE, Lexer::T_MULTIPLY)); - } - - /** - * Checks if the next-next (after lookahead) token starts a function. - * - * @return boolean TRUE if the next-next tokens start a function, FALSE otherwise. - */ - private function _isFunction() - { - $peek = $this->_lexer->peek(); - $nextpeek = $this->_lexer->peek(); - - $this->_lexer->resetPeek(); - - // We deny the COUNT(SELECT * FROM User u) here. COUNT won't be considered a function - return ($peek['type'] === Lexer::T_OPEN_PARENTHESIS && $nextpeek['type'] !== Lexer::T_SELECT); - } - - /** - * Checks whether the given token type indicates an aggregate function. - * - * @return boolean TRUE if the token type is an aggregate function, FALSE otherwise. - */ - private function _isAggregateFunction($tokenType) - { - return in_array($tokenType, array(Lexer::T_AVG, Lexer::T_MIN, Lexer::T_MAX, Lexer::T_SUM, Lexer::T_COUNT)); - } - - /** - * Checks whether the current lookahead token of the lexer has the type T_ALL, T_ANY or T_SOME. - * - * @return boolean - */ - private function _isNextAllAnySome() - { - return in_array($this->_lexer->lookahead['type'], array(Lexer::T_ALL, Lexer::T_ANY, Lexer::T_SOME)); - } - - /** - * Validates that the given IdentificationVariable is semantically correct. - * It must exist in query components list. - * - * @return void - */ - private function _processDeferredIdentificationVariables() - { - foreach ($this->_deferredIdentificationVariables as $deferredItem) { - $identVariable = $deferredItem['expression']; - - // Check if IdentificationVariable exists in queryComponents - if ( ! isset($this->_queryComponents[$identVariable])) { - $this->semanticalError( - "'$identVariable' is not defined.", $deferredItem['token'] - ); - } - - $qComp = $this->_queryComponents[$identVariable]; - - // Check if queryComponent points to an AbstractSchemaName or a ResultVariable - if ( ! isset($qComp['metadata'])) { - $this->semanticalError( - "'$identVariable' does not point to a Class.", $deferredItem['token'] - ); - } - - // Validate if identification variable nesting level is lower or equal than the current one - if ($qComp['nestingLevel'] > $deferredItem['nestingLevel']) { - $this->semanticalError( - "'$identVariable' is used outside the scope of its declaration.", $deferredItem['token'] - ); - } - } - } - - /** - * Validates that the given PartialObjectExpression is semantically correct. - * It must exist in query components list. - * - * @return void - */ - private function _processDeferredPartialObjectExpressions() - { - foreach ($this->_deferredPartialObjectExpressions as $deferredItem) { - $expr = $deferredItem['expression']; - $class = $this->_queryComponents[$expr->identificationVariable]['metadata']; - - foreach ($expr->partialFieldSet as $field) { - if (isset($class->fieldMappings[$field])) { - continue; - } - - $this->semanticalError( - "There is no mapped field named '$field' on class " . $class->name . ".", $deferredItem['token'] - ); - } - - if (array_intersect($class->identifier, $expr->partialFieldSet) != $class->identifier) { - $this->semanticalError( - "The partial field selection of class " . $class->name . " must contain the identifier.", - $deferredItem['token'] - ); - } - } - } - - /** - * Validates that the given ResultVariable is semantically correct. - * It must exist in query components list. - * - * @return void - */ - private function _processDeferredResultVariables() - { - foreach ($this->_deferredResultVariables as $deferredItem) { - $resultVariable = $deferredItem['expression']; - - // Check if ResultVariable exists in queryComponents - if ( ! isset($this->_queryComponents[$resultVariable])) { - $this->semanticalError( - "'$resultVariable' is not defined.", $deferredItem['token'] - ); - } - - $qComp = $this->_queryComponents[$resultVariable]; - - // Check if queryComponent points to an AbstractSchemaName or a ResultVariable - if ( ! isset($qComp['resultVariable'])) { - $this->semanticalError( - "'$resultVariable' does not point to a ResultVariable.", $deferredItem['token'] - ); - } - - // Validate if identification variable nesting level is lower or equal than the current one - if ($qComp['nestingLevel'] > $deferredItem['nestingLevel']) { - $this->semanticalError( - "'$resultVariable' is used outside the scope of its declaration.", $deferredItem['token'] - ); - } - } - } - - /** - * Validates that the given PathExpression is semantically correct for grammar rules: - * - * AssociationPathExpression ::= CollectionValuedPathExpression | SingleValuedAssociationPathExpression - * SingleValuedPathExpression ::= StateFieldPathExpression | SingleValuedAssociationPathExpression - * StateFieldPathExpression ::= IdentificationVariable "." StateField - * SingleValuedAssociationPathExpression ::= IdentificationVariable "." SingleValuedAssociationField - * CollectionValuedPathExpression ::= IdentificationVariable "." CollectionValuedAssociationField - * - * @param array $deferredItem - * @param mixed $AST - */ - private function _processDeferredPathExpressions($AST) - { - foreach ($this->_deferredPathExpressions as $deferredItem) { - $pathExpression = $deferredItem['expression']; - - $qComp = $this->_queryComponents[$pathExpression->identificationVariable]; - $class = $qComp['metadata']; - - if (($field = $pathExpression->field) === null) { - $field = $pathExpression->field = $class->identifier[0]; - } - - // Check if field or association exists - if ( ! isset($class->associationMappings[$field]) && ! isset($class->fieldMappings[$field])) { - $this->semanticalError( - 'Class ' . $class->name . ' has no field or association named ' . $field, - $deferredItem['token'] - ); - } - - $fieldType = AST\PathExpression::TYPE_STATE_FIELD; - - if (isset($class->associationMappings[$field])) { - $assoc = $class->associationMappings[$field]; - - $fieldType = ($assoc['type'] & ClassMetadata::TO_ONE) - ? AST\PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION - : AST\PathExpression::TYPE_COLLECTION_VALUED_ASSOCIATION; - } - - // Validate if PathExpression is one of the expected types - $expectedType = $pathExpression->expectedType; - - if ( ! ($expectedType & $fieldType)) { - // We need to recognize which was expected type(s) - $expectedStringTypes = array(); - - // Validate state field type - if ($expectedType & AST\PathExpression::TYPE_STATE_FIELD) { - $expectedStringTypes[] = 'StateFieldPathExpression'; - } - - // Validate single valued association (*-to-one) - if ($expectedType & AST\PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION) { - $expectedStringTypes[] = 'SingleValuedAssociationField'; - } - - // Validate single valued association (*-to-many) - if ($expectedType & AST\PathExpression::TYPE_COLLECTION_VALUED_ASSOCIATION) { - $expectedStringTypes[] = 'CollectionValuedAssociationField'; - } - - // Build the error message - $semanticalError = 'Invalid PathExpression. '; - $semanticalError .= (count($expectedStringTypes) == 1) - ? 'Must be a ' . $expectedStringTypes[0] . '.' - : implode(' or ', $expectedStringTypes) . ' expected.'; - - $this->semanticalError($semanticalError, $deferredItem['token']); - } - - // We need to force the type in PathExpression - $pathExpression->type = $fieldType; - } - } - - private function _processRootEntityAliasSelected() - { - if ( ! count($this->_identVariableExpressions)) { - return; - } - - $foundRootEntity = false; - - foreach ($this->_identVariableExpressions as $dqlAlias => $expr) { - if (isset($this->_queryComponents[$dqlAlias]) && $this->_queryComponents[$dqlAlias]['parent'] === null) { - $foundRootEntity = true; - } - } - - if ( ! $foundRootEntity) { - $this->semanticalError('Cannot select entity through identification variables without choosing at least one root entity alias.'); - } - } - - /** - * QueryLanguage ::= SelectStatement | UpdateStatement | DeleteStatement - * - * @return \Doctrine\ORM\Query\AST\SelectStatement | - * \Doctrine\ORM\Query\AST\UpdateStatement | - * \Doctrine\ORM\Query\AST\DeleteStatement - */ - public function QueryLanguage() - { - $this->_lexer->moveNext(); - - switch ($this->_lexer->lookahead['type']) { - case Lexer::T_SELECT: - $statement = $this->SelectStatement(); - break; - - case Lexer::T_UPDATE: - $statement = $this->UpdateStatement(); - break; - - case Lexer::T_DELETE: - $statement = $this->DeleteStatement(); - break; - - default: - $this->syntaxError('SELECT, UPDATE or DELETE'); - break; - } - - // Check for end of string - if ($this->_lexer->lookahead !== null) { - $this->syntaxError('end of string'); - } - - return $statement; - } - - /** - * SelectStatement ::= SelectClause FromClause [WhereClause] [GroupByClause] [HavingClause] [OrderByClause] - * - * @return \Doctrine\ORM\Query\AST\SelectStatement - */ - public function SelectStatement() - { - $selectStatement = new AST\SelectStatement($this->SelectClause(), $this->FromClause()); - - $selectStatement->whereClause = $this->_lexer->isNextToken(Lexer::T_WHERE) ? $this->WhereClause() : null; - $selectStatement->groupByClause = $this->_lexer->isNextToken(Lexer::T_GROUP) ? $this->GroupByClause() : null; - $selectStatement->havingClause = $this->_lexer->isNextToken(Lexer::T_HAVING) ? $this->HavingClause() : null; - $selectStatement->orderByClause = $this->_lexer->isNextToken(Lexer::T_ORDER) ? $this->OrderByClause() : null; - - return $selectStatement; - } - - /** - * UpdateStatement ::= UpdateClause [WhereClause] - * - * @return \Doctrine\ORM\Query\AST\UpdateStatement - */ - public function UpdateStatement() - { - $updateStatement = new AST\UpdateStatement($this->UpdateClause()); - - $updateStatement->whereClause = $this->_lexer->isNextToken(Lexer::T_WHERE) ? $this->WhereClause() : null; - - return $updateStatement; - } - - /** - * DeleteStatement ::= DeleteClause [WhereClause] - * - * @return \Doctrine\ORM\Query\AST\DeleteStatement - */ - public function DeleteStatement() - { - $deleteStatement = new AST\DeleteStatement($this->DeleteClause()); - - $deleteStatement->whereClause = $this->_lexer->isNextToken(Lexer::T_WHERE) ? $this->WhereClause() : null; - - return $deleteStatement; - } - - /** - * IdentificationVariable ::= identifier - * - * @return string - */ - public function IdentificationVariable() - { - $this->match(Lexer::T_IDENTIFIER); - - $identVariable = $this->_lexer->token['value']; - - $this->_deferredIdentificationVariables[] = array( - 'expression' => $identVariable, - 'nestingLevel' => $this->_nestingLevel, - 'token' => $this->_lexer->token, - ); - - return $identVariable; - } - - /** - * AliasIdentificationVariable = identifier - * - * @return string - */ - public function AliasIdentificationVariable() - { - $this->match(Lexer::T_IDENTIFIER); - - $aliasIdentVariable = $this->_lexer->token['value']; - $exists = isset($this->_queryComponents[$aliasIdentVariable]); - - if ($exists) { - $this->semanticalError("'$aliasIdentVariable' is already defined.", $this->_lexer->token); - } - - return $aliasIdentVariable; - } - - /** - * AbstractSchemaName ::= identifier - * - * @return string - */ - public function AbstractSchemaName() - { - $this->match(Lexer::T_IDENTIFIER); - - $schemaName = ltrim($this->_lexer->token['value'], '\\'); - - if (strrpos($schemaName, ':') !== false) { - list($namespaceAlias, $simpleClassName) = explode(':', $schemaName); - - $schemaName = $this->_em->getConfiguration()->getEntityNamespace($namespaceAlias) . '\\' . $simpleClassName; - } - - $exists = class_exists($schemaName, true); - - if ( ! $exists) { - $this->semanticalError("Class '$schemaName' is not defined.", $this->_lexer->token); - } - - return $schemaName; - } - - /** - * AliasResultVariable ::= identifier - * - * @return string - */ - public function AliasResultVariable() - { - $this->match(Lexer::T_IDENTIFIER); - - $resultVariable = $this->_lexer->token['value']; - $exists = isset($this->_queryComponents[$resultVariable]); - - if ($exists) { - $this->semanticalError("'$resultVariable' is already defined.", $this->_lexer->token); - } - - return $resultVariable; - } - - /** - * ResultVariable ::= identifier - * - * @return string - */ - public function ResultVariable() - { - $this->match(Lexer::T_IDENTIFIER); - - $resultVariable = $this->_lexer->token['value']; - - // Defer ResultVariable validation - $this->_deferredResultVariables[] = array( - 'expression' => $resultVariable, - 'nestingLevel' => $this->_nestingLevel, - 'token' => $this->_lexer->token, - ); - - return $resultVariable; - } - - /** - * JoinAssociationPathExpression ::= IdentificationVariable "." (CollectionValuedAssociationField | SingleValuedAssociationField) - * - * @return \Doctrine\ORM\Query\AST\JoinAssociationPathExpression - */ - public function JoinAssociationPathExpression() - { - $identVariable = $this->IdentificationVariable(); - - if ( ! isset($this->_queryComponents[$identVariable])) { - $this->semanticalError( - 'Identification Variable ' . $identVariable .' used in join path expression but was not defined before.' - ); - } - - $this->match(Lexer::T_DOT); - $this->match(Lexer::T_IDENTIFIER); - - $field = $this->_lexer->token['value']; - - // Validate association field - $qComp = $this->_queryComponents[$identVariable]; - $class = $qComp['metadata']; - - if ( ! $class->hasAssociation($field)) { - $this->semanticalError('Class ' . $class->name . ' has no association named ' . $field); - } - - return new AST\JoinAssociationPathExpression($identVariable, $field); - } - - /** - * Parses an arbitrary path expression and defers semantical validation - * based on expected types. - * - * PathExpression ::= IdentificationVariable "." identifier - * - * @param integer $expectedTypes - * @return \Doctrine\ORM\Query\AST\PathExpression - */ - public function PathExpression($expectedTypes) - { - $identVariable = $this->IdentificationVariable(); - $field = null; - - if ($this->_lexer->isNextToken(Lexer::T_DOT)) { - $this->match(Lexer::T_DOT); - $this->match(Lexer::T_IDENTIFIER); - - $field = $this->_lexer->token['value']; - } - - // Creating AST node - $pathExpr = new AST\PathExpression($expectedTypes, $identVariable, $field); - - // Defer PathExpression validation if requested to be defered - $this->_deferredPathExpressions[] = array( - 'expression' => $pathExpr, - 'nestingLevel' => $this->_nestingLevel, - 'token' => $this->_lexer->token, - ); - - return $pathExpr; - } - - /** - * AssociationPathExpression ::= CollectionValuedPathExpression | SingleValuedAssociationPathExpression - * - * @return \Doctrine\ORM\Query\AST\PathExpression - */ - public function AssociationPathExpression() - { - return $this->PathExpression( - AST\PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION | - AST\PathExpression::TYPE_COLLECTION_VALUED_ASSOCIATION - ); - } - - /** - * SingleValuedPathExpression ::= StateFieldPathExpression | SingleValuedAssociationPathExpression - * - * @return \Doctrine\ORM\Query\AST\PathExpression - */ - public function SingleValuedPathExpression() - { - return $this->PathExpression( - AST\PathExpression::TYPE_STATE_FIELD | - AST\PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION - ); - } - - /** - * StateFieldPathExpression ::= IdentificationVariable "." StateField - * - * @return \Doctrine\ORM\Query\AST\PathExpression - */ - public function StateFieldPathExpression() - { - return $this->PathExpression(AST\PathExpression::TYPE_STATE_FIELD); - } - - /** - * SingleValuedAssociationPathExpression ::= IdentificationVariable "." SingleValuedAssociationField - * - * @return \Doctrine\ORM\Query\AST\PathExpression - */ - public function SingleValuedAssociationPathExpression() - { - return $this->PathExpression(AST\PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION); - } - - /** - * CollectionValuedPathExpression ::= IdentificationVariable "." CollectionValuedAssociationField - * - * @return \Doctrine\ORM\Query\AST\PathExpression - */ - public function CollectionValuedPathExpression() - { - return $this->PathExpression(AST\PathExpression::TYPE_COLLECTION_VALUED_ASSOCIATION); - } - - /** - * SelectClause ::= "SELECT" ["DISTINCT"] SelectExpression {"," SelectExpression} - * - * @return \Doctrine\ORM\Query\AST\SelectClause - */ - public function SelectClause() - { - $isDistinct = false; - $this->match(Lexer::T_SELECT); - - // Check for DISTINCT - if ($this->_lexer->isNextToken(Lexer::T_DISTINCT)) { - $this->match(Lexer::T_DISTINCT); - - $isDistinct = true; - } - - // Process SelectExpressions (1..N) - $selectExpressions = array(); - $selectExpressions[] = $this->SelectExpression(); - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - - $selectExpressions[] = $this->SelectExpression(); - } - - return new AST\SelectClause($selectExpressions, $isDistinct); - } - - /** - * SimpleSelectClause ::= "SELECT" ["DISTINCT"] SimpleSelectExpression - * - * @return \Doctrine\ORM\Query\AST\SimpleSelectClause - */ - public function SimpleSelectClause() - { - $isDistinct = false; - $this->match(Lexer::T_SELECT); - - if ($this->_lexer->isNextToken(Lexer::T_DISTINCT)) { - $this->match(Lexer::T_DISTINCT); - - $isDistinct = true; - } - - return new AST\SimpleSelectClause($this->SimpleSelectExpression(), $isDistinct); - } - - /** - * UpdateClause ::= "UPDATE" AbstractSchemaName ["AS"] AliasIdentificationVariable "SET" UpdateItem {"," UpdateItem}* - * - * @return \Doctrine\ORM\Query\AST\UpdateClause - */ - public function UpdateClause() - { - $this->match(Lexer::T_UPDATE); - $token = $this->_lexer->lookahead; - $abstractSchemaName = $this->AbstractSchemaName(); - - if ($this->_lexer->isNextToken(Lexer::T_AS)) { - $this->match(Lexer::T_AS); - } - - $aliasIdentificationVariable = $this->AliasIdentificationVariable(); - - $class = $this->_em->getClassMetadata($abstractSchemaName); - - // Building queryComponent - $queryComponent = array( - 'metadata' => $class, - 'parent' => null, - 'relation' => null, - 'map' => null, - 'nestingLevel' => $this->_nestingLevel, - 'token' => $token, - ); - - $this->_queryComponents[$aliasIdentificationVariable] = $queryComponent; - - $this->match(Lexer::T_SET); - - $updateItems = array(); - $updateItems[] = $this->UpdateItem(); - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - - $updateItems[] = $this->UpdateItem(); - } - - $updateClause = new AST\UpdateClause($abstractSchemaName, $updateItems); - $updateClause->aliasIdentificationVariable = $aliasIdentificationVariable; - - return $updateClause; - } - - /** - * DeleteClause ::= "DELETE" ["FROM"] AbstractSchemaName ["AS"] AliasIdentificationVariable - * - * @return \Doctrine\ORM\Query\AST\DeleteClause - */ - public function DeleteClause() - { - $this->match(Lexer::T_DELETE); - - if ($this->_lexer->isNextToken(Lexer::T_FROM)) { - $this->match(Lexer::T_FROM); - } - - $token = $this->_lexer->lookahead; - $deleteClause = new AST\DeleteClause($this->AbstractSchemaName()); - - if ($this->_lexer->isNextToken(Lexer::T_AS)) { - $this->match(Lexer::T_AS); - } - - $aliasIdentificationVariable = $this->AliasIdentificationVariable(); - - $deleteClause->aliasIdentificationVariable = $aliasIdentificationVariable; - $class = $this->_em->getClassMetadata($deleteClause->abstractSchemaName); - - // Building queryComponent - $queryComponent = array( - 'metadata' => $class, - 'parent' => null, - 'relation' => null, - 'map' => null, - 'nestingLevel' => $this->_nestingLevel, - 'token' => $token, - ); - - $this->_queryComponents[$aliasIdentificationVariable] = $queryComponent; - - return $deleteClause; - } - - /** - * FromClause ::= "FROM" IdentificationVariableDeclaration {"," IdentificationVariableDeclaration}* - * - * @return \Doctrine\ORM\Query\AST\FromClause - */ - public function FromClause() - { - $this->match(Lexer::T_FROM); - - $identificationVariableDeclarations = array(); - $identificationVariableDeclarations[] = $this->IdentificationVariableDeclaration(); - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - - $identificationVariableDeclarations[] = $this->IdentificationVariableDeclaration(); - } - - return new AST\FromClause($identificationVariableDeclarations); - } - - /** - * SubselectFromClause ::= "FROM" SubselectIdentificationVariableDeclaration {"," SubselectIdentificationVariableDeclaration}* - * - * @return \Doctrine\ORM\Query\AST\SubselectFromClause - */ - public function SubselectFromClause() - { - $this->match(Lexer::T_FROM); - - $identificationVariables = array(); - $identificationVariables[] = $this->SubselectIdentificationVariableDeclaration(); - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - - $identificationVariables[] = $this->SubselectIdentificationVariableDeclaration(); - } - - return new AST\SubselectFromClause($identificationVariables); - } - - /** - * WhereClause ::= "WHERE" ConditionalExpression - * - * @return \Doctrine\ORM\Query\AST\WhereClause - */ - public function WhereClause() - { - $this->match(Lexer::T_WHERE); - - return new AST\WhereClause($this->ConditionalExpression()); - } - - /** - * HavingClause ::= "HAVING" ConditionalExpression - * - * @return \Doctrine\ORM\Query\AST\HavingClause - */ - public function HavingClause() - { - $this->match(Lexer::T_HAVING); - - return new AST\HavingClause($this->ConditionalExpression()); - } - - /** - * GroupByClause ::= "GROUP" "BY" GroupByItem {"," GroupByItem}* - * - * @return \Doctrine\ORM\Query\AST\GroupByClause - */ - public function GroupByClause() - { - $this->match(Lexer::T_GROUP); - $this->match(Lexer::T_BY); - - $groupByItems = array($this->GroupByItem()); - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - - $groupByItems[] = $this->GroupByItem(); - } - - return new AST\GroupByClause($groupByItems); - } - - /** - * OrderByClause ::= "ORDER" "BY" OrderByItem {"," OrderByItem}* - * - * @return \Doctrine\ORM\Query\AST\OrderByClause - */ - public function OrderByClause() - { - $this->match(Lexer::T_ORDER); - $this->match(Lexer::T_BY); - - $orderByItems = array(); - $orderByItems[] = $this->OrderByItem(); - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - - $orderByItems[] = $this->OrderByItem(); - } - - return new AST\OrderByClause($orderByItems); - } - - /** - * Subselect ::= SimpleSelectClause SubselectFromClause [WhereClause] [GroupByClause] [HavingClause] [OrderByClause] - * - * @return \Doctrine\ORM\Query\AST\Subselect - */ - public function Subselect() - { - // Increase query nesting level - $this->_nestingLevel++; - - $subselect = new AST\Subselect($this->SimpleSelectClause(), $this->SubselectFromClause()); - - $subselect->whereClause = $this->_lexer->isNextToken(Lexer::T_WHERE) ? $this->WhereClause() : null; - $subselect->groupByClause = $this->_lexer->isNextToken(Lexer::T_GROUP) ? $this->GroupByClause() : null; - $subselect->havingClause = $this->_lexer->isNextToken(Lexer::T_HAVING) ? $this->HavingClause() : null; - $subselect->orderByClause = $this->_lexer->isNextToken(Lexer::T_ORDER) ? $this->OrderByClause() : null; - - // Decrease query nesting level - $this->_nestingLevel--; - - return $subselect; - } - - /** - * UpdateItem ::= SingleValuedPathExpression "=" NewValue - * - * @return \Doctrine\ORM\Query\AST\UpdateItem - */ - public function UpdateItem() - { - $pathExpr = $this->SingleValuedPathExpression(); - - $this->match(Lexer::T_EQUALS); - - $updateItem = new AST\UpdateItem($pathExpr, $this->NewValue()); - - return $updateItem; - } - - /** - * GroupByItem ::= IdentificationVariable | ResultVariable | SingleValuedPathExpression - * - * @return string | \Doctrine\ORM\Query\AST\PathExpression - */ - public function GroupByItem() - { - // We need to check if we are in a IdentificationVariable or SingleValuedPathExpression - $glimpse = $this->_lexer->glimpse(); - - if ($glimpse['type'] === Lexer::T_DOT) { - return $this->SingleValuedPathExpression(); - } - - // Still need to decide between IdentificationVariable or ResultVariable - $lookaheadValue = $this->_lexer->lookahead['value']; - - if ( ! isset($this->_queryComponents[$lookaheadValue])) { - $this->semanticalError('Cannot group by undefined identification or result variable.'); - } - - return (isset($this->_queryComponents[$lookaheadValue]['metadata'])) - ? $this->IdentificationVariable() - : $this->ResultVariable(); - } - - /** - * OrderByItem ::= ( - * SimpleArithmeticExpression | SingleValuedPathExpression | - * ScalarExpression | ResultVariable - * ) ["ASC" | "DESC"] - * - * @return \Doctrine\ORM\Query\AST\OrderByItem - */ - public function OrderByItem() - { - - $this->_lexer->peek(); // lookahead => '.' - $this->_lexer->peek(); // lookahead => token after '.' - $peek = $this->_lexer->peek(); // lookahead => token after the token after the '.' - $this->_lexer->resetPeek(); - $glimpse = $this->_lexer->glimpse(); - - switch (true) { - - case ($this->_isMathOperator($peek)): - $expr = $this->SimpleArithmeticExpression(); - - break; - case ($glimpse['type'] === Lexer::T_DOT): - $expr = $this->SingleValuedPathExpression(); - - break; - case ($this->_lexer->peek() && $this->_isMathOperator($this->_peekBeyondClosingParenthesis())): - $expr = $this->ScalarExpression(); - - break; - default: - $expr = $this->ResultVariable(); - - break; - } - - $type = 'ASC'; - $item = new AST\OrderByItem($expr); - - switch (true) { - case ($this->_lexer->isNextToken(Lexer::T_DESC)): - $this->match(Lexer::T_DESC); - $type = 'DESC'; - break; - - case ($this->_lexer->isNextToken(Lexer::T_ASC)): - $this->match(Lexer::T_ASC); - break; - - default: - // Do nothing - } - - $item->type = $type; - - return $item; - } - - /** - * NewValue ::= SimpleArithmeticExpression | StringPrimary | DatetimePrimary | BooleanPrimary | - * EnumPrimary | SimpleEntityExpression | "NULL" - * - * NOTE: Since it is not possible to correctly recognize individual types, here is the full - * grammar that needs to be supported: - * - * NewValue ::= SimpleArithmeticExpression | "NULL" - * - * SimpleArithmeticExpression covers all *Primary grammar rules and also SimpleEntityExpression - */ - public function NewValue() - { - if ($this->_lexer->isNextToken(Lexer::T_NULL)) { - $this->match(Lexer::T_NULL); - - return null; - } - - if ($this->_lexer->isNextToken(Lexer::T_INPUT_PARAMETER)) { - $this->match(Lexer::T_INPUT_PARAMETER); - - return new AST\InputParameter($this->_lexer->token['value']); - } - - return $this->SimpleArithmeticExpression(); - } - - /** - * IdentificationVariableDeclaration ::= RangeVariableDeclaration [IndexBy] {Join}* - * - * @return \Doctrine\ORM\Query\AST\IdentificationVariableDeclaration - */ - public function IdentificationVariableDeclaration() - { - $rangeVariableDeclaration = $this->RangeVariableDeclaration(); - $indexBy = $this->_lexer->isNextToken(Lexer::T_INDEX) ? $this->IndexBy() : null; - $joins = array(); - - while ( - $this->_lexer->isNextToken(Lexer::T_LEFT) || - $this->_lexer->isNextToken(Lexer::T_INNER) || - $this->_lexer->isNextToken(Lexer::T_JOIN) - ) { - $joins[] = $this->Join(); - } - - return new AST\IdentificationVariableDeclaration( - $rangeVariableDeclaration, $indexBy, $joins - ); - } - - /** - * SubselectIdentificationVariableDeclaration ::= IdentificationVariableDeclaration | (AssociationPathExpression ["AS"] AliasIdentificationVariable) - * - * @return \Doctrine\ORM\Query\AST\SubselectIdentificationVariableDeclaration | - * \Doctrine\ORM\Query\AST\IdentificationVariableDeclaration - */ - public function SubselectIdentificationVariableDeclaration() - { - $this->_lexer->glimpse(); - - /* NOT YET IMPLEMENTED! - - if ($glimpse['type'] == Lexer::T_DOT) { - $subselectIdVarDecl = new AST\SubselectIdentificationVariableDeclaration(); - $subselectIdVarDecl->associationPathExpression = $this->AssociationPathExpression(); - $this->match(Lexer::T_AS); - $subselectIdVarDecl->aliasIdentificationVariable = $this->AliasIdentificationVariable(); - - return $subselectIdVarDecl; - } - */ - - return $this->IdentificationVariableDeclaration(); - } - - /** - * Join ::= ["LEFT" ["OUTER"] | "INNER"] "JOIN" - * (JoinAssociationDeclaration | RangeVariableDeclaration) - * ["WITH" ConditionalExpression] - * - * @return \Doctrine\ORM\Query\AST\Join - */ - public function Join() - { - // Check Join type - $joinType = AST\Join::JOIN_TYPE_INNER; - - switch (true) { - case ($this->_lexer->isNextToken(Lexer::T_LEFT)): - $this->match(Lexer::T_LEFT); - - $joinType = AST\Join::JOIN_TYPE_LEFT; - - // Possible LEFT OUTER join - if ($this->_lexer->isNextToken(Lexer::T_OUTER)) { - $this->match(Lexer::T_OUTER); - - $joinType = AST\Join::JOIN_TYPE_LEFTOUTER; - } - break; - - case ($this->_lexer->isNextToken(Lexer::T_INNER)): - $this->match(Lexer::T_INNER); - break; - - default: - // Do nothing - } - - $this->match(Lexer::T_JOIN); - - $next = $this->_lexer->glimpse(); - $joinDeclaration = ($next['type'] === Lexer::T_DOT) - ? $this->JoinAssociationDeclaration() - : $this->RangeVariableDeclaration(); - - // Create AST node - $join = new AST\Join($joinType, $joinDeclaration); - - // Check for ad-hoc Join conditions - if ($this->_lexer->isNextToken(Lexer::T_WITH) || $joinDeclaration instanceof AST\RangeVariableDeclaration) { - $this->match(Lexer::T_WITH); - - $join->conditionalExpression = $this->ConditionalExpression(); - } - - return $join; - } - - /** - * RangeVariableDeclaration ::= AbstractSchemaName ["AS"] AliasIdentificationVariable - * - * @return \Doctrine\ORM\Query\AST\RangeVariableDeclaration - */ - public function RangeVariableDeclaration() - { - $abstractSchemaName = $this->AbstractSchemaName(); - - if ($this->_lexer->isNextToken(Lexer::T_AS)) { - $this->match(Lexer::T_AS); - } - - $token = $this->_lexer->lookahead; - $aliasIdentificationVariable = $this->AliasIdentificationVariable(); - $classMetadata = $this->_em->getClassMetadata($abstractSchemaName); - - // Building queryComponent - $queryComponent = array( - 'metadata' => $classMetadata, - 'parent' => null, - 'relation' => null, - 'map' => null, - 'nestingLevel' => $this->_nestingLevel, - 'token' => $token - ); - - $this->_queryComponents[$aliasIdentificationVariable] = $queryComponent; - - return new AST\RangeVariableDeclaration($abstractSchemaName, $aliasIdentificationVariable); - } - - /** - * JoinAssociationDeclaration ::= JoinAssociationPathExpression ["AS"] AliasIdentificationVariable [IndexBy] - * - * @return \Doctrine\ORM\Query\AST\JoinAssociationPathExpression - */ - public function JoinAssociationDeclaration() - { - $joinAssociationPathExpression = $this->JoinAssociationPathExpression(); - - if ($this->_lexer->isNextToken(Lexer::T_AS)) { - $this->match(Lexer::T_AS); - } - - $aliasIdentificationVariable = $this->AliasIdentificationVariable(); - $indexBy = $this->_lexer->isNextToken(Lexer::T_INDEX) ? $this->IndexBy() : null; - - $identificationVariable = $joinAssociationPathExpression->identificationVariable; - $field = $joinAssociationPathExpression->associationField; - - $class = $this->_queryComponents[$identificationVariable]['metadata']; - $targetClass = $this->_em->getClassMetadata($class->associationMappings[$field]['targetEntity']); - - // Building queryComponent - $joinQueryComponent = array( - 'metadata' => $targetClass, - 'parent' => $joinAssociationPathExpression->identificationVariable, - 'relation' => $class->getAssociationMapping($field), - 'map' => null, - 'nestingLevel' => $this->_nestingLevel, - 'token' => $this->_lexer->lookahead - ); - - $this->_queryComponents[$aliasIdentificationVariable] = $joinQueryComponent; - - return new AST\JoinAssociationDeclaration($joinAssociationPathExpression, $aliasIdentificationVariable, $indexBy); - } - - /** - * PartialObjectExpression ::= "PARTIAL" IdentificationVariable "." PartialFieldSet - * PartialFieldSet ::= "{" SimpleStateField {"," SimpleStateField}* "}" - * - * @return array - */ - public function PartialObjectExpression() - { - $this->match(Lexer::T_PARTIAL); - - $partialFieldSet = array(); - - $identificationVariable = $this->IdentificationVariable(); - - $this->match(Lexer::T_DOT); - $this->match(Lexer::T_OPEN_CURLY_BRACE); - $this->match(Lexer::T_IDENTIFIER); - - $partialFieldSet[] = $this->_lexer->token['value']; - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - $this->match(Lexer::T_IDENTIFIER); - - $partialFieldSet[] = $this->_lexer->token['value']; - } - - $this->match(Lexer::T_CLOSE_CURLY_BRACE); - - $partialObjectExpression = new AST\PartialObjectExpression($identificationVariable, $partialFieldSet); - - // Defer PartialObjectExpression validation - $this->_deferredPartialObjectExpressions[] = array( - 'expression' => $partialObjectExpression, - 'nestingLevel' => $this->_nestingLevel, - 'token' => $this->_lexer->token, - ); - - return $partialObjectExpression; - } - - /** - * IndexBy ::= "INDEX" "BY" StateFieldPathExpression - * - * @return \Doctrine\ORM\Query\AST\IndexBy - */ - public function IndexBy() - { - $this->match(Lexer::T_INDEX); - $this->match(Lexer::T_BY); - $pathExpr = $this->StateFieldPathExpression(); - - // Add the INDEX BY info to the query component - $this->_queryComponents[$pathExpr->identificationVariable]['map'] = $pathExpr->field; - - return new AST\IndexBy($pathExpr); - } - - /** - * ScalarExpression ::= SimpleArithmeticExpression | StringPrimary | DateTimePrimary | - * StateFieldPathExpression | BooleanPrimary | CaseExpression | - * InstanceOfExpression - * - * @return mixed One of the possible expressions or subexpressions. - */ - public function ScalarExpression() - { - $lookahead = $this->_lexer->lookahead['type']; - - switch ($lookahead) { - case Lexer::T_IDENTIFIER: - $this->_lexer->peek(); // lookahead => '.' - $this->_lexer->peek(); // lookahead => token after '.' - $peek = $this->_lexer->peek(); // lookahead => token after the token after the '.' - $this->_lexer->resetPeek(); - - if ($this->_isMathOperator($peek)) { - return $this->SimpleArithmeticExpression(); - } - - return $this->StateFieldPathExpression(); - - case Lexer::T_INTEGER: - case Lexer::T_FLOAT: - return $this->SimpleArithmeticExpression(); - - case Lexer::T_STRING: - return $this->StringPrimary(); - - case Lexer::T_TRUE: - case Lexer::T_FALSE: - $this->match($lookahead); - - return new AST\Literal(AST\Literal::BOOLEAN, $this->_lexer->token['value']); - - case Lexer::T_INPUT_PARAMETER: - return $this->InputParameter(); - - case Lexer::T_CASE: - case Lexer::T_COALESCE: - case Lexer::T_NULLIF: - // Since NULLIF and COALESCE can be identified as a function, - // we need to check if before check for FunctionDeclaration - return $this->CaseExpression(); - - default: - if ( ! ($this->_isFunction() || $this->_isAggregateFunction($lookahead))) { - $this->syntaxError(); - } - - // We may be in an ArithmeticExpression (find the matching ")" and inspect for Math operator) - $this->_lexer->peek(); // "(" - $peek = $this->_peekBeyondClosingParenthesis(); - - if ($this->_isMathOperator($peek)) { - return $this->SimpleArithmeticExpression(); - } - - if ($this->_isAggregateFunction($this->_lexer->lookahead['type'])) { - return $this->AggregateExpression(); - } - - return $this->FunctionDeclaration(); - } - } - - /** - * CaseExpression ::= GeneralCaseExpression | SimpleCaseExpression | CoalesceExpression | NullifExpression - * GeneralCaseExpression ::= "CASE" WhenClause {WhenClause}* "ELSE" ScalarExpression "END" - * WhenClause ::= "WHEN" ConditionalExpression "THEN" ScalarExpression - * SimpleCaseExpression ::= "CASE" CaseOperand SimpleWhenClause {SimpleWhenClause}* "ELSE" ScalarExpression "END" - * CaseOperand ::= StateFieldPathExpression | TypeDiscriminator - * SimpleWhenClause ::= "WHEN" ScalarExpression "THEN" ScalarExpression - * CoalesceExpression ::= "COALESCE" "(" ScalarExpression {"," ScalarExpression}* ")" - * NullifExpression ::= "NULLIF" "(" ScalarExpression "," ScalarExpression ")" - * - * @return mixed One of the possible expressions or subexpressions. - */ - public function CaseExpression() - { - $lookahead = $this->_lexer->lookahead['type']; - - switch ($lookahead) { - case Lexer::T_NULLIF: - return $this->NullIfExpression(); - - case Lexer::T_COALESCE: - return $this->CoalesceExpression(); - - case Lexer::T_CASE: - $this->_lexer->resetPeek(); - $peek = $this->_lexer->peek(); - - if ($peek['type'] === Lexer::T_WHEN) { - return $this->GeneralCaseExpression(); - } - - return $this->SimpleCaseExpression(); - - default: - // Do nothing - break; - } - - $this->syntaxError(); - } - - /** - * CoalesceExpression ::= "COALESCE" "(" ScalarExpression {"," ScalarExpression}* ")" - * - * @return \Doctrine\ORM\Query\AST\CoalesceExpression - */ - public function CoalesceExpression() - { - $this->match(Lexer::T_COALESCE); - $this->match(Lexer::T_OPEN_PARENTHESIS); - - // Process ScalarExpressions (1..N) - $scalarExpressions = array(); - $scalarExpressions[] = $this->ScalarExpression(); - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - - $scalarExpressions[] = $this->ScalarExpression(); - } - - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - return new AST\CoalesceExpression($scalarExpressions); - } - - /** - * NullIfExpression ::= "NULLIF" "(" ScalarExpression "," ScalarExpression ")" - * - * @return \Doctrine\ORM\Query\AST\NullIfExpression - */ - public function NullIfExpression() - { - $this->match(Lexer::T_NULLIF); - $this->match(Lexer::T_OPEN_PARENTHESIS); - - $firstExpression = $this->ScalarExpression(); - $this->match(Lexer::T_COMMA); - $secondExpression = $this->ScalarExpression(); - - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - return new AST\NullIfExpression($firstExpression, $secondExpression); - } - - /** - * GeneralCaseExpression ::= "CASE" WhenClause {WhenClause}* "ELSE" ScalarExpression "END" - * - * @return \Doctrine\ORM\Query\AST\GeneralExpression - */ - public function GeneralCaseExpression() - { - $this->match(Lexer::T_CASE); - - // Process WhenClause (1..N) - $whenClauses = array(); - - do { - $whenClauses[] = $this->WhenClause(); - } while ($this->_lexer->isNextToken(Lexer::T_WHEN)); - - $this->match(Lexer::T_ELSE); - $scalarExpression = $this->ScalarExpression(); - $this->match(Lexer::T_END); - - return new AST\GeneralCaseExpression($whenClauses, $scalarExpression); - } - - /** - * SimpleCaseExpression ::= "CASE" CaseOperand SimpleWhenClause {SimpleWhenClause}* "ELSE" ScalarExpression "END" - * CaseOperand ::= StateFieldPathExpression | TypeDiscriminator - */ - public function SimpleCaseExpression() - { - $this->match(Lexer::T_CASE); - $caseOperand = $this->StateFieldPathExpression(); - - // Process SimpleWhenClause (1..N) - $simpleWhenClauses = array(); - - do { - $simpleWhenClauses[] = $this->SimpleWhenClause(); - } while ($this->_lexer->isNextToken(Lexer::T_WHEN)); - - $this->match(Lexer::T_ELSE); - $scalarExpression = $this->ScalarExpression(); - $this->match(Lexer::T_END); - - return new AST\SimpleCaseExpression($caseOperand, $simpleWhenClauses, $scalarExpression); - } - - /** - * WhenClause ::= "WHEN" ConditionalExpression "THEN" ScalarExpression - * - * @return \Doctrine\ORM\Query\AST\WhenExpression - */ - public function WhenClause() - { - $this->match(Lexer::T_WHEN); - $conditionalExpression = $this->ConditionalExpression(); - $this->match(Lexer::T_THEN); - - return new AST\WhenClause($conditionalExpression, $this->ScalarExpression()); - } - - /** - * SimpleWhenClause ::= "WHEN" ScalarExpression "THEN" ScalarExpression - * - * @return \Doctrine\ORM\Query\AST\SimpleWhenExpression - */ - public function SimpleWhenClause() - { - $this->match(Lexer::T_WHEN); - $conditionalExpression = $this->ScalarExpression(); - $this->match(Lexer::T_THEN); - - return new AST\SimpleWhenClause($conditionalExpression, $this->ScalarExpression()); - } - - /** - * SelectExpression ::= ( - * IdentificationVariable | ScalarExpression | AggregateExpression | FunctionDeclaration | - * PartialObjectExpression | "(" Subselect ")" | CaseExpression - * ) [["AS"] ["HIDDEN"] AliasResultVariable] - * - * @return \Doctrine\ORM\Query\AST\SelectExpression - */ - public function SelectExpression() - { - $expression = null; - $identVariable = null; - $peek = $this->_lexer->glimpse(); - $lookaheadType = $this->_lexer->lookahead['type']; - - switch (true) { - // ScalarExpression (u.name) - case ($lookaheadType === Lexer::T_IDENTIFIER && $peek['type'] === Lexer::T_DOT): - $expression = $this->ScalarExpression(); - break; - - // IdentificationVariable (u) - case ($lookaheadType === Lexer::T_IDENTIFIER && $peek['type'] !== Lexer::T_OPEN_PARENTHESIS): - $expression = $identVariable = $this->IdentificationVariable(); - break; - - // CaseExpression (CASE ... or NULLIF(...) or COALESCE(...)) - case ($lookaheadType === Lexer::T_CASE): - case ($lookaheadType === Lexer::T_COALESCE): - case ($lookaheadType === Lexer::T_NULLIF): - $expression = $this->CaseExpression(); - break; - - // DQL Function (SUM(u.value) or SUM(u.value) + 1) - case ($this->_isFunction()): - $this->_lexer->peek(); // "(" - - switch (true) { - case ($this->_isMathOperator($this->_peekBeyondClosingParenthesis())): - // SUM(u.id) + COUNT(u.id) - $expression = $this->ScalarExpression(); - break; - - case ($this->_isAggregateFunction($lookaheadType)): - // COUNT(u.id) - $expression = $this->AggregateExpression(); - break; - - default: - // IDENTITY(u) - $expression = $this->FunctionDeclaration(); - break; - } - - break; - - // PartialObjectExpression (PARTIAL u.{id, name}) - case ($lookaheadType === Lexer::T_PARTIAL): - $expression = $this->PartialObjectExpression(); - $identVariable = $expression->identificationVariable; - break; - - // Subselect - case ($lookaheadType === Lexer::T_OPEN_PARENTHESIS && $peek['type'] === Lexer::T_SELECT): - $this->match(Lexer::T_OPEN_PARENTHESIS); - $expression = $this->Subselect(); - $this->match(Lexer::T_CLOSE_PARENTHESIS); - break; - - // Shortcut: ScalarExpression => SimpleArithmeticExpression - case ($lookaheadType === Lexer::T_OPEN_PARENTHESIS): - case ($lookaheadType === Lexer::T_INTEGER): - case ($lookaheadType === Lexer::T_STRING): - case ($lookaheadType === Lexer::T_FLOAT): - // SimpleArithmeticExpression : (- u.value ) or ( + u.value ) - case ($lookaheadType === Lexer::T_MINUS): - case ($lookaheadType === Lexer::T_PLUS): - $expression = $this->SimpleArithmeticExpression(); - break; - - default: - $this->syntaxError( - 'IdentificationVariable | ScalarExpression | AggregateExpression | FunctionDeclaration | PartialObjectExpression | "(" Subselect ")" | CaseExpression', - $this->_lexer->lookahead - ); - } - - // [["AS"] ["HIDDEN"] AliasResultVariable] - - if ($this->_lexer->isNextToken(Lexer::T_AS)) { - $this->match(Lexer::T_AS); - } - - $hiddenAliasResultVariable = false; - - if ($this->_lexer->isNextToken(Lexer::T_HIDDEN)) { - $this->match(Lexer::T_HIDDEN); - - $hiddenAliasResultVariable = true; - } - - $aliasResultVariable = null; - - if ($this->_lexer->isNextToken(Lexer::T_IDENTIFIER)) { - $token = $this->_lexer->lookahead; - $aliasResultVariable = $this->AliasResultVariable(); - - // Include AliasResultVariable in query components. - $this->_queryComponents[$aliasResultVariable] = array( - 'resultVariable' => $expression, - 'nestingLevel' => $this->_nestingLevel, - 'token' => $token, - ); - } - - // AST - - $expr = new AST\SelectExpression($expression, $aliasResultVariable, $hiddenAliasResultVariable); - - if ($identVariable) { - $this->_identVariableExpressions[$identVariable] = $expr; - } - - return $expr; - } - - /** - * SimpleSelectExpression ::= ( - * StateFieldPathExpression | IdentificationVariable | FunctionDeclaration | - * AggregateExpression | "(" Subselect ")" | ScalarExpression - * ) [["AS"] AliasResultVariable] - * - * @return \Doctrine\ORM\Query\AST\SimpleSelectExpression - */ - public function SimpleSelectExpression() - { - $peek = $this->_lexer->glimpse(); - - switch ($this->_lexer->lookahead['type']) { - case Lexer::T_IDENTIFIER: - switch (true) { - case ($peek['type'] === Lexer::T_DOT): - $expression = $this->StateFieldPathExpression(); - - return new AST\SimpleSelectExpression($expression); - - case ($peek['type'] !== Lexer::T_OPEN_PARENTHESIS): - $expression = $this->IdentificationVariable(); - - return new AST\SimpleSelectExpression($expression); - - case ($this->_isFunction()): - // SUM(u.id) + COUNT(u.id) - if ($this->_isMathOperator($this->_peekBeyondClosingParenthesis())) { - return new AST\SimpleSelectExpression($this->ScalarExpression()); - } - // COUNT(u.id) - if ($this->_isAggregateFunction($this->_lexer->lookahead['type'])) { - return new AST\SimpleSelectExpression($this->AggregateExpression()); - } - // IDENTITY(u) - return new AST\SimpleSelectExpression($this->FunctionDeclaration()); - - default: - // Do nothing - } - break; - - case Lexer::T_OPEN_PARENTHESIS: - if ($peek['type'] !== Lexer::T_SELECT) { - // Shortcut: ScalarExpression => SimpleArithmeticExpression - $expression = $this->SimpleArithmeticExpression(); - - return new AST\SimpleSelectExpression($expression); - } - - // Subselect - $this->match(Lexer::T_OPEN_PARENTHESIS); - $expression = $this->Subselect(); - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - return new AST\SimpleSelectExpression($expression); - - default: - // Do nothing - } - - $this->_lexer->peek(); - - $expression = $this->ScalarExpression(); - $expr = new AST\SimpleSelectExpression($expression); - - if ($this->_lexer->isNextToken(Lexer::T_AS)) { - $this->match(Lexer::T_AS); - } - - if ($this->_lexer->isNextToken(Lexer::T_IDENTIFIER)) { - $token = $this->_lexer->lookahead; - $resultVariable = $this->AliasResultVariable(); - $expr->fieldIdentificationVariable = $resultVariable; - - // Include AliasResultVariable in query components. - $this->_queryComponents[$resultVariable] = array( - 'resultvariable' => $expr, - 'nestingLevel' => $this->_nestingLevel, - 'token' => $token, - ); - } - - return $expr; - } - - /** - * ConditionalExpression ::= ConditionalTerm {"OR" ConditionalTerm}* - * - * @return \Doctrine\ORM\Query\AST\ConditionalExpression - */ - public function ConditionalExpression() - { - $conditionalTerms = array(); - $conditionalTerms[] = $this->ConditionalTerm(); - - while ($this->_lexer->isNextToken(Lexer::T_OR)) { - $this->match(Lexer::T_OR); - - $conditionalTerms[] = $this->ConditionalTerm(); - } - - // Phase 1 AST optimization: Prevent AST\ConditionalExpression - // if only one AST\ConditionalTerm is defined - if (count($conditionalTerms) == 1) { - return $conditionalTerms[0]; - } - - return new AST\ConditionalExpression($conditionalTerms); - } - - /** - * ConditionalTerm ::= ConditionalFactor {"AND" ConditionalFactor}* - * - * @return \Doctrine\ORM\Query\AST\ConditionalTerm - */ - public function ConditionalTerm() - { - $conditionalFactors = array(); - $conditionalFactors[] = $this->ConditionalFactor(); - - while ($this->_lexer->isNextToken(Lexer::T_AND)) { - $this->match(Lexer::T_AND); - - $conditionalFactors[] = $this->ConditionalFactor(); - } - - // Phase 1 AST optimization: Prevent AST\ConditionalTerm - // if only one AST\ConditionalFactor is defined - if (count($conditionalFactors) == 1) { - return $conditionalFactors[0]; - } - - return new AST\ConditionalTerm($conditionalFactors); - } - - /** - * ConditionalFactor ::= ["NOT"] ConditionalPrimary - * - * @return \Doctrine\ORM\Query\AST\ConditionalFactor - */ - public function ConditionalFactor() - { - $not = false; - - if ($this->_lexer->isNextToken(Lexer::T_NOT)) { - $this->match(Lexer::T_NOT); - - $not = true; - } - - $conditionalPrimary = $this->ConditionalPrimary(); - - // Phase 1 AST optimization: Prevent AST\ConditionalFactor - // if only one AST\ConditionalPrimary is defined - if ( ! $not) { - return $conditionalPrimary; - } - - $conditionalFactor = new AST\ConditionalFactor($conditionalPrimary); - $conditionalFactor->not = $not; - - return $conditionalFactor; - } - - /** - * ConditionalPrimary ::= SimpleConditionalExpression | "(" ConditionalExpression ")" - * - * @return \Doctrine\ORM\Query\AST\ConditionalPrimary - */ - public function ConditionalPrimary() - { - $condPrimary = new AST\ConditionalPrimary; - - if ( ! $this->_lexer->isNextToken(Lexer::T_OPEN_PARENTHESIS)) { - $condPrimary->simpleConditionalExpression = $this->SimpleConditionalExpression(); - - return $condPrimary; - } - - // Peek beyond the matching closing paranthesis ')' - $peek = $this->_peekBeyondClosingParenthesis(); - - if (in_array($peek['value'], array("=", "<", "<=", "<>", ">", ">=", "!=")) || - in_array($peek['type'], array(Lexer::T_NOT, Lexer::T_BETWEEN, Lexer::T_LIKE, Lexer::T_IN, Lexer::T_IS, Lexer::T_EXISTS)) || - $this->_isMathOperator($peek)) { - $condPrimary->simpleConditionalExpression = $this->SimpleConditionalExpression(); - - return $condPrimary; - } - - $this->match(Lexer::T_OPEN_PARENTHESIS); - $condPrimary->conditionalExpression = $this->ConditionalExpression(); - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - return $condPrimary; - } - - /** - * SimpleConditionalExpression ::= - * ComparisonExpression | BetweenExpression | LikeExpression | - * InExpression | NullComparisonExpression | ExistsExpression | - * EmptyCollectionComparisonExpression | CollectionMemberExpression | - * InstanceOfExpression - */ - public function SimpleConditionalExpression() - { - $token = $this->_lexer->lookahead; - - if ($this->_lexer->isNextToken(Lexer::T_NOT)) { - $token = $this->_lexer->glimpse(); - } - - if ($token['type'] === Lexer::T_EXISTS) { - return $this->ExistsExpression(); - } - - $peek = $this->_lexer->glimpse(); - - if ($token['type'] === Lexer::T_IDENTIFIER || $token['type'] === Lexer::T_INPUT_PARAMETER) { - if ($peek['value'] == '(') { - // Peek beyond the matching closing paranthesis ')' - $this->_lexer->peek(); - $token = $this->_peekBeyondClosingParenthesis(false); - - if ($token['type'] === Lexer::T_NOT) { - $token = $this->_lexer->peek(); - } - - $this->_lexer->resetPeek(); - } else { - // Peek beyond the PathExpression (or InputParameter) - $peek = $this->_lexer->peek(); - - while ($peek['value'] === '.') { - $this->_lexer->peek(); - $peek = $this->_lexer->peek(); - } - - // Also peek beyond a NOT if there is one - if ($peek['type'] === Lexer::T_NOT) { - $peek = $this->_lexer->peek(); - } - - $token = $peek; - - // We need to go even further in case of IS (differenciate between NULL and EMPTY) - $lookahead = $this->_lexer->peek(); - - // Also peek beyond a NOT if there is one - if ($lookahead['type'] === Lexer::T_NOT) { - $lookahead = $this->_lexer->peek(); - } - - $this->_lexer->resetPeek(); - } - } - - switch ($token['type']) { - case Lexer::T_BETWEEN: - return $this->BetweenExpression(); - case Lexer::T_LIKE: - return $this->LikeExpression(); - case Lexer::T_IN: - return $this->InExpression(); - case Lexer::T_INSTANCE: - return $this->InstanceOfExpression(); - case Lexer::T_IS: - if ($lookahead['type'] == Lexer::T_NULL) { - return $this->NullComparisonExpression(); - } - return $this->EmptyCollectionComparisonExpression(); - case Lexer::T_MEMBER: - return $this->CollectionMemberExpression(); - default: - return $this->ComparisonExpression(); - } - } - - /** - * EmptyCollectionComparisonExpression ::= CollectionValuedPathExpression "IS" ["NOT"] "EMPTY" - * - * @return \Doctrine\ORM\Query\AST\EmptyCollectionComparisonExpression - */ - public function EmptyCollectionComparisonExpression() - { - $emptyColletionCompExpr = new AST\EmptyCollectionComparisonExpression( - $this->CollectionValuedPathExpression() - ); - $this->match(Lexer::T_IS); - - if ($this->_lexer->isNextToken(Lexer::T_NOT)) { - $this->match(Lexer::T_NOT); - $emptyColletionCompExpr->not = true; - } - - $this->match(Lexer::T_EMPTY); - - return $emptyColletionCompExpr; - } - - /** - * CollectionMemberExpression ::= EntityExpression ["NOT"] "MEMBER" ["OF"] CollectionValuedPathExpression - * - * EntityExpression ::= SingleValuedAssociationPathExpression | SimpleEntityExpression - * SimpleEntityExpression ::= IdentificationVariable | InputParameter - * - * @return \Doctrine\ORM\Query\AST\CollectionMemberExpression - */ - public function CollectionMemberExpression() - { - $not = false; - $entityExpr = $this->EntityExpression(); - - if ($this->_lexer->isNextToken(Lexer::T_NOT)) { - $this->match(Lexer::T_NOT); - - $not = true; - } - - $this->match(Lexer::T_MEMBER); - - if ($this->_lexer->isNextToken(Lexer::T_OF)) { - $this->match(Lexer::T_OF); - } - - $collMemberExpr = new AST\CollectionMemberExpression( - $entityExpr, $this->CollectionValuedPathExpression() - ); - $collMemberExpr->not = $not; - - return $collMemberExpr; - } - - /** - * Literal ::= string | char | integer | float | boolean - * - * @return string - */ - public function Literal() - { - switch ($this->_lexer->lookahead['type']) { - case Lexer::T_STRING: - $this->match(Lexer::T_STRING); - return new AST\Literal(AST\Literal::STRING, $this->_lexer->token['value']); - - case Lexer::T_INTEGER: - case Lexer::T_FLOAT: - $this->match( - $this->_lexer->isNextToken(Lexer::T_INTEGER) ? Lexer::T_INTEGER : Lexer::T_FLOAT - ); - return new AST\Literal(AST\Literal::NUMERIC, $this->_lexer->token['value']); - - case Lexer::T_TRUE: - case Lexer::T_FALSE: - $this->match( - $this->_lexer->isNextToken(Lexer::T_TRUE) ? Lexer::T_TRUE : Lexer::T_FALSE - ); - return new AST\Literal(AST\Literal::BOOLEAN, $this->_lexer->token['value']); - - default: - $this->syntaxError('Literal'); - } - } - - /** - * InParameter ::= Literal | InputParameter - * - * @return string | \Doctrine\ORM\Query\AST\InputParameter - */ - public function InParameter() - { - if ($this->_lexer->lookahead['type'] == Lexer::T_INPUT_PARAMETER) { - return $this->InputParameter(); - } - - return $this->Literal(); - } - - /** - * InputParameter ::= PositionalParameter | NamedParameter - * - * @return \Doctrine\ORM\Query\AST\InputParameter - */ - public function InputParameter() - { - $this->match(Lexer::T_INPUT_PARAMETER); - - return new AST\InputParameter($this->_lexer->token['value']); - } - - /** - * ArithmeticExpression ::= SimpleArithmeticExpression | "(" Subselect ")" - * - * @return \Doctrine\ORM\Query\AST\ArithmeticExpression - */ - public function ArithmeticExpression() - { - $expr = new AST\ArithmeticExpression; - - if ($this->_lexer->isNextToken(Lexer::T_OPEN_PARENTHESIS)) { - $peek = $this->_lexer->glimpse(); - - if ($peek['type'] === Lexer::T_SELECT) { - $this->match(Lexer::T_OPEN_PARENTHESIS); - $expr->subselect = $this->Subselect(); - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - return $expr; - } - } - - $expr->simpleArithmeticExpression = $this->SimpleArithmeticExpression(); - - return $expr; - } - - /** - * SimpleArithmeticExpression ::= ArithmeticTerm {("+" | "-") ArithmeticTerm}* - * - * @return \Doctrine\ORM\Query\AST\SimpleArithmeticExpression - */ - public function SimpleArithmeticExpression() - { - $terms = array(); - $terms[] = $this->ArithmeticTerm(); - - while (($isPlus = $this->_lexer->isNextToken(Lexer::T_PLUS)) || $this->_lexer->isNextToken(Lexer::T_MINUS)) { - $this->match(($isPlus) ? Lexer::T_PLUS : Lexer::T_MINUS); - - $terms[] = $this->_lexer->token['value']; - $terms[] = $this->ArithmeticTerm(); - } - - // Phase 1 AST optimization: Prevent AST\SimpleArithmeticExpression - // if only one AST\ArithmeticTerm is defined - if (count($terms) == 1) { - return $terms[0]; - } - - return new AST\SimpleArithmeticExpression($terms); - } - - /** - * ArithmeticTerm ::= ArithmeticFactor {("*" | "/") ArithmeticFactor}* - * - * @return \Doctrine\ORM\Query\AST\ArithmeticTerm - */ - public function ArithmeticTerm() - { - $factors = array(); - $factors[] = $this->ArithmeticFactor(); - - while (($isMult = $this->_lexer->isNextToken(Lexer::T_MULTIPLY)) || $this->_lexer->isNextToken(Lexer::T_DIVIDE)) { - $this->match(($isMult) ? Lexer::T_MULTIPLY : Lexer::T_DIVIDE); - - $factors[] = $this->_lexer->token['value']; - $factors[] = $this->ArithmeticFactor(); - } - - // Phase 1 AST optimization: Prevent AST\ArithmeticTerm - // if only one AST\ArithmeticFactor is defined - if (count($factors) == 1) { - return $factors[0]; - } - - return new AST\ArithmeticTerm($factors); - } - - /** - * ArithmeticFactor ::= [("+" | "-")] ArithmeticPrimary - * - * @return \Doctrine\ORM\Query\AST\ArithmeticFactor - */ - public function ArithmeticFactor() - { - $sign = null; - - if (($isPlus = $this->_lexer->isNextToken(Lexer::T_PLUS)) || $this->_lexer->isNextToken(Lexer::T_MINUS)) { - $this->match(($isPlus) ? Lexer::T_PLUS : Lexer::T_MINUS); - $sign = $isPlus; - } - - $primary = $this->ArithmeticPrimary(); - - // Phase 1 AST optimization: Prevent AST\ArithmeticFactor - // if only one AST\ArithmeticPrimary is defined - if ($sign === null) { - return $primary; - } - - return new AST\ArithmeticFactor($primary, $sign); - } - - /** - * ArithmeticPrimary ::= SingleValuedPathExpression | Literal | "(" SimpleArithmeticExpression ")" - * | FunctionsReturningNumerics | AggregateExpression | FunctionsReturningStrings - * | FunctionsReturningDatetime | IdentificationVariable | ResultVariable - * | InputParameter | CaseExpression - */ - public function ArithmeticPrimary() - { - if ($this->_lexer->isNextToken(Lexer::T_OPEN_PARENTHESIS)) { - $this->match(Lexer::T_OPEN_PARENTHESIS); - $expr = $this->SimpleArithmeticExpression(); - - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - return $expr; - } - - switch ($this->_lexer->lookahead['type']) { - case Lexer::T_COALESCE: - case Lexer::T_NULLIF: - case Lexer::T_CASE: - return $this->CaseExpression(); - - case Lexer::T_IDENTIFIER: - $peek = $this->_lexer->glimpse(); - - if ($peek['value'] == '(') { - return $this->FunctionDeclaration(); - } - - if ($peek['value'] == '.') { - return $this->SingleValuedPathExpression(); - } - - if (isset($this->_queryComponents[$this->_lexer->lookahead['value']]['resultVariable'])) { - return $this->ResultVariable(); - } - - return $this->StateFieldPathExpression(); - - case Lexer::T_INPUT_PARAMETER: - return $this->InputParameter(); - - default: - $peek = $this->_lexer->glimpse(); - - if ($peek['value'] == '(') { - if ($this->_isAggregateFunction($this->_lexer->lookahead['type'])) { - return $this->AggregateExpression(); - } - - return $this->FunctionDeclaration(); - } - - return $this->Literal(); - } - } - - /** - * StringExpression ::= StringPrimary | "(" Subselect ")" - * - * @return \Doctrine\ORM\Query\AST\StringPrimary | - * \Doctrine]ORM\Query\AST\Subselect - */ - public function StringExpression() - { - if ($this->_lexer->isNextToken(Lexer::T_OPEN_PARENTHESIS)) { - $peek = $this->_lexer->glimpse(); - - if ($peek['type'] === Lexer::T_SELECT) { - $this->match(Lexer::T_OPEN_PARENTHESIS); - $expr = $this->Subselect(); - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - return $expr; - } - } - - return $this->StringPrimary(); - } - - /** - * StringPrimary ::= StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression | CaseExpression - */ - public function StringPrimary() - { - $lookaheadType = $this->_lexer->lookahead['type']; - - switch ($lookaheadType) { - case Lexer::T_IDENTIFIER: - $peek = $this->_lexer->glimpse(); - - if ($peek['value'] == '.') { - return $this->StateFieldPathExpression(); - } - - if ($peek['value'] == '(') { - // do NOT directly go to FunctionsReturningString() because it doesnt check for custom functions. - return $this->FunctionDeclaration(); - } - - $this->syntaxError("'.' or '('"); - break; - - case Lexer::T_STRING: - $this->match(Lexer::T_STRING); - - return new AST\Literal(AST\Literal::STRING, $this->_lexer->token['value']); - - case Lexer::T_INPUT_PARAMETER: - return $this->InputParameter(); - - case Lexer::T_CASE: - case Lexer::T_COALESCE: - case Lexer::T_NULLIF: - return $this->CaseExpression(); - - default: - if ($this->_isAggregateFunction($lookaheadType)) { - return $this->AggregateExpression(); - } - } - - $this->syntaxError( - 'StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression' - ); - } - - /** - * EntityExpression ::= SingleValuedAssociationPathExpression | SimpleEntityExpression - * - * @return \Doctrine\ORM\Query\AST\SingleValuedAssociationPathExpression | - * \Doctrine\ORM\Query\AST\SimpleEntityExpression - */ - public function EntityExpression() - { - $glimpse = $this->_lexer->glimpse(); - - if ($this->_lexer->isNextToken(Lexer::T_IDENTIFIER) && $glimpse['value'] === '.') { - return $this->SingleValuedAssociationPathExpression(); - } - - return $this->SimpleEntityExpression(); - } - - /** - * SimpleEntityExpression ::= IdentificationVariable | InputParameter - * - * @return string | \Doctrine\ORM\Query\AST\InputParameter - */ - public function SimpleEntityExpression() - { - if ($this->_lexer->isNextToken(Lexer::T_INPUT_PARAMETER)) { - return $this->InputParameter(); - } - - return $this->StateFieldPathExpression(); - } - - /** - * AggregateExpression ::= - * ("AVG" | "MAX" | "MIN" | "SUM") "(" ["DISTINCT"] StateFieldPathExpression ")" | - * "COUNT" "(" ["DISTINCT"] (IdentificationVariable | SingleValuedPathExpression) ")" - * - * @return \Doctrine\ORM\Query\AST\AggregateExpression - */ - public function AggregateExpression() - { - $lookaheadType = $this->_lexer->lookahead['type']; - $isDistinct = false; - - if ( ! in_array($lookaheadType, array(Lexer::T_COUNT, Lexer::T_AVG, Lexer::T_MAX, Lexer::T_MIN, Lexer::T_SUM))) { - $this->syntaxError('One of: MAX, MIN, AVG, SUM, COUNT'); - } - - $this->match($lookaheadType); - $functionName = $this->_lexer->token['value']; - $this->match(Lexer::T_OPEN_PARENTHESIS); - - if ($this->_lexer->isNextToken(Lexer::T_DISTINCT)) { - $this->match(Lexer::T_DISTINCT); - $isDistinct = true; - } - - $pathExp = ($lookaheadType === Lexer::T_COUNT) - ? $this->SingleValuedPathExpression() - : $this->SimpleArithmeticExpression(); - - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - return new AST\AggregateExpression($functionName, $pathExp, $isDistinct); - } - - /** - * QuantifiedExpression ::= ("ALL" | "ANY" | "SOME") "(" Subselect ")" - * - * @return \Doctrine\ORM\Query\AST\QuantifiedExpression - */ - public function QuantifiedExpression() - { - $lookaheadType = $this->_lexer->lookahead['type']; - $value = $this->_lexer->lookahead['value']; - - if ( ! in_array($lookaheadType, array(Lexer::T_ALL, Lexer::T_ANY, Lexer::T_SOME))) { - $this->syntaxError('ALL, ANY or SOME'); - } - - $this->match($lookaheadType); - $this->match(Lexer::T_OPEN_PARENTHESIS); - - $qExpr = new AST\QuantifiedExpression($this->Subselect()); - $qExpr->type = $value; - - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - return $qExpr; - } - - /** - * BetweenExpression ::= ArithmeticExpression ["NOT"] "BETWEEN" ArithmeticExpression "AND" ArithmeticExpression - * - * @return \Doctrine\ORM\Query\AST\BetweenExpression - */ - public function BetweenExpression() - { - $not = false; - $arithExpr1 = $this->ArithmeticExpression(); - - if ($this->_lexer->isNextToken(Lexer::T_NOT)) { - $this->match(Lexer::T_NOT); - $not = true; - } - - $this->match(Lexer::T_BETWEEN); - $arithExpr2 = $this->ArithmeticExpression(); - $this->match(Lexer::T_AND); - $arithExpr3 = $this->ArithmeticExpression(); - - $betweenExpr = new AST\BetweenExpression($arithExpr1, $arithExpr2, $arithExpr3); - $betweenExpr->not = $not; - - return $betweenExpr; - } - - /** - * ComparisonExpression ::= ArithmeticExpression ComparisonOperator ( QuantifiedExpression | ArithmeticExpression ) - * - * @return \Doctrine\ORM\Query\AST\ComparisonExpression - */ - public function ComparisonExpression() - { - $this->_lexer->glimpse(); - - $leftExpr = $this->ArithmeticExpression(); - $operator = $this->ComparisonOperator(); - $rightExpr = ($this->_isNextAllAnySome()) - ? $this->QuantifiedExpression() - : $this->ArithmeticExpression(); - - return new AST\ComparisonExpression($leftExpr, $operator, $rightExpr); - } - - /** - * InExpression ::= SingleValuedPathExpression ["NOT"] "IN" "(" (InParameter {"," InParameter}* | Subselect) ")" - * - * @return \Doctrine\ORM\Query\AST\InExpression - */ - public function InExpression() - { - $inExpression = new AST\InExpression($this->ArithmeticExpression()); - - if ($this->_lexer->isNextToken(Lexer::T_NOT)) { - $this->match(Lexer::T_NOT); - $inExpression->not = true; - } - - $this->match(Lexer::T_IN); - $this->match(Lexer::T_OPEN_PARENTHESIS); - - if ($this->_lexer->isNextToken(Lexer::T_SELECT)) { - $inExpression->subselect = $this->Subselect(); - } else { - $literals = array(); - $literals[] = $this->InParameter(); - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - $literals[] = $this->InParameter(); - } - - $inExpression->literals = $literals; - } - - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - return $inExpression; - } - - /** - * InstanceOfExpression ::= IdentificationVariable ["NOT"] "INSTANCE" ["OF"] (InstanceOfParameter | "(" InstanceOfParameter {"," InstanceOfParameter}* ")") - * - * @return \Doctrine\ORM\Query\AST\InstanceOfExpression - */ - public function InstanceOfExpression() - { - $instanceOfExpression = new AST\InstanceOfExpression($this->IdentificationVariable()); - - if ($this->_lexer->isNextToken(Lexer::T_NOT)) { - $this->match(Lexer::T_NOT); - $instanceOfExpression->not = true; - } - - $this->match(Lexer::T_INSTANCE); - $this->match(Lexer::T_OF); - - $exprValues = array(); - - if ($this->_lexer->isNextToken(Lexer::T_OPEN_PARENTHESIS)) { - $this->match(Lexer::T_OPEN_PARENTHESIS); - - $exprValues[] = $this->InstanceOfParameter(); - - while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { - $this->match(Lexer::T_COMMA); - - $exprValues[] = $this->InstanceOfParameter(); - } - - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - $instanceOfExpression->value = $exprValues; - - return $instanceOfExpression; - } - - $exprValues[] = $this->InstanceOfParameter(); - - $instanceOfExpression->value = $exprValues; - - return $instanceOfExpression; - } - - /** - * InstanceOfParameter ::= AbstractSchemaName | InputParameter - * - * @return mixed - */ - public function InstanceOfParameter() - { - if ($this->_lexer->isNextToken(Lexer::T_INPUT_PARAMETER)) { - $this->match(Lexer::T_INPUT_PARAMETER); - - return new AST\InputParameter($this->_lexer->token['value']); - } - - return $this->AliasIdentificationVariable(); - } - - /** - * LikeExpression ::= StringExpression ["NOT"] "LIKE" StringPrimary ["ESCAPE" char] - * - * @return \Doctrine\ORM\Query\AST\LikeExpression - */ - public function LikeExpression() - { - $stringExpr = $this->StringExpression(); - $not = false; - - if ($this->_lexer->isNextToken(Lexer::T_NOT)) { - $this->match(Lexer::T_NOT); - $not = true; - } - - $this->match(Lexer::T_LIKE); - - if ($this->_lexer->isNextToken(Lexer::T_INPUT_PARAMETER)) { - $this->match(Lexer::T_INPUT_PARAMETER); - $stringPattern = new AST\InputParameter($this->_lexer->token['value']); - } else { - $stringPattern = $this->StringPrimary(); - } - - $escapeChar = null; - - if ($this->_lexer->lookahead['type'] === Lexer::T_ESCAPE) { - $this->match(Lexer::T_ESCAPE); - $this->match(Lexer::T_STRING); - - $escapeChar = new AST\Literal(AST\Literal::STRING, $this->_lexer->token['value']); - } - - $likeExpr = new AST\LikeExpression($stringExpr, $stringPattern, $escapeChar); - $likeExpr->not = $not; - - return $likeExpr; - } - - /** - * NullComparisonExpression ::= (SingleValuedPathExpression | InputParameter) "IS" ["NOT"] "NULL" - * - * @return \Doctrine\ORM\Query\AST\NullComparisonExpression - */ - public function NullComparisonExpression() - { - if ($this->_lexer->isNextToken(Lexer::T_INPUT_PARAMETER)) { - $this->match(Lexer::T_INPUT_PARAMETER); - $expr = new AST\InputParameter($this->_lexer->token['value']); - } else { - $expr = $this->SingleValuedPathExpression(); - } - - $nullCompExpr = new AST\NullComparisonExpression($expr); - $this->match(Lexer::T_IS); - - if ($this->_lexer->isNextToken(Lexer::T_NOT)) { - $this->match(Lexer::T_NOT); - $nullCompExpr->not = true; - } - - $this->match(Lexer::T_NULL); - - return $nullCompExpr; - } - - /** - * ExistsExpression ::= ["NOT"] "EXISTS" "(" Subselect ")" - * - * @return \Doctrine\ORM\Query\AST\ExistsExpression - */ - public function ExistsExpression() - { - $not = false; - - if ($this->_lexer->isNextToken(Lexer::T_NOT)) { - $this->match(Lexer::T_NOT); - $not = true; - } - - $this->match(Lexer::T_EXISTS); - $this->match(Lexer::T_OPEN_PARENTHESIS); - - $existsExpression = new AST\ExistsExpression($this->Subselect()); - $existsExpression->not = $not; - - $this->match(Lexer::T_CLOSE_PARENTHESIS); - - return $existsExpression; - } - - /** - * ComparisonOperator ::= "=" | "<" | "<=" | "<>" | ">" | ">=" | "!=" - * - * @return string - */ - public function ComparisonOperator() - { - switch ($this->_lexer->lookahead['value']) { - case '=': - $this->match(Lexer::T_EQUALS); - - return '='; - - case '<': - $this->match(Lexer::T_LOWER_THAN); - $operator = '<'; - - if ($this->_lexer->isNextToken(Lexer::T_EQUALS)) { - $this->match(Lexer::T_EQUALS); - $operator .= '='; - } else if ($this->_lexer->isNextToken(Lexer::T_GREATER_THAN)) { - $this->match(Lexer::T_GREATER_THAN); - $operator .= '>'; - } - - return $operator; - - case '>': - $this->match(Lexer::T_GREATER_THAN); - $operator = '>'; - - if ($this->_lexer->isNextToken(Lexer::T_EQUALS)) { - $this->match(Lexer::T_EQUALS); - $operator .= '='; - } - - return $operator; - - case '!': - $this->match(Lexer::T_NEGATE); - $this->match(Lexer::T_EQUALS); - - return '<>'; - - default: - $this->syntaxError('=, <, <=, <>, >, >=, !='); - } - } - - /** - * FunctionDeclaration ::= FunctionsReturningStrings | FunctionsReturningNumerics | FunctionsReturningDatetime - */ - public function FunctionDeclaration() - { - $token = $this->_lexer->lookahead; - $funcName = strtolower($token['value']); - - // Check for built-in functions first! - switch (true) { - case (isset(self::$_STRING_FUNCTIONS[$funcName])): - return $this->FunctionsReturningStrings(); - - case (isset(self::$_NUMERIC_FUNCTIONS[$funcName])): - return $this->FunctionsReturningNumerics(); - - case (isset(self::$_DATETIME_FUNCTIONS[$funcName])): - return $this->FunctionsReturningDatetime(); - - default: - return $this->CustomFunctionDeclaration(); - } - } - - /** - * Helper function for FunctionDeclaration grammar rule - */ - private function CustomFunctionDeclaration() - { - $token = $this->_lexer->lookahead; - $funcName = strtolower($token['value']); - - // Check for custom functions afterwards - $config = $this->_em->getConfiguration(); - - switch (true) { - case ($config->getCustomStringFunction($funcName) !== null): - return $this->CustomFunctionsReturningStrings(); - - case ($config->getCustomNumericFunction($funcName) !== null): - return $this->CustomFunctionsReturningNumerics(); - - case ($config->getCustomDatetimeFunction($funcName) !== null): - return $this->CustomFunctionsReturningDatetime(); - - default: - $this->syntaxError('known function', $token); - } - } - - /** - * FunctionsReturningNumerics ::= - * "LENGTH" "(" StringPrimary ")" | - * "LOCATE" "(" StringPrimary "," StringPrimary ["," SimpleArithmeticExpression]")" | - * "ABS" "(" SimpleArithmeticExpression ")" | - * "SQRT" "(" SimpleArithmeticExpression ")" | - * "MOD" "(" SimpleArithmeticExpression "," SimpleArithmeticExpression ")" | - * "SIZE" "(" CollectionValuedPathExpression ")" - */ - public function FunctionsReturningNumerics() - { - $funcNameLower = strtolower($this->_lexer->lookahead['value']); - $funcClass = self::$_NUMERIC_FUNCTIONS[$funcNameLower]; - - $function = new $funcClass($funcNameLower); - $function->parse($this); - - return $function; - } - - public function CustomFunctionsReturningNumerics() - { - // getCustomNumericFunction is case-insensitive - $funcName = strtolower($this->_lexer->lookahead['value']); - $funcClass = $this->_em->getConfiguration()->getCustomNumericFunction($funcName); - - $function = new $funcClass($funcName); - $function->parse($this); - - return $function; - } - - /** - * FunctionsReturningDateTime ::= "CURRENT_DATE" | "CURRENT_TIME" | "CURRENT_TIMESTAMP" - */ - public function FunctionsReturningDatetime() - { - $funcNameLower = strtolower($this->_lexer->lookahead['value']); - $funcClass = self::$_DATETIME_FUNCTIONS[$funcNameLower]; - - $function = new $funcClass($funcNameLower); - $function->parse($this); - - return $function; - } - - public function CustomFunctionsReturningDatetime() - { - // getCustomDatetimeFunction is case-insensitive - $funcName = $this->_lexer->lookahead['value']; - $funcClass = $this->_em->getConfiguration()->getCustomDatetimeFunction($funcName); - - $function = new $funcClass($funcName); - $function->parse($this); - - return $function; - } - - /** - * FunctionsReturningStrings ::= - * "CONCAT" "(" StringPrimary "," StringPrimary ")" | - * "SUBSTRING" "(" StringPrimary "," SimpleArithmeticExpression "," SimpleArithmeticExpression ")" | - * "TRIM" "(" [["LEADING" | "TRAILING" | "BOTH"] [char] "FROM"] StringPrimary ")" | - * "LOWER" "(" StringPrimary ")" | - * "UPPER" "(" StringPrimary ")" - */ - public function FunctionsReturningStrings() - { - $funcNameLower = strtolower($this->_lexer->lookahead['value']); - $funcClass = self::$_STRING_FUNCTIONS[$funcNameLower]; - - $function = new $funcClass($funcNameLower); - $function->parse($this); - - return $function; - } - - public function CustomFunctionsReturningStrings() - { - // getCustomStringFunction is case-insensitive - $funcName = $this->_lexer->lookahead['value']; - $funcClass = $this->_em->getConfiguration()->getCustomStringFunction($funcName); - - $function = new $funcClass($funcName); - $function->parse($this); - - return $function; - } -} diff --git a/framework/library/Doctrine/ORM/Query/ParserResult.php b/framework/library/Doctrine/ORM/Query/ParserResult.php deleted file mode 100644 index e068622..0000000 --- a/framework/library/Doctrine/ORM/Query/ParserResult.php +++ /dev/null @@ -1,138 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -/** - * Encapsulates the resulting components from a DQL query parsing process that - * can be serialized. - * - * @author Guilherme Blanco - * @author Janne Vanhala - * @author Roman Borschel - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link http://www.doctrine-project.org - * @since 2.0 - */ -class ParserResult -{ - /** - * The SQL executor used for executing the SQL. - * - * @var \Doctrine\ORM\Query\Exec\AbstractSqlExecutor - */ - private $_sqlExecutor; - - /** - * The ResultSetMapping that describes how to map the SQL result set. - * - * @var \Doctrine\ORM\Query\ResultSetMapping - */ - private $_resultSetMapping; - - /** - * The mappings of DQL parameter names/positions to SQL parameter positions. - * - * @var array - */ - private $_parameterMappings = array(); - - /** - * Initializes a new instance of the ParserResult class. - * The new instance is initialized with an empty ResultSetMapping. - */ - public function __construct() - { - $this->_resultSetMapping = new ResultSetMapping; - } - - /** - * Gets the ResultSetMapping for the parsed query. - * - * @return ResultSetMapping The result set mapping of the parsed query or NULL - * if the query is not a SELECT query. - */ - public function getResultSetMapping() - { - return $this->_resultSetMapping; - } - - /** - * Sets the ResultSetMapping of the parsed query. - * - * @param ResultSetMapping $rsm - */ - public function setResultSetMapping(ResultSetMapping $rsm) - { - $this->_resultSetMapping = $rsm; - } - - /** - * Sets the SQL executor that should be used for this ParserResult. - * - * @param \Doctrine\ORM\Query\Exec\AbstractSqlExecutor $executor - */ - public function setSqlExecutor($executor) - { - $this->_sqlExecutor = $executor; - } - - /** - * Gets the SQL executor used by this ParserResult. - * - * @return \Doctrine\ORM\Query\Exec\AbstractSqlExecutor - */ - public function getSqlExecutor() - { - return $this->_sqlExecutor; - } - - /** - * Adds a DQL to SQL parameter mapping. One DQL parameter name/position can map to - * several SQL parameter positions. - * - * @param string|integer $dqlPosition - * @param integer $sqlPosition - */ - public function addParameterMapping($dqlPosition, $sqlPosition) - { - $this->_parameterMappings[$dqlPosition][] = $sqlPosition; - } - - /** - * Gets all DQL to SQL parameter mappings. - * - * @return array The parameter mappings. - */ - public function getParameterMappings() - { - return $this->_parameterMappings; - } - - /** - * Gets the SQL parameter positions for a DQL parameter name/position. - * - * @param string|integer $dqlPosition The name or position of the DQL parameter. - * @return array The positions of the corresponding SQL parameters. - */ - public function getSqlParameterPositions($dqlPosition) - { - return $this->_parameterMappings[$dqlPosition]; - } -} diff --git a/framework/library/Doctrine/ORM/Query/Printer.php b/framework/library/Doctrine/ORM/Query/Printer.php deleted file mode 100644 index 83640c5..0000000 --- a/framework/library/Doctrine/ORM/Query/Printer.php +++ /dev/null @@ -1,92 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -/** - * A parse tree printer for Doctrine Query Language parser. - * - * @author Janne Vanhala - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link http://www.phpdoctrine.org - * @since 2.0 - */ -class Printer -{ - /** - * Current indentation level - * - * @var int - */ - protected $_indent = 0; - - /** - * Defines whether parse tree is printed (default, false) or not (true). - * - * @var bool - */ - protected $_silent; - - /** - * Constructs a new parse tree printer. - * - * @param bool $silent Parse tree will not be printed if true. - */ - public function __construct($silent = false) - { - $this->_silent = $silent; - } - - /** - * Prints an opening parenthesis followed by production name and increases - * indentation level by one. - * - * This method is called before executing a production. - * - * @param string $name production name - */ - public function startProduction($name) - { - $this->println('(' . $name); - $this->_indent++; - } - - /** - * Decreases indentation level by one and prints a closing parenthesis. - * - * This method is called after executing a production. - */ - public function endProduction() - { - $this->_indent--; - $this->println(')'); - } - - /** - * Prints text indented with spaces depending on current indentation level. - * - * @param string $str text - */ - public function println($str) - { - if ( ! $this->_silent) { - echo str_repeat(' ', $this->_indent), $str, "\n"; - } - } -} diff --git a/framework/library/Doctrine/ORM/Query/QueryException.php b/framework/library/Doctrine/ORM/Query/QueryException.php deleted file mode 100644 index 6a03c8c..0000000 --- a/framework/library/Doctrine/ORM/Query/QueryException.php +++ /dev/null @@ -1,156 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -use Doctrine\ORM\Query\AST\PathExpression; - -/** - * Description of QueryException - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class QueryException extends \Doctrine\ORM\ORMException -{ - public static function dqlError($dql) - { - return new self($dql); - } - - public static function syntaxError($message, $previous = null) - { - return new self('[Syntax Error] ' . $message, 0, $previous); - } - - public static function semanticalError($message, $previous = null) - { - return new self('[Semantical Error] ' . $message, 0, $previous); - } - - public static function invalidLockMode() - { - return new self('Invalid lock mode hint provided.'); - } - - public static function invalidParameterType($expected, $received) - { - return new self('Invalid parameter type, ' . $received . ' given, but ' . $expected . ' expected.'); - } - - public static function invalidParameterPosition($pos) - { - return new self('Invalid parameter position: ' . $pos); - } - - public static function invalidParameterNumber() - { - return new self("Invalid parameter number: number of bound variables does not match number of tokens"); - } - - public static function invalidParameterFormat($value) - { - return new self('Invalid parameter format, '.$value.' given, but : or ? expected.'); - } - - public static function unknownParameter($key) - { - return new self("Invalid parameter: token ".$key." is not defined in the query."); - } - - public static function parameterTypeMissmatch() - { - return new self("DQL Query parameter and type numbers missmatch, but have to be exactly equal."); - } - - public static function invalidPathExpression($pathExpr) - { - return new self( - "Invalid PathExpression '" . $pathExpr->identificationVariable . "." . $pathExpr->field . "'." - ); - } - - public static function invalidLiteral($literal) { - return new self("Invalid literal '$literal'"); - } - - /** - * @param array $assoc - */ - public static function iterateWithFetchJoinCollectionNotAllowed($assoc) - { - return new self( - "Invalid query operation: Not allowed to iterate over fetch join collections ". - "in class ".$assoc['sourceEntity']." assocation ".$assoc['fieldName'] - ); - } - - public static function partialObjectsAreDangerous() - { - return new self( - "Loading partial objects is dangerous. Fetch full objects or consider " . - "using a different fetch mode. If you really want partial objects, " . - "set the doctrine.forcePartialLoad query hint to TRUE." - ); - } - - public static function overwritingJoinConditionsNotYetSupported($assoc) - { - return new self( - "Unsupported query operation: It is not yet possible to overwrite the join ". - "conditions in class ".$assoc['sourceEntityName']." assocation ".$assoc['fieldName'].". ". - "Use WITH to append additional join conditions to the association." - ); - } - - public static function associationPathInverseSideNotSupported() - { - return new self( - "A single-valued association path expression to an inverse side is not supported". - " in DQL queries. Use an explicit join instead." - ); - } - - public static function iterateWithFetchJoinNotAllowed($assoc) { - return new self( - "Iterate with fetch join in class " . $assoc['sourceEntity'] . - " using association " . $assoc['fieldName'] . " not allowed." - ); - } - - public static function associationPathCompositeKeyNotSupported() - { - return new self( - "A single-valued association path expression to an entity with a composite primary ". - "key is not supported. Explicitly name the components of the composite primary key ". - "in the query." - ); - } - - public static function instanceOfUnrelatedClass($className, $rootClass) - { - return new self("Cannot check if a child of '" . $rootClass . "' is instanceof '" . $className . "', " . - "inheritance hierachy exists between these two classes."); - } -} diff --git a/framework/library/Doctrine/ORM/Query/ResultSetMapping.php b/framework/library/Doctrine/ORM/Query/ResultSetMapping.php deleted file mode 100644 index b8cbd32..0000000 --- a/framework/library/Doctrine/ORM/Query/ResultSetMapping.php +++ /dev/null @@ -1,485 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -/** - * A ResultSetMapping describes how a result set of an SQL query maps to a Doctrine result. - * - * IMPORTANT NOTE: - * The properties of this class are only public for fast internal READ access and to (drastically) - * reduce the size of serialized instances for more effective caching due to better (un-)serialization - * performance. - * - * Users should use the public methods. - * - * @author Roman Borschel - * @since 2.0 - * @todo Think about whether the number of lookup maps can be reduced. - */ -class ResultSetMapping -{ - /** - * @ignore - * @var boolean Whether the result is mixed (contains scalar values together with field values). - */ - public $isMixed = false; - - /** - * @ignore - * @var array Maps alias names to class names. - */ - public $aliasMap = array(); - - /** - * @ignore - * @var array Maps alias names to related association field names. - */ - public $relationMap = array(); - - /** - * @ignore - * @var array Maps alias names to parent alias names. - */ - public $parentAliasMap = array(); - - /** - * @ignore - * @var array Maps column names in the result set to field names for each class. - */ - public $fieldMappings = array(); - - /** - * @ignore - * @var array Maps column names in the result set to the alias/field name to use in the mapped result. - */ - public $scalarMappings = array(); - - /** - * @ignore - * @var array Maps column names in the result set to the alias/field type to use in the mapped result. - */ - public $typeMappings = array(); - - /** - * @ignore - * @var array Maps entities in the result set to the alias name to use in the mapped result. - */ - public $entityMappings = array(); - - /** - * @ignore - * @var array Maps column names of meta columns (foreign keys, discriminator columns, ...) to field names. - */ - public $metaMappings = array(); - - /** - * @ignore - * @var array Maps column names in the result set to the alias they belong to. - */ - public $columnOwnerMap = array(); - - /** - * @ignore - * @var array List of columns in the result set that are used as discriminator columns. - */ - public $discriminatorColumns = array(); - - /** - * @ignore - * @var array Maps alias names to field names that should be used for indexing. - */ - public $indexByMap = array(); - - /** - * @ignore - * @var array Map from column names to class names that declare the field the column is mapped to. - */ - public $declaringClasses = array(); - - /** - * @var array This is necessary to hydrate derivate foreign keys correctly. - */ - public $isIdentifierColumn = array(); - - /** - * Adds an entity result to this ResultSetMapping. - * - * @param string $class The class name of the entity. - * @param string $alias The alias for the class. The alias must be unique among all entity - * results or joined entity results within this ResultSetMapping. - * @param string $resultAlias The result alias with which the entity result should be - * placed in the result structure. - * @return ResultSetMapping This ResultSetMapping instance. - * @todo Rename: addRootEntity - */ - public function addEntityResult($class, $alias, $resultAlias = null) - { - $this->aliasMap[$alias] = $class; - $this->entityMappings[$alias] = $resultAlias; - - if ($resultAlias !== null) { - $this->isMixed = true; - } - - return $this; - } - - /** - * Sets a discriminator column for an entity result or joined entity result. - * The discriminator column will be used to determine the concrete class name to - * instantiate. - * - * @param string $alias The alias of the entity result or joined entity result the discriminator - * column should be used for. - * @param string $discrColumn The name of the discriminator column in the SQL result set. - * @return ResultSetMapping This ResultSetMapping instance. - * @todo Rename: addDiscriminatorColumn - */ - public function setDiscriminatorColumn($alias, $discrColumn) - { - $this->discriminatorColumns[$alias] = $discrColumn; - $this->columnOwnerMap[$discrColumn] = $alias; - - return $this; - } - - /** - * Sets a field to use for indexing an entity result or joined entity result. - * - * @param string $alias The alias of an entity result or joined entity result. - * @param string $fieldName The name of the field to use for indexing. - * @return ResultSetMapping This ResultSetMapping instance. - */ - public function addIndexBy($alias, $fieldName) - { - $found = false; - - foreach ($this->fieldMappings as $columnName => $columnFieldName) { - if ( ! ($columnFieldName === $fieldName && $this->columnOwnerMap[$columnName] === $alias)) continue; - - $this->addIndexByColumn($alias, $columnName); - $found = true; - - break; - } - - /* TODO: check if this exception can be put back, for now it's gone because of assumptions made by some ORM internals - if ( ! $found) { - $message = sprintf( - 'Cannot add index by for DQL alias %s and field %s without calling addFieldResult() for them before.', - $alias, - $fieldName - ); - - throw new \LogicException($message); - } - */ - - return $this; - } - - /** - * Set to index by a scalar result column name - * - * @param $resultColumnName - * @return ResultSetMapping This ResultSetMapping instance. - */ - public function addIndexByScalar($resultColumnName) - { - $this->indexByMap['scalars'] = $resultColumnName; - - return $this; - } - - /** - * Sets a column to use for indexing an entity or joined entity result by the given alias name. - * - * @param $alias - * @param $resultColumnName - * @return ResultSetMapping This ResultSetMapping instance. - */ - public function addIndexByColumn($alias, $resultColumnName) - { - $this->indexByMap[$alias] = $resultColumnName; - - return $this; - } - - /** - * Checks whether an entity result or joined entity result with a given alias has - * a field set for indexing. - * - * @param string $alias - * @return boolean - * @todo Rename: isIndexed($alias) - */ - public function hasIndexBy($alias) - { - return isset($this->indexByMap[$alias]); - } - - /** - * Checks whether the column with the given name is mapped as a field result - * as part of an entity result or joined entity result. - * - * @param string $columnName The name of the column in the SQL result set. - * @return boolean - * @todo Rename: isField - */ - public function isFieldResult($columnName) - { - return isset($this->fieldMappings[$columnName]); - } - - /** - * Adds a field to the result that belongs to an entity or joined entity. - * - * @param string $alias The alias of the root entity or joined entity to which the field belongs. - * @param string $columnName The name of the column in the SQL result set. - * @param string $fieldName The name of the field on the declaring class. - * @param string $declaringClass The name of the class that declares/owns the specified field. - * When $alias refers to a superclass in a mapped hierarchy but - * the field $fieldName is defined on a subclass, specify that here. - * If not specified, the field is assumed to belong to the class - * designated by $alias. - * @return ResultSetMapping This ResultSetMapping instance. - * @todo Rename: addField - */ - public function addFieldResult($alias, $columnName, $fieldName, $declaringClass = null) - { - // column name (in result set) => field name - $this->fieldMappings[$columnName] = $fieldName; - // column name => alias of owner - $this->columnOwnerMap[$columnName] = $alias; - // field name => class name of declaring class - $this->declaringClasses[$columnName] = $declaringClass ?: $this->aliasMap[$alias]; - - if ( ! $this->isMixed && $this->scalarMappings) { - $this->isMixed = true; - } - - return $this; - } - - /** - * Adds a joined entity result. - * - * @param string $class The class name of the joined entity. - * @param string $alias The unique alias to use for the joined entity. - * @param string $parentAlias The alias of the entity result that is the parent of this joined result. - * @param object $relation The association field that connects the parent entity result with the joined entity result. - * @return ResultSetMapping This ResultSetMapping instance. - * @todo Rename: addJoinedEntity - */ - public function addJoinedEntityResult($class, $alias, $parentAlias, $relation) - { - $this->aliasMap[$alias] = $class; - $this->parentAliasMap[$alias] = $parentAlias; - $this->relationMap[$alias] = $relation; - - return $this; - } - - /** - * Adds a scalar result mapping. - * - * @param string $columnName The name of the column in the SQL result set. - * @param string $alias The result alias with which the scalar result should be placed in the result structure. - * @param string $type The column type - * - * @return ResultSetMapping This ResultSetMapping instance. - * - * @todo Rename: addScalar - */ - public function addScalarResult($columnName, $alias, $type = 'string') - { - $this->scalarMappings[$columnName] = $alias; - $this->typeMappings[$columnName] = $type; - - if ( ! $this->isMixed && $this->fieldMappings) { - $this->isMixed = true; - } - - return $this; - } - - /** - * Checks whether a column with a given name is mapped as a scalar result. - * - * @param string $columName The name of the column in the SQL result set. - * @return boolean - * @todo Rename: isScalar - */ - public function isScalarResult($columnName) - { - return isset($this->scalarMappings[$columnName]); - } - - /** - * Gets the name of the class of an entity result or joined entity result, - * identified by the given unique alias. - * - * @param string $alias - * @return string - */ - public function getClassName($alias) - { - return $this->aliasMap[$alias]; - } - - /** - * Gets the field alias for a column that is mapped as a scalar value. - * - * @param string $columnName The name of the column in the SQL result set. - * @return string - */ - public function getScalarAlias($columnName) - { - return $this->scalarMappings[$columnName]; - } - - /** - * Gets the name of the class that owns a field mapping for the specified column. - * - * @param string $columnName - * @return string - */ - public function getDeclaringClass($columnName) - { - return $this->declaringClasses[$columnName]; - } - - /** - * - * @param string $alias - * @return AssociationMapping - */ - public function getRelation($alias) - { - return $this->relationMap[$alias]; - } - - /** - * - * @param string $alias - * @return boolean - */ - public function isRelation($alias) - { - return isset($this->relationMap[$alias]); - } - - /** - * Gets the alias of the class that owns a field mapping for the specified column. - * - * @param string $columnName - * @return string - */ - public function getEntityAlias($columnName) - { - return $this->columnOwnerMap[$columnName]; - } - - /** - * Gets the parent alias of the given alias. - * - * @param string $alias - * @return string - */ - public function getParentAlias($alias) - { - return $this->parentAliasMap[$alias]; - } - - /** - * Checks whether the given alias has a parent alias. - * - * @param string $alias - * @return boolean - */ - public function hasParentAlias($alias) - { - return isset($this->parentAliasMap[$alias]); - } - - /** - * Gets the field name for a column name. - * - * @param string $columnName - * @return string - */ - public function getFieldName($columnName) - { - return $this->fieldMappings[$columnName]; - } - - /** - * - * @return array - */ - public function getAliasMap() - { - return $this->aliasMap; - } - - /** - * Gets the number of different entities that appear in the mapped result. - * - * @return integer - */ - public function getEntityResultCount() - { - return count($this->aliasMap); - } - - /** - * Checks whether this ResultSetMapping defines a mixed result. - * Mixed results can only occur in object and array (graph) hydration. In such a - * case a mixed result means that scalar values are mixed with objects/array in - * the result. - * - * @return boolean - */ - public function isMixedResult() - { - return $this->isMixed; - } - - /** - * Adds a meta column (foreign key or discriminator column) to the result set. - * - * @param string $alias - * @param string $columnName - * @param string $fieldName - * @param bool - * @return ResultSetMapping This ResultSetMapping instance. - */ - public function addMetaResult($alias, $columnName, $fieldName, $isIdentifierColumn = false) - { - $this->metaMappings[$columnName] = $fieldName; - $this->columnOwnerMap[$columnName] = $alias; - - if ($isIdentifierColumn) { - $this->isIdentifierColumn[$alias][$columnName] = true; - } - - return $this; - } -} diff --git a/framework/library/Doctrine/ORM/Query/ResultSetMappingBuilder.php b/framework/library/Doctrine/ORM/Query/ResultSetMappingBuilder.php deleted file mode 100644 index 8e31bcf..0000000 --- a/framework/library/Doctrine/ORM/Query/ResultSetMappingBuilder.php +++ /dev/null @@ -1,264 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -use Doctrine\ORM\EntityManager; -use Doctrine\ORM\Mapping\ClassMetadataInfo; - -/** - * A ResultSetMappingBuilder uses the EntityManager to automatically populate entity fields - * - * @author Michael Ridgway - * @since 2.1 - */ -class ResultSetMappingBuilder extends ResultSetMapping -{ - /** - * @var EntityManager - */ - private $em; - - /** - * @param EntityManager - */ - public function __construct(EntityManager $em) - { - $this->em = $em; - } - - /** - * Adds a root entity and all of its fields to the result set. - * - * @param string $class The class name of the root entity. - * @param string $alias The unique alias to use for the root entity. - * @param array $renamedColumns Columns that have been renamed (tableColumnName => queryColumnName) - */ - public function addRootEntityFromClassMetadata($class, $alias, $renamedColumns = array()) - { - $this->addEntityResult($class, $alias); - $this->addAllClassFields($class, $alias, $renamedColumns); - } - - /** - * Adds a joined entity and all of its fields to the result set. - * - * @param string $class The class name of the joined entity. - * @param string $alias The unique alias to use for the joined entity. - * @param string $parentAlias The alias of the entity result that is the parent of this joined result. - * @param object $relation The association field that connects the parent entity result with the joined entity result. - * @param array $renamedColumns Columns that have been renamed (tableColumnName => queryColumnName) - */ - public function addJoinedEntityFromClassMetadata($class, $alias, $parentAlias, $relation, $renamedColumns = array()) - { - $this->addJoinedEntityResult($class, $alias, $parentAlias, $relation); - $this->addAllClassFields($class, $alias, $renamedColumns); - } - - /** - * Adds all fields of the given class to the result set mapping (columns and meta fields) - */ - protected function addAllClassFields($class, $alias, $renamedColumns = array()) - { - $classMetadata = $this->em->getClassMetadata($class); - if ($classMetadata->isInheritanceTypeSingleTable() || $classMetadata->isInheritanceTypeJoined()) { - throw new \InvalidArgumentException('ResultSetMapping builder does not currently support inheritance.'); - } - $platform = $this->em->getConnection()->getDatabasePlatform(); - foreach ($classMetadata->getColumnNames() as $columnName) { - $propertyName = $classMetadata->getFieldName($columnName); - if (isset($renamedColumns[$columnName])) { - $columnName = $renamedColumns[$columnName]; - } - $columnName = $platform->getSQLResultCasing($columnName); - if (isset($this->fieldMappings[$columnName])) { - throw new \InvalidArgumentException("The column '$columnName' conflicts with another column in the mapper."); - } - $this->addFieldResult($alias, $columnName, $propertyName); - } - foreach ($classMetadata->associationMappings as $associationMapping) { - if ($associationMapping['isOwningSide'] && $associationMapping['type'] & ClassMetadataInfo::TO_ONE) { - foreach ($associationMapping['joinColumns'] as $joinColumn) { - $columnName = $joinColumn['name']; - $renamedColumnName = isset($renamedColumns[$columnName]) ? $renamedColumns[$columnName] : $columnName; - $renamedColumnName = $platform->getSQLResultCasing($renamedColumnName); - if (isset($this->metaMappings[$renamedColumnName])) { - throw new \InvalidArgumentException("The column '$renamedColumnName' conflicts with another column in the mapper."); - } - $this->addMetaResult($alias, $renamedColumnName, $columnName); - } - } - } - } - - - /** - * Adds the mappings of the results of native SQL queries to the result set. - * - * @param ClassMetadataInfo $class - * @param array $queryMapping - * @return ResultSetMappingBuilder - */ - public function addNamedNativeQueryMapping(ClassMetadataInfo $class, array $queryMapping) - { - if (isset($queryMapping['resultClass'])) { - return $this->addNamedNativeQueryResultClassMapping($class, $queryMapping['resultClass']); - } - - return $this->addNamedNativeQueryResultSetMapping($class, $queryMapping['resultSetMapping']); - } - - /** - * Adds the class mapping of the results of native SQL queries to the result set. - * - * @param ClassMetadataInfo $class - * @param string $resultClassName - * @return ResultSetMappingBuilder - */ - public function addNamedNativeQueryResultClassMapping(ClassMetadataInfo $class, $resultClassName) - { - - $classMetadata = $this->em->getClassMetadata($resultClassName); - $shortName = $classMetadata->reflClass->getShortName(); - $alias = strtolower($shortName[0]).'0'; - - $this->addEntityResult($class->name, $alias); - - if ($classMetadata->discriminatorColumn) { - $discriminatorColumn = $classMetadata->discriminatorColumn; - $this->setDiscriminatorColumn($alias, $discriminatorColumn['name']); - $this->addMetaResult($alias, $discriminatorColumn['name'], $discriminatorColumn['fieldName']); - } - - foreach ($classMetadata->getColumnNames() as $key => $columnName) { - $propertyName = $classMetadata->getFieldName($columnName); - $this->addFieldResult($alias, $columnName, $propertyName); - } - - foreach ($classMetadata->associationMappings as $associationMapping) { - if ($associationMapping['isOwningSide'] && $associationMapping['type'] & ClassMetadataInfo::TO_ONE) { - foreach ($associationMapping['joinColumns'] as $joinColumn) { - $columnName = $joinColumn['name']; - $this->addMetaResult($alias, $columnName, $columnName, $classMetadata->isIdentifier($columnName)); - } - } - } - - return $this; - } - - /** - * Adds the result set mapping of the results of native SQL queries to the result set. - * - * @param ClassMetadataInfo $class - * @param string $resultSetMappingName - * @return ResultSetMappingBuilder - */ - public function addNamedNativeQueryResultSetMapping(ClassMetadataInfo $class, $resultSetMappingName) - { - $counter = 0; - $resultMapping = $class->getSqlResultSetMapping($resultSetMappingName); - $rooShortName = $class->reflClass->getShortName(); - $rootAlias = strtolower($rooShortName[0]) . $counter; - - - if (isset($resultMapping['entities'])) { - foreach ($resultMapping['entities'] as $key => $entityMapping) { - $classMetadata = $this->em->getClassMetadata($entityMapping['entityClass']); - - if ($class->reflClass->name == $classMetadata->reflClass->name) { - $this->addEntityResult($classMetadata->name, $rootAlias); - $this->addNamedNativeQueryEntityResultMapping($classMetadata, $entityMapping, $rootAlias); - } else { - $shortName = $classMetadata->reflClass->getShortName(); - $joinAlias = strtolower($shortName[0]) . ++ $counter; - $associations = $class->getAssociationsByTargetClass($classMetadata->name); - - foreach ($associations as $relation => $mapping) { - $this->addJoinedEntityResult($mapping['targetEntity'], $joinAlias, $rootAlias, $relation); - $this->addNamedNativeQueryEntityResultMapping($classMetadata, $entityMapping, $joinAlias); - } - } - - } - } - - if (isset($resultMapping['columns'])) { - foreach ($resultMapping['columns'] as $entityMapping) { - $this->addScalarResult($entityMapping['name'], $entityMapping['name']); - } - } - - return $this; - } - - /** - * Adds the entity result mapping of the results of native SQL queries to the result set. - * - * @param ClassMetadataInfo $classMetadata - * @param array $entityMapping - * @param string $alias - * @return ResultSetMappingBuilder - */ - public function addNamedNativeQueryEntityResultMapping(ClassMetadataInfo $classMetadata, array $entityMapping, $alias) - { - if (isset($entityMapping['discriminatorColumn']) && $entityMapping['discriminatorColumn']) { - $discriminatorColumn = $entityMapping['discriminatorColumn']; - $this->setDiscriminatorColumn($alias, $discriminatorColumn); - $this->addMetaResult($alias, $discriminatorColumn, $discriminatorColumn); - } - - if (isset($entityMapping['fields']) && !empty($entityMapping['fields'])) { - foreach ($entityMapping['fields'] as $field) { - $fieldName = $field['name']; - $relation = null; - - if(strpos($fieldName, '.')){ - list($relation, $fieldName) = explode('.', $fieldName); - } - - if (isset($classMetadata->associationMappings[$relation])) { - if($relation) { - $associationMapping = $classMetadata->associationMappings[$relation]; - $joinAlias = $alias.$relation; - $parentAlias = $alias; - - $this->addJoinedEntityResult($associationMapping['targetEntity'], $joinAlias, $parentAlias, $relation); - $this->addFieldResult($joinAlias, $field['column'], $fieldName); - }else { - $this->addFieldResult($alias, $field['column'], $fieldName, $classMetadata->name); - } - } else { - if(!isset($classMetadata->fieldMappings[$fieldName])) { - throw new \InvalidArgumentException("Entity '".$classMetadata->name."' has no field '".$fieldName."'. "); - } - $this->addFieldResult($alias, $field['column'], $fieldName, $classMetadata->name); - } - } - - } else { - foreach ($classMetadata->getColumnNames() as $columnName) { - $propertyName = $classMetadata->getFieldName($columnName); - $this->addFieldResult($alias, $columnName, $propertyName); - } - } - - return $this; - } -} diff --git a/framework/library/Doctrine/ORM/Query/SqlWalker.php b/framework/library/Doctrine/ORM/Query/SqlWalker.php deleted file mode 100644 index 6fb3abb..0000000 --- a/framework/library/Doctrine/ORM/Query/SqlWalker.php +++ /dev/null @@ -1,2211 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -use Doctrine\DBAL\LockMode, - Doctrine\DBAL\Types\Type, - Doctrine\ORM\Mapping\ClassMetadata, - Doctrine\ORM\Query, - Doctrine\ORM\Query\QueryException, - Doctrine\ORM\Mapping\ClassMetadataInfo; - -/** - * The SqlWalker is a TreeWalker that walks over a DQL AST and constructs - * the corresponding SQL. - * - * @author Guilherme Blanco - * @author Roman Borschel - * @author Benjamin Eberlei - * @author Alexander - * @since 2.0 - * @todo Rename: SQLWalker - */ -class SqlWalker implements TreeWalker -{ - /** - * @var string - */ - const HINT_DISTINCT = 'doctrine.distinct'; - - /** - * @var ResultSetMapping - */ - private $rsm; - - /** - * Counters for generating unique column aliases. - * - * @var integer - */ - private $aliasCounter = 0; - - /** - * Counters for generating unique table aliases. - * - * @var integer - */ - private $tableAliasCounter = 0; - - /** - * Counters for generating unique scalar result. - * - * @var integer - */ - private $scalarResultCounter = 1; - - /** - * Counters for generating unique parameter indexes. - * - * @var integer - */ - private $sqlParamIndex = 0; - - /** - * @var ParserResult - */ - private $parserResult; - - /** - * @var EntityManager - */ - private $em; - - /** - * @var \Doctrine\DBAL\Connection - */ - private $conn; - - /** - * @var AbstractQuery - */ - private $query; - - /** - * @var array - */ - private $tableAliasMap = array(); - - /** - * Map from result variable names to their SQL column alias names. - * - * @var array - */ - private $scalarResultAliasMap = array(); - - /** - * Map from DQL-Alias + Field-Name to SQL Column Alias - * - * @var array - */ - private $scalarFields = array(); - - /** - * Map of all components/classes that appear in the DQL query. - * - * @var array - */ - private $queryComponents; - - /** - * A list of classes that appear in non-scalar SelectExpressions. - * - * @var array - */ - private $selectedClasses = array(); - - /** - * The DQL alias of the root class of the currently traversed query. - * - * @var array - */ - private $rootAliases = array(); - - /** - * Flag that indicates whether to generate SQL table aliases in the SQL. - * These should only be generated for SELECT queries, not for UPDATE/DELETE. - * - * @var boolean - */ - private $useSqlTableAliases = true; - - /** - * The database platform abstraction. - * - * @var AbstractPlatform - */ - private $platform; - - /** - * The quote strategy. - * - * @var \Doctrine\ORM\Mapping\QuoteStrategy - */ - private $quoteStrategy; - - /** - * {@inheritDoc} - */ - public function __construct($query, $parserResult, array $queryComponents) - { - $this->query = $query; - $this->parserResult = $parserResult; - $this->queryComponents = $queryComponents; - $this->rsm = $parserResult->getResultSetMapping(); - $this->em = $query->getEntityManager(); - $this->conn = $this->em->getConnection(); - $this->platform = $this->conn->getDatabasePlatform(); - $this->quoteStrategy = $this->em->getConfiguration()->getQuoteStrategy(); - } - - /** - * Gets the Query instance used by the walker. - * - * @return Query. - */ - public function getQuery() - { - return $this->query; - } - - /** - * Gets the Connection used by the walker. - * - * @return Connection - */ - public function getConnection() - { - return $this->conn; - } - - /** - * Gets the EntityManager used by the walker. - * - * @return EntityManager - */ - public function getEntityManager() - { - return $this->em; - } - - /** - * Gets the information about a single query component. - * - * @param string $dqlAlias The DQL alias. - * @return array - */ - public function getQueryComponent($dqlAlias) - { - return $this->queryComponents[$dqlAlias]; - } - - /** - * Gets an executor that can be used to execute the result of this walker. - * - * @return AbstractExecutor - */ - public function getExecutor($AST) - { - switch (true) { - case ($AST instanceof AST\DeleteStatement): - $primaryClass = $this->em->getClassMetadata($AST->deleteClause->abstractSchemaName); - - return ($primaryClass->isInheritanceTypeJoined()) - ? new Exec\MultiTableDeleteExecutor($AST, $this) - : new Exec\SingleTableDeleteUpdateExecutor($AST, $this); - - case ($AST instanceof AST\UpdateStatement): - $primaryClass = $this->em->getClassMetadata($AST->updateClause->abstractSchemaName); - - return ($primaryClass->isInheritanceTypeJoined()) - ? new Exec\MultiTableUpdateExecutor($AST, $this) - : new Exec\SingleTableDeleteUpdateExecutor($AST, $this); - - default: - return new Exec\SingleSelectExecutor($AST, $this); - } - } - - /** - * Generates a unique, short SQL table alias. - * - * @param string $tableName Table name - * @param string $dqlAlias The DQL alias. - * @return string Generated table alias. - */ - public function getSQLTableAlias($tableName, $dqlAlias = '') - { - $tableName .= ($dqlAlias) ? '@[' . $dqlAlias . ']' : ''; - - if ( ! isset($this->tableAliasMap[$tableName])) { - $this->tableAliasMap[$tableName] = strtolower(substr($tableName, 0, 1)) . $this->tableAliasCounter++ . '_'; - } - - return $this->tableAliasMap[$tableName]; - } - - /** - * Forces the SqlWalker to use a specific alias for a table name, rather than - * generating an alias on its own. - * - * @param string $tableName - * @param string $alias - * @param string $dqlAlias - * @return string - */ - public function setSQLTableAlias($tableName, $alias, $dqlAlias = '') - { - $tableName .= ($dqlAlias) ? '@[' . $dqlAlias . ']' : ''; - - $this->tableAliasMap[$tableName] = $alias; - - return $alias; - } - - /** - * Gets an SQL column alias for a column name. - * - * @param string $columnName - * @return string - */ - public function getSQLColumnAlias($columnName) - { - return $this->quoteStrategy->getColumnAlias($columnName, $this->aliasCounter++, $this->platform); - } - - /** - * Generates the SQL JOINs that are necessary for Class Table Inheritance - * for the given class. - * - * @param ClassMetadata $class The class for which to generate the joins. - * @param string $dqlAlias The DQL alias of the class. - * @return string The SQL. - */ - private function _generateClassTableInheritanceJoins($class, $dqlAlias) - { - $sql = ''; - - $baseTableAlias = $this->getSQLTableAlias($class->getTableName(), $dqlAlias); - - // INNER JOIN parent class tables - foreach ($class->parentClasses as $parentClassName) { - $parentClass = $this->em->getClassMetadata($parentClassName); - $tableAlias = $this->getSQLTableAlias($parentClass->getTableName(), $dqlAlias); - - // If this is a joined association we must use left joins to preserve the correct result. - $sql .= isset($this->queryComponents[$dqlAlias]['relation']) ? ' LEFT ' : ' INNER '; - $sql .= 'JOIN ' . $this->quoteStrategy->getTableName($parentClass, $this->platform) . ' ' . $tableAlias . ' ON '; - - $sqlParts = array(); - - foreach ($this->quoteStrategy->getIdentifierColumnNames($class, $this->platform) as $columnName) { - $sqlParts[] = $baseTableAlias . '.' . $columnName . ' = ' . $tableAlias . '.' . $columnName; - } - - // Add filters on the root class - if ($filterSql = $this->generateFilterConditionSQL($parentClass, $tableAlias)) { - $sqlParts[] = $filterSql; - } - - $sql .= implode(' AND ', $sqlParts); - } - - // Ignore subclassing inclusion if partial objects is disallowed - if ($this->query->getHint(Query::HINT_FORCE_PARTIAL_LOAD)) { - return $sql; - } - - // LEFT JOIN child class tables - foreach ($class->subClasses as $subClassName) { - $subClass = $this->em->getClassMetadata($subClassName); - $tableAlias = $this->getSQLTableAlias($subClass->getTableName(), $dqlAlias); - - $sql .= ' LEFT JOIN ' . $this->quoteStrategy->getTableName($subClass, $this->platform) . ' ' . $tableAlias . ' ON '; - - $sqlParts = array(); - - foreach ($this->quoteStrategy->getIdentifierColumnNames($subClass, $this->platform) as $columnName) { - $sqlParts[] = $baseTableAlias . '.' . $columnName . ' = ' . $tableAlias . '.' . $columnName; - } - - $sql .= implode(' AND ', $sqlParts); - } - - return $sql; - } - - private function _generateOrderedCollectionOrderByItems() - { - $sqlParts = array(); - - foreach ($this->selectedClasses as $selectedClass) { - $dqlAlias = $selectedClass['dqlAlias']; - $qComp = $this->queryComponents[$dqlAlias]; - - if ( ! isset($qComp['relation']['orderBy'])) continue; - - foreach ($qComp['relation']['orderBy'] as $fieldName => $orientation) { - $columnName = $this->quoteStrategy->getColumnName($fieldName, $qComp['metadata'], $this->platform); - $tableName = ($qComp['metadata']->isInheritanceTypeJoined()) - ? $this->em->getUnitOfWork()->getEntityPersister($qComp['metadata']->name)->getOwningTable($fieldName) - : $qComp['metadata']->getTableName(); - - $sqlParts[] = $this->getSQLTableAlias($tableName, $dqlAlias) . '.' . $columnName . ' ' . $orientation; - } - } - - return implode(', ', $sqlParts); - } - - /** - * Generates a discriminator column SQL condition for the class with the given DQL alias. - * - * @param array $dqlAliases List of root DQL aliases to inspect for discriminator restrictions. - * @return string - */ - private function _generateDiscriminatorColumnConditionSQL(array $dqlAliases) - { - $sqlParts = array(); - - foreach ($dqlAliases as $dqlAlias) { - $class = $this->queryComponents[$dqlAlias]['metadata']; - - if ( ! $class->isInheritanceTypeSingleTable()) continue; - - $conn = $this->em->getConnection(); - $values = array(); - - if ($class->discriminatorValue !== null) { // discrimnators can be 0 - $values[] = $conn->quote($class->discriminatorValue); - } - - foreach ($class->subClasses as $subclassName) { - $values[] = $conn->quote($this->em->getClassMetadata($subclassName)->discriminatorValue); - } - - $sqlParts[] = (($this->useSqlTableAliases) ? $this->getSQLTableAlias($class->getTableName(), $dqlAlias) . '.' : '') - . $class->discriminatorColumn['name'] . ' IN (' . implode(', ', $values) . ')'; - } - - $sql = implode(' AND ', $sqlParts); - - return (count($sqlParts) > 1) ? '(' . $sql . ')' : $sql; - } - - /** - * Generates the filter SQL for a given entity and table alias. - * - * @param ClassMetadata $targetEntity Metadata of the target entity. - * @param string $targetTableAlias The table alias of the joined/selected table. - * - * @return string The SQL query part to add to a query. - */ - private function generateFilterConditionSQL(ClassMetadata $targetEntity, $targetTableAlias) - { - if (!$this->em->hasFilters()) { - return ''; - } - - switch($targetEntity->inheritanceType) { - case ClassMetadata::INHERITANCE_TYPE_NONE: - break; - case ClassMetadata::INHERITANCE_TYPE_JOINED: - // The classes in the inheritance will be added to the query one by one, - // but only the root node is getting filtered - if ($targetEntity->name !== $targetEntity->rootEntityName) { - return ''; - } - break; - case ClassMetadata::INHERITANCE_TYPE_SINGLE_TABLE: - // With STI the table will only be queried once, make sure that the filters - // are added to the root entity - $targetEntity = $this->em->getClassMetadata($targetEntity->rootEntityName); - break; - default: - //@todo: throw exception? - return ''; - break; - } - - $filterClauses = array(); - foreach ($this->em->getFilters()->getEnabledFilters() as $filter) { - if ('' !== $filterExpr = $filter->addFilterConstraint($targetEntity, $targetTableAlias)) { - $filterClauses[] = '(' . $filterExpr . ')'; - } - } - - return implode(' AND ', $filterClauses); - } - /** - * Walks down a SelectStatement AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - public function walkSelectStatement(AST\SelectStatement $AST) - { - $sql = $this->walkSelectClause($AST->selectClause); - $sql .= $this->walkFromClause($AST->fromClause); - $sql .= $this->walkWhereClause($AST->whereClause); - $sql .= $AST->groupByClause ? $this->walkGroupByClause($AST->groupByClause) : ''; - $sql .= $AST->havingClause ? $this->walkHavingClause($AST->havingClause) : ''; - - if (($orderByClause = $AST->orderByClause) !== null) { - $sql .= $AST->orderByClause ? $this->walkOrderByClause($AST->orderByClause) : ''; - } else if (($orderBySql = $this->_generateOrderedCollectionOrderByItems()) !== '') { - $sql .= ' ORDER BY ' . $orderBySql; - } - - $sql = $this->platform->modifyLimitQuery( - $sql, $this->query->getMaxResults(), $this->query->getFirstResult() - ); - - if (($lockMode = $this->query->getHint(Query::HINT_LOCK_MODE)) !== false) { - switch ($lockMode) { - case LockMode::PESSIMISTIC_READ: - $sql .= ' ' . $this->platform->getReadLockSQL(); - break; - - case LockMode::PESSIMISTIC_WRITE: - $sql .= ' ' . $this->platform->getWriteLockSQL(); - break; - - case LockMode::OPTIMISTIC: - foreach ($this->selectedClasses as $selectedClass) { - if ( ! $selectedClass['class']->isVersioned) { - throw \Doctrine\ORM\OptimisticLockException::lockFailed($selectedClass['class']->name); - } - } - break; - case LockMode::NONE: - break; - - default: - throw \Doctrine\ORM\Query\QueryException::invalidLockMode(); - } - } - - return $sql; - } - - /** - * Walks down an UpdateStatement AST node, thereby generating the appropriate SQL. - * - * @param UpdateStatement - * @return string The SQL. - */ - public function walkUpdateStatement(AST\UpdateStatement $AST) - { - $this->useSqlTableAliases = false; - - return $this->walkUpdateClause($AST->updateClause) - . $this->walkWhereClause($AST->whereClause); - } - - /** - * Walks down a DeleteStatement AST node, thereby generating the appropriate SQL. - * - * @param DeleteStatement - * @return string The SQL. - */ - public function walkDeleteStatement(AST\DeleteStatement $AST) - { - $this->useSqlTableAliases = false; - - return $this->walkDeleteClause($AST->deleteClause) - . $this->walkWhereClause($AST->whereClause); - } - - /** - * Walks down an IdentificationVariable AST node, thereby generating the appropriate SQL. - * This one differs of ->walkIdentificationVariable() because it generates the entity identifiers. - * - * @param string $identVariable - * @return string - */ - public function walkEntityIdentificationVariable($identVariable) - { - $class = $this->queryComponents[$identVariable]['metadata']; - $tableAlias = $this->getSQLTableAlias($class->getTableName(), $identVariable); - $sqlParts = array(); - - foreach ($this->quoteStrategy->getIdentifierColumnNames($class, $this->platform) as $columnName) { - $sqlParts[] = $tableAlias . '.' . $columnName; - } - - return implode(', ', $sqlParts); - } - - /** - * Walks down an IdentificationVariable (no AST node associated), thereby generating the SQL. - * - * @param string $identificationVariable - * @param string $fieldName - * @return string The SQL. - */ - public function walkIdentificationVariable($identificationVariable, $fieldName = null) - { - $class = $this->queryComponents[$identificationVariable]['metadata']; - - if ( - $fieldName !== null && $class->isInheritanceTypeJoined() && - isset($class->fieldMappings[$fieldName]['inherited']) - ) { - $class = $this->em->getClassMetadata($class->fieldMappings[$fieldName]['inherited']); - } - - return $this->getSQLTableAlias($class->getTableName(), $identificationVariable); - } - - /** - * Walks down a PathExpression AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkPathExpression($pathExpr) - { - $sql = ''; - - switch ($pathExpr->type) { - case AST\PathExpression::TYPE_STATE_FIELD: - $fieldName = $pathExpr->field; - $dqlAlias = $pathExpr->identificationVariable; - $class = $this->queryComponents[$dqlAlias]['metadata']; - - if ($this->useSqlTableAliases) { - $sql .= $this->walkIdentificationVariable($dqlAlias, $fieldName) . '.'; - } - - $sql .= $this->quoteStrategy->getColumnName($fieldName, $class, $this->platform); - break; - - case AST\PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION: - // 1- the owning side: - // Just use the foreign key, i.e. u.group_id - $fieldName = $pathExpr->field; - $dqlAlias = $pathExpr->identificationVariable; - $class = $this->queryComponents[$dqlAlias]['metadata']; - - if (isset($class->associationMappings[$fieldName]['inherited'])) { - $class = $this->em->getClassMetadata($class->associationMappings[$fieldName]['inherited']); - } - - $assoc = $class->associationMappings[$fieldName]; - - if ( ! $assoc['isOwningSide']) { - throw QueryException::associationPathInverseSideNotSupported(); - } - - // COMPOSITE KEYS NOT (YET?) SUPPORTED - if (count($assoc['sourceToTargetKeyColumns']) > 1) { - throw QueryException::associationPathCompositeKeyNotSupported(); - } - - if ($this->useSqlTableAliases) { - $sql .= $this->getSQLTableAlias($class->getTableName(), $dqlAlias) . '.'; - } - - $sql .= reset($assoc['targetToSourceKeyColumns']); - break; - - default: - throw QueryException::invalidPathExpression($pathExpr); - } - - return $sql; - } - - /** - * Walks down a SelectClause AST node, thereby generating the appropriate SQL. - * - * @param $selectClause - * @return string The SQL. - */ - public function walkSelectClause($selectClause) - { - $sql = 'SELECT ' . (($selectClause->isDistinct) ? 'DISTINCT ' : ''); - $sqlSelectExpressions = array_filter(array_map(array($this, 'walkSelectExpression'), $selectClause->selectExpressions)); - - if ($this->query->getHint(Query::HINT_INTERNAL_ITERATION) == true && $selectClause->isDistinct) { - $this->query->setHint(self::HINT_DISTINCT, true); - } - - $addMetaColumns = ! $this->query->getHint(Query::HINT_FORCE_PARTIAL_LOAD) && - $this->query->getHydrationMode() == Query::HYDRATE_OBJECT - || - $this->query->getHydrationMode() != Query::HYDRATE_OBJECT && - $this->query->getHint(Query::HINT_INCLUDE_META_COLUMNS); - - foreach ($this->selectedClasses as $selectedClass) { - $class = $selectedClass['class']; - $dqlAlias = $selectedClass['dqlAlias']; - $resultAlias = $selectedClass['resultAlias']; - - // Register as entity or joined entity result - if ($this->queryComponents[$dqlAlias]['relation'] === null) { - $this->rsm->addEntityResult($class->name, $dqlAlias, $resultAlias); - } else { - $this->rsm->addJoinedEntityResult( - $class->name, - $dqlAlias, - $this->queryComponents[$dqlAlias]['parent'], - $this->queryComponents[$dqlAlias]['relation']['fieldName'] - ); - } - - if ($class->isInheritanceTypeSingleTable() || $class->isInheritanceTypeJoined()) { - // Add discriminator columns to SQL - $rootClass = $this->em->getClassMetadata($class->rootEntityName); - $tblAlias = $this->getSQLTableAlias($rootClass->getTableName(), $dqlAlias); - $discrColumn = $rootClass->discriminatorColumn; - $columnAlias = $this->getSQLColumnAlias($discrColumn['name']); - - $sqlSelectExpressions[] = $tblAlias . '.' . $discrColumn['name'] . ' AS ' . $columnAlias; - - $this->rsm->setDiscriminatorColumn($dqlAlias, $columnAlias); - $this->rsm->addMetaResult($dqlAlias, $columnAlias, $discrColumn['fieldName']); - } - - // Add foreign key columns to SQL, if necessary - if ( ! $addMetaColumns && ! $class->containsForeignIdentifier) { - continue; - } - - // Add foreign key columns of class and also parent classes - foreach ($class->associationMappings as $assoc) { - if ( ! ($assoc['isOwningSide'] && $assoc['type'] & ClassMetadata::TO_ONE)) { - continue; - } else if ( !$addMetaColumns && !isset($assoc['id'])) { - continue; - } - - $owningClass = (isset($assoc['inherited'])) ? $this->em->getClassMetadata($assoc['inherited']) : $class; - $sqlTableAlias = $this->getSQLTableAlias($owningClass->getTableName(), $dqlAlias); - - foreach ($assoc['targetToSourceKeyColumns'] as $srcColumn) { - $columnAlias = $this->getSQLColumnAlias($srcColumn); - - $sqlSelectExpressions[] = $sqlTableAlias . '.' . $srcColumn . ' AS ' . $columnAlias; - - $this->rsm->addMetaResult($dqlAlias, $columnAlias, $srcColumn, (isset($assoc['id']) && $assoc['id'] === true)); - } - } - - // Add foreign key columns to SQL, if necessary - if ( ! $addMetaColumns) { - continue; - } - - // Add foreign key columns of subclasses - foreach ($class->subClasses as $subClassName) { - $subClass = $this->em->getClassMetadata($subClassName); - $sqlTableAlias = $this->getSQLTableAlias($subClass->getTableName(), $dqlAlias); - - foreach ($subClass->associationMappings as $assoc) { - // Skip if association is inherited - if (isset($assoc['inherited'])) continue; - - if ( ! ($assoc['isOwningSide'] && $assoc['type'] & ClassMetadata::TO_ONE)) continue; - - foreach ($assoc['targetToSourceKeyColumns'] as $srcColumn) { - $columnAlias = $this->getSQLColumnAlias($srcColumn); - - $sqlSelectExpressions[] = $sqlTableAlias . '.' . $srcColumn . ' AS ' . $columnAlias; - - $this->rsm->addMetaResult($dqlAlias, $columnAlias, $srcColumn); - } - } - } - } - - $sql .= implode(', ', $sqlSelectExpressions); - - return $sql; - } - - /** - * Walks down a FromClause AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - public function walkFromClause($fromClause) - { - $identificationVarDecls = $fromClause->identificationVariableDeclarations; - $sqlParts = array(); - - foreach ($identificationVarDecls as $identificationVariableDecl) { - $sql = $this->platform->appendLockHint( - $this->walkRangeVariableDeclaration($identificationVariableDecl->rangeVariableDeclaration), - $this->query->getHint(Query::HINT_LOCK_MODE) - ); - - foreach ($identificationVariableDecl->joins as $join) { - $sql .= $this->walkJoin($join); - } - - if ($identificationVariableDecl->indexBy) { - $alias = $identificationVariableDecl->indexBy->simpleStateFieldPathExpression->identificationVariable; - $field = $identificationVariableDecl->indexBy->simpleStateFieldPathExpression->field; - - if (isset($this->scalarFields[$alias][$field])) { - $this->rsm->addIndexByScalar($this->scalarFields[$alias][$field]); - } else { - $this->rsm->addIndexBy( - $identificationVariableDecl->indexBy->simpleStateFieldPathExpression->identificationVariable, - $identificationVariableDecl->indexBy->simpleStateFieldPathExpression->field - ); - } - } - - $sqlParts[] = $sql; - } - - return ' FROM ' . implode(', ', $sqlParts); - } - - /** - * Walks down a RangeVariableDeclaration AST node, thereby generating the appropriate SQL. - * - * @return string - */ - public function walkRangeVariableDeclaration($rangeVariableDeclaration) - { - $class = $this->em->getClassMetadata($rangeVariableDeclaration->abstractSchemaName); - $dqlAlias = $rangeVariableDeclaration->aliasIdentificationVariable; - - $this->rootAliases[] = $dqlAlias; - - $sql = $class->getQuotedTableName($this->platform) . ' ' - . $this->getSQLTableAlias($class->getTableName(), $dqlAlias); - - if ($class->isInheritanceTypeJoined()) { - $sql .= $this->_generateClassTableInheritanceJoins($class, $dqlAlias); - } - - return $sql; - } - - /** - * Walks down a JoinAssociationDeclaration AST node, thereby generating the appropriate SQL. - * - * @return string - */ - public function walkJoinAssociationDeclaration($joinAssociationDeclaration, $joinType = AST\Join::JOIN_TYPE_INNER) - { - $sql = ''; - - $associationPathExpression = $joinAssociationDeclaration->joinAssociationPathExpression; - $joinedDqlAlias = $joinAssociationDeclaration->aliasIdentificationVariable; - $indexBy = $joinAssociationDeclaration->indexBy; - - $relation = $this->queryComponents[$joinedDqlAlias]['relation']; - $targetClass = $this->em->getClassMetadata($relation['targetEntity']); - $sourceClass = $this->em->getClassMetadata($relation['sourceEntity']); - $targetTableName = $targetClass->getQuotedTableName($this->platform); - - $targetTableAlias = $this->getSQLTableAlias($targetClass->getTableName(), $joinedDqlAlias); - $sourceTableAlias = $this->getSQLTableAlias($sourceClass->getTableName(), $associationPathExpression->identificationVariable); - - // Ensure we got the owning side, since it has all mapping info - $assoc = ( ! $relation['isOwningSide']) ? $targetClass->associationMappings[$relation['mappedBy']] : $relation; - - if ($this->query->getHint(Query::HINT_INTERNAL_ITERATION) == true && (!$this->query->getHint(self::HINT_DISTINCT) || isset($this->selectedClasses[$joinedDqlAlias]))) { - if ($relation['type'] == ClassMetadata::ONE_TO_MANY || $relation['type'] == ClassMetadata::MANY_TO_MANY) { - throw QueryException::iterateWithFetchJoinNotAllowed($assoc); - } - } - - // This condition is not checking ClassMetadata::MANY_TO_ONE, because by definition it cannot - // be the owning side and previously we ensured that $assoc is always the owning side of the associations. - // The owning side is necessary at this point because only it contains the JoinColumn information. - switch (true) { - case ($assoc['type'] & ClassMetadata::TO_ONE): - $conditions = array(); - - foreach ($assoc['joinColumns'] as $joinColumn) { - $quotedSourceColumn = $this->quoteStrategy->getJoinColumnName($joinColumn, $targetClass, $this->platform); - $quotedTargetColumn = $this->quoteStrategy->getReferencedJoinColumnName($joinColumn, $targetClass, $this->platform); - - if ($relation['isOwningSide']) { - $conditions[] = $sourceTableAlias . '.' . $quotedSourceColumn . ' = ' . $targetTableAlias . '.' . $quotedTargetColumn; - - continue; - } - - $conditions[] = $sourceTableAlias . '.' . $quotedTargetColumn . ' = ' . $targetTableAlias . '.' . $quotedSourceColumn; - } - - // Apply remaining inheritance restrictions - $discrSql = $this->_generateDiscriminatorColumnConditionSQL(array($joinedDqlAlias)); - - if ($discrSql) { - $conditions[] = $discrSql; - } - - // Apply the filters - $filterExpr = $this->generateFilterConditionSQL($targetClass, $targetTableAlias); - - if ($filterExpr) { - $conditions[] = $filterExpr; - } - - $sql .= $targetTableName . ' ' . $targetTableAlias . ' ON ' . implode(' AND ', $conditions); - break; - - case ($assoc['type'] == ClassMetadata::MANY_TO_MANY): - // Join relation table - $joinTable = $assoc['joinTable']; - $joinTableAlias = $this->getSQLTableAlias($joinTable['name'], $joinedDqlAlias); - $joinTableName = $sourceClass->getQuotedJoinTableName($assoc, $this->platform); - - $conditions = array(); - $relationColumns = ($relation['isOwningSide']) - ? $assoc['joinTable']['joinColumns'] - : $assoc['joinTable']['inverseJoinColumns']; - - foreach ($relationColumns as $joinColumn) { - $quotedSourceColumn = $this->quoteStrategy->getJoinColumnName($joinColumn, $targetClass, $this->platform); - $quotedTargetColumn = $this->quoteStrategy->getReferencedJoinColumnName($joinColumn, $targetClass, $this->platform); - - $conditions[] = $sourceTableAlias . '.' . $quotedTargetColumn . ' = ' . $joinTableAlias . '.' . $quotedSourceColumn; - } - - $sql .= $joinTableName . ' ' . $joinTableAlias . ' ON ' . implode(' AND ', $conditions); - - // Join target table - $sql .= ($joinType == AST\Join::JOIN_TYPE_LEFT || $joinType == AST\Join::JOIN_TYPE_LEFTOUTER) ? ' LEFT JOIN ' : ' INNER JOIN '; - - $conditions = array(); - $relationColumns = ($relation['isOwningSide']) - ? $assoc['joinTable']['inverseJoinColumns'] - : $assoc['joinTable']['joinColumns']; - - foreach ($relationColumns as $joinColumn) { - $quotedSourceColumn = $this->quoteStrategy->getJoinColumnName($joinColumn, $targetClass, $this->platform); - $quotedTargetColumn = $this->quoteStrategy->getReferencedJoinColumnName($joinColumn, $targetClass, $this->platform); - - $conditions[] = $targetTableAlias . '.' . $quotedTargetColumn . ' = ' . $joinTableAlias . '.' . $quotedSourceColumn; - } - - // Apply remaining inheritance restrictions - $discrSql = $this->_generateDiscriminatorColumnConditionSQL(array($joinedDqlAlias)); - - if ($discrSql) { - $conditions[] = $discrSql; - } - - // Apply the filters - $filterExpr = $this->generateFilterConditionSQL($targetClass, $targetTableAlias); - - if ($filterExpr) { - $conditions[] = $filterExpr; - } - - $sql .= $targetTableName . ' ' . $targetTableAlias . ' ON ' . implode(' AND ', $conditions); - break; - } - - // FIXME: these should either be nested or all forced to be left joins (DDC-XXX) - if ($targetClass->isInheritanceTypeJoined()) { - $sql .= $this->_generateClassTableInheritanceJoins($targetClass, $joinedDqlAlias); - } - - // Apply the indexes - if ($indexBy) { - // For Many-To-One or One-To-One associations this obviously makes no sense, but is ignored silently. - $this->rsm->addIndexBy( - $indexBy->simpleStateFieldPathExpression->identificationVariable, - $indexBy->simpleStateFieldPathExpression->field - ); - } else if (isset($relation['indexBy'])) { - $this->rsm->addIndexBy($joinedDqlAlias, $relation['indexBy']); - } - - return $sql; - } - - /** - * Walks down a FunctionNode AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - public function walkFunction($function) - { - return $function->getSql($this); - } - - /** - * Walks down an OrderByClause AST node, thereby generating the appropriate SQL. - * - * @param OrderByClause - * @return string The SQL. - */ - public function walkOrderByClause($orderByClause) - { - $orderByItems = array_map(array($this, 'walkOrderByItem'), $orderByClause->orderByItems); - - if (($collectionOrderByItems = $this->_generateOrderedCollectionOrderByItems()) !== '') { - $orderByItems = array_merge($orderByItems, (array) $collectionOrderByItems); - } - - return ' ORDER BY ' . implode(', ', $orderByItems); - } - - /** - * Walks down an OrderByItem AST node, thereby generating the appropriate SQL. - * - * @param OrderByItem - * @return string The SQL. - */ - public function walkOrderByItem($orderByItem) - { - $expr = $orderByItem->expression; - $sql = ($expr instanceof AST\Node) - ? $expr->dispatch($this) - : $this->walkResultVariable($this->queryComponents[$expr]['token']['value']); - - return $sql . ' ' . strtoupper($orderByItem->type); - } - - /** - * Walks down a HavingClause AST node, thereby generating the appropriate SQL. - * - * @param HavingClause - * @return string The SQL. - */ - public function walkHavingClause($havingClause) - { - return ' HAVING ' . $this->walkConditionalExpression($havingClause->conditionalExpression); - } - - /** - * Walks down a Join AST node and creates the corresponding SQL. - * - * @return string The SQL. - */ - public function walkJoin($join) - { - $joinType = $join->joinType; - $joinDeclaration = $join->joinAssociationDeclaration; - - $sql = ($joinType == AST\Join::JOIN_TYPE_LEFT || $joinType == AST\Join::JOIN_TYPE_LEFTOUTER) - ? ' LEFT JOIN ' - : ' INNER JOIN '; - - switch (true) { - case ($joinDeclaration instanceof \Doctrine\ORM\Query\AST\RangeVariableDeclaration): - $class = $this->em->getClassMetadata($joinDeclaration->abstractSchemaName); - $condExprConjunction = $class->isInheritanceTypeJoined() && $joinType != AST\Join::JOIN_TYPE_LEFT && $joinType != AST\Join::JOIN_TYPE_LEFTOUTER - ? ' AND ' - : ' ON '; - - $sql .= $this->walkRangeVariableDeclaration($joinDeclaration) - . $condExprConjunction . '(' . $this->walkConditionalExpression($join->conditionalExpression) . ')'; - break; - - case ($joinDeclaration instanceof \Doctrine\ORM\Query\AST\JoinAssociationDeclaration): - $sql .= $this->walkJoinAssociationDeclaration($joinDeclaration, $joinType); - - // Handle WITH clause - if (($condExpr = $join->conditionalExpression) !== null) { - // Phase 2 AST optimization: Skip processment of ConditionalExpression - // if only one ConditionalTerm is defined - $sql .= ' AND (' . $this->walkConditionalExpression($condExpr) . ')'; - } - break; - } - - return $sql; - } - - /** - * Walks down a CaseExpression AST node and generates the corresponding SQL. - * - * @param CoalesceExpression|NullIfExpression|GeneralCaseExpression|SimpleCaseExpression $expression - * @return string The SQL. - */ - public function walkCaseExpression($expression) - { - switch (true) { - case ($expression instanceof AST\CoalesceExpression): - return $this->walkCoalesceExpression($expression); - - case ($expression instanceof AST\NullIfExpression): - return $this->walkNullIfExpression($expression); - - case ($expression instanceof AST\GeneralCaseExpression): - return $this->walkGeneralCaseExpression($expression); - - case ($expression instanceof AST\SimpleCaseExpression): - return $this->walkSimpleCaseExpression($expression); - - default: - return ''; - } - } - - /** - * Walks down a CoalesceExpression AST node and generates the corresponding SQL. - * - * @param CoalesceExpression $coalesceExpression - * @return string The SQL. - */ - public function walkCoalesceExpression($coalesceExpression) - { - $sql = 'COALESCE('; - - $scalarExpressions = array(); - - foreach ($coalesceExpression->scalarExpressions as $scalarExpression) { - $scalarExpressions[] = $this->walkSimpleArithmeticExpression($scalarExpression); - } - - $sql .= implode(', ', $scalarExpressions) . ')'; - - return $sql; - } - - /** - * Walks down a NullIfExpression AST node and generates the corresponding SQL. - * - * @param NullIfExpression $nullIfExpression - * @return string The SQL. - */ - public function walkNullIfExpression($nullIfExpression) - { - $firstExpression = is_string($nullIfExpression->firstExpression) - ? $this->conn->quote($nullIfExpression->firstExpression) - : $this->walkSimpleArithmeticExpression($nullIfExpression->firstExpression); - - $secondExpression = is_string($nullIfExpression->secondExpression) - ? $this->conn->quote($nullIfExpression->secondExpression) - : $this->walkSimpleArithmeticExpression($nullIfExpression->secondExpression); - - return 'NULLIF(' . $firstExpression . ', ' . $secondExpression . ')'; - } - - /** - * Walks down a GeneralCaseExpression AST node and generates the corresponding SQL. - * - * @param GeneralCaseExpression $generalCaseExpression - * @return string The SQL. - */ - public function walkGeneralCaseExpression(AST\GeneralCaseExpression $generalCaseExpression) - { - $sql = 'CASE'; - - foreach ($generalCaseExpression->whenClauses as $whenClause) { - $sql .= ' WHEN ' . $this->walkConditionalExpression($whenClause->caseConditionExpression); - $sql .= ' THEN ' . $this->walkSimpleArithmeticExpression($whenClause->thenScalarExpression); - } - - $sql .= ' ELSE ' . $this->walkSimpleArithmeticExpression($generalCaseExpression->elseScalarExpression) . ' END'; - - return $sql; - } - - /** - * Walks down a SimpleCaseExpression AST node and generates the corresponding SQL. - * - * @param SimpleCaseExpression $simpleCaseExpression - * @return string The SQL. - */ - public function walkSimpleCaseExpression($simpleCaseExpression) - { - $sql = 'CASE ' . $this->walkStateFieldPathExpression($simpleCaseExpression->caseOperand); - - foreach ($simpleCaseExpression->simpleWhenClauses as $simpleWhenClause) { - $sql .= ' WHEN ' . $this->walkSimpleArithmeticExpression($simpleWhenClause->caseScalarExpression); - $sql .= ' THEN ' . $this->walkSimpleArithmeticExpression($simpleWhenClause->thenScalarExpression); - } - - $sql .= ' ELSE ' . $this->walkSimpleArithmeticExpression($simpleCaseExpression->elseScalarExpression) . ' END'; - - return $sql; - } - - /** - * Walks down a SelectExpression AST node and generates the corresponding SQL. - * - * @param SelectExpression $selectExpression - * @return string The SQL. - */ - public function walkSelectExpression($selectExpression) - { - $sql = ''; - $expr = $selectExpression->expression; - $hidden = $selectExpression->hiddenAliasResultVariable; - - switch (true) { - case ($expr instanceof AST\PathExpression): - if ($expr->type !== AST\PathExpression::TYPE_STATE_FIELD) { - throw QueryException::invalidPathExpression($expr); - } - - $fieldName = $expr->field; - $dqlAlias = $expr->identificationVariable; - $qComp = $this->queryComponents[$dqlAlias]; - $class = $qComp['metadata']; - - $resultAlias = $selectExpression->fieldIdentificationVariable ?: $fieldName; - $tableName = ($class->isInheritanceTypeJoined()) - ? $this->em->getUnitOfWork()->getEntityPersister($class->name)->getOwningTable($fieldName) - : $class->getTableName(); - - $sqlTableAlias = $this->getSQLTableAlias($tableName, $dqlAlias); - $columnName = $this->quoteStrategy->getColumnName($fieldName, $class, $this->platform); - $columnAlias = $this->getSQLColumnAlias($class->fieldMappings[$fieldName]['columnName']); - - $col = $sqlTableAlias . '.' . $columnName; - - $fieldType = $class->getTypeOfField($fieldName); - - if (isset($class->fieldMappings[$fieldName]['requireSQLConversion'])) { - $type = Type::getType($fieldType); - $col = $type->convertToPHPValueSQL($col, $this->conn->getDatabasePlatform()); - } - - $sql .= $col . ' AS ' . $columnAlias; - - $this->scalarResultAliasMap[$resultAlias] = $columnAlias; - - if ( ! $hidden) { - $this->rsm->addScalarResult($columnAlias, $resultAlias, $fieldType); - $this->scalarFields[$dqlAlias][$fieldName] = $columnAlias; - } - break; - - case ($expr instanceof AST\AggregateExpression): - case ($expr instanceof AST\Functions\FunctionNode): - case ($expr instanceof AST\SimpleArithmeticExpression): - case ($expr instanceof AST\ArithmeticTerm): - case ($expr instanceof AST\ArithmeticFactor): - case ($expr instanceof AST\Literal): - case ($expr instanceof AST\NullIfExpression): - case ($expr instanceof AST\CoalesceExpression): - case ($expr instanceof AST\GeneralCaseExpression): - case ($expr instanceof AST\SimpleCaseExpression): - $columnAlias = $this->getSQLColumnAlias('sclr'); - $resultAlias = $selectExpression->fieldIdentificationVariable ?: $this->scalarResultCounter++; - - $sql .= $expr->dispatch($this) . ' AS ' . $columnAlias; - - $this->scalarResultAliasMap[$resultAlias] = $columnAlias; - - if ( ! $hidden) { - // We cannot resolve field type here; assume 'string'. - $this->rsm->addScalarResult($columnAlias, $resultAlias, 'string'); - } - break; - - case ($expr instanceof AST\Subselect): - $columnAlias = $this->getSQLColumnAlias('sclr'); - $resultAlias = $selectExpression->fieldIdentificationVariable ?: $this->scalarResultCounter++; - - $sql .= '(' . $this->walkSubselect($expr) . ') AS ' . $columnAlias; - - $this->scalarResultAliasMap[$resultAlias] = $columnAlias; - - if ( ! $hidden) { - // We cannot resolve field type here; assume 'string'. - $this->rsm->addScalarResult($columnAlias, $resultAlias, 'string'); - } - break; - - default: - // IdentificationVariable or PartialObjectExpression - if ($expr instanceof AST\PartialObjectExpression) { - $dqlAlias = $expr->identificationVariable; - $partialFieldSet = $expr->partialFieldSet; - } else { - $dqlAlias = $expr; - $partialFieldSet = array(); - } - - $queryComp = $this->queryComponents[$dqlAlias]; - $class = $queryComp['metadata']; - $resultAlias = $selectExpression->fieldIdentificationVariable ?: null; - - if ( ! isset($this->selectedClasses[$dqlAlias])) { - $this->selectedClasses[$dqlAlias] = array( - 'class' => $class, - 'dqlAlias' => $dqlAlias, - 'resultAlias' => $resultAlias - ); - } - - $sqlParts = array(); - - // Select all fields from the queried class - foreach ($class->fieldMappings as $fieldName => $mapping) { - if ($partialFieldSet && ! in_array($fieldName, $partialFieldSet)) { - continue; - } - - $tableName = (isset($mapping['inherited'])) - ? $this->em->getClassMetadata($mapping['inherited'])->getTableName() - : $class->getTableName(); - - $sqlTableAlias = $this->getSQLTableAlias($tableName, $dqlAlias); - $columnAlias = $this->getSQLColumnAlias($mapping['columnName']); - $quotedColumnName = $this->quoteStrategy->getColumnName($fieldName, $class, $this->platform); - - $col = $sqlTableAlias . '.' . $quotedColumnName; - - if (isset($class->fieldMappings[$fieldName]['requireSQLConversion'])) { - $type = Type::getType($class->getTypeOfField($fieldName)); - $col = $type->convertToPHPValueSQL($col, $this->platform); - } - - $sqlParts[] = $col . ' AS '. $columnAlias; - - $this->scalarResultAliasMap[$resultAlias][] = $columnAlias; - - $this->rsm->addFieldResult($dqlAlias, $columnAlias, $fieldName, $class->name); - } - - // Add any additional fields of subclasses (excluding inherited fields) - // 1) on Single Table Inheritance: always, since its marginal overhead - // 2) on Class Table Inheritance only if partial objects are disallowed, - // since it requires outer joining subtables. - if ($class->isInheritanceTypeSingleTable() || ! $this->query->getHint(Query::HINT_FORCE_PARTIAL_LOAD)) { - foreach ($class->subClasses as $subClassName) { - $subClass = $this->em->getClassMetadata($subClassName); - $sqlTableAlias = $this->getSQLTableAlias($subClass->getTableName(), $dqlAlias); - - foreach ($subClass->fieldMappings as $fieldName => $mapping) { - if (isset($mapping['inherited']) || $partialFieldSet && !in_array($fieldName, $partialFieldSet)) { - continue; - } - - $columnAlias = $this->getSQLColumnAlias($mapping['columnName']); - $quotedColumnName = $this->quoteStrategy->getColumnName($fieldName, $subClass, $this->platform); - - $col = $sqlTableAlias . '.' . $quotedColumnName; - - if (isset($subClass->fieldMappings[$fieldName]['requireSQLConversion'])) { - $type = Type::getType($subClass->getTypeOfField($fieldName)); - $col = $type->convertToPHPValueSQL($col, $this->platform); - } - - $sqlParts[] = $col . ' AS ' . $columnAlias; - - $this->scalarResultAliasMap[$resultAlias][] = $columnAlias; - - $this->rsm->addFieldResult($dqlAlias, $columnAlias, $fieldName, $subClassName); - } - } - } - - $sql .= implode(', ', $sqlParts); - } - - return $sql; - } - - /** - * Walks down a QuantifiedExpression AST node, thereby generating the appropriate SQL. - * - * @param QuantifiedExpression - * @return string The SQL. - */ - public function walkQuantifiedExpression($qExpr) - { - return ' ' . strtoupper($qExpr->type) . '(' . $this->walkSubselect($qExpr->subselect) . ')'; - } - - /** - * Walks down a Subselect AST node, thereby generating the appropriate SQL. - * - * @param Subselect - * @return string The SQL. - */ - public function walkSubselect($subselect) - { - $useAliasesBefore = $this->useSqlTableAliases; - $rootAliasesBefore = $this->rootAliases; - - $this->rootAliases = array(); // reset the rootAliases for the subselect - $this->useSqlTableAliases = true; - - $sql = $this->walkSimpleSelectClause($subselect->simpleSelectClause); - $sql .= $this->walkSubselectFromClause($subselect->subselectFromClause); - $sql .= $this->walkWhereClause($subselect->whereClause); - - $sql .= $subselect->groupByClause ? $this->walkGroupByClause($subselect->groupByClause) : ''; - $sql .= $subselect->havingClause ? $this->walkHavingClause($subselect->havingClause) : ''; - $sql .= $subselect->orderByClause ? $this->walkOrderByClause($subselect->orderByClause) : ''; - - $this->rootAliases = $rootAliasesBefore; // put the main aliases back - $this->useSqlTableAliases = $useAliasesBefore; - - return $sql; - } - - /** - * Walks down a SubselectFromClause AST node, thereby generating the appropriate SQL. - * - * @param SubselectFromClause - * @return string The SQL. - */ - public function walkSubselectFromClause($subselectFromClause) - { - $identificationVarDecls = $subselectFromClause->identificationVariableDeclarations; - $sqlParts = array (); - - foreach ($identificationVarDecls as $subselectIdVarDecl) { - $sql = $this->platform->appendLockHint( - $this->walkRangeVariableDeclaration($subselectIdVarDecl->rangeVariableDeclaration), - $this->query->getHint(Query::HINT_LOCK_MODE) - ); - - foreach ($subselectIdVarDecl->joins as $join) { - $sql .= $this->walkJoin($join); - } - - $sqlParts[] = $sql; - } - - return ' FROM ' . implode(', ', $sqlParts); - } - - /** - * Walks down a SimpleSelectClause AST node, thereby generating the appropriate SQL. - * - * @param SimpleSelectClause - * @return string The SQL. - */ - public function walkSimpleSelectClause($simpleSelectClause) - { - return 'SELECT' . ($simpleSelectClause->isDistinct ? ' DISTINCT' : '') - . $this->walkSimpleSelectExpression($simpleSelectClause->simpleSelectExpression); - } - - /** - * Walks down a SimpleSelectExpression AST node, thereby generating the appropriate SQL. - * - * @param SimpleSelectExpression - * @return string The SQL. - */ - public function walkSimpleSelectExpression($simpleSelectExpression) - { - $expr = $simpleSelectExpression->expression; - $sql = ' '; - - switch (true) { - case ($expr instanceof AST\PathExpression): - $sql .= $this->walkPathExpression($expr); - break; - - case ($expr instanceof AST\AggregateExpression): - $alias = $simpleSelectExpression->fieldIdentificationVariable ?: $this->scalarResultCounter++; - - $sql .= $this->walkAggregateExpression($expr) . ' AS dctrn__' . $alias; - break; - - case ($expr instanceof AST\Subselect): - $alias = $simpleSelectExpression->fieldIdentificationVariable ?: $this->scalarResultCounter++; - - $columnAlias = 'sclr' . $this->aliasCounter++; - $this->scalarResultAliasMap[$alias] = $columnAlias; - - $sql .= '(' . $this->walkSubselect($expr) . ') AS ' . $columnAlias; - break; - - case ($expr instanceof AST\Functions\FunctionNode): - case ($expr instanceof AST\SimpleArithmeticExpression): - case ($expr instanceof AST\ArithmeticTerm): - case ($expr instanceof AST\ArithmeticFactor): - case ($expr instanceof AST\Literal): - case ($expr instanceof AST\NullIfExpression): - case ($expr instanceof AST\CoalesceExpression): - case ($expr instanceof AST\GeneralCaseExpression): - case ($expr instanceof AST\SimpleCaseExpression): - $alias = $simpleSelectExpression->fieldIdentificationVariable ?: $this->scalarResultCounter++; - - $columnAlias = $this->getSQLColumnAlias('sclr'); - $this->scalarResultAliasMap[$alias] = $columnAlias; - - $sql .= $expr->dispatch($this) . ' AS ' . $columnAlias; - break; - - default: // IdentificationVariable - $sql .= $this->walkEntityIdentificationVariable($expr); - break; - } - - return $sql; - } - - /** - * Walks down an AggregateExpression AST node, thereby generating the appropriate SQL. - * - * @param AggregateExpression - * @return string The SQL. - */ - public function walkAggregateExpression($aggExpression) - { - return $aggExpression->functionName . '(' . ($aggExpression->isDistinct ? 'DISTINCT ' : '') - . $this->walkSimpleArithmeticExpression($aggExpression->pathExpression) . ')'; - } - - /** - * Walks down a GroupByClause AST node, thereby generating the appropriate SQL. - * - * @param GroupByClause - * @return string The SQL. - */ - public function walkGroupByClause($groupByClause) - { - $sqlParts = array(); - - foreach ($groupByClause->groupByItems as $groupByItem) { - $sqlParts[] = $this->walkGroupByItem($groupByItem); - } - - return ' GROUP BY ' . implode(', ', $sqlParts); - } - - /** - * Walks down a GroupByItem AST node, thereby generating the appropriate SQL. - * - * @param GroupByItem - * @return string The SQL. - */ - public function walkGroupByItem($groupByItem) - { - // StateFieldPathExpression - if ( ! is_string($groupByItem)) { - return $this->walkPathExpression($groupByItem); - } - - // ResultVariable - if (isset($this->queryComponents[$groupByItem]['resultVariable'])) { - return $this->walkResultVariable($groupByItem); - } - - // IdentificationVariable - $sqlParts = array(); - - foreach ($this->queryComponents[$groupByItem]['metadata']->fieldNames as $field) { - $item = new AST\PathExpression(AST\PathExpression::TYPE_STATE_FIELD, $groupByItem, $field); - $item->type = AST\PathExpression::TYPE_STATE_FIELD; - - $sqlParts[] = $this->walkPathExpression($item); - } - - foreach ($this->queryComponents[$groupByItem]['metadata']->associationMappings as $mapping) { - if ($mapping['isOwningSide'] && $mapping['type'] & ClassMetadataInfo::TO_ONE) { - $item = new AST\PathExpression(AST\PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION, $groupByItem, $mapping['fieldName']); - $item->type = AST\PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION; - - $sqlParts[] = $this->walkPathExpression($item); - } - } - - return implode(', ', $sqlParts); - } - - /** - * Walks down a DeleteClause AST node, thereby generating the appropriate SQL. - * - * @param DeleteClause - * @return string The SQL. - */ - public function walkDeleteClause(AST\DeleteClause $deleteClause) - { - $class = $this->em->getClassMetadata($deleteClause->abstractSchemaName); - $tableName = $class->getTableName(); - $sql = 'DELETE FROM ' . $this->quoteStrategy->getTableName($class, $this->platform); - - $this->setSQLTableAlias($tableName, $tableName, $deleteClause->aliasIdentificationVariable); - $this->rootAliases[] = $deleteClause->aliasIdentificationVariable; - - return $sql; - } - - /** - * Walks down an UpdateClause AST node, thereby generating the appropriate SQL. - * - * @param UpdateClause - * @return string The SQL. - */ - public function walkUpdateClause($updateClause) - { - $class = $this->em->getClassMetadata($updateClause->abstractSchemaName); - $tableName = $class->getTableName(); - $sql = 'UPDATE ' . $this->quoteStrategy->getTableName($class, $this->platform); - - $this->setSQLTableAlias($tableName, $tableName, $updateClause->aliasIdentificationVariable); - $this->rootAliases[] = $updateClause->aliasIdentificationVariable; - - $sql .= ' SET ' . implode(', ', array_map(array($this, 'walkUpdateItem'), $updateClause->updateItems)); - - return $sql; - } - - /** - * Walks down an UpdateItem AST node, thereby generating the appropriate SQL. - * - * @param UpdateItem - * @return string The SQL. - */ - public function walkUpdateItem($updateItem) - { - $useTableAliasesBefore = $this->useSqlTableAliases; - $this->useSqlTableAliases = false; - - $sql = $this->walkPathExpression($updateItem->pathExpression) . ' = '; - $newValue = $updateItem->newValue; - - switch (true) { - case ($newValue instanceof AST\Node): - $sql .= $newValue->dispatch($this); - break; - - case ($newValue === null): - $sql .= 'NULL'; - break; - - default: - $sql .= $this->conn->quote($newValue); - break; - } - - $this->useSqlTableAliases = $useTableAliasesBefore; - - return $sql; - } - - /** - * Walks down a WhereClause AST node, thereby generating the appropriate SQL. - * WhereClause or not, the appropriate discriminator sql is added. - * - * @param WhereClause - * @return string The SQL. - */ - public function walkWhereClause($whereClause) - { - $condSql = null !== $whereClause ? $this->walkConditionalExpression($whereClause->conditionalExpression) : ''; - $discrSql = $this->_generateDiscriminatorColumnConditionSql($this->rootAliases); - - if ($this->em->hasFilters()) { - $filterClauses = array(); - foreach ($this->rootAliases as $dqlAlias) { - $class = $this->queryComponents[$dqlAlias]['metadata']; - $tableAlias = $this->getSQLTableAlias($class->table['name'], $dqlAlias); - - if ($filterExpr = $this->generateFilterConditionSQL($class, $tableAlias)) { - $filterClauses[] = $filterExpr; - } - } - - if (count($filterClauses)) { - if ($condSql) { - $condSql = '(' . $condSql . ') AND '; - } - - $condSql .= implode(' AND ', $filterClauses); - } - } - - if ($condSql) { - return ' WHERE ' . (( ! $discrSql) ? $condSql : '(' . $condSql . ') AND ' . $discrSql); - } - - if ($discrSql) { - return ' WHERE ' . $discrSql; - } - - return ''; - } - - /** - * Walk down a ConditionalExpression AST node, thereby generating the appropriate SQL. - * - * @param ConditionalExpression - * @return string The SQL. - */ - public function walkConditionalExpression($condExpr) - { - // Phase 2 AST optimization: Skip processment of ConditionalExpression - // if only one ConditionalTerm is defined - if ( ! ($condExpr instanceof AST\ConditionalExpression)) { - return $this->walkConditionalTerm($condExpr); - } - - return implode(' OR ', array_map(array($this, 'walkConditionalTerm'), $condExpr->conditionalTerms)); - } - - /** - * Walks down a ConditionalTerm AST node, thereby generating the appropriate SQL. - * - * @param ConditionalTerm - * @return string The SQL. - */ - public function walkConditionalTerm($condTerm) - { - // Phase 2 AST optimization: Skip processment of ConditionalTerm - // if only one ConditionalFactor is defined - if ( ! ($condTerm instanceof AST\ConditionalTerm)) { - return $this->walkConditionalFactor($condTerm); - } - - return implode(' AND ', array_map(array($this, 'walkConditionalFactor'), $condTerm->conditionalFactors)); - } - - /** - * Walks down a ConditionalFactor AST node, thereby generating the appropriate SQL. - * - * @param ConditionalFactor - * @return string The SQL. - */ - public function walkConditionalFactor($factor) - { - // Phase 2 AST optimization: Skip processment of ConditionalFactor - // if only one ConditionalPrimary is defined - return ( ! ($factor instanceof AST\ConditionalFactor)) - ? $this->walkConditionalPrimary($factor) - : ($factor->not ? 'NOT ' : '') . $this->walkConditionalPrimary($factor->conditionalPrimary); - } - - /** - * Walks down a ConditionalPrimary AST node, thereby generating the appropriate SQL. - * - * @param ConditionalPrimary - * @return string The SQL. - */ - public function walkConditionalPrimary($primary) - { - if ($primary->isSimpleConditionalExpression()) { - return $primary->simpleConditionalExpression->dispatch($this); - } - - if ($primary->isConditionalExpression()) { - $condExpr = $primary->conditionalExpression; - - return '(' . $this->walkConditionalExpression($condExpr) . ')'; - } - } - - /** - * Walks down an ExistsExpression AST node, thereby generating the appropriate SQL. - * - * @param ExistsExpression - * @return string The SQL. - */ - public function walkExistsExpression($existsExpr) - { - $sql = ($existsExpr->not) ? 'NOT ' : ''; - - $sql .= 'EXISTS (' . $this->walkSubselect($existsExpr->subselect) . ')'; - - return $sql; - } - - /** - * Walks down a CollectionMemberExpression AST node, thereby generating the appropriate SQL. - * - * @param CollectionMemberExpression - * @return string The SQL. - */ - public function walkCollectionMemberExpression($collMemberExpr) - { - $sql = $collMemberExpr->not ? 'NOT ' : ''; - $sql .= 'EXISTS (SELECT 1 FROM '; - - $entityExpr = $collMemberExpr->entityExpression; - $collPathExpr = $collMemberExpr->collectionValuedPathExpression; - - $fieldName = $collPathExpr->field; - $dqlAlias = $collPathExpr->identificationVariable; - - $class = $this->queryComponents[$dqlAlias]['metadata']; - - switch (true) { - // InputParameter - case ($entityExpr instanceof AST\InputParameter): - $dqlParamKey = $entityExpr->name; - $entitySql = '?'; - break; - - // SingleValuedAssociationPathExpression | IdentificationVariable - case ($entityExpr instanceof AST\PathExpression): - $entitySql = $this->walkPathExpression($entityExpr); - break; - - default: - throw new \BadMethodCallException("Not implemented"); - } - - $assoc = $class->associationMappings[$fieldName]; - - if ($assoc['type'] == ClassMetadata::ONE_TO_MANY) { - $targetClass = $this->em->getClassMetadata($assoc['targetEntity']); - $targetTableAlias = $this->getSQLTableAlias($targetClass->getTableName()); - $sourceTableAlias = $this->getSQLTableAlias($class->getTableName(), $dqlAlias); - - $sql .= $this->quoteStrategy->getTableName($targetClass, $this->platform) . ' ' . $targetTableAlias . ' WHERE '; - - $owningAssoc = $targetClass->associationMappings[$assoc['mappedBy']]; - $sqlParts = array(); - - foreach ($owningAssoc['targetToSourceKeyColumns'] as $targetColumn => $sourceColumn) { - $targetColumn = $this->quoteStrategy->getColumnName($class->fieldNames[$targetColumn], $class, $this->platform); - - $sqlParts[] = $sourceTableAlias . '.' . $targetColumn . ' = ' . $targetTableAlias . '.' . $sourceColumn; - } - - foreach ($this->quoteStrategy->getIdentifierColumnNames($targetClass, $this->platform) as $targetColumnName) { - if (isset($dqlParamKey)) { - $this->parserResult->addParameterMapping($dqlParamKey, $this->sqlParamIndex++); - } - - $sqlParts[] = $targetTableAlias . '.' . $targetColumnName . ' = ' . $entitySql; - } - - $sql .= implode(' AND ', $sqlParts); - } else { // many-to-many - $targetClass = $this->em->getClassMetadata($assoc['targetEntity']); - - $owningAssoc = $assoc['isOwningSide'] ? $assoc : $targetClass->associationMappings[$assoc['mappedBy']]; - $joinTable = $owningAssoc['joinTable']; - - // SQL table aliases - $joinTableAlias = $this->getSQLTableAlias($joinTable['name']); - $targetTableAlias = $this->getSQLTableAlias($targetClass->getTableName()); - $sourceTableAlias = $this->getSQLTableAlias($class->getTableName(), $dqlAlias); - - // join to target table - $sql .= $this->quoteStrategy->getJoinTableName($owningAssoc, $targetClass, $this->platform) . ' ' . $joinTableAlias - . ' INNER JOIN ' . $this->quoteStrategy->getTableName($targetClass, $this->platform) . ' ' . $targetTableAlias . ' ON '; - - // join conditions - $joinColumns = $assoc['isOwningSide'] ? $joinTable['inverseJoinColumns'] : $joinTable['joinColumns']; - $joinSqlParts = array(); - - foreach ($joinColumns as $joinColumn) { - $targetColumn = $this->quoteStrategy->getColumnName($targetClass->fieldNames[$joinColumn['referencedColumnName']], $targetClass, $this->platform); - - $joinSqlParts[] = $joinTableAlias . '.' . $joinColumn['name'] . ' = ' . $targetTableAlias . '.' . $targetColumn; - } - - $sql .= implode(' AND ', $joinSqlParts); - $sql .= ' WHERE '; - - $joinColumns = $assoc['isOwningSide'] ? $joinTable['joinColumns'] : $joinTable['inverseJoinColumns']; - $sqlParts = array(); - - foreach ($joinColumns as $joinColumn) { - $targetColumn = $this->quoteStrategy->getColumnName($class->fieldNames[$joinColumn['referencedColumnName']], $class, $this->platform); - - $sqlParts[] = $joinTableAlias . '.' . $joinColumn['name'] . ' = ' . $sourceTableAlias . '.' . $targetColumn; - } - - foreach ($this->quoteStrategy->getIdentifierColumnNames($targetClass, $this->platform) as $targetColumnName) { - if (isset($dqlParamKey)) { - $this->parserResult->addParameterMapping($dqlParamKey, $this->sqlParamIndex++); - } - - $sqlParts[] = $targetTableAlias . '.' . $targetColumnName . ' = ' . $entitySql; - } - - $sql .= implode(' AND ', $sqlParts); - } - - return $sql . ')'; - } - - /** - * Walks down an EmptyCollectionComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param EmptyCollectionComparisonExpression - * @return string The SQL. - */ - public function walkEmptyCollectionComparisonExpression($emptyCollCompExpr) - { - $sizeFunc = new AST\Functions\SizeFunction('size'); - $sizeFunc->collectionPathExpression = $emptyCollCompExpr->expression; - - return $sizeFunc->getSql($this) . ($emptyCollCompExpr->not ? ' > 0' : ' = 0'); - } - - /** - * Walks down a NullComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param NullComparisonExpression - * @return string The SQL. - */ - public function walkNullComparisonExpression($nullCompExpr) - { - $sql = ''; - $innerExpr = $nullCompExpr->expression; - - if ($innerExpr instanceof AST\InputParameter) { - $dqlParamKey = $innerExpr->name; - $this->parserResult->addParameterMapping($dqlParamKey, $this->sqlParamIndex++); - $sql .= ' ?'; - } else { - $sql .= $this->walkPathExpression($innerExpr); - } - - $sql .= ' IS' . ($nullCompExpr->not ? ' NOT' : '') . ' NULL'; - - return $sql; - } - - /** - * Walks down an InExpression AST node, thereby generating the appropriate SQL. - * - * @param InExpression - * @return string The SQL. - */ - public function walkInExpression($inExpr) - { - $sql = $this->walkArithmeticExpression($inExpr->expression) . ($inExpr->not ? ' NOT' : '') . ' IN ('; - - $sql .= ($inExpr->subselect) - ? $this->walkSubselect($inExpr->subselect) - : implode(', ', array_map(array($this, 'walkInParameter'), $inExpr->literals)); - - $sql .= ')'; - - return $sql; - } - - /** - * Walks down an InstanceOfExpression AST node, thereby generating the appropriate SQL. - * - * @param InstanceOfExpression - * @return string The SQL. - */ - public function walkInstanceOfExpression($instanceOfExpr) - { - $sql = ''; - - $dqlAlias = $instanceOfExpr->identificationVariable; - $discrClass = $class = $this->queryComponents[$dqlAlias]['metadata']; - - if ($class->discriminatorColumn) { - $discrClass = $this->em->getClassMetadata($class->rootEntityName); - } - - if ($this->useSqlTableAliases) { - $sql .= $this->getSQLTableAlias($discrClass->getTableName(), $dqlAlias) . '.'; - } - - $sql .= $class->discriminatorColumn['name'] . ($instanceOfExpr->not ? ' NOT IN ' : ' IN '); - - $sqlParameterList = array(); - - foreach ($instanceOfExpr->value as $parameter) { - if ($parameter instanceof AST\InputParameter) { - // We need to modify the parameter value to be its correspondent mapped value - $dqlParamKey = $parameter->name; - $dqlParam = $this->query->getParameter($dqlParamKey); - $paramValue = $this->query->processParameterValue($dqlParam->getValue()); - - if ( ! ($paramValue instanceof \Doctrine\ORM\Mapping\ClassMetadata)) { - throw QueryException::invalidParameterType('ClassMetadata', get_class($paramValue)); - } - - $entityClassName = $paramValue->name; - } else { - // Get name from ClassMetadata to resolve aliases. - $entityClassName = $this->em->getClassMetadata($parameter)->name; - } - - if ($entityClassName == $class->name) { - $sqlParameterList[] = $this->conn->quote($class->discriminatorValue); - } else { - $discrMap = array_flip($class->discriminatorMap); - - if (!isset($discrMap[$entityClassName])) { - throw QueryException::instanceOfUnrelatedClass($entityClassName, $class->rootEntityName); - } - - $sqlParameterList[] = $this->conn->quote($discrMap[$entityClassName]); - } - } - - $sql .= '(' . implode(', ', $sqlParameterList) . ')'; - - return $sql; - } - - /** - * Walks down an InParameter AST node, thereby generating the appropriate SQL. - * - * @param InParameter - * @return string The SQL. - */ - public function walkInParameter($inParam) - { - return $inParam instanceof AST\InputParameter - ? $this->walkInputParameter($inParam) - : $this->walkLiteral($inParam); - } - - /** - * Walks down a literal that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkLiteral($literal) - { - switch ($literal->type) { - case AST\Literal::STRING: - return $this->conn->quote($literal->value); - - case AST\Literal::BOOLEAN: - $bool = strtolower($literal->value) == 'true' ? true : false; - $boolVal = $this->conn->getDatabasePlatform()->convertBooleans($bool); - - return $boolVal; - - case AST\Literal::NUMERIC: - return $literal->value; - - default: - throw QueryException::invalidLiteral($literal); - } - } - - /** - * Walks down a BetweenExpression AST node, thereby generating the appropriate SQL. - * - * @param BetweenExpression - * @return string The SQL. - */ - public function walkBetweenExpression($betweenExpr) - { - $sql = $this->walkArithmeticExpression($betweenExpr->expression); - - if ($betweenExpr->not) $sql .= ' NOT'; - - $sql .= ' BETWEEN ' . $this->walkArithmeticExpression($betweenExpr->leftBetweenExpression) - . ' AND ' . $this->walkArithmeticExpression($betweenExpr->rightBetweenExpression); - - return $sql; - } - - /** - * Walks down a LikeExpression AST node, thereby generating the appropriate SQL. - * - * @param LikeExpression - * @return string The SQL. - */ - public function walkLikeExpression($likeExpr) - { - $stringExpr = $likeExpr->stringExpression; - $sql = $stringExpr->dispatch($this) . ($likeExpr->not ? ' NOT' : '') . ' LIKE '; - - if ($likeExpr->stringPattern instanceof AST\InputParameter) { - $inputParam = $likeExpr->stringPattern; - $dqlParamKey = $inputParam->name; - $this->parserResult->addParameterMapping($dqlParamKey, $this->sqlParamIndex++); - $sql .= '?'; - } elseif ($likeExpr->stringPattern instanceof AST\Functions\FunctionNode ) { - $sql .= $this->walkFunction($likeExpr->stringPattern); - } elseif ($likeExpr->stringPattern instanceof AST\PathExpression) { - $sql .= $this->walkPathExpression($likeExpr->stringPattern); - } else { - $sql .= $this->walkLiteral($likeExpr->stringPattern); - } - - if ($likeExpr->escapeChar) { - $sql .= ' ESCAPE ' . $this->walkLiteral($likeExpr->escapeChar); - } - - return $sql; - } - - /** - * Walks down a StateFieldPathExpression AST node, thereby generating the appropriate SQL. - * - * @param StateFieldPathExpression - * @return string The SQL. - */ - public function walkStateFieldPathExpression($stateFieldPathExpression) - { - return $this->walkPathExpression($stateFieldPathExpression); - } - - /** - * Walks down a ComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param ComparisonExpression - * @return string The SQL. - */ - public function walkComparisonExpression($compExpr) - { - $leftExpr = $compExpr->leftExpression; - $rightExpr = $compExpr->rightExpression; - $sql = ''; - - $sql .= ($leftExpr instanceof AST\Node) - ? $leftExpr->dispatch($this) - : (is_numeric($leftExpr) ? $leftExpr : $this->conn->quote($leftExpr)); - - $sql .= ' ' . $compExpr->operator . ' '; - - $sql .= ($rightExpr instanceof AST\Node) - ? $rightExpr->dispatch($this) - : (is_numeric($rightExpr) ? $rightExpr : $this->conn->quote($rightExpr)); - - return $sql; - } - - /** - * Walks down an InputParameter AST node, thereby generating the appropriate SQL. - * - * @param InputParameter - * @return string The SQL. - */ - public function walkInputParameter($inputParam) - { - $this->parserResult->addParameterMapping($inputParam->name, $this->sqlParamIndex++); - - return '?'; - } - - /** - * Walks down an ArithmeticExpression AST node, thereby generating the appropriate SQL. - * - * @param ArithmeticExpression - * @return string The SQL. - */ - public function walkArithmeticExpression($arithmeticExpr) - { - return ($arithmeticExpr->isSimpleArithmeticExpression()) - ? $this->walkSimpleArithmeticExpression($arithmeticExpr->simpleArithmeticExpression) - : '(' . $this->walkSubselect($arithmeticExpr->subselect) . ')'; - } - - /** - * Walks down an SimpleArithmeticExpression AST node, thereby generating the appropriate SQL. - * - * @param SimpleArithmeticExpression - * @return string The SQL. - */ - public function walkSimpleArithmeticExpression($simpleArithmeticExpr) - { - if ( ! ($simpleArithmeticExpr instanceof AST\SimpleArithmeticExpression)) { - return $this->walkArithmeticTerm($simpleArithmeticExpr); - } - - return implode(' ', array_map(array($this, 'walkArithmeticTerm'), $simpleArithmeticExpr->arithmeticTerms)); - } - - /** - * Walks down an ArithmeticTerm AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkArithmeticTerm($term) - { - if (is_string($term)) { - return (isset($this->queryComponents[$term])) - ? $this->walkResultVariable($this->queryComponents[$term]['token']['value']) - : $term; - } - - // Phase 2 AST optimization: Skip processment of ArithmeticTerm - // if only one ArithmeticFactor is defined - if ( ! ($term instanceof AST\ArithmeticTerm)) { - return $this->walkArithmeticFactor($term); - } - - return implode(' ', array_map(array($this, 'walkArithmeticFactor'), $term->arithmeticFactors)); - } - - /** - * Walks down an ArithmeticFactor that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkArithmeticFactor($factor) - { - if (is_string($factor)) { - return $factor; - } - - // Phase 2 AST optimization: Skip processment of ArithmeticFactor - // if only one ArithmeticPrimary is defined - if ( ! ($factor instanceof AST\ArithmeticFactor)) { - return $this->walkArithmeticPrimary($factor); - } - - $sign = $factor->isNegativeSigned() ? '-' : ($factor->isPositiveSigned() ? '+' : ''); - - return $sign . $this->walkArithmeticPrimary($factor->arithmeticPrimary); - } - - /** - * Walks down an ArithmeticPrimary that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkArithmeticPrimary($primary) - { - if ($primary instanceof AST\SimpleArithmeticExpression) { - return '(' . $this->walkSimpleArithmeticExpression($primary) . ')'; - } - - if ($primary instanceof AST\Node) { - return $primary->dispatch($this); - } - - return $this->walkEntityIdentificationVariable($primary); - } - - /** - * Walks down a StringPrimary that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkStringPrimary($stringPrimary) - { - return (is_string($stringPrimary)) - ? $this->conn->quote($stringPrimary) - : $stringPrimary->dispatch($this); - } - - /** - * Walks down a ResultVriable that represents an AST node, thereby generating the appropriate SQL. - * - * @param string $resultVariable - * @return string The SQL. - */ - public function walkResultVariable($resultVariable) - { - $resultAlias = $this->scalarResultAliasMap[$resultVariable]; - - if (is_array($resultAlias)) { - return implode(', ', $resultAlias); - } - - return $resultAlias; - } -} diff --git a/framework/library/Doctrine/ORM/Query/TreeWalker.php b/framework/library/Doctrine/ORM/Query/TreeWalker.php deleted file mode 100644 index c88ca13..0000000 --- a/framework/library/Doctrine/ORM/Query/TreeWalker.php +++ /dev/null @@ -1,409 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -/** - * Interface for walkers of DQL ASTs (abstract syntax trees). - * - * @author Roman Borschel - * @since 2.0 - */ -interface TreeWalker -{ - /** - * Initializes TreeWalker with important information about the ASTs to be walked - * - * @param Query $query The parsed Query. - * @param ParserResult $parserResult The result of the parsing process. - * @param array $queryComponents Query components (symbol table) - */ - public function __construct($query, $parserResult, array $queryComponents); - - /** - * Walks down a SelectStatement AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - function walkSelectStatement(AST\SelectStatement $AST); - - /** - * Walks down a SelectClause AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - function walkSelectClause($selectClause); - - /** - * Walks down a FromClause AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - function walkFromClause($fromClause); - - /** - * Walks down a FunctionNode AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - function walkFunction($function); - - /** - * Walks down an OrderByClause AST node, thereby generating the appropriate SQL. - * - * @param OrderByClause - * @return string The SQL. - */ - function walkOrderByClause($orderByClause); - - /** - * Walks down an OrderByItem AST node, thereby generating the appropriate SQL. - * - * @param OrderByItem - * @return string The SQL. - */ - function walkOrderByItem($orderByItem); - - /** - * Walks down a HavingClause AST node, thereby generating the appropriate SQL. - * - * @param HavingClause - * @return string The SQL. - */ - function walkHavingClause($havingClause); - - /** - * Walks down a Join AST node and creates the corresponding SQL. - * - * @param Join $joinVarDecl - * @return string The SQL. - */ - function walkJoin($join); - - /** - * Walks down a SelectExpression AST node and generates the corresponding SQL. - * - * @param SelectExpression $selectExpression - * @return string The SQL. - */ - function walkSelectExpression($selectExpression); - - /** - * Walks down a QuantifiedExpression AST node, thereby generating the appropriate SQL. - * - * @param QuantifiedExpression - * @return string The SQL. - */ - function walkQuantifiedExpression($qExpr); - - /** - * Walks down a Subselect AST node, thereby generating the appropriate SQL. - * - * @param Subselect - * @return string The SQL. - */ - function walkSubselect($subselect); - - /** - * Walks down a SubselectFromClause AST node, thereby generating the appropriate SQL. - * - * @param SubselectFromClause - * @return string The SQL. - */ - function walkSubselectFromClause($subselectFromClause); - - /** - * Walks down a SimpleSelectClause AST node, thereby generating the appropriate SQL. - * - * @param SimpleSelectClause - * @return string The SQL. - */ - function walkSimpleSelectClause($simpleSelectClause); - - /** - * Walks down a SimpleSelectExpression AST node, thereby generating the appropriate SQL. - * - * @param SimpleSelectExpression - * @return string The SQL. - */ - function walkSimpleSelectExpression($simpleSelectExpression); - - /** - * Walks down an AggregateExpression AST node, thereby generating the appropriate SQL. - * - * @param AggregateExpression - * @return string The SQL. - */ - function walkAggregateExpression($aggExpression); - - /** - * Walks down a GroupByClause AST node, thereby generating the appropriate SQL. - * - * @param GroupByClause - * @return string The SQL. - */ - function walkGroupByClause($groupByClause); - - /** - * Walks down a GroupByItem AST node, thereby generating the appropriate SQL. - * - * @param GroupByItem - * @return string The SQL. - */ - function walkGroupByItem($groupByItem); - - /** - * Walks down an UpdateStatement AST node, thereby generating the appropriate SQL. - * - * @param UpdateStatement - * @return string The SQL. - */ - function walkUpdateStatement(AST\UpdateStatement $AST); - - /** - * Walks down a DeleteStatement AST node, thereby generating the appropriate SQL. - * - * @param DeleteStatement - * @return string The SQL. - */ - function walkDeleteStatement(AST\DeleteStatement $AST); - - /** - * Walks down a DeleteClause AST node, thereby generating the appropriate SQL. - * - * @param DeleteClause - * @return string The SQL. - */ - function walkDeleteClause(AST\DeleteClause $deleteClause); - - /** - * Walks down an UpdateClause AST node, thereby generating the appropriate SQL. - * - * @param UpdateClause - * @return string The SQL. - */ - function walkUpdateClause($updateClause); - - /** - * Walks down an UpdateItem AST node, thereby generating the appropriate SQL. - * - * @param UpdateItem - * @return string The SQL. - */ - function walkUpdateItem($updateItem); - - /** - * Walks down a WhereClause AST node, thereby generating the appropriate SQL. - * - * @param WhereClause - * @return string The SQL. - */ - function walkWhereClause($whereClause); - - /** - * Walks down a ConditionalExpression AST node, thereby generating the appropriate SQL. - * - * @param ConditionalExpression - * @return string The SQL. - */ - function walkConditionalExpression($condExpr); - - /** - * Walks down a ConditionalTerm AST node, thereby generating the appropriate SQL. - * - * @param ConditionalTerm - * @return string The SQL. - */ - function walkConditionalTerm($condTerm); - - /** - * Walks down a ConditionalFactor AST node, thereby generating the appropriate SQL. - * - * @param ConditionalFactor - * @return string The SQL. - */ - function walkConditionalFactor($factor); - - /** - * Walks down a ConditionalPrimary AST node, thereby generating the appropriate SQL. - * - * @param ConditionalPrimary - * @return string The SQL. - */ - function walkConditionalPrimary($primary); - - /** - * Walks down an ExistsExpression AST node, thereby generating the appropriate SQL. - * - * @param ExistsExpression - * @return string The SQL. - */ - function walkExistsExpression($existsExpr); - - /** - * Walks down a CollectionMemberExpression AST node, thereby generating the appropriate SQL. - * - * @param CollectionMemberExpression - * @return string The SQL. - */ - function walkCollectionMemberExpression($collMemberExpr); - - /** - * Walks down an EmptyCollectionComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param EmptyCollectionComparisonExpression - * @return string The SQL. - */ - function walkEmptyCollectionComparisonExpression($emptyCollCompExpr); - - /** - * Walks down a NullComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param NullComparisonExpression - * @return string The SQL. - */ - function walkNullComparisonExpression($nullCompExpr); - - /** - * Walks down an InExpression AST node, thereby generating the appropriate SQL. - * - * @param InExpression - * @return string The SQL. - */ - function walkInExpression($inExpr); - - /** - * Walks down an InstanceOfExpression AST node, thereby generating the appropriate SQL. - * - * @param InstanceOfExpression - * @return string The SQL. - */ - function walkInstanceOfExpression($instanceOfExpr); - - /** - * Walks down a literal that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - function walkLiteral($literal); - - /** - * Walks down a BetweenExpression AST node, thereby generating the appropriate SQL. - * - * @param BetweenExpression - * @return string The SQL. - */ - function walkBetweenExpression($betweenExpr); - - /** - * Walks down a LikeExpression AST node, thereby generating the appropriate SQL. - * - * @param LikeExpression - * @return string The SQL. - */ - function walkLikeExpression($likeExpr); - - /** - * Walks down a StateFieldPathExpression AST node, thereby generating the appropriate SQL. - * - * @param StateFieldPathExpression - * @return string The SQL. - */ - function walkStateFieldPathExpression($stateFieldPathExpression); - - /** - * Walks down a ComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param ComparisonExpression - * @return string The SQL. - */ - function walkComparisonExpression($compExpr); - - /** - * Walks down an InputParameter AST node, thereby generating the appropriate SQL. - * - * @param InputParameter - * @return string The SQL. - */ - function walkInputParameter($inputParam); - - /** - * Walks down an ArithmeticExpression AST node, thereby generating the appropriate SQL. - * - * @param ArithmeticExpression - * @return string The SQL. - */ - function walkArithmeticExpression($arithmeticExpr); - - /** - * Walks down an ArithmeticTerm AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - function walkArithmeticTerm($term); - - /** - * Walks down a StringPrimary that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - function walkStringPrimary($stringPrimary); - - /** - * Walks down an ArithmeticFactor that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - function walkArithmeticFactor($factor); - - /** - * Walks down an SimpleArithmeticExpression AST node, thereby generating the appropriate SQL. - * - * @param SimpleArithmeticExpression - * @return string The SQL. - */ - function walkSimpleArithmeticExpression($simpleArithmeticExpr); - - /** - * Walks down an PathExpression AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - function walkPathExpression($pathExpr); - - /** - * Walks down an ResultVariable AST node, thereby generating the appropriate SQL. - * - * @param string $resultVariable - * @return string The SQL. - */ - function walkResultVariable($resultVariable); - - /** - * Gets an executor that can be used to execute the result of this walker. - * - * @return AbstractExecutor - */ - function getExecutor($AST); -} diff --git a/framework/library/Doctrine/ORM/Query/TreeWalkerAdapter.php b/framework/library/Doctrine/ORM/Query/TreeWalkerAdapter.php deleted file mode 100644 index 4446a85..0000000 --- a/framework/library/Doctrine/ORM/Query/TreeWalkerAdapter.php +++ /dev/null @@ -1,443 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -/** - * An adapter implementation of the TreeWalker interface. The methods in this class - * are empty. This class exists as convenience for creating tree walkers. - * - * @author Roman Borschel - * @since 2.0 - */ -abstract class TreeWalkerAdapter implements TreeWalker -{ - private $_query; - private $_parserResult; - private $_queryComponents; - - /** - * {@inheritdoc} - */ - public function __construct($query, $parserResult, array $queryComponents) - { - $this->_query = $query; - $this->_parserResult = $parserResult; - $this->_queryComponents = $queryComponents; - } - - /** - * @return array - */ - protected function _getQueryComponents() - { - return $this->_queryComponents; - } - - /** - * Retrieve Query Instance reponsible for the current walkers execution. - * - * @return \Doctrine\ORM\Query - */ - protected function _getQuery() - { - return $this->_query; - } - - /** - * Retrieve ParserResult - * - * @return \Doctrine\ORM\Query\ParserResult - */ - protected function _getParserResult() - { - return $this->_parserResult; - } - - /** - * Walks down a SelectStatement AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - public function walkSelectStatement(AST\SelectStatement $AST) {} - - /** - * Walks down a SelectClause AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - public function walkSelectClause($selectClause) {} - - /** - * Walks down a FromClause AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - public function walkFromClause($fromClause) {} - - /** - * Walks down a FunctionNode AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - public function walkFunction($function) {} - - /** - * Walks down an OrderByClause AST node, thereby generating the appropriate SQL. - * - * @param OrderByClause - * @return string The SQL. - */ - public function walkOrderByClause($orderByClause) {} - - /** - * Walks down an OrderByItem AST node, thereby generating the appropriate SQL. - * - * @param OrderByItem - * @return string The SQL. - */ - public function walkOrderByItem($orderByItem) {} - - /** - * Walks down a HavingClause AST node, thereby generating the appropriate SQL. - * - * @param HavingClause - * @return string The SQL. - */ - public function walkHavingClause($havingClause) {} - - /** - * Walks down a Join AST node and creates the corresponding SQL. - * - * @param Join $join - * @return string The SQL. - */ - public function walkJoin($join) {} - - /** - * Walks down a SelectExpression AST node and generates the corresponding SQL. - * - * @param SelectExpression $selectExpression - * @return string The SQL. - */ - public function walkSelectExpression($selectExpression) {} - - /** - * Walks down a QuantifiedExpression AST node, thereby generating the appropriate SQL. - * - * @param QuantifiedExpression - * @return string The SQL. - */ - public function walkQuantifiedExpression($qExpr) {} - - /** - * Walks down a Subselect AST node, thereby generating the appropriate SQL. - * - * @param Subselect - * @return string The SQL. - */ - public function walkSubselect($subselect) {} - - /** - * Walks down a SubselectFromClause AST node, thereby generating the appropriate SQL. - * - * @param SubselectFromClause - * @return string The SQL. - */ - public function walkSubselectFromClause($subselectFromClause) {} - - /** - * Walks down a SimpleSelectClause AST node, thereby generating the appropriate SQL. - * - * @param SimpleSelectClause - * @return string The SQL. - */ - public function walkSimpleSelectClause($simpleSelectClause) {} - - /** - * Walks down a SimpleSelectExpression AST node, thereby generating the appropriate SQL. - * - * @param SimpleSelectExpression - * @return string The SQL. - */ - public function walkSimpleSelectExpression($simpleSelectExpression) {} - - /** - * Walks down an AggregateExpression AST node, thereby generating the appropriate SQL. - * - * @param AggregateExpression - * @return string The SQL. - */ - public function walkAggregateExpression($aggExpression) {} - - /** - * Walks down a GroupByClause AST node, thereby generating the appropriate SQL. - * - * @param GroupByClause - * @return string The SQL. - */ - public function walkGroupByClause($groupByClause) {} - - /** - * Walks down a GroupByItem AST node, thereby generating the appropriate SQL. - * - * @param GroupByItem - * @return string The SQL. - */ - public function walkGroupByItem($groupByItem) {} - - /** - * Walks down an UpdateStatement AST node, thereby generating the appropriate SQL. - * - * @param UpdateStatement - * @return string The SQL. - */ - public function walkUpdateStatement(AST\UpdateStatement $AST) {} - - /** - * Walks down a DeleteStatement AST node, thereby generating the appropriate SQL. - * - * @param DeleteStatement - * @return string The SQL. - */ - public function walkDeleteStatement(AST\DeleteStatement $AST) {} - - /** - * Walks down a DeleteClause AST node, thereby generating the appropriate SQL. - * - * @param DeleteClause - * @return string The SQL. - */ - public function walkDeleteClause(AST\DeleteClause $deleteClause) {} - - /** - * Walks down an UpdateClause AST node, thereby generating the appropriate SQL. - * - * @param UpdateClause - * @return string The SQL. - */ - public function walkUpdateClause($updateClause) {} - - /** - * Walks down an UpdateItem AST node, thereby generating the appropriate SQL. - * - * @param UpdateItem - * @return string The SQL. - */ - public function walkUpdateItem($updateItem) {} - - /** - * Walks down a WhereClause AST node, thereby generating the appropriate SQL. - * - * @param WhereClause - * @return string The SQL. - */ - public function walkWhereClause($whereClause) {} - - /** - * Walks down a ConditionalExpression AST node, thereby generating the appropriate SQL. - * - * @param ConditionalExpression - * @return string The SQL. - */ - public function walkConditionalExpression($condExpr) {} - - /** - * Walks down a ConditionalTerm AST node, thereby generating the appropriate SQL. - * - * @param ConditionalTerm - * @return string The SQL. - */ - public function walkConditionalTerm($condTerm) {} - - /** - * Walks down a ConditionalFactor AST node, thereby generating the appropriate SQL. - * - * @param ConditionalFactor - * @return string The SQL. - */ - public function walkConditionalFactor($factor) {} - - /** - * Walks down a ConditionalPrimary AST node, thereby generating the appropriate SQL. - * - * @param ConditionalPrimary - * @return string The SQL. - */ - public function walkConditionalPrimary($primary) {} - - /** - * Walks down an ExistsExpression AST node, thereby generating the appropriate SQL. - * - * @param ExistsExpression - * @return string The SQL. - */ - public function walkExistsExpression($existsExpr) {} - - /** - * Walks down a CollectionMemberExpression AST node, thereby generating the appropriate SQL. - * - * @param CollectionMemberExpression - * @return string The SQL. - */ - public function walkCollectionMemberExpression($collMemberExpr) {} - - /** - * Walks down an EmptyCollectionComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param EmptyCollectionComparisonExpression - * @return string The SQL. - */ - public function walkEmptyCollectionComparisonExpression($emptyCollCompExpr) {} - - /** - * Walks down a NullComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param NullComparisonExpression - * @return string The SQL. - */ - public function walkNullComparisonExpression($nullCompExpr) {} - - /** - * Walks down an InExpression AST node, thereby generating the appropriate SQL. - * - * @param InExpression - * @return string The SQL. - */ - public function walkInExpression($inExpr) {} - - /** - * Walks down an InstanceOfExpression AST node, thereby generating the appropriate SQL. - * - * @param InstanceOfExpression - * @return string The SQL. - */ - function walkInstanceOfExpression($instanceOfExpr) {} - - /** - * Walks down a literal that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkLiteral($literal) {} - - /** - * Walks down a BetweenExpression AST node, thereby generating the appropriate SQL. - * - * @param BetweenExpression - * @return string The SQL. - */ - public function walkBetweenExpression($betweenExpr) {} - - /** - * Walks down a LikeExpression AST node, thereby generating the appropriate SQL. - * - * @param LikeExpression - * @return string The SQL. - */ - public function walkLikeExpression($likeExpr) {} - - /** - * Walks down a StateFieldPathExpression AST node, thereby generating the appropriate SQL. - * - * @param StateFieldPathExpression - * @return string The SQL. - */ - public function walkStateFieldPathExpression($stateFieldPathExpression) {} - - /** - * Walks down a ComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param ComparisonExpression - * @return string The SQL. - */ - public function walkComparisonExpression($compExpr) {} - - /** - * Walks down an InputParameter AST node, thereby generating the appropriate SQL. - * - * @param InputParameter - * @return string The SQL. - */ - public function walkInputParameter($inputParam) {} - - /** - * Walks down an ArithmeticExpression AST node, thereby generating the appropriate SQL. - * - * @param ArithmeticExpression - * @return string The SQL. - */ - public function walkArithmeticExpression($arithmeticExpr) {} - - /** - * Walks down an ArithmeticTerm AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkArithmeticTerm($term) {} - - /** - * Walks down a StringPrimary that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkStringPrimary($stringPrimary) {} - - /** - * Walks down an ArithmeticFactor that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkArithmeticFactor($factor) {} - - /** - * Walks down an SimpleArithmeticExpression AST node, thereby generating the appropriate SQL. - * - * @param SimpleArithmeticExpression - * @return string The SQL. - */ - public function walkSimpleArithmeticExpression($simpleArithmeticExpr) {} - - /** - * Walks down an PathExpression AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkPathExpression($pathExpr) {} - - /** - * Walks down an ResultVariable AST node, thereby generating the appropriate SQL. - * - * @param string $resultVariable - * @return string The SQL. - */ - public function walkResultVariable($resultVariable) {} - - /** - * Gets an executor that can be used to execute the result of this walker. - * - * @return AbstractExecutor - */ - public function getExecutor($AST) {} -} diff --git a/framework/library/Doctrine/ORM/Query/TreeWalkerChain.php b/framework/library/Doctrine/ORM/Query/TreeWalkerChain.php deleted file mode 100644 index 13bbcde..0000000 --- a/framework/library/Doctrine/ORM/Query/TreeWalkerChain.php +++ /dev/null @@ -1,662 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Query; - -/** - * Represents a chain of tree walkers that modify an AST and finally emit output. - * Only the last walker in the chain can emit output. Any previous walkers can modify - * the AST to influence the final output produced by the last walker. - * - * @author Roman Borschel - * @since 2.0 - */ -class TreeWalkerChain implements TreeWalker -{ - /** The tree walkers. */ - private $_walkers = array(); - /** The original Query. */ - private $_query; - /** The ParserResult of the original query that was produced by the Parser. */ - private $_parserResult; - /** The query components of the original query (the "symbol table") that was produced by the Parser. */ - private $_queryComponents; - - /** - * @inheritdoc - */ - public function __construct($query, $parserResult, array $queryComponents) - { - $this->_query = $query; - $this->_parserResult = $parserResult; - $this->_queryComponents = $queryComponents; - } - - /** - * Adds a tree walker to the chain. - * - * @param string $walkerClass The class of the walker to instantiate. - */ - public function addTreeWalker($walkerClass) - { - $this->_walkers[] = new $walkerClass($this->_query, $this->_parserResult, $this->_queryComponents); - } - - /** - * Walks down a SelectStatement AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - public function walkSelectStatement(AST\SelectStatement $AST) - { - foreach ($this->_walkers as $walker) { - $walker->walkSelectStatement($AST); - } - } - - /** - * Walks down a SelectClause AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - public function walkSelectClause($selectClause) - { - foreach ($this->_walkers as $walker) { - $walker->walkSelectClause($selectClause); - } - } - - /** - * Walks down a FromClause AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - public function walkFromClause($fromClause) - { - foreach ($this->_walkers as $walker) { - $walker->walkFromClause($fromClause); - } - } - - /** - * Walks down a FunctionNode AST node, thereby generating the appropriate SQL. - * - * @return string The SQL. - */ - public function walkFunction($function) - { - foreach ($this->_walkers as $walker) { - $walker->walkFunction($function); - } - } - - /** - * Walks down an OrderByClause AST node, thereby generating the appropriate SQL. - * - * @param OrderByClause - * @return string The SQL. - */ - public function walkOrderByClause($orderByClause) - { - foreach ($this->_walkers as $walker) { - $walker->walkOrderByClause($orderByClause); - } - } - - /** - * Walks down an OrderByItem AST node, thereby generating the appropriate SQL. - * - * @param OrderByItem - * @return string The SQL. - */ - public function walkOrderByItem($orderByItem) - { - foreach ($this->_walkers as $walker) { - $walker->walkOrderByItem($orderByItem); - } - } - - /** - * Walks down a HavingClause AST node, thereby generating the appropriate SQL. - * - * @param HavingClause - * @return string The SQL. - */ - public function walkHavingClause($havingClause) - { - foreach ($this->_walkers as $walker) { - $walker->walkHavingClause($havingClause); - } - } - - /** - * Walks down a Join AST node and creates the corresponding SQL. - * - * @param Join $join - * @return string The SQL. - */ - public function walkJoin($join) - { - foreach ($this->_walkers as $walker) { - $walker->walkJoin($join); - } - } - - /** - * Walks down a SelectExpression AST node and generates the corresponding SQL. - * - * @param SelectExpression $selectExpression - * @return string The SQL. - */ - public function walkSelectExpression($selectExpression) - { - foreach ($this->_walkers as $walker) { - $walker->walkSelectExpression($selectExpression); - } - } - - /** - * Walks down a QuantifiedExpression AST node, thereby generating the appropriate SQL. - * - * @param QuantifiedExpression - * @return string The SQL. - */ - public function walkQuantifiedExpression($qExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkQuantifiedExpression($qExpr); - } - } - - /** - * Walks down a Subselect AST node, thereby generating the appropriate SQL. - * - * @param Subselect - * @return string The SQL. - */ - public function walkSubselect($subselect) - { - foreach ($this->_walkers as $walker) { - $walker->walkSubselect($subselect); - } - } - - /** - * Walks down a SubselectFromClause AST node, thereby generating the appropriate SQL. - * - * @param SubselectFromClause - * @return string The SQL. - */ - public function walkSubselectFromClause($subselectFromClause) - { - foreach ($this->_walkers as $walker) { - $walker->walkSubselectFromClause($subselectFromClause); - } - } - - /** - * Walks down a SimpleSelectClause AST node, thereby generating the appropriate SQL. - * - * @param SimpleSelectClause - * @return string The SQL. - */ - public function walkSimpleSelectClause($simpleSelectClause) - { - foreach ($this->_walkers as $walker) { - $walker->walkSimpleSelectClause($simpleSelectClause); - } - } - - /** - * Walks down a SimpleSelectExpression AST node, thereby generating the appropriate SQL. - * - * @param SimpleSelectExpression - * @return string The SQL. - */ - public function walkSimpleSelectExpression($simpleSelectExpression) - { - foreach ($this->_walkers as $walker) { - $walker->walkSimpleSelectExpression($simpleSelectExpression); - } - } - - /** - * Walks down an AggregateExpression AST node, thereby generating the appropriate SQL. - * - * @param AggregateExpression - * @return string The SQL. - */ - public function walkAggregateExpression($aggExpression) - { - foreach ($this->_walkers as $walker) { - $walker->walkAggregateExpression($aggExpression); - } - } - - /** - * Walks down a GroupByClause AST node, thereby generating the appropriate SQL. - * - * @param GroupByClause - * @return string The SQL. - */ - public function walkGroupByClause($groupByClause) - { - foreach ($this->_walkers as $walker) { - $walker->walkGroupByClause($groupByClause); - } - } - - /** - * Walks down a GroupByItem AST node, thereby generating the appropriate SQL. - * - * @param GroupByItem - * @return string The SQL. - */ - public function walkGroupByItem($groupByItem) - { - foreach ($this->_walkers as $walker) { - $walker->walkGroupByItem($groupByItem); - } - } - - /** - * Walks down an UpdateStatement AST node, thereby generating the appropriate SQL. - * - * @param UpdateStatement - * @return string The SQL. - */ - public function walkUpdateStatement(AST\UpdateStatement $AST) - { - foreach ($this->_walkers as $walker) { - $walker->walkUpdateStatement($AST); - } - } - - /** - * Walks down a DeleteStatement AST node, thereby generating the appropriate SQL. - * - * @param DeleteStatement - * @return string The SQL. - */ - public function walkDeleteStatement(AST\DeleteStatement $AST) - { - foreach ($this->_walkers as $walker) { - $walker->walkDeleteStatement($AST); - } - } - - /** - * Walks down a DeleteClause AST node, thereby generating the appropriate SQL. - * - * @param DeleteClause - * @return string The SQL. - */ - public function walkDeleteClause(AST\DeleteClause $deleteClause) - { - foreach ($this->_walkers as $walker) { - $walker->walkDeleteClause($deleteClause); - } - } - - /** - * Walks down an UpdateClause AST node, thereby generating the appropriate SQL. - * - * @param UpdateClause - * @return string The SQL. - */ - public function walkUpdateClause($updateClause) - { - foreach ($this->_walkers as $walker) { - $walker->walkUpdateClause($updateClause); - } - } - - /** - * Walks down an UpdateItem AST node, thereby generating the appropriate SQL. - * - * @param UpdateItem - * @return string The SQL. - */ - public function walkUpdateItem($updateItem) - { - foreach ($this->_walkers as $walker) { - $walker->walkUpdateItem($updateItem); - } - } - - /** - * Walks down a WhereClause AST node, thereby generating the appropriate SQL. - * - * @param WhereClause - * @return string The SQL. - */ - public function walkWhereClause($whereClause) - { - foreach ($this->_walkers as $walker) { - $walker->walkWhereClause($whereClause); - } - } - - /** - * Walks down a ConditionalExpression AST node, thereby generating the appropriate SQL. - * - * @param ConditionalExpression - * @return string The SQL. - */ - public function walkConditionalExpression($condExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkConditionalExpression($condExpr); - } - } - - /** - * Walks down a ConditionalTerm AST node, thereby generating the appropriate SQL. - * - * @param ConditionalTerm - * @return string The SQL. - */ - public function walkConditionalTerm($condTerm) - { - foreach ($this->_walkers as $walker) { - $walker->walkConditionalTerm($condTerm); - } - } - - /** - * Walks down a ConditionalFactor AST node, thereby generating the appropriate SQL. - * - * @param ConditionalFactor - * @return string The SQL. - */ - public function walkConditionalFactor($factor) - { - foreach ($this->_walkers as $walker) { - $walker->walkConditionalFactor($factor); - } - } - - /** - * Walks down a ConditionalPrimary AST node, thereby generating the appropriate SQL. - * - * @param ConditionalPrimary - * @return string The SQL. - */ - public function walkConditionalPrimary($condPrimary) - { - foreach ($this->_walkers as $walker) { - $walker->walkConditionalPrimary($condPrimary); - } - } - - /** - * Walks down an ExistsExpression AST node, thereby generating the appropriate SQL. - * - * @param ExistsExpression - * @return string The SQL. - */ - public function walkExistsExpression($existsExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkExistsExpression($existsExpr); - } - } - - /** - * Walks down a CollectionMemberExpression AST node, thereby generating the appropriate SQL. - * - * @param CollectionMemberExpression - * @return string The SQL. - */ - public function walkCollectionMemberExpression($collMemberExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkCollectionMemberExpression($collMemberExpr); - } - } - - /** - * Walks down an EmptyCollectionComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param EmptyCollectionComparisonExpression - * @return string The SQL. - */ - public function walkEmptyCollectionComparisonExpression($emptyCollCompExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkEmptyCollectionComparisonExpression($emptyCollCompExpr); - } - } - - /** - * Walks down a NullComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param NullComparisonExpression - * @return string The SQL. - */ - public function walkNullComparisonExpression($nullCompExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkNullComparisonExpression($nullCompExpr); - } - } - - /** - * Walks down an InExpression AST node, thereby generating the appropriate SQL. - * - * @param InExpression - * @return string The SQL. - */ - public function walkInExpression($inExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkInExpression($inExpr); - } - } - - /** - * Walks down an InstanceOfExpression AST node, thereby generating the appropriate SQL. - * - * @param InstanceOfExpression - * @return string The SQL. - */ - function walkInstanceOfExpression($instanceOfExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkInstanceOfExpression($instanceOfExpr); - } - } - - /** - * Walks down a literal that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkLiteral($literal) - { - foreach ($this->_walkers as $walker) { - $walker->walkLiteral($literal); - } - } - - /** - * Walks down a BetweenExpression AST node, thereby generating the appropriate SQL. - * - * @param BetweenExpression - * @return string The SQL. - */ - public function walkBetweenExpression($betweenExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkBetweenExpression($betweenExpr); - } - } - - /** - * Walks down a LikeExpression AST node, thereby generating the appropriate SQL. - * - * @param LikeExpression - * @return string The SQL. - */ - public function walkLikeExpression($likeExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkLikeExpression($likeExpr); - } - } - - /** - * Walks down a StateFieldPathExpression AST node, thereby generating the appropriate SQL. - * - * @param StateFieldPathExpression - * @return string The SQL. - */ - public function walkStateFieldPathExpression($stateFieldPathExpression) - { - foreach ($this->_walkers as $walker) { - $walker->walkStateFieldPathExpression($stateFieldPathExpression); - } - } - - /** - * Walks down a ComparisonExpression AST node, thereby generating the appropriate SQL. - * - * @param ComparisonExpression - * @return string The SQL. - */ - public function walkComparisonExpression($compExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkComparisonExpression($compExpr); - } - } - - /** - * Walks down an InputParameter AST node, thereby generating the appropriate SQL. - * - * @param InputParameter - * @return string The SQL. - */ - public function walkInputParameter($inputParam) - { - foreach ($this->_walkers as $walker) { - $walker->walkInputParameter($inputParam); - } - } - - /** - * Walks down an ArithmeticExpression AST node, thereby generating the appropriate SQL. - * - * @param ArithmeticExpression - * @return string The SQL. - */ - public function walkArithmeticExpression($arithmeticExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkArithmeticExpression($arithmeticExpr); - } - } - - /** - * Walks down an ArithmeticTerm AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkArithmeticTerm($term) - { - foreach ($this->_walkers as $walker) { - $walker->walkArithmeticTerm($term); - } - } - - /** - * Walks down a StringPrimary that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkStringPrimary($stringPrimary) - { - foreach ($this->_walkers as $walker) { - $walker->walkStringPrimary($stringPrimary); - } - } - - /** - * Walks down an ArithmeticFactor that represents an AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkArithmeticFactor($factor) - { - foreach ($this->_walkers as $walker) { - $walker->walkArithmeticFactor($factor); - } - } - - /** - * Walks down an SimpleArithmeticExpression AST node, thereby generating the appropriate SQL. - * - * @param SimpleArithmeticExpression - * @return string The SQL. - */ - public function walkSimpleArithmeticExpression($simpleArithmeticExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkSimpleArithmeticExpression($simpleArithmeticExpr); - } - } - - /** - * Walks down an PathExpression AST node, thereby generating the appropriate SQL. - * - * @param mixed - * @return string The SQL. - */ - public function walkPathExpression($pathExpr) - { - foreach ($this->_walkers as $walker) { - $walker->walkPathExpression($pathExpr); - } - } - - /** - * Walks down an ResultVariable AST node, thereby generating the appropriate SQL. - * - * @param string $resultVariable - * @return string The SQL. - */ - public function walkResultVariable($resultVariable) - { - foreach ($this->_walkers as $walker) { - $walker->walkResultVariable($resultVariable); - } - } - - /** - * Gets an executor that can be used to execute the result of this walker. - * - * @return AbstractExecutor - */ - public function getExecutor($AST) - {} -} diff --git a/framework/library/Doctrine/ORM/QueryBuilder.php b/framework/library/Doctrine/ORM/QueryBuilder.php deleted file mode 100644 index 51ef277..0000000 --- a/framework/library/Doctrine/ORM/QueryBuilder.php +++ /dev/null @@ -1,1181 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -use Doctrine\Common\Collections\ArrayCollection; - -use Doctrine\ORM\Query\Expr; - -/** - * This class is responsible for building DQL query strings via an object oriented - * PHP interface. - * - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class QueryBuilder -{ - /* The query types. */ - const SELECT = 0; - const DELETE = 1; - const UPDATE = 2; - - /** The builder states. */ - const STATE_DIRTY = 0; - const STATE_CLEAN = 1; - - /** - * @var EntityManager The EntityManager used by this QueryBuilder. - */ - private $_em; - - /** - * @var array The array of DQL parts collected. - */ - private $_dqlParts = array( - 'distinct' => false, - 'select' => array(), - 'from' => array(), - 'join' => array(), - 'set' => array(), - 'where' => null, - 'groupBy' => array(), - 'having' => null, - 'orderBy' => array() - ); - - /** - * @var integer The type of query this is. Can be select, update or delete. - */ - private $_type = self::SELECT; - - /** - * @var integer The state of the query object. Can be dirty or clean. - */ - private $_state = self::STATE_CLEAN; - - /** - * @var string The complete DQL string for this query. - */ - private $_dql; - - /** - * @var \Doctrine\Common\Collections\ArrayCollection The query parameters. - */ - private $parameters = array(); - - /** - * @var integer The index of the first result to retrieve. - */ - private $_firstResult = null; - - /** - * @var integer The maximum number of results to retrieve. - */ - private $_maxResults = null; - - /** - * @var array Keeps root entity alias names for join entities. - */ - private $joinRootAliases = array(); - - /** - * Initializes a new QueryBuilder that uses the given EntityManager. - * - * @param EntityManager $em The EntityManager to use. - */ - public function __construct(EntityManager $em) - { - $this->_em = $em; - $this->parameters = new ArrayCollection(); - } - - /** - * Gets an ExpressionBuilder used for object-oriented construction of query expressions. - * This producer method is intended for convenient inline usage. Example: - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * ->where($qb->expr()->eq('u.id', 1)); - * - * - * For more complex expression construction, consider storing the expression - * builder object in a local variable. - * - * @return Query\Expr - */ - public function expr() - { - return $this->_em->getExpressionBuilder(); - } - - /** - * Get the type of the currently built query. - * - * @return integer - */ - public function getType() - { - return $this->_type; - } - - /** - * Get the associated EntityManager for this query builder. - * - * @return EntityManager - */ - public function getEntityManager() - { - return $this->_em; - } - - /** - * Get the state of this query builder instance. - * - * @return integer Either QueryBuilder::STATE_DIRTY or QueryBuilder::STATE_CLEAN. - */ - public function getState() - { - return $this->_state; - } - - /** - * Get the complete DQL string formed by the current specifications of this QueryBuilder. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * echo $qb->getDql(); // SELECT u FROM User u - * - * - * @return string The DQL query string. - */ - public function getDQL() - { - if ($this->_dql !== null && $this->_state === self::STATE_CLEAN) { - return $this->_dql; - } - - $dql = ''; - - switch ($this->_type) { - case self::DELETE: - $dql = $this->_getDQLForDelete(); - break; - - case self::UPDATE: - $dql = $this->_getDQLForUpdate(); - break; - - case self::SELECT: - default: - $dql = $this->_getDQLForSelect(); - break; - } - - $this->_state = self::STATE_CLEAN; - $this->_dql = $dql; - - return $dql; - } - - /** - * Constructs a Query instance from the current specifications of the builder. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u'); - * $q = $qb->getQuery(); - * $results = $q->execute(); - * - * - * @return Query - */ - public function getQuery() - { - $parameters = clone $this->parameters; - - return $this->_em->createQuery($this->getDQL()) - ->setParameters($parameters) - ->setFirstResult($this->_firstResult) - ->setMaxResults($this->_maxResults); - } - - /** - * Finds the root entity alias of the joined entity. - * - * @param string $alias The alias of the new join entity - * @param string $parentAlias The parent entity alias of the join relationship - * @return string - */ - private function findRootAlias($alias, $parentAlias) - { - $rootAlias = null; - - if (in_array($parentAlias, $this->getRootAliases())) { - $rootAlias = $parentAlias; - } elseif (isset($this->joinRootAliases[$parentAlias])) { - $rootAlias = $this->joinRootAliases[$parentAlias]; - } else { - // Should never happen with correct joining order. Might be - // thoughtful to throw exception instead. - $rootAlias = $this->getRootAlias(); - } - - $this->joinRootAliases[$alias] = $rootAlias; - - return $rootAlias; - } - - /** - * Gets the FIRST root alias of the query. This is the first entity alias involved - * in the construction of the query. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u'); - * - * echo $qb->getRootAlias(); // u - * - * - * @deprecated Please use $qb->getRootAliases() instead. - * @return string $rootAlias - */ - public function getRootAlias() - { - $aliases = $this->getRootAliases(); - return $aliases[0]; - } - - /** - * Gets the root aliases of the query. This is the entity aliases involved - * in the construction of the query. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u'); - * - * $qb->getRootAliases(); // array('u') - * - * - * @return array $rootAliases - */ - public function getRootAliases() - { - $aliases = array(); - - foreach ($this->_dqlParts['from'] as &$fromClause) { - if (is_string($fromClause)) { - $spacePos = strrpos($fromClause, ' '); - $from = substr($fromClause, 0, $spacePos); - $alias = substr($fromClause, $spacePos + 1); - - $fromClause = new Query\Expr\From($from, $alias); - } - - $aliases[] = $fromClause->getAlias(); - } - - return $aliases; - } - - /** - * Gets the root entities of the query. This is the entity aliases involved - * in the construction of the query. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u'); - * - * $qb->getRootEntities(); // array('User') - * - * - * @return array $rootEntities - */ - public function getRootEntities() - { - $entities = array(); - - foreach ($this->_dqlParts['from'] as &$fromClause) { - if (is_string($fromClause)) { - $spacePos = strrpos($fromClause, ' '); - $from = substr($fromClause, 0, $spacePos); - $alias = substr($fromClause, $spacePos + 1); - - $fromClause = new Query\Expr\From($from, $alias); - } - - $entities[] = $fromClause->getFrom(); - } - - return $entities; - } - - /** - * Sets a query parameter for the query being constructed. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * ->where('u.id = :user_id') - * ->setParameter('user_id', 1); - * - * - * @param string|integer $key The parameter position or name. - * @param mixed $value The parameter value. - * @param string|null $type PDO::PARAM_* or \Doctrine\DBAL\Types\Type::* constant - * @return QueryBuilder This QueryBuilder instance. - */ - public function setParameter($key, $value, $type = null) - { - $filteredParameters = $this->parameters->filter( - function ($parameter) use ($key) - { - // Must not be identical because of string to integer conversion - return ($key == $parameter->getName()); - } - ); - - if (count($filteredParameters)) { - $parameter = $filteredParameters->first(); - $parameter->setValue($value, $type); - - return $this; - } - - $parameter = new Query\Parameter($key, $value, $type); - - $this->parameters->add($parameter); - - return $this; - } - - /** - * Sets a collection of query parameters for the query being constructed. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * ->where('u.id = :user_id1 OR u.id = :user_id2') - * ->setParameters(new ArrayCollection(array( - * new Parameter('user_id1', 1), - * new Parameter('user_id2', 2) - ))); - * - * - * @param \Doctrine\Common\Collections\ArrayCollection|array $params The query parameters to set. - * @return QueryBuilder This QueryBuilder instance. - */ - public function setParameters($parameters) - { - // BC compatibility with 2.3- - if (is_array($parameters)) { - $parameterCollection = new ArrayCollection(); - - foreach ($parameters as $key => $value) { - $parameter = new Query\Parameter($key, $value); - - $parameterCollection->add($parameter); - } - - $parameters = $parameterCollection; - } - - $this->parameters = $parameters; - - return $this; - } - - /** - * Gets all defined query parameters for the query being constructed. - * - * @return \Doctrine\Common\Collections\ArrayCollection The currently defined query parameters. - */ - public function getParameters() - { - return $this->parameters; - } - - /** - * Gets a (previously set) query parameter of the query being constructed. - * - * @param mixed $key The key (index or name) of the bound parameter. - * - * @return Query\Parameter|null The value of the bound parameter. - */ - public function getParameter($key) - { - $filteredParameters = $this->parameters->filter( - function ($parameter) use ($key) - { - // Must not be identical because of string to integer conversion - return ($key == $parameter->getName()); - } - ); - - return count($filteredParameters) ? $filteredParameters->first() : null; - } - - /** - * Sets the position of the first result to retrieve (the "offset"). - * - * @param integer $firstResult The first result to return. - * @return QueryBuilder This QueryBuilder instance. - */ - public function setFirstResult($firstResult) - { - $this->_firstResult = $firstResult; - - return $this; - } - - /** - * Gets the position of the first result the query object was set to retrieve (the "offset"). - * Returns NULL if {@link setFirstResult} was not applied to this QueryBuilder. - * - * @return integer The position of the first result. - */ - public function getFirstResult() - { - return $this->_firstResult; - } - - /** - * Sets the maximum number of results to retrieve (the "limit"). - * - * @param integer $maxResults The maximum number of results to retrieve. - * @return QueryBuilder This QueryBuilder instance. - */ - public function setMaxResults($maxResults) - { - $this->_maxResults = $maxResults; - - return $this; - } - - /** - * Gets the maximum number of results the query object was set to retrieve (the "limit"). - * Returns NULL if {@link setMaxResults} was not applied to this query builder. - * - * @return integer Maximum number of results. - */ - public function getMaxResults() - { - return $this->_maxResults; - } - - /** - * Either appends to or replaces a single, generic query part. - * - * The available parts are: 'select', 'from', 'join', 'set', 'where', - * 'groupBy', 'having' and 'orderBy'. - * - * @param string $dqlPartName - * @param string $dqlPart - * @param string $append - * @return QueryBuilder This QueryBuilder instance. - */ - public function add($dqlPartName, $dqlPart, $append = false) - { - $isMultiple = is_array($this->_dqlParts[$dqlPartName]); - - // This is introduced for backwards compatibility reasons. - // TODO: Remove for 3.0 - if ($dqlPartName == 'join') { - $newDqlPart = array(); - - foreach ($dqlPart as $k => $v) { - $k = is_numeric($k) ? $this->getRootAlias() : $k; - - $newDqlPart[$k] = $v; - } - - $dqlPart = $newDqlPart; - } - - if ($append && $isMultiple) { - if (is_array($dqlPart)) { - $key = key($dqlPart); - - $this->_dqlParts[$dqlPartName][$key][] = $dqlPart[$key]; - } else { - $this->_dqlParts[$dqlPartName][] = $dqlPart; - } - } else { - $this->_dqlParts[$dqlPartName] = ($isMultiple) ? array($dqlPart) : $dqlPart; - } - - $this->_state = self::STATE_DIRTY; - - return $this; - } - - /** - * Specifies an item that is to be returned in the query result. - * Replaces any previously specified selections, if any. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u', 'p') - * ->from('User', 'u') - * ->leftJoin('u.Phonenumbers', 'p'); - * - * - * @param mixed $select The selection expressions. - * @return QueryBuilder This QueryBuilder instance. - */ - public function select($select = null) - { - $this->_type = self::SELECT; - - if (empty($select)) { - return $this; - } - - $selects = is_array($select) ? $select : func_get_args(); - - return $this->add('select', new Expr\Select($selects), false); - } - - /** - * Add a DISTINCT flag to this query. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->distinct() - * ->from('User', 'u'); - * - * - * @param bool - * @return QueryBuilder - */ - public function distinct($flag = true) - { - $this->_dqlParts['distinct'] = (bool) $flag; - - return $this; - } - - /** - * Adds an item that is to be returned in the query result. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->addSelect('p') - * ->from('User', 'u') - * ->leftJoin('u.Phonenumbers', 'p'); - * - * - * @param mixed $select The selection expression. - * @return QueryBuilder This QueryBuilder instance. - */ - public function addSelect($select = null) - { - $this->_type = self::SELECT; - - if (empty($select)) { - return $this; - } - - $selects = is_array($select) ? $select : func_get_args(); - - return $this->add('select', new Expr\Select($selects), true); - } - - /** - * Turns the query being built into a bulk delete query that ranges over - * a certain entity type. - * - * - * $qb = $em->createQueryBuilder() - * ->delete('User', 'u') - * ->where('u.id = :user_id'); - * ->setParameter('user_id', 1); - * - * - * @param string $delete The class/type whose instances are subject to the deletion. - * @param string $alias The class/type alias used in the constructed query. - * @return QueryBuilder This QueryBuilder instance. - */ - public function delete($delete = null, $alias = null) - { - $this->_type = self::DELETE; - - if ( ! $delete) { - return $this; - } - - return $this->add('from', new Expr\From($delete, $alias)); - } - - /** - * Turns the query being built into a bulk update query that ranges over - * a certain entity type. - * - * - * $qb = $em->createQueryBuilder() - * ->update('User', 'u') - * ->set('u.password', md5('password')) - * ->where('u.id = ?'); - * - * - * @param string $update The class/type whose instances are subject to the update. - * @param string $alias The class/type alias used in the constructed query. - * @return QueryBuilder This QueryBuilder instance. - */ - public function update($update = null, $alias = null) - { - $this->_type = self::UPDATE; - - if ( ! $update) { - return $this; - } - - return $this->add('from', new Expr\From($update, $alias)); - } - - /** - * Create and add a query root corresponding to the entity identified by the given alias, - * forming a cartesian product with any existing query roots. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * - * - * @param string $from The class name. - * @param string $alias The alias of the class. - * @param string $indexBy The index for the from. - * @return QueryBuilder This QueryBuilder instance. - */ - public function from($from, $alias, $indexBy = null) - { - return $this->add('from', new Expr\From($from, $alias, $indexBy), true); - } - - /** - * Creates and adds a join over an entity association to the query. - * - * The entities in the joined association will be fetched as part of the query - * result if the alias used for the joined association is placed in the select - * expressions. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * ->join('u.Phonenumbers', 'p', Expr\Join::WITH, 'p.is_primary = 1'); - * - * - * @param string $join The relationship to join - * @param string $alias The alias of the join - * @param string $conditionType The condition type constant. Either ON or WITH. - * @param string $condition The condition for the join - * @param string $indexBy The index for the join - * @return QueryBuilder This QueryBuilder instance. - */ - public function join($join, $alias, $conditionType = null, $condition = null, $indexBy = null) - { - return $this->innerJoin($join, $alias, $conditionType, $condition, $indexBy); - } - - /** - * Creates and adds a join over an entity association to the query. - * - * The entities in the joined association will be fetched as part of the query - * result if the alias used for the joined association is placed in the select - * expressions. - * - * [php] - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * ->innerJoin('u.Phonenumbers', 'p', Expr\Join::WITH, 'p.is_primary = 1'); - * - * @param string $join The relationship to join - * @param string $alias The alias of the join - * @param string $conditionType The condition type constant. Either ON or WITH. - * @param string $condition The condition for the join - * @param string $indexBy The index for the join - * @return QueryBuilder This QueryBuilder instance. - */ - public function innerJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null) - { - $parentAlias = substr($join, 0, strpos($join, '.')); - - $rootAlias = $this->findRootAlias($alias, $parentAlias); - - $join = new Expr\Join( - Expr\Join::INNER_JOIN, $join, $alias, $conditionType, $condition, $indexBy - ); - - return $this->add('join', array($rootAlias => $join), true); - } - - /** - * Creates and adds a left join over an entity association to the query. - * - * The entities in the joined association will be fetched as part of the query - * result if the alias used for the joined association is placed in the select - * expressions. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * ->leftJoin('u.Phonenumbers', 'p', Expr\Join::WITH, 'p.is_primary = 1'); - * - * - * @param string $join The relationship to join - * @param string $alias The alias of the join - * @param string $conditionType The condition type constant. Either ON or WITH. - * @param string $condition The condition for the join - * @param string $indexBy The index for the join - * @return QueryBuilder This QueryBuilder instance. - */ - public function leftJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null) - { - $parentAlias = substr($join, 0, strpos($join, '.')); - - $rootAlias = $this->findRootAlias($alias, $parentAlias); - - $join = new Expr\Join( - Expr\Join::LEFT_JOIN, $join, $alias, $conditionType, $condition, $indexBy - ); - - return $this->add('join', array($rootAlias => $join), true); - } - - /** - * Sets a new value for a field in a bulk update query. - * - * - * $qb = $em->createQueryBuilder() - * ->update('User', 'u') - * ->set('u.password', md5('password')) - * ->where('u.id = ?'); - * - * - * @param string $key The key/field to set. - * @param string $value The value, expression, placeholder, etc. - * @return QueryBuilder This QueryBuilder instance. - */ - public function set($key, $value) - { - return $this->add('set', new Expr\Comparison($key, Expr\Comparison::EQ, $value), true); - } - - /** - * Specifies one or more restrictions to the query result. - * Replaces any previously specified restrictions, if any. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * ->where('u.id = ?'); - * - * // You can optionally programatically build and/or expressions - * $qb = $em->createQueryBuilder(); - * - * $or = $qb->expr()->orx(); - * $or->add($qb->expr()->eq('u.id', 1)); - * $or->add($qb->expr()->eq('u.id', 2)); - * - * $qb->update('User', 'u') - * ->set('u.password', md5('password')) - * ->where($or); - * - * - * @param mixed $predicates The restriction predicates. - * @return QueryBuilder This QueryBuilder instance. - */ - public function where($predicates) - { - if ( ! (func_num_args() == 1 && $predicates instanceof Expr\Composite)) { - $predicates = new Expr\Andx(func_get_args()); - } - - return $this->add('where', $predicates); - } - - /** - * Adds one or more restrictions to the query results, forming a logical - * conjunction with any previously specified restrictions. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * ->where('u.username LIKE ?') - * ->andWhere('u.is_active = 1'); - * - * - * @param mixed $where The query restrictions. - * @return QueryBuilder This QueryBuilder instance. - * @see where() - */ - public function andWhere($where) - { - $where = $this->getDQLPart('where'); - $args = func_get_args(); - - if ($where instanceof Expr\Andx) { - $where->addMultiple($args); - } else { - array_unshift($args, $where); - $where = new Expr\Andx($args); - } - - return $this->add('where', $where, true); - } - - /** - * Adds one or more restrictions to the query results, forming a logical - * disjunction with any previously specified restrictions. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * ->where('u.id = 1') - * ->orWhere('u.id = 2'); - * - * - * @param mixed $where The WHERE statement - * @return QueryBuilder $qb - * @see where() - */ - public function orWhere($where) - { - $where = $this->getDqlPart('where'); - $args = func_get_args(); - - if ($where instanceof Expr\Orx) { - $where->addMultiple($args); - } else { - array_unshift($args, $where); - $where = new Expr\Orx($args); - } - - return $this->add('where', $where, true); - } - - /** - * Specifies a grouping over the results of the query. - * Replaces any previously specified groupings, if any. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * ->groupBy('u.id'); - * - * - * @param string $groupBy The grouping expression. - * @return QueryBuilder This QueryBuilder instance. - */ - public function groupBy($groupBy) - { - return $this->add('groupBy', new Expr\GroupBy(func_get_args())); - } - - - /** - * Adds a grouping expression to the query. - * - * - * $qb = $em->createQueryBuilder() - * ->select('u') - * ->from('User', 'u') - * ->groupBy('u.lastLogin'); - * ->addGroupBy('u.createdAt') - * - * - * @param string $groupBy The grouping expression. - * @return QueryBuilder This QueryBuilder instance. - */ - public function addGroupBy($groupBy) - { - return $this->add('groupBy', new Expr\GroupBy(func_get_args()), true); - } - - /** - * Specifies a restriction over the groups of the query. - * Replaces any previous having restrictions, if any. - * - * @param mixed $having The restriction over the groups. - * @return QueryBuilder This QueryBuilder instance. - */ - public function having($having) - { - if ( ! (func_num_args() == 1 && ($having instanceof Expr\Andx || $having instanceof Expr\Orx))) { - $having = new Expr\Andx(func_get_args()); - } - - return $this->add('having', $having); - } - - /** - * Adds a restriction over the groups of the query, forming a logical - * conjunction with any existing having restrictions. - * - * @param mixed $having The restriction to append. - * @return QueryBuilder This QueryBuilder instance. - */ - public function andHaving($having) - { - $having = $this->getDqlPart('having'); - $args = func_get_args(); - - if ($having instanceof Expr\Andx) { - $having->addMultiple($args); - } else { - array_unshift($args, $having); - $having = new Expr\Andx($args); - } - - return $this->add('having', $having); - } - - /** - * Adds a restriction over the groups of the query, forming a logical - * disjunction with any existing having restrictions. - * - * @param mixed $having The restriction to add. - * @return QueryBuilder This QueryBuilder instance. - */ - public function orHaving($having) - { - $having = $this->getDqlPart('having'); - $args = func_get_args(); - - if ($having instanceof Expr\Orx) { - $having->addMultiple($args); - } else { - array_unshift($args, $having); - $having = new Expr\Orx($args); - } - - return $this->add('having', $having); - } - - /** - * Specifies an ordering for the query results. - * Replaces any previously specified orderings, if any. - * - * @param string $sort The ordering expression. - * @param string $order The ordering direction. - * @return QueryBuilder This QueryBuilder instance. - */ - public function orderBy($sort, $order = null) - { - $orderBy = ($sort instanceof Expr\OrderBy) ? $sort : new Expr\OrderBy($sort, $order); - - return $this->add('orderBy', $orderBy); - } - - /** - * Adds an ordering to the query results. - * - * @param string $sort The ordering expression. - * @param string $order The ordering direction. - * @return QueryBuilder This QueryBuilder instance. - */ - public function addOrderBy($sort, $order = null) - { - return $this->add('orderBy', new Expr\OrderBy($sort, $order), true); - } - - /** - * Get a query part by its name. - * - * @param string $queryPartName - * @return mixed $queryPart - * @todo Rename: getQueryPart (or remove?) - */ - public function getDQLPart($queryPartName) - { - return $this->_dqlParts[$queryPartName]; - } - - /** - * Get all query parts. - * - * @return array $dqlParts - * @todo Rename: getQueryParts (or remove?) - */ - public function getDQLParts() - { - return $this->_dqlParts; - } - - private function _getDQLForDelete() - { - return 'DELETE' - . $this->_getReducedDQLQueryPart('from', array('pre' => ' ', 'separator' => ', ')) - . $this->_getReducedDQLQueryPart('where', array('pre' => ' WHERE ')) - . $this->_getReducedDQLQueryPart('orderBy', array('pre' => ' ORDER BY ', 'separator' => ', ')); - } - - private function _getDQLForUpdate() - { - return 'UPDATE' - . $this->_getReducedDQLQueryPart('from', array('pre' => ' ', 'separator' => ', ')) - . $this->_getReducedDQLQueryPart('set', array('pre' => ' SET ', 'separator' => ', ')) - . $this->_getReducedDQLQueryPart('where', array('pre' => ' WHERE ')) - . $this->_getReducedDQLQueryPart('orderBy', array('pre' => ' ORDER BY ', 'separator' => ', ')); - } - - private function _getDQLForSelect() - { - $dql = 'SELECT' - . ($this->_dqlParts['distinct']===true ? ' DISTINCT' : '') - . $this->_getReducedDQLQueryPart('select', array('pre' => ' ', 'separator' => ', ')); - - $fromParts = $this->getDQLPart('from'); - $joinParts = $this->getDQLPart('join'); - $fromClauses = array(); - - // Loop through all FROM clauses - if ( ! empty($fromParts)) { - $dql .= ' FROM '; - - foreach ($fromParts as $from) { - $fromClause = (string) $from; - - if ($from instanceof Expr\From && isset($joinParts[$from->getAlias()])) { - foreach ($joinParts[$from->getAlias()] as $join) { - $fromClause .= ' ' . ((string) $join); - } - } - - $fromClauses[] = $fromClause; - } - } - - $dql .= implode(', ', $fromClauses) - . $this->_getReducedDQLQueryPart('where', array('pre' => ' WHERE ')) - . $this->_getReducedDQLQueryPart('groupBy', array('pre' => ' GROUP BY ', 'separator' => ', ')) - . $this->_getReducedDQLQueryPart('having', array('pre' => ' HAVING ')) - . $this->_getReducedDQLQueryPart('orderBy', array('pre' => ' ORDER BY ', 'separator' => ', ')); - - return $dql; - } - - private function _getReducedDQLQueryPart($queryPartName, $options = array()) - { - $queryPart = $this->getDQLPart($queryPartName); - - if (empty($queryPart)) { - return (isset($options['empty']) ? $options['empty'] : ''); - } - - return (isset($options['pre']) ? $options['pre'] : '') - . (is_array($queryPart) ? implode($options['separator'], $queryPart) : $queryPart) - . (isset($options['post']) ? $options['post'] : ''); - } - - /** - * Reset DQL parts - * - * @param array $parts - * @return QueryBuilder - */ - public function resetDQLParts($parts = null) - { - if (is_null($parts)) { - $parts = array_keys($this->_dqlParts); - } - - foreach ($parts as $part) { - $this->resetDQLPart($part); - } - - return $this; - } - - /** - * Reset single DQL part - * - * @param string $part - * @return QueryBuilder; - */ - public function resetDQLPart($part) - { - $this->_dqlParts[$part] = is_array($this->_dqlParts[$part]) ? array() : null; - $this->_state = self::STATE_DIRTY; - - return $this; - } - - /** - * Gets a string representation of this QueryBuilder which corresponds to - * the final DQL query being constructed. - * - * @return string The string representation of this QueryBuilder. - */ - public function __toString() - { - return $this->getDQL(); - } - - /** - * Deep clone of all expression objects in the DQL parts. - * - * @return void - */ - public function __clone() - { - foreach ($this->_dqlParts as $part => $elements) { - if (is_array($this->_dqlParts[$part])) { - foreach ($this->_dqlParts[$part] as $idx => $element) { - if (is_object($element)) { - $this->_dqlParts[$part][$idx] = clone $element; - } - } - } else if (is_object($elements)) { - $this->_dqlParts[$part] = clone $elements; - } - } - - $parameters = array(); - - foreach ($this->parameters as $parameter) { - $parameters[] = clone $parameter; - } - - $this->parameters = new ArrayCollection($parameters); - } -} diff --git a/framework/library/Doctrine/ORM/README.markdown b/framework/library/Doctrine/ORM/README.markdown deleted file mode 100644 index e69de29..0000000 diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/ClearCache/MetadataCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/ClearCache/MetadataCommand.php deleted file mode 100644 index c01d964..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/ClearCache/MetadataCommand.php +++ /dev/null @@ -1,103 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command\ClearCache; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console, - Doctrine\Common\Cache; - -/** - * Command to clear the metadata cache of the various cache drivers. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class MetadataCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:clear-cache:metadata') - ->setDescription('Clear all metadata cache of the various cache drivers.') - ->setDefinition(array( - new InputOption( - 'flush', null, InputOption::VALUE_NONE, - 'If defined, cache entries will be flushed instead of deleted/invalidated.' - ) - )); - - $this->setHelp(<<%command.name% command is meant to clear the metadata cache of associated Entity Manager. -It is possible to invalidate all cache entries at once - called delete -, or flushes the cache provider -instance completely. - -The execution type differ on how you execute the command. -If you want to invalidate the entries (and not delete from cache instance), this command would do the work: - -%command.name% - -Alternatively, if you want to flush the cache provider using this command: - -%command.name% --flush - -Finally, be aware that if --flush option is passed, not all cache providers are able to flush entries, -because of a limitation of its execution nature. -EOT - ); - } - - /** - * @see Console\Command\Command - */ - protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output) - { - $em = $this->getHelper('em')->getEntityManager(); - $cacheDriver = $em->getConfiguration()->getMetadataCacheImpl(); - - if ( ! $cacheDriver) { - throw new \InvalidArgumentException('No Metadata cache driver is configured on given EntityManager.'); - } - - if ($cacheDriver instanceof Cache\ApcCache) { - throw new \LogicException("Cannot clear APC Cache from Console, its shared in the Webserver memory and not accessible from the CLI."); - } - - $output->write('Clearing ALL Metadata cache entries' . PHP_EOL); - - $result = $cacheDriver->deleteAll(); - $message = ($result) ? 'Successfully deleted cache entries.' : 'No cache entries were deleted.'; - - if (true === $input->getOption('flush')) { - $result = $cacheDriver->flushAll(); - $message = ($result) ? 'Successfully flushed cache entries.' : $message; - } - - $output->write($message . PHP_EOL); - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/ClearCache/QueryCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/ClearCache/QueryCommand.php deleted file mode 100644 index a984b96..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/ClearCache/QueryCommand.php +++ /dev/null @@ -1,103 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command\ClearCache; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console, - Doctrine\Common\Cache; - -/** - * Command to clear the query cache of the various cache drivers. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class QueryCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:clear-cache:query') - ->setDescription('Clear all query cache of the various cache drivers.') - ->setDefinition(array( - new InputOption( - 'flush', null, InputOption::VALUE_NONE, - 'If defined, cache entries will be flushed instead of deleted/invalidated.' - ) - )); - - $this->setHelp(<<%command.name% command is meant to clear the query cache of associated Entity Manager. -It is possible to invalidate all cache entries at once - called delete -, or flushes the cache provider -instance completely. - -The execution type differ on how you execute the command. -If you want to invalidate the entries (and not delete from cache instance), this command would do the work: - -%command.name% - -Alternatively, if you want to flush the cache provider using this command: - -%command.name% --flush - -Finally, be aware that if --flush option is passed, not all cache providers are able to flush entries, -because of a limitation of its execution nature. -EOT - ); - } - - /** - * @see Console\Command\Command - */ - protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output) - { - $em = $this->getHelper('em')->getEntityManager(); - $cacheDriver = $em->getConfiguration()->getQueryCacheImpl(); - - if ( ! $cacheDriver) { - throw new \InvalidArgumentException('No Query cache driver is configured on given EntityManager.'); - } - - if ($cacheDriver instanceof Cache\ApcCache) { - throw new \LogicException("Cannot clear APC Cache from Console, its shared in the Webserver memory and not accessible from the CLI."); - } - - $output->write('Clearing ALL Query cache entries' . PHP_EOL); - - $result = $cacheDriver->deleteAll(); - $message = ($result) ? 'Successfully deleted cache entries.' : 'No cache entries were deleted.'; - - if (true === $input->getOption('flush')) { - $result = $cacheDriver->flushAll(); - $message = ($result) ? 'Successfully flushed cache entries.' : $message; - } - - $output->write($message . PHP_EOL); - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/ClearCache/ResultCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/ClearCache/ResultCommand.php deleted file mode 100644 index 096aa53..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/ClearCache/ResultCommand.php +++ /dev/null @@ -1,103 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command\ClearCache; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console, - Doctrine\Common\Cache; - -/** - * Command to clear the result cache of the various cache drivers. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ResultCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:clear-cache:result') - ->setDescription('Clear all result cache of the various cache drivers.') - ->setDefinition(array( - new InputOption( - 'flush', null, InputOption::VALUE_NONE, - 'If defined, cache entries will be flushed instead of deleted/invalidated.' - ) - )); - - $this->setHelp(<<%command.name% command is meant to clear the result cache of associated Entity Manager. -It is possible to invalidate all cache entries at once - called delete -, or flushes the cache provider -instance completely. - -The execution type differ on how you execute the command. -If you want to invalidate the entries (and not delete from cache instance), this command would do the work: - -%command.name% - -Alternatively, if you want to flush the cache provider using this command: - -%command.name% --flush - -Finally, be aware that if --flush option is passed, not all cache providers are able to flush entries, -because of a limitation of its execution nature. -EOT - ); - } - - /** - * @see Console\Command\Command - */ - protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output) - { - $em = $this->getHelper('em')->getEntityManager(); - $cacheDriver = $em->getConfiguration()->getResultCacheImpl(); - - if ( ! $cacheDriver) { - throw new \InvalidArgumentException('No Result cache driver is configured on given EntityManager.'); - } - - if ($cacheDriver instanceof Cache\ApcCache) { - throw new \LogicException("Cannot clear APC Cache from Console, its shared in the Webserver memory and not accessible from the CLI."); - } - - $output->write('Clearing ALL Result cache entries' . PHP_EOL); - - $result = $cacheDriver->deleteAll(); - $message = ($result) ? 'Successfully deleted cache entries.' : 'No cache entries were deleted.'; - - if (true === $input->getOption('flush')) { - $result = $cacheDriver->flushAll(); - $message = ($result) ? 'Successfully flushed cache entries.' : $message; - } - - $output->write($message . PHP_EOL); - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/ConvertDoctrine1SchemaCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/ConvertDoctrine1SchemaCommand.php deleted file mode 100644 index a964299..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/ConvertDoctrine1SchemaCommand.php +++ /dev/null @@ -1,220 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console, - Doctrine\ORM\Tools\Export\ClassMetadataExporter, - Doctrine\ORM\Tools\ConvertDoctrine1Schema, - Doctrine\ORM\Tools\EntityGenerator; - -/** - * Command to convert a Doctrine 1 schema to a Doctrine 2 mapping file. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -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 - */ - protected function configure() - { - $this - ->setName('orm:convert-d1-schema') - ->setDescription('Converts Doctrine 1.X schema into a Doctrine 2.X schema.') - ->setDefinition(array( - new InputArgument( - 'from-path', InputArgument::REQUIRED, 'The path of Doctrine 1.X schema information.' - ), - new InputArgument( - 'to-type', InputArgument::REQUIRED, 'The destination Doctrine 2.X mapping type.' - ), - new InputArgument( - 'dest-path', InputArgument::REQUIRED, - 'The path to generate your Doctrine 2.X mapping information.' - ), - new InputOption( - 'from', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, - 'Optional paths of Doctrine 1.X schema information.', - array() - ), - new InputOption( - 'extend', null, InputOption::VALUE_OPTIONAL, - 'Defines a base class to be extended by generated entity classes.' - ), - new InputOption( - 'num-spaces', null, InputOption::VALUE_OPTIONAL, - 'Defines the number of indentation spaces', 4 - ) - )) - ->setHelp(<<getHelper('em')->getEntityManager(); - - // 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); - - if ( ! file_exists($dirName)) { - throw new \InvalidArgumentException( - sprintf("Doctrine 1.X schema directory '%s' does not exist.", $dirName) - ); - } else if ( ! is_readable($dirName)) { - throw new \InvalidArgumentException( - sprintf("Doctrine 1.X schema directory '%s' does not have read permissions.", $dirName) - ); - } - } - - if ( ! file_exists($destPath)) { - throw new \InvalidArgumentException( - sprintf("Doctrine 2.X mapping destination directory '%s' does not exist.", $destPath) - ); - } else if ( ! is_writable($destPath)) { - throw new \InvalidArgumentException( - sprintf("Doctrine 2.X mapping destination directory '%s' does not have write permissions.", $destPath) - ); - } - - $cme = $this->getMetadataExporter(); - $exporter = $cme->getExporter($toType, $destPath); - - if (strtolower($toType) === 'annotation') { - $entityGenerator = $this->getEntityGenerator(); - $exporter->setEntityGenerator($entityGenerator); - - $entityGenerator->setNumSpaces($numSpaces); - - if ($extend !== null) { - $entityGenerator->setClassToExtend($extend); - } - } - - $converter = new ConvertDoctrine1Schema($fromPaths); - $metadata = $converter->getMetadata(); - - if ($metadata) { - $output->write(PHP_EOL); - - foreach ($metadata as $class) { - $output->write(sprintf('Processing entity "%s"', $class->name) . PHP_EOL); - } - - $exporter->setMetadata($metadata); - $exporter->export(); - - $output->write(PHP_EOL . sprintf( - 'Converting Doctrine 1.X schema to "%s" mapping type in "%s"', $toType, $destPath - )); - } else { - $output->write('No Metadata Classes to process.' . PHP_EOL); - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/ConvertMappingCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/ConvertMappingCommand.php deleted file mode 100644 index 84070fb..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/ConvertMappingCommand.php +++ /dev/null @@ -1,183 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console, - Doctrine\ORM\Tools\Console\MetadataFilter, - Doctrine\ORM\Tools\Export\ClassMetadataExporter, - Doctrine\ORM\Tools\EntityGenerator, - Doctrine\ORM\Tools\DisconnectedClassMetadataFactory; - -/** - * Command to convert your mapping information between the various formats. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ConvertMappingCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:convert-mapping') - ->setDescription('Convert mapping information between supported formats.') - ->setDefinition(array( - new InputOption( - 'filter', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, - 'A string pattern used to match entities that should be processed.' - ), - new InputArgument( - 'to-type', InputArgument::REQUIRED, 'The mapping type to be converted.' - ), - new InputArgument( - 'dest-path', InputArgument::REQUIRED, - 'The path to generate your entities classes.' - ), - new InputOption( - 'force', null, InputOption::VALUE_NONE, - 'Force to overwrite existing mapping files.' - ), - new InputOption( - 'from-database', null, null, 'Whether or not to convert mapping information from existing database.' - ), - new InputOption( - 'extend', null, InputOption::VALUE_OPTIONAL, - 'Defines a base class to be extended by generated entity classes.' - ), - new InputOption( - 'num-spaces', null, InputOption::VALUE_OPTIONAL, - 'Defines the number of indentation spaces', 4 - ), - new InputOption( - 'namespace', null, InputOption::VALUE_OPTIONAL, - 'Defines a namespace for the generated entity classes, if converted from database.' - ), - )) - ->setHelp(<<one-time command. It should not be necessary for -you to call this method multiple times, escpecially when using the --from-database -flag. - -Converting an existing databsae schema into mapping files only solves about 70-80% -of the necessary mapping information. Additionally the detection from an existing -database cannot detect inverse associations, inheritance types, -entities with foreign keys as primary keys and many of the -semantical operations on associations such as cascade. - -Hint: There is no need to convert YAML or XML mapping files to annotations -every time you make changes. All mapping drivers are first class citizens -in Doctrine 2 and can be used as runtime mapping for the ORM. -EOT - ); - } - - /** - * @see Console\Command\Command - */ - protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output) - { - $em = $this->getHelper('em')->getEntityManager(); - - if ($input->getOption('from-database') === true) { - $databaseDriver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver( - $em->getConnection()->getSchemaManager() - ); - - $em->getConfiguration()->setMetadataDriverImpl( - $databaseDriver - ); - - if (($namespace = $input->getOption('namespace')) !== null) { - $databaseDriver->setNamespace($namespace); - } - } - - $cmf = new DisconnectedClassMetadataFactory(); - $cmf->setEntityManager($em); - $metadata = $cmf->getAllMetadata(); - $metadata = MetadataFilter::filter($metadata, $input->getOption('filter')); - - // Process destination directory - if ( ! is_dir($destPath = $input->getArgument('dest-path'))) { - mkdir($destPath, 0777, true); - } - $destPath = realpath($destPath); - - if ( ! file_exists($destPath)) { - throw new \InvalidArgumentException( - sprintf("Mapping destination directory '%s' does not exist.", $input->getArgument('dest-path')) - ); - } else if ( ! is_writable($destPath)) { - throw new \InvalidArgumentException( - sprintf("Mapping destination directory '%s' does not have write permissions.", $destPath) - ); - } - - $toType = strtolower($input->getArgument('to-type')); - - $exporter = $this->getExporter($toType, $destPath); - $exporter->setOverwriteExistingFiles( ($input->getOption('force') !== false) ); - - if ($toType == 'annotation') { - $entityGenerator = new EntityGenerator(); - $exporter->setEntityGenerator($entityGenerator); - - $entityGenerator->setNumSpaces($input->getOption('num-spaces')); - - if (($extend = $input->getOption('extend')) !== null) { - $entityGenerator->setClassToExtend($extend); - } - } - - if (count($metadata)) { - foreach ($metadata as $class) { - $output->write(sprintf('Processing entity "%s"', $class->name) . PHP_EOL); - } - - $exporter->setMetadata($metadata); - $exporter->export(); - - $output->write(PHP_EOL . sprintf( - 'Exporting "%s" mapping information to "%s"' . PHP_EOL, $toType, $destPath - )); - } else { - $output->write('No Metadata Classes to process.' . PHP_EOL); - } - } - - protected function getExporter($toType, $destPath) - { - $cme = new ClassMetadataExporter(); - - return $cme->getExporter($toType, $destPath); - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/EnsureProductionSettingsCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/EnsureProductionSettingsCommand.php deleted file mode 100644 index 53f90b2..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/EnsureProductionSettingsCommand.php +++ /dev/null @@ -1,83 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console; - -/** - * Command to ensure that Doctrine is properly configured for a production environment. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class EnsureProductionSettingsCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:ensure-production-settings') - ->setDescription('Verify that Doctrine is properly configured for a production environment.') - ->setDefinition(array( - new InputOption( - 'complete', null, InputOption::VALUE_NONE, - 'Flag to also inspect database connection existance.' - ) - )) - ->setHelp(<<getHelper('em')->getEntityManager(); - - $error = false; - try { - $em->getConfiguration()->ensureProductionSettings(); - - if ($input->getOption('complete') !== null) { - $em->getConnection()->connect(); - } - } catch (\Exception $e) { - $error = true; - $output->writeln('' . $e->getMessage() . ''); - } - - if ($error === false) { - $output->write('Environment is correctly configured for production.' . PHP_EOL); - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/GenerateEntitiesCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/GenerateEntitiesCommand.php deleted file mode 100644 index 7210b6b..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/GenerateEntitiesCommand.php +++ /dev/null @@ -1,160 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console, - Doctrine\ORM\Tools\Console\MetadataFilter, - Doctrine\ORM\Tools\EntityGenerator, - Doctrine\ORM\Tools\DisconnectedClassMetadataFactory; - -/** - * Command to generate entity classes and method stubs from your mapping information. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class GenerateEntitiesCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:generate-entities') - ->setDescription('Generate entity classes and method stubs from your mapping information.') - ->setDefinition(array( - new InputOption( - 'filter', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, - 'A string pattern used to match entities that should be processed.' - ), - new InputArgument( - 'dest-path', InputArgument::REQUIRED, 'The path to generate your entity classes.' - ), - new InputOption( - 'generate-annotations', null, InputOption::VALUE_OPTIONAL, - 'Flag to define if generator should generate annotation metadata on entities.', false - ), - new InputOption( - 'generate-methods', null, InputOption::VALUE_OPTIONAL, - 'Flag to define if generator should generate stub methods on entities.', true - ), - new InputOption( - 'regenerate-entities', null, InputOption::VALUE_OPTIONAL, - 'Flag to define if generator should regenerate entity if it exists.', false - ), - new InputOption( - 'update-entities', null, InputOption::VALUE_OPTIONAL, - 'Flag to define if generator should only update entity if it exists.', true - ), - new InputOption( - 'extend', null, InputOption::VALUE_OPTIONAL, - 'Defines a base class to be extended by generated entity classes.' - ), - new InputOption( - 'num-spaces', null, InputOption::VALUE_OPTIONAL, - 'Defines the number of indentation spaces', 4 - ) - )) - ->setHelp(<<--update-entities or --regenerate-entities flags your existing -code gets overwritten. The EntityGenerator will only append new code to your -file and will not delete the old code. However this approach may still be prone -to error and we suggest you use code repositories such as GIT or SVN to make -backups of your code. - -It makes sense to generate the entity code if you are using entities as Data -Access Objects only and dont put much additional logic on them. If you are -however putting much more logic on the entities you should refrain from using -the entity-generator and code your entities manually. - -Important: Even if you specified Inheritance options in your -XML or YAML Mapping files the generator cannot generate the base and -child classes for you correctly, because it doesn't know which -class is supposed to extend which. You have to adjust the entity -code manually for inheritance to work! -EOT - ); - } - - /** - * @see Console\Command\Command - */ - protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output) - { - $em = $this->getHelper('em')->getEntityManager(); - - $cmf = new DisconnectedClassMetadataFactory(); - $cmf->setEntityManager($em); - $metadatas = $cmf->getAllMetadata(); - $metadatas = MetadataFilter::filter($metadatas, $input->getOption('filter')); - - // Process destination directory - $destPath = realpath($input->getArgument('dest-path')); - - if ( ! file_exists($destPath)) { - throw new \InvalidArgumentException( - sprintf("Entities destination directory '%s' does not exist.", $input->getArgument('dest-path')) - ); - } else if ( ! is_writable($destPath)) { - throw new \InvalidArgumentException( - sprintf("Entities destination directory '%s' does not have write permissions.", $destPath) - ); - } - - if (count($metadatas)) { - // Create EntityGenerator - $entityGenerator = new EntityGenerator(); - - $entityGenerator->setGenerateAnnotations($input->getOption('generate-annotations')); - $entityGenerator->setGenerateStubMethods($input->getOption('generate-methods')); - $entityGenerator->setRegenerateEntityIfExists($input->getOption('regenerate-entities')); - $entityGenerator->setUpdateEntityIfExists($input->getOption('update-entities')); - $entityGenerator->setNumSpaces($input->getOption('num-spaces')); - - if (($extend = $input->getOption('extend')) !== null) { - $entityGenerator->setClassToExtend($extend); - } - - foreach ($metadatas as $metadata) { - $output->write( - sprintf('Processing entity "%s"', $metadata->name) . PHP_EOL - ); - } - - // Generating Entities - $entityGenerator->generate($metadatas, $destPath); - - // Outputting information message - $output->write(PHP_EOL . sprintf('Entity classes generated to "%s"', $destPath) . PHP_EOL); - } else { - $output->write('No Metadata Classes to process.' . PHP_EOL); - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/GenerateProxiesCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/GenerateProxiesCommand.php deleted file mode 100644 index 2a7de9d..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/GenerateProxiesCommand.php +++ /dev/null @@ -1,112 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console, - Doctrine\ORM\Tools\Console\MetadataFilter; - -/** - * Command to (re)generate the proxy classes used by doctrine. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class GenerateProxiesCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:generate-proxies') - ->setDescription('Generates proxy classes for entity classes.') - ->setDefinition(array( - new InputOption( - 'filter', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, - 'A string pattern used to match entities that should be processed.' - ), - new InputArgument( - 'dest-path', InputArgument::OPTIONAL, - 'The path to generate your proxy classes. If none is provided, it will attempt to grab from configuration.' - ), - )) - ->setHelp(<<getHelper('em')->getEntityManager(); - - $metadatas = $em->getMetadataFactory()->getAllMetadata(); - $metadatas = MetadataFilter::filter($metadatas, $input->getOption('filter')); - - // Process destination directory - if (($destPath = $input->getArgument('dest-path')) === null) { - $destPath = $em->getConfiguration()->getProxyDir(); - } - - if ( ! is_dir($destPath)) { - mkdir($destPath, 0777, true); - } - - $destPath = realpath($destPath); - - if ( ! file_exists($destPath)) { - throw new \InvalidArgumentException( - sprintf("Proxies destination directory '%s' does not exist.", $em->getConfiguration()->getProxyDir()) - ); - } else if ( ! is_writable($destPath)) { - throw new \InvalidArgumentException( - sprintf("Proxies destination directory '%s' does not have write permissions.", $destPath) - ); - } - - if ( count($metadatas)) { - foreach ($metadatas as $metadata) { - $output->write( - sprintf('Processing entity "%s"', $metadata->name) . PHP_EOL - ); - } - - // Generating Proxies - $em->getProxyFactory()->generateProxyClasses($metadatas, $destPath); - - // Outputting information message - $output->write(PHP_EOL . sprintf('Proxy classes generated to "%s"', $destPath) . PHP_EOL); - } else { - $output->write('No Metadata Classes to process.' . PHP_EOL); - } - - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/GenerateRepositoriesCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/GenerateRepositoriesCommand.php deleted file mode 100644 index b716aee..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/GenerateRepositoriesCommand.php +++ /dev/null @@ -1,113 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console, - Doctrine\ORM\Tools\Console\MetadataFilter, - Doctrine\ORM\Tools\EntityRepositoryGenerator; - -/** - * Command to generate repository classes for mapping information. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class GenerateRepositoriesCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:generate-repositories') - ->setDescription('Generate repository classes from your mapping information.') - ->setDefinition(array( - new InputOption( - 'filter', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, - 'A string pattern used to match entities that should be processed.' - ), - new InputArgument( - 'dest-path', InputArgument::REQUIRED, 'The path to generate your repository classes.' - ) - )) - ->setHelp(<<getHelper('em')->getEntityManager(); - - $metadatas = $em->getMetadataFactory()->getAllMetadata(); - $metadatas = MetadataFilter::filter($metadatas, $input->getOption('filter')); - - // Process destination directory - $destPath = realpath($input->getArgument('dest-path')); - - if ( ! file_exists($destPath)) { - throw new \InvalidArgumentException( - sprintf("Entities destination directory '%s' does not exist.", $input->getArgument('dest-path')) - ); - } else if ( ! is_writable($destPath)) { - throw new \InvalidArgumentException( - sprintf("Entities destination directory '%s' does not have write permissions.", $destPath) - ); - } - - if (count($metadatas)) { - $numRepositories = 0; - $generator = new EntityRepositoryGenerator(); - - foreach ($metadatas as $metadata) { - if ($metadata->customRepositoryClassName) { - $output->write( - sprintf('Processing repository "%s"', $metadata->customRepositoryClassName) . PHP_EOL - ); - - $generator->writeEntityRepositoryClass($metadata->customRepositoryClassName, $destPath); - - $numRepositories++; - } - } - - if ($numRepositories) { - // Outputting information message - $output->write(PHP_EOL . sprintf('Repository classes generated to "%s"', $destPath) . PHP_EOL); - } else { - $output->write('No Repository classes were found to be processed.' . PHP_EOL); - } - } else { - $output->write('No Metadata Classes to process.' . PHP_EOL); - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/InfoCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/InfoCommand.php deleted file mode 100644 index b0902ba..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/InfoCommand.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command; - -use Doctrine\ORM\Mapping\MappingException; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Command\Command; - -/** - * Show information about mapped entities - * - * - * @link www.doctrine-project.org - * @since 2.1 - * @author Benjamin Eberlei - */ -class InfoCommand extends Command -{ - protected function configure() - { - $this - ->setName('orm:info') - ->setDescription('Show basic information about all mapped entities') - ->setHelp(<<%command.name% shows basic information about which -entities exist and possibly if their mapping information contains errors or -not. -EOT - ); - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - /* @var $entityManager \Doctrine\ORM\EntityManager */ - $entityManager = $this->getHelper('em')->getEntityManager(); - - $entityClassNames = $entityManager->getConfiguration() - ->getMetadataDriverImpl() - ->getAllClassNames(); - - if (!$entityClassNames) { - throw new \Exception( - 'You do not have any mapped Doctrine ORM entities according to the current configuration. '. - 'If you have entities or mapping files you should check your mapping configuration for errors.' - ); - } - - $output->writeln(sprintf("Found %d mapped entities:", count($entityClassNames))); - - foreach ($entityClassNames as $entityClassName) { - try { - $entityManager->getClassMetadata($entityClassName); - $output->writeln(sprintf("[OK] %s", $entityClassName)); - } catch (MappingException $e) { - $output->writeln("[FAIL] ".$entityClassName); - $output->writeln(sprintf("%s", $e->getMessage())); - $output->writeln(''); - } - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/RunDqlCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/RunDqlCommand.php deleted file mode 100644 index c9af93f..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/RunDqlCommand.php +++ /dev/null @@ -1,121 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console; - -/** - * Command to execute DQL queries in a given EntityManager. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class RunDqlCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:run-dql') - ->setDescription('Executes arbitrary DQL directly from the command line.') - ->setDefinition(array( - new InputArgument('dql', InputArgument::REQUIRED, 'The DQL to execute.'), - new InputOption( - 'hydrate', null, InputOption::VALUE_REQUIRED, - 'Hydration mode of result set. Should be either: object, array, scalar or single-scalar.', - 'object' - ), - new InputOption( - 'first-result', null, InputOption::VALUE_REQUIRED, - 'The first result in the result set.' - ), - new InputOption( - 'max-result', null, InputOption::VALUE_REQUIRED, - 'The maximum number of results in the result set.' - ), - new InputOption( - 'depth', null, InputOption::VALUE_REQUIRED, - 'Dumping depth of Entity graph.', 7 - ) - )) - ->setHelp(<<getHelper('em')->getEntityManager(); - - if (($dql = $input->getArgument('dql')) === null) { - throw new \RuntimeException("Argument 'DQL' 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"); - } - - $hydrationModeName = $input->getOption('hydrate'); - $hydrationMode = 'Doctrine\ORM\Query::HYDRATE_' . strtoupper(str_replace('-', '_', $hydrationModeName)); - - if ( ! defined($hydrationMode)) { - throw new \RuntimeException( - "Hydration mode '$hydrationModeName' does not exist. It should be either: object. array, scalar or single-scalar." - ); - } - - $query = $em->createQuery($dql); - - if (($firstResult = $input->getOption('first-result')) !== null) { - if ( ! is_numeric($firstResult)) { - throw new \LogicException("Option 'first-result' must contains an integer value"); - } - - $query->setFirstResult((int) $firstResult); - } - - if (($maxResult = $input->getOption('max-result')) !== null) { - if ( ! is_numeric($maxResult)) { - throw new \LogicException("Option 'max-result' must contains an integer value"); - } - - $query->setMaxResults((int) $maxResult); - } - - $resultSet = $query->execute(array(), constant($hydrationMode)); - - \Doctrine\Common\Util\Debug::dump($resultSet, $input->getOption('depth')); - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/AbstractCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/AbstractCommand.php deleted file mode 100644 index a87eb20..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/AbstractCommand.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command\SchemaTool; - -use Symfony\Component\Console\Input\InputInterface, - Symfony\Component\Console\Output\OutputInterface, - Symfony\Component\Console\Command\Command, - Doctrine\ORM\Tools\SchemaTool; - -abstract class AbstractCommand extends Command -{ - /** - * @param InputInterface $input - * @param OutputInterface $output - * @param SchemaTool $schemaTool - * @param array $metadatas - */ - abstract protected function executeSchemaCommand(InputInterface $input, OutputInterface $output, SchemaTool $schemaTool, array $metadatas); - - /** - * @see Console\Command\Command - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $emHelper = $this->getHelper('em'); - - /* @var $em \Doctrine\ORM\EntityManager */ - $em = $emHelper->getEntityManager(); - - $metadatas = $em->getMetadataFactory()->getAllMetadata(); - - if ( ! empty($metadatas)) { - // Create SchemaTool - $tool = new \Doctrine\ORM\Tools\SchemaTool($em); - - $this->executeSchemaCommand($input, $output, $tool, $metadatas); - } else { - $output->write('No Metadata Classes to process.' . PHP_EOL); - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/CreateCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/CreateCommand.php deleted file mode 100644 index 69d3f36..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/CreateCommand.php +++ /dev/null @@ -1,76 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command\SchemaTool; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console\Input\InputInterface, - Symfony\Component\Console\Output\OutputInterface, - Doctrine\ORM\Tools\SchemaTool; - -/** - * Command to create the database schema for a set of classes based on their mappings. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class CreateCommand extends AbstractCommand -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:schema-tool:create') - ->setDescription( - 'Processes the schema and either create it directly on EntityManager Storage Connection or generate the SQL output.' - ) - ->setDefinition(array( - new InputOption( - 'dump-sql', null, InputOption::VALUE_NONE, - 'Instead of try to apply generated SQLs into EntityManager Storage Connection, output them.' - ) - )) - ->setHelp(<<getOption('dump-sql') === true) { - $sqls = $schemaTool->getCreateSchemaSql($metadatas); - $output->write(implode(';' . PHP_EOL, $sqls) . ';' . PHP_EOL); - } else { - $output->write('ATTENTION: This operation should not be executed in a production environment.' . PHP_EOL . PHP_EOL); - - $output->write('Creating database schema...' . PHP_EOL); - $schemaTool->createSchema($metadatas); - $output->write('Database schema created successfully!' . PHP_EOL); - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/DropCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/DropCommand.php deleted file mode 100644 index 50fa645..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/DropCommand.php +++ /dev/null @@ -1,108 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command\SchemaTool; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console\Input\InputInterface, - Symfony\Component\Console\Output\OutputInterface, - Doctrine\ORM\Tools\SchemaTool; - -/** - * Command to drop the database schema for a set of classes based on their mappings. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class DropCommand extends AbstractCommand -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:schema-tool:drop') - ->setDescription( - 'Drop the complete database schema of EntityManager Storage Connection or generate the corresponding SQL output.' - ) - ->setDefinition(array( - new InputOption( - 'dump-sql', null, InputOption::VALUE_NONE, - 'Instead of try to apply generated SQLs into EntityManager Storage Connection, output them.' - ), - new InputOption( - 'force', null, InputOption::VALUE_NONE, - "Don't ask for the deletion of the database, but force the operation to run." - ), - new InputOption( - 'full-database', null, InputOption::VALUE_NONE, - 'Instead of using the Class Metadata to detect the database table schema, drop ALL assets that the database contains.' - ), - )) - ->setHelp(<<getOption('full-database')); - - if ($input->getOption('dump-sql') === true) { - if ($isFullDatabaseDrop) { - $sqls = $schemaTool->getDropDatabaseSQL(); - } else { - $sqls = $schemaTool->getDropSchemaSQL($metadatas); - } - $output->write(implode(';' . PHP_EOL, $sqls) . PHP_EOL); - } else if ($input->getOption('force') === true) { - $output->write('Dropping database schema...' . PHP_EOL); - if ($isFullDatabaseDrop) { - $schemaTool->dropDatabase(); - } else { - $schemaTool->dropSchema($metadatas); - } - $output->write('Database schema dropped successfully!' . PHP_EOL); - } else { - $output->write('ATTENTION: This operation should not be executed in a production environment.' . PHP_EOL . PHP_EOL); - - if ($isFullDatabaseDrop) { - $sqls = $schemaTool->getDropDatabaseSQL(); - } else { - $sqls = $schemaTool->getDropSchemaSQL($metadatas); - } - - if (count($sqls)) { - $output->write('Schema-Tool would execute ' . count($sqls) . ' queries to drop the database.' . PHP_EOL); - $output->write('Please run the operation with --force to execute these queries or use --dump-sql to see them.' . PHP_EOL); - } else { - $output->write('Nothing to drop. The database is empty!' . PHP_EOL); - } - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand.php deleted file mode 100644 index 26552cc..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand.php +++ /dev/null @@ -1,131 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command\SchemaTool; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console\Input\InputInterface, - Symfony\Component\Console\Output\OutputInterface, - Doctrine\ORM\Tools\SchemaTool; - -/** - * Command to generate the SQL needed to update the database schema to match - * the current mapping information. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Ryan Weaver - */ -class UpdateCommand extends AbstractCommand -{ - protected $name = 'orm:schema-tool:update'; - - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName($this->name) - ->setDescription( - 'Executes (or dumps) the SQL needed to update the database schema to match the current mapping metadata.' - ) - ->setDefinition(array( - new InputOption( - 'complete', null, InputOption::VALUE_NONE, - 'If defined, all assets of the database which are not relevant to the current metadata will be dropped.' - ), - - new InputOption( - 'dump-sql', null, InputOption::VALUE_NONE, - 'Dumps the generated SQL statements to the screen (does not execute them).' - ), - new InputOption( - 'force', null, InputOption::VALUE_NONE, - 'Causes the generated SQL statements to be physically executed against your database.' - ), - )); - - $this->setHelp(<<%command.name% command generates the SQL needed to -synchronize the database schema with the current mapping metadata of the -default entity manager. - -For example, if you add metadata for a new column to an entity, this command -would generate and output the SQL needed to add the new column to the database: - -%command.name% --dump-sql - -Alternatively, you can execute the generated queries: - -%command.name% --force - -Finally, be aware that if the --complete option is passed, this -task will drop all database assets (e.g. tables, etc) that are *not* described -by the current metadata. In other words, without this option, this task leaves -untouched any "extra" tables that exist in the database, but which aren't -described by any metadata. -EOT - ); - } - - protected function executeSchemaCommand(InputInterface $input, OutputInterface $output, SchemaTool $schemaTool, array $metadatas) - { - // Defining if update is complete or not (--complete not defined means $saveMode = true) - $saveMode = ($input->getOption('complete') !== true); - - $sqls = $schemaTool->getUpdateSchemaSql($metadatas, $saveMode); - if (0 == count($sqls)) { - $output->writeln('Nothing to update - your database is already in sync with the current entity metadata.'); - - return; - } - - $dumpSql = (true === $input->getOption('dump-sql')); - $force = (true === $input->getOption('force')); - if ($dumpSql && $force) { - throw new \InvalidArgumentException('You can pass either the --dump-sql or the --force option (but not both simultaneously).'); - } - - if ($dumpSql) { - $output->writeln(implode(';' . PHP_EOL, $sqls)); - } else if ($force) { - $output->writeln('Updating database schema...'); - $schemaTool->updateSchema($metadatas, $saveMode); - $output->writeln(sprintf('Database schema updated successfully! "%s" queries were executed', count($sqls))); - } else { - $output->writeln('ATTENTION: This operation should not be executed in a production environment.'); - $output->writeln(' Use the incremental update to detect changes during development and use'); - $output->writeln(' the SQL DDL provided to manually update your database in production.'); - $output->writeln(''); - - $output->writeln(sprintf('The Schema-Tool would execute "%s" queries to update the database.', count($sqls))); - $output->writeln('Please run the operation by passing one of the following options:'); - - $output->writeln(sprintf(' %s --force to execute the command', $this->getName())); - $output->writeln(sprintf(' %s --dump-sql to dump the SQL statements to the screen', $this->getName())); - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Command/ValidateSchemaCommand.php b/framework/library/Doctrine/ORM/Tools/Console/Command/ValidateSchemaCommand.php deleted file mode 100644 index 3dbc54f..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Command/ValidateSchemaCommand.php +++ /dev/null @@ -1,86 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Command; - -use Symfony\Component\Console\Input\InputArgument, - Symfony\Component\Console\Input\InputOption, - Symfony\Component\Console; - -/** - * Validate that the current mapping is valid - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ValidateSchemaCommand extends Console\Command\Command -{ - /** - * @see Console\Command\Command - */ - protected function configure() - { - $this - ->setName('orm:validate-schema') - ->setDescription('Validate the mapping files.') - ->setHelp(<<getHelper('em')->getEntityManager(); - - $validator = new \Doctrine\ORM\Tools\SchemaValidator($em); - $errors = $validator->validateMapping(); - - $exit = 0; - if ($errors) { - foreach ($errors as $className => $errorMessages) { - $output->write("[Mapping] FAIL - The entity-class '" . $className . "' mapping is invalid:\n"); - foreach ($errorMessages as $errorMessage) { - $output->write('* ' . $errorMessage . "\n"); - } - $output->write("\n"); - } - $exit += 1; - } else { - $output->write('[Mapping] OK - The mapping files are correct.' . "\n"); - } - - if (!$validator->schemaInSyncWithMetadata()) { - $output->write('[Database] FAIL - The database schema is not in sync with the current mapping file.' . "\n"); - $exit += 2; - } else { - $output->write('[Database] OK - The database schema is in sync with the mapping files.' . "\n"); - } - - return $exit; - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/ConsoleRunner.php b/framework/library/Doctrine/ORM/Tools/Console/ConsoleRunner.php deleted file mode 100644 index e8bc6ec..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/ConsoleRunner.php +++ /dev/null @@ -1,72 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Helper\HelperSet; - -class ConsoleRunner -{ - /** - * Run console with the given helperset. - * - * @param \Symfony\Component\Console\Helper\HelperSet $helperSet - * @param \Symfony\Component\Console\Command\Command[] $commands - * @return void - */ - static public function run(HelperSet $helperSet, $commands = array()) - { - $cli = new Application('Doctrine Command Line Interface', \Doctrine\ORM\Version::VERSION); - $cli->setCatchExceptions(true); - $cli->setHelperSet($helperSet); - self::addCommands($cli); - $cli->addCommands($commands); - $cli->run(); - } - - /** - * @param Application $cli - */ - static public function addCommands(Application $cli) - { - $cli->addCommands(array( - // DBAL Commands - new \Doctrine\DBAL\Tools\Console\Command\RunSqlCommand(), - new \Doctrine\DBAL\Tools\Console\Command\ImportCommand(), - - // ORM Commands - new \Doctrine\ORM\Tools\Console\Command\ClearCache\MetadataCommand(), - new \Doctrine\ORM\Tools\Console\Command\ClearCache\ResultCommand(), - new \Doctrine\ORM\Tools\Console\Command\ClearCache\QueryCommand(), - new \Doctrine\ORM\Tools\Console\Command\SchemaTool\CreateCommand(), - new \Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand(), - new \Doctrine\ORM\Tools\Console\Command\SchemaTool\DropCommand(), - new \Doctrine\ORM\Tools\Console\Command\EnsureProductionSettingsCommand(), - new \Doctrine\ORM\Tools\Console\Command\ConvertDoctrine1SchemaCommand(), - new \Doctrine\ORM\Tools\Console\Command\GenerateRepositoriesCommand(), - new \Doctrine\ORM\Tools\Console\Command\GenerateEntitiesCommand(), - new \Doctrine\ORM\Tools\Console\Command\GenerateProxiesCommand(), - new \Doctrine\ORM\Tools\Console\Command\ConvertMappingCommand(), - new \Doctrine\ORM\Tools\Console\Command\RunDqlCommand(), - new \Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand(), - new \Doctrine\ORM\Tools\Console\Command\InfoCommand() - )); - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/Helper/EntityManagerHelper.php b/framework/library/Doctrine/ORM/Tools/Console/Helper/EntityManagerHelper.php deleted file mode 100644 index a5da041..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/Helper/EntityManagerHelper.php +++ /dev/null @@ -1,71 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console\Helper; - -use Symfony\Component\Console\Helper\Helper, - Doctrine\ORM\EntityManager; - -/** - * Doctrine CLI Connection Helper. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class EntityManagerHelper extends Helper -{ - /** - * Doctrine ORM EntityManager - * @var EntityManager - */ - protected $_em; - - /** - * Constructor - * - * @param Connection $connection Doctrine Database Connection - */ - public function __construct(EntityManager $em) - { - $this->_em = $em; - } - - /** - * Retrieves Doctrine ORM EntityManager - * - * @return EntityManager - */ - public function getEntityManager() - { - return $this->_em; - } - - /** - * @see Helper - */ - public function getName() - { - return 'entityManager'; - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Console/MetadataFilter.php b/framework/library/Doctrine/ORM/Tools/Console/MetadataFilter.php deleted file mode 100644 index 72c753e..0000000 --- a/framework/library/Doctrine/ORM/Tools/Console/MetadataFilter.php +++ /dev/null @@ -1,77 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Console; - -/** - * Used by CLI Tools to restrict entity-based commands to given patterns. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class MetadataFilter extends \FilterIterator implements \Countable -{ - /** - * Filter Metadatas by one or more filter options. - * - * @param array $metadatas - * @param array|string $filter - * @return array - */ - static public function filter(array $metadatas, $filter) - { - $metadatas = new MetadataFilter(new \ArrayIterator($metadatas), $filter); - return iterator_to_array($metadatas); - } - - private $_filter = array(); - - public function __construct(\ArrayIterator $metadata, $filter) - { - $this->_filter = (array)$filter; - parent::__construct($metadata); - } - - public function accept() - { - if (count($this->_filter) == 0) { - return true; - } - - $it = $this->getInnerIterator(); - $metadata = $it->current(); - - foreach ($this->_filter as $filter) { - if (strpos($metadata->name, $filter) !== false) { - return true; - } - } - return false; - } - - public function count() - { - return count($this->getInnerIterator()); - } -} diff --git a/framework/library/Doctrine/ORM/Tools/ConvertDoctrine1Schema.php b/framework/library/Doctrine/ORM/Tools/ConvertDoctrine1Schema.php deleted file mode 100644 index 46f358a..0000000 --- a/framework/library/Doctrine/ORM/Tools/ConvertDoctrine1Schema.php +++ /dev/null @@ -1,271 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools; - -use Doctrine\ORM\Mapping\ClassMetadataInfo, - Doctrine\ORM\Tools\Export\Driver\AbstractExporter, - Doctrine\Common\Util\Inflector; - -/** - * Class to help with converting Doctrine 1 schema files to Doctrine 2 mapping files - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class ConvertDoctrine1Schema -{ - private $_legacyTypeMap = array( - // TODO: This list may need to be updated - 'clob' => 'text', - 'timestamp' => 'datetime', - 'enum' => 'string' - ); - - /** - * Constructor passes the directory or array of directories - * to convert the Doctrine 1 schema files from - * - * @param array $from - * @author Jonathan Wage - */ - public function __construct($from) - { - $this->_from = (array) $from; - } - - /** - * Get an array of ClassMetadataInfo instances from the passed - * Doctrine 1 schema - * - * @return array $metadatas An array of ClassMetadataInfo instances - */ - public function getMetadata() - { - $schema = array(); - foreach ($this->_from as $path) { - if (is_dir($path)) { - $files = glob($path . '/*.yml'); - foreach ($files as $file) { - $schema = array_merge($schema, (array) \Symfony\Component\Yaml\Yaml::parse($file)); - } - } else { - $schema = array_merge($schema, (array) \Symfony\Component\Yaml\Yaml::parse($path)); - } - } - - $metadatas = array(); - foreach ($schema as $className => $mappingInformation) { - $metadatas[] = $this->_convertToClassMetadataInfo($className, $mappingInformation); - } - - return $metadatas; - } - - private function _convertToClassMetadataInfo($className, $mappingInformation) - { - $metadata = new ClassMetadataInfo($className); - - $this->_convertTableName($className, $mappingInformation, $metadata); - $this->_convertColumns($className, $mappingInformation, $metadata); - $this->_convertIndexes($className, $mappingInformation, $metadata); - $this->_convertRelations($className, $mappingInformation, $metadata); - - return $metadata; - } - - private function _convertTableName($className, array $model, ClassMetadataInfo $metadata) - { - if (isset($model['tableName']) && $model['tableName']) { - $e = explode('.', $model['tableName']); - - if (count($e) > 1) { - $metadata->table['schema'] = $e[0]; - $metadata->table['name'] = $e[1]; - } else { - $metadata->table['name'] = $e[0]; - } - } - } - - private function _convertColumns($className, array $model, ClassMetadataInfo $metadata) - { - $id = false; - - if (isset($model['columns']) && $model['columns']) { - foreach ($model['columns'] as $name => $column) { - $fieldMapping = $this->_convertColumn($className, $name, $column, $metadata); - - if (isset($fieldMapping['id']) && $fieldMapping['id']) { - $id = true; - } - } - } - - if ( ! $id) { - $fieldMapping = array( - 'fieldName' => 'id', - 'columnName' => 'id', - 'type' => 'integer', - 'id' => true - ); - $metadata->mapField($fieldMapping); - $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_AUTO); - } - } - - private function _convertColumn($className, $name, $column, ClassMetadataInfo $metadata) - { - if (is_string($column)) { - $string = $column; - $column = array(); - $column['type'] = $string; - } - if ( ! isset($column['name'])) { - $column['name'] = $name; - } - // check if a column alias was used (column_name as field_name) - if (preg_match("/(\w+)\sas\s(\w+)/i", $column['name'], $matches)) { - $name = $matches[1]; - $column['name'] = $name; - $column['alias'] = $matches[2]; - } - if (preg_match("/([a-zA-Z]+)\(([0-9]+)\)/", $column['type'], $matches)) { - $column['type'] = $matches[1]; - $column['length'] = $matches[2]; - } - $column['type'] = strtolower($column['type']); - // check if legacy column type (1.x) needs to be mapped to a 2.0 one - if (isset($this->_legacyTypeMap[$column['type']])) { - $column['type'] = $this->_legacyTypeMap[$column['type']]; - } - if ( ! \Doctrine\DBAL\Types\Type::hasType($column['type'])) { - throw ToolsException::couldNotMapDoctrine1Type($column['type']); - } - - $fieldMapping = array(); - if (isset($column['primary'])) { - $fieldMapping['id'] = true; - } - $fieldMapping['fieldName'] = isset($column['alias']) ? $column['alias'] : $name; - $fieldMapping['columnName'] = $column['name']; - $fieldMapping['type'] = $column['type']; - if (isset($column['length'])) { - $fieldMapping['length'] = $column['length']; - } - $allowed = array('precision', 'scale', 'unique', 'options', 'notnull', 'version'); - foreach ($column as $key => $value) { - if (in_array($key, $allowed)) { - $fieldMapping[$key] = $value; - } - } - - $metadata->mapField($fieldMapping); - - if (isset($column['autoincrement'])) { - $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_AUTO); - } else if (isset($column['sequence'])) { - $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_SEQUENCE); - $definition = array( - 'sequenceName' => is_array($column['sequence']) ? $column['sequence']['name']:$column['sequence'] - ); - if (isset($column['sequence']['size'])) { - $definition['allocationSize'] = $column['sequence']['size']; - } - if (isset($column['sequence']['value'])) { - $definition['initialValue'] = $column['sequence']['value']; - } - $metadata->setSequenceGeneratorDefinition($definition); - } - return $fieldMapping; - } - - private function _convertIndexes($className, array $model, ClassMetadataInfo $metadata) - { - if (isset($model['indexes']) && $model['indexes']) { - foreach ($model['indexes'] as $name => $index) { - $type = (isset($index['type']) && $index['type'] == 'unique') - ? 'uniqueConstraints' : 'indexes'; - - $metadata->table[$type][$name] = array( - 'columns' => $index['fields'] - ); - } - } - } - - private function _convertRelations($className, array $model, ClassMetadataInfo $metadata) - { - if (isset($model['relations']) && $model['relations']) { - foreach ($model['relations'] as $name => $relation) { - if ( ! isset($relation['alias'])) { - $relation['alias'] = $name; - } - if ( ! isset($relation['class'])) { - $relation['class'] = $name; - } - if ( ! isset($relation['local'])) { - $relation['local'] = Inflector::tableize($relation['class']); - } - if ( ! isset($relation['foreign'])) { - $relation['foreign'] = 'id'; - } - if ( ! isset($relation['foreignAlias'])) { - $relation['foreignAlias'] = $className; - } - - if (isset($relation['refClass'])) { - $type = 'many'; - $foreignType = 'many'; - $joinColumns = array(); - } else { - $type = isset($relation['type']) ? $relation['type'] : 'one'; - $foreignType = isset($relation['foreignType']) ? $relation['foreignType'] : 'many'; - $joinColumns = array( - array( - 'name' => $relation['local'], - 'referencedColumnName' => $relation['foreign'], - 'onDelete' => isset($relation['onDelete']) ? $relation['onDelete'] : null, - ) - ); - } - - if ($type == 'one' && $foreignType == 'one') { - $method = 'mapOneToOne'; - } else if ($type == 'many' && $foreignType == 'many') { - $method = 'mapManyToMany'; - } else { - $method = 'mapOneToMany'; - } - - $associationMapping = array(); - $associationMapping['fieldName'] = $relation['alias']; - $associationMapping['targetEntity'] = $relation['class']; - $associationMapping['mappedBy'] = $relation['foreignAlias']; - $associationMapping['joinColumns'] = $joinColumns; - - $metadata->$method($associationMapping); - } - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/DebugUnitOfWorkListener.php b/framework/library/Doctrine/ORM/Tools/DebugUnitOfWorkListener.php deleted file mode 100644 index c2bb0fd..0000000 --- a/framework/library/Doctrine/ORM/Tools/DebugUnitOfWorkListener.php +++ /dev/null @@ -1,151 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools; - -use Doctrine\ORM\Event\OnFlushEventArgs; -use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\ORM\PersistentCollection; -use Doctrine\ORM\UnitOfWork; - -/** - * Use this logger to dump the identity map during the onFlush event. This is useful for debugging - * weird UnitOfWork behavior with complex operations. - */ -class DebugUnitOfWorkListener -{ - private $file; - private $context; - - /** - * Pass a stream and contet information for the debugging session. - * - * The stream can be php://output to print to the screen. - * - * @param string $file - * @param string $context - */ - public function __construct($file = 'php://output', $context = '') - { - $this->file = $file; - $this->context = $context; - } - - public function onFlush(OnFlushEventArgs $args) - { - $this->dumpIdentityMap($args->getEntityManager()); - } - - /** - * Dump the contents of the identity map into a stream. - * - * @param EntityManager $em - * @return void - */ - public function dumpIdentityMap(EntityManager $em) - { - $uow = $em->getUnitOfWork(); - $identityMap = $uow->getIdentityMap(); - - $fh = fopen($this->file, "x+"); - if (count($identityMap) == 0) { - fwrite($fh, "Flush Operation [".$this->context."] - Empty identity map.\n"); - return; - } - - fwrite($fh, "Flush Operation [".$this->context."] - Dumping identity map:\n"); - foreach ($identityMap as $className => $map) { - fwrite($fh, "Class: ". $className . "\n"); - foreach ($map as $entity) { - fwrite($fh, " Entity: " . $this->getIdString($entity, $uow) . " " . spl_object_hash($entity)."\n"); - fwrite($fh, " Associations:\n"); - - $cm = $em->getClassMetadata($className); - foreach ($cm->associationMappings as $field => $assoc) { - fwrite($fh, " " . $field . " "); - $value = $cm->reflFields[$field]->getValue($entity); - - if ($assoc['type'] & ClassMetadata::TO_ONE) { - if ($value === null) { - fwrite($fh, " NULL\n"); - } else { - if ($value instanceof Proxy && !$value->__isInitialized__) { - fwrite($fh, "[PROXY] "); - } - - fwrite($fh, $this->getIdString($value, $uow) . " " . spl_object_hash($value) . "\n"); - } - } else { - $initialized = !($value instanceof PersistentCollection) || $value->isInitialized(); - if ($value === null) { - fwrite($fh, " NULL\n"); - } else if ($initialized) { - fwrite($fh, "[INITIALIZED] " . $this->getType($value). " " . count($value) . " elements\n"); - foreach ($value as $obj) { - fwrite($fh, " " . $this->getIdString($obj, $uow) . " " . spl_object_hash($obj)."\n"); - } - } else { - fwrite($fh, "[PROXY] " . $this->getType($value) . " unknown element size\n"); - foreach ($value->unwrap() as $obj) { - fwrite($fh, " " . $this->getIdString($obj, $uow) . " " . spl_object_hash($obj)."\n"); - } - } - } - } - } - } - fclose($fh); - } - - private function getType($var) - { - if (is_object($var)) { - $refl = new \ReflectionObject($var); - return $refl->getShortname(); - } else { - return gettype($var); - } - } - - private function getIdString($entity, $uow) - { - if ($uow->isInIdentityMap($entity)) { - $ids = $uow->getEntityIdentifier($entity); - $idstring = ""; - foreach ($ids as $k => $v) { - $idstring .= $k."=".$v; - } - } else { - $idstring = "NEWOBJECT "; - } - - $state = $uow->getEntityState($entity); - if ($state == UnitOfWork::STATE_NEW) { - $idstring .= " [NEW]"; - } else if ($state == UnitOfWork::STATE_REMOVED) { - $idstring .= " [REMOVED]"; - } else if ($state == UnitOfWork::STATE_MANAGED) { - $idstring .= " [MANAGED]"; - } else if ($state == UnitOfwork::STATE_DETACHED) { - $idstring .= " [DETACHED]"; - } - - return $idstring; - } -} diff --git a/framework/library/Doctrine/ORM/Tools/DisconnectedClassMetadataFactory.php b/framework/library/Doctrine/ORM/Tools/DisconnectedClassMetadataFactory.php deleted file mode 100644 index e44f99f..0000000 --- a/framework/library/Doctrine/ORM/Tools/DisconnectedClassMetadataFactory.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools; - -use Doctrine\ORM\Mapping\ClassMetadataFactory; -use Doctrine\ORM\Mapping\ClassMetadataInfo; - -/** - * The DisconnectedClassMetadataFactory is used to create ClassMetadataInfo objects - * that do not require the entity class actually exist. This allows us to - * load some mapping information and use it to do things like generate code - * from the mapping information. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class DisconnectedClassMetadataFactory extends ClassMetadataFactory -{ - public function getReflectionService() - { - return new \Doctrine\Common\Persistence\Mapping\StaticReflectionService; - } -} diff --git a/framework/library/Doctrine/ORM/Tools/EntityGenerator.php b/framework/library/Doctrine/ORM/Tools/EntityGenerator.php deleted file mode 100644 index f7e6048..0000000 --- a/framework/library/Doctrine/ORM/Tools/EntityGenerator.php +++ /dev/null @@ -1,1290 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools; - -use Doctrine\ORM\Mapping\ClassMetadataInfo, - Doctrine\Common\Util\Inflector, - Doctrine\DBAL\Types\Type; - -/** - * Generic class used to generate PHP5 entity classes from ClassMetadataInfo instances - * - * [php] - * $classes = $em->getClassMetadataFactory()->getAllMetadata(); - * - * $generator = new \Doctrine\ORM\Tools\EntityGenerator(); - * $generator->setGenerateAnnotations(true); - * $generator->setGenerateStubMethods(true); - * $generator->setRegenerateEntityIfExists(false); - * $generator->setUpdateEntityIfExists(true); - * $generator->generate($classes, '/path/to/generate/entities'); - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class EntityGenerator -{ - /** - * Specifies class fields should be protected - */ - const FIELD_VISIBLE_PROTECTED = 'protected'; - - /** - * Specifies class fields should be private - */ - const FIELD_VISIBLE_PRIVATE = 'private'; - - /** - * @var bool - */ - private $backupExisting = true; - - /** - * The extension to use for written php files - * - * @var string - */ - private $extension = '.php'; - - /** - * Whether or not the current ClassMetadataInfo instance is new or old - * - * @var boolean - */ - private $isNew = true; - - /** - * @var array - */ - private $staticReflection = array(); - - /** - * Number of spaces to use for indention in generated code - */ - private $numSpaces = 4; - - /** - * The actual spaces to use for indention - * - * @var string - */ - private $spaces = ' '; - - /** - * The class all generated entities should extend - * - * @var string - */ - private $classToExtend; - - /** - * Whether or not to generation annotations - * - * @var boolean - */ - private $generateAnnotations = false; - - /** - * @var string - */ - private $annotationsPrefix = ''; - - /** - * Whether or not to generated sub methods - * - * @var boolean - */ - private $generateEntityStubMethods = false; - - /** - * Whether or not to update the entity class if it exists already - * - * @var boolean - */ - private $updateEntityIfExists = false; - - /** - * Whether or not to re-generate entity class if it exists already - * - * @var boolean - */ - private $regenerateEntityIfExists = false; - - /** - * @var boolean - */ - private $fieldVisibility = 'private'; - - /** - * Hash-map for handle types - * - * @var array - */ - private $typeAlias = array( - Type::DATETIMETZ => '\DateTime', - Type::DATETIME => '\DateTime', - Type::DATE => '\DateTime', - Type::TIME => '\DateTime', - Type::OBJECT => '\stdClass', - Type::BIGINT => 'integer', - Type::SMALLINT => 'integer', - Type::TEXT => 'string', - Type::BLOB => 'string', - Type::DECIMAL => 'float', - Type::JSON_ARRAY => 'array', - Type::SIMPLE_ARRAY => 'array', - ); - - /** - * @var array Hash-map to handle generator types string. - */ - protected static $generatorStrategyMap = array( - ClassMetadataInfo::GENERATOR_TYPE_AUTO => 'AUTO', - ClassMetadataInfo::GENERATOR_TYPE_SEQUENCE => 'SEQUENCE', - ClassMetadataInfo::GENERATOR_TYPE_TABLE => 'TABLE', - ClassMetadataInfo::GENERATOR_TYPE_IDENTITY => 'IDENTITY', - ClassMetadataInfo::GENERATOR_TYPE_NONE => 'NONE', - ClassMetadataInfo::GENERATOR_TYPE_UUID => 'UUID', - ClassMetadataInfo::GENERATOR_TYPE_CUSTOM => 'CUSTOM' - ); - - /** - * @var array Hash-map to handle the change tracking policy string. - */ - protected static $changeTrackingPolicyMap = array( - ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT => 'DEFERRED_IMPLICIT', - ClassMetadataInfo::CHANGETRACKING_DEFERRED_EXPLICIT => 'DEFERRED_EXPLICIT', - ClassMetadataInfo::CHANGETRACKING_NOTIFY => 'NOTIFY', - ); - - /** - * @var array Hash-map to handle the inheritance type string. - */ - protected static $inheritanceTypeMap = array( - ClassMetadataInfo::INHERITANCE_TYPE_NONE => 'NONE', - ClassMetadataInfo::INHERITANCE_TYPE_JOINED => 'JOINED', - ClassMetadataInfo::INHERITANCE_TYPE_SINGLE_TABLE => 'SINGLE_TABLE', - ClassMetadataInfo::INHERITANCE_TYPE_TABLE_PER_CLASS => 'TABLE_PER_CLASS', - ); - - /** - * @var string - */ - private static $classTemplate = -' - -use Doctrine\ORM\Mapping as ORM; - - - -{ - -} -'; - - /** - * @var string - */ - private static $getMethodTemplate = -'/** - * - * - * @return - */ -public function () -{ -return $this->; -}'; - - /** - * @var string - */ - private static $setMethodTemplate = -'/** - * - * - * @param $ - * @return - */ -public function ($) -{ -$this-> = $; - -return $this; -}'; - - /** - * @var string - */ - private static $addMethodTemplate = -'/** - * - * - * @param $ - * @return - */ -public function ($) -{ -$this->[] = $; - -return $this; -}'; - - /** - * @var string - */ - private static $removeMethodTemplate = -'/** - * - * - * @param $ - */ -public function ($) -{ -$this->->removeElement($); -}'; - - /** - * @var string - */ - private static $lifecycleCallbackMethodTemplate = -'/** - * @ - */ -public function () -{ -// Add your code here -}'; - - /** - * @var string - */ - private static $constructorMethodTemplate = -'/** - * Constructor - */ -public function __construct() -{ - -} -'; - - public function __construct() - { - if (version_compare(\Doctrine\Common\Version::VERSION, '2.2.0-DEV', '>=')) { - $this->annotationsPrefix = 'ORM\\'; - } - } - - /** - * Generate and write entity classes for the given array of ClassMetadataInfo instances - * - * @param array $metadatas - * @param string $outputDirectory - * @return void - */ - public function generate(array $metadatas, $outputDirectory) - { - foreach ($metadatas as $metadata) { - $this->writeEntityClass($metadata, $outputDirectory); - } - } - - /** - * Generated and write entity class to disk for the given ClassMetadataInfo instance - * - * @param ClassMetadataInfo $metadata - * @param string $outputDirectory - * @return void - */ - public function writeEntityClass(ClassMetadataInfo $metadata, $outputDirectory) - { - $path = $outputDirectory . '/' . str_replace('\\', DIRECTORY_SEPARATOR, $metadata->name) . $this->extension; - $dir = dirname($path); - - if ( ! is_dir($dir)) { - mkdir($dir, 0777, true); - } - - $this->isNew = !file_exists($path) || (file_exists($path) && $this->regenerateEntityIfExists); - - if ( ! $this->isNew) { - $this->parseTokensInEntityFile(file_get_contents($path)); - } else { - $this->staticReflection[$metadata->name] = array('properties' => array(), 'methods' => array()); - } - - if ($this->backupExisting && file_exists($path)) { - $backupPath = dirname($path) . DIRECTORY_SEPARATOR . basename($path) . "~"; - if (!copy($path, $backupPath)) { - throw new \RuntimeException("Attempt to backup overwritten entity file but copy operation failed."); - } - } - - // If entity doesn't exist or we're re-generating the entities entirely - if ($this->isNew) { - file_put_contents($path, $this->generateEntityClass($metadata)); - // If entity exists and we're allowed to update the entity class - } else if ( ! $this->isNew && $this->updateEntityIfExists) { - file_put_contents($path, $this->generateUpdatedEntityClass($metadata, $path)); - } - } - - /** - * Generate a PHP5 Doctrine 2 entity class from the given ClassMetadataInfo instance - * - * @param ClassMetadataInfo $metadata - * @return string $code - */ - public function generateEntityClass(ClassMetadataInfo $metadata) - { - $placeHolders = array( - '', - '', - '', - '' - ); - - $replacements = array( - $this->generateEntityNamespace($metadata), - $this->generateEntityDocBlock($metadata), - $this->generateEntityClassName($metadata), - $this->generateEntityBody($metadata) - ); - - $code = str_replace($placeHolders, $replacements, self::$classTemplate); - return str_replace('', $this->spaces, $code); - } - - /** - * Generate the updated code for the given ClassMetadataInfo and entity at path - * - * @param ClassMetadataInfo $metadata - * @param string $path - * @return string $code; - */ - public function generateUpdatedEntityClass(ClassMetadataInfo $metadata, $path) - { - $currentCode = file_get_contents($path); - - $body = $this->generateEntityBody($metadata); - $body = str_replace('', $this->spaces, $body); - $last = strrpos($currentCode, '}'); - - return substr($currentCode, 0, $last) . $body . (strlen($body) > 0 ? "\n" : ''). "}"; - } - - /** - * Set the number of spaces the exported class should have - * - * @param integer $numSpaces - * @return void - */ - public function setNumSpaces($numSpaces) - { - $this->spaces = str_repeat(' ', $numSpaces); - $this->numSpaces = $numSpaces; - } - - /** - * Set the extension to use when writing php files to disk - * - * @param string $extension - * @return void - */ - public function setExtension($extension) - { - $this->extension = $extension; - } - - /** - * Set the name of the class the generated classes should extend from - * - * @return void - */ - public function setClassToExtend($classToExtend) - { - $this->classToExtend = $classToExtend; - } - - /** - * Set whether or not to generate annotations for the entity - * - * @param bool $bool - * @return void - */ - public function setGenerateAnnotations($bool) - { - $this->generateAnnotations = $bool; - } - - /** - * Set the class fields visibility for the entity (can either be private or protected) - * - * @param bool $bool - * @return void - */ - public function setFieldVisibility($visibility) - { - if ($visibility !== self::FIELD_VISIBLE_PRIVATE && $visibility !== self::FIELD_VISIBLE_PROTECTED) { - throw new \InvalidArgumentException('Invalid provided visibilty (only private and protected are allowed): ' . $visibility); - } - - $this->fieldVisibility = $visibility; - } - - /** - * Set an annotation prefix. - * - * @param string $prefix - */ - public function setAnnotationPrefix($prefix) - { - $this->annotationsPrefix = $prefix; - } - - /** - * Set whether or not to try and update the entity if it already exists - * - * @param bool $bool - * @return void - */ - public function setUpdateEntityIfExists($bool) - { - $this->updateEntityIfExists = $bool; - } - - /** - * Set whether or not to regenerate the entity if it exists - * - * @param bool $bool - * @return void - */ - public function setRegenerateEntityIfExists($bool) - { - $this->regenerateEntityIfExists = $bool; - } - - /** - * Set whether or not to generate stub methods for the entity - * - * @param bool $bool - * @return void - */ - public function setGenerateStubMethods($bool) - { - $this->generateEntityStubMethods = $bool; - } - - /** - * Should an existing entity be backed up if it already exists? - */ - public function setBackupExisting($bool) - { - $this->backupExisting = $bool; - } - - /** - * @param string $type - * @return string - */ - private function getType($type) - { - if (isset($this->typeAlias[$type])) { - return $this->typeAlias[$type]; - } - - return $type; - } - - private function generateEntityNamespace(ClassMetadataInfo $metadata) - { - if ($this->hasNamespace($metadata)) { - return 'namespace ' . $this->getNamespace($metadata) .';'; - } - } - - private function generateEntityClassName(ClassMetadataInfo $metadata) - { - return 'class ' . $this->getClassName($metadata) . - ($this->extendsClass() ? ' extends ' . $this->getClassToExtendName() : null); - } - - private function generateEntityBody(ClassMetadataInfo $metadata) - { - $fieldMappingProperties = $this->generateEntityFieldMappingProperties($metadata); - $associationMappingProperties = $this->generateEntityAssociationMappingProperties($metadata); - $stubMethods = $this->generateEntityStubMethods ? $this->generateEntityStubMethods($metadata) : null; - $lifecycleCallbackMethods = $this->generateEntityLifecycleCallbackMethods($metadata); - - $code = array(); - - if ($fieldMappingProperties) { - $code[] = $fieldMappingProperties; - } - - if ($associationMappingProperties) { - $code[] = $associationMappingProperties; - } - - $code[] = $this->generateEntityConstructor($metadata); - - if ($stubMethods) { - $code[] = $stubMethods; - } - - if ($lifecycleCallbackMethods) { - $code[] = $lifecycleCallbackMethods; - } - - return implode("\n", $code); - } - - private function generateEntityConstructor(ClassMetadataInfo $metadata) - { - if ($this->hasMethod('__construct', $metadata)) { - return ''; - } - - $collections = array(); - - foreach ($metadata->associationMappings as $mapping) { - if ($mapping['type'] & ClassMetadataInfo::TO_MANY) { - $collections[] = '$this->'.$mapping['fieldName'].' = new \Doctrine\Common\Collections\ArrayCollection();'; - } - } - - if ($collections) { - return $this->prefixCodeWithSpaces(str_replace("", implode("\n".$this->spaces, $collections), self::$constructorMethodTemplate)); - } - - return ''; - } - - /** - * @todo this won't work if there is a namespace in brackets and a class outside of it. - * @param string $src - */ - private function parseTokensInEntityFile($src) - { - $tokens = token_get_all($src); - $lastSeenNamespace = ""; - $lastSeenClass = false; - - $inNamespace = false; - $inClass = false; - for ($i = 0; $i < count($tokens); $i++) { - $token = $tokens[$i]; - if (in_array($token[0], array(T_WHITESPACE, T_COMMENT, T_DOC_COMMENT))) { - continue; - } - - if ($inNamespace) { - if ($token[0] == T_NS_SEPARATOR || $token[0] == T_STRING) { - $lastSeenNamespace .= $token[1]; - } else if (is_string($token) && in_array($token, array(';', '{'))) { - $inNamespace = false; - } - } - - if ($inClass) { - $inClass = false; - $lastSeenClass = $lastSeenNamespace . ($lastSeenNamespace ? '\\' : '') . $token[1]; - $this->staticReflection[$lastSeenClass]['properties'] = array(); - $this->staticReflection[$lastSeenClass]['methods'] = array(); - } - - if ($token[0] == T_NAMESPACE) { - $lastSeenNamespace = ""; - $inNamespace = true; - } else if ($token[0] == T_CLASS) { - $inClass = true; - } else if ($token[0] == T_FUNCTION) { - if ($tokens[$i+2][0] == T_STRING) { - $this->staticReflection[$lastSeenClass]['methods'][] = $tokens[$i+2][1]; - } else if ($tokens[$i+2] == "&" && $tokens[$i+3][0] == T_STRING) { - $this->staticReflection[$lastSeenClass]['methods'][] = $tokens[$i+3][1]; - } - } else if (in_array($token[0], array(T_VAR, T_PUBLIC, T_PRIVATE, T_PROTECTED)) && $tokens[$i+2][0] != T_FUNCTION) { - $this->staticReflection[$lastSeenClass]['properties'][] = substr($tokens[$i+2][1], 1); - } - } - } - - private function hasProperty($property, ClassMetadataInfo $metadata) - { - if ($this->extendsClass()) { - // don't generate property if its already on the base class. - $reflClass = new \ReflectionClass($this->getClassToExtend()); - if ($reflClass->hasProperty($property)) { - return true; - } - } - - return ( - isset($this->staticReflection[$metadata->name]) && - in_array($property, $this->staticReflection[$metadata->name]['properties']) - ); - } - - private function hasMethod($method, ClassMetadataInfo $metadata) - { - if ($this->extendsClass()) { - // don't generate method if its already on the base class. - $reflClass = new \ReflectionClass($this->getClassToExtend()); - if ($reflClass->hasMethod($method)) { - return true; - } - } - - return ( - isset($this->staticReflection[$metadata->name]) && - in_array($method, $this->staticReflection[$metadata->name]['methods']) - ); - } - - private function hasNamespace(ClassMetadataInfo $metadata) - { - return strpos($metadata->name, '\\') ? true : false; - } - - private function extendsClass() - { - return $this->classToExtend ? true : false; - } - - private function getClassToExtend() - { - return $this->classToExtend; - } - - private function getClassToExtendName() - { - $refl = new \ReflectionClass($this->getClassToExtend()); - - return '\\' . $refl->getName(); - } - - private function getClassName(ClassMetadataInfo $metadata) - { - return ($pos = strrpos($metadata->name, '\\')) - ? substr($metadata->name, $pos + 1, strlen($metadata->name)) : $metadata->name; - } - - private function getNamespace(ClassMetadataInfo $metadata) - { - return substr($metadata->name, 0, strrpos($metadata->name, '\\')); - } - - private function generateEntityDocBlock(ClassMetadataInfo $metadata) - { - $lines = array(); - $lines[] = '/**'; - $lines[] = ' * ' . $this->getClassName($metadata); - - if ($this->generateAnnotations) { - $lines[] = ' *'; - - $methods = array( - 'generateTableAnnotation', - 'generateInheritanceAnnotation', - 'generateDiscriminatorColumnAnnotation', - 'generateDiscriminatorMapAnnotation' - ); - - foreach ($methods as $method) { - if ($code = $this->$method($metadata)) { - $lines[] = ' * ' . $code; - } - } - - if ($metadata->isMappedSuperclass) { - $lines[] = ' * @' . $this->annotationsPrefix . 'MappedSuperClass'; - } else { - $lines[] = ' * @' . $this->annotationsPrefix . 'Entity'; - } - - if ($metadata->customRepositoryClassName) { - $lines[count($lines) - 1] .= '(repositoryClass="' . $metadata->customRepositoryClassName . '")'; - } - - if (isset($metadata->lifecycleCallbacks) && $metadata->lifecycleCallbacks) { - $lines[] = ' * @' . $this->annotationsPrefix . 'HasLifecycleCallbacks'; - } - } - - $lines[] = ' */'; - - return implode("\n", $lines); - } - - private function generateTableAnnotation($metadata) - { - $table = array(); - - if (isset($metadata->table['schema'])) { - $table[] = 'schema="' . $metadata->table['schema'] . '"'; - } - - if (isset($metadata->table['name'])) { - $table[] = 'name="' . $metadata->table['name'] . '"'; - } - - if (isset($metadata->table['uniqueConstraints']) && $metadata->table['uniqueConstraints']) { - $constraints = $this->generateTableConstraints('UniqueConstraint', $metadata->table['uniqueConstraints']); - $table[] = 'uniqueConstraints={' . $constraints . '}'; - } - - if (isset($metadata->table['indexes']) && $metadata->table['indexes']) { - $constraints = $this->generateTableConstraints('Index', $metadata->table['indexes']); - $table[] = 'indexes={' . $constraints . '}'; - } - - return '@' . $this->annotationsPrefix . 'Table(' . implode(', ', $table) . ')'; - } - - private function generateTableConstraints($constraintName, $constraints) - { - $annotations = array(); - foreach ($constraints as $name => $constraint) { - $columns = array(); - foreach ($constraint['columns'] as $column) { - $columns[] = '"' . $column . '"'; - } - $annotations[] = '@' . $this->annotationsPrefix . $constraintName . '(name="' . $name . '", columns={' . implode(', ', $columns) . '})'; - } - return implode(', ', $annotations); - } - - private function generateInheritanceAnnotation($metadata) - { - if ($metadata->inheritanceType != ClassMetadataInfo::INHERITANCE_TYPE_NONE) { - return '@' . $this->annotationsPrefix . 'InheritanceType("'.$this->getInheritanceTypeString($metadata->inheritanceType).'")'; - } - } - - private function generateDiscriminatorColumnAnnotation($metadata) - { - if ($metadata->inheritanceType != ClassMetadataInfo::INHERITANCE_TYPE_NONE) { - $discrColumn = $metadata->discriminatorValue; - $columnDefinition = 'name="' . $discrColumn['name'] - . '", type="' . $discrColumn['type'] - . '", length=' . $discrColumn['length']; - - return '@' . $this->annotationsPrefix . 'DiscriminatorColumn(' . $columnDefinition . ')'; - } - } - - private function generateDiscriminatorMapAnnotation($metadata) - { - if ($metadata->inheritanceType != ClassMetadataInfo::INHERITANCE_TYPE_NONE) { - $inheritanceClassMap = array(); - - foreach ($metadata->discriminatorMap as $type => $class) { - $inheritanceClassMap[] .= '"' . $type . '" = "' . $class . '"'; - } - - return '@' . $this->annotationsPrefix . 'DiscriminatorMap({' . implode(', ', $inheritanceClassMap) . '})'; - } - } - - private function generateEntityStubMethods(ClassMetadataInfo $metadata) - { - $methods = array(); - - foreach ($metadata->fieldMappings as $fieldMapping) { - if ( ! isset($fieldMapping['id']) || ! $fieldMapping['id'] || $metadata->generatorType == ClassMetadataInfo::GENERATOR_TYPE_NONE) { - if ($code = $this->generateEntityStubMethod($metadata, 'set', $fieldMapping['fieldName'], $fieldMapping['type'])) { - $methods[] = $code; - } - } - - if ($code = $this->generateEntityStubMethod($metadata, 'get', $fieldMapping['fieldName'], $fieldMapping['type'])) { - $methods[] = $code; - } - } - - foreach ($metadata->associationMappings as $associationMapping) { - if ($associationMapping['type'] & ClassMetadataInfo::TO_ONE) { - $nullable = $this->isAssociationIsNullable($associationMapping) ? 'null' : null; - if ($code = $this->generateEntityStubMethod($metadata, 'set', $associationMapping['fieldName'], $associationMapping['targetEntity'], $nullable)) { - $methods[] = $code; - } - if ($code = $this->generateEntityStubMethod($metadata, 'get', $associationMapping['fieldName'], $associationMapping['targetEntity'])) { - $methods[] = $code; - } - } else if ($associationMapping['type'] & ClassMetadataInfo::TO_MANY) { - if ($code = $this->generateEntityStubMethod($metadata, 'add', $associationMapping['fieldName'], $associationMapping['targetEntity'])) { - $methods[] = $code; - } - if ($code = $this->generateEntityStubMethod($metadata, 'remove', $associationMapping['fieldName'], $associationMapping['targetEntity'])) { - $methods[] = $code; - } - if ($code = $this->generateEntityStubMethod($metadata, 'get', $associationMapping['fieldName'], 'Doctrine\Common\Collections\Collection')) { - $methods[] = $code; - } - } - } - - return implode("\n\n", $methods); - } - - private function isAssociationIsNullable($associationMapping) - { - if (isset($associationMapping['id']) && $associationMapping['id']) { - return false; - } - if (isset($associationMapping['joinColumns'])) { - $joinColumns = $associationMapping['joinColumns']; - } else { - //@todo thereis no way to retreive targetEntity metadata - $joinColumns = array(); - } - foreach ($joinColumns as $joinColumn) { - if(isset($joinColumn['nullable']) && !$joinColumn['nullable']) { - return false; - } - } - return true; - } - - private function generateEntityLifecycleCallbackMethods(ClassMetadataInfo $metadata) - { - if (isset($metadata->lifecycleCallbacks) && $metadata->lifecycleCallbacks) { - $methods = array(); - - foreach ($metadata->lifecycleCallbacks as $name => $callbacks) { - foreach ($callbacks as $callback) { - if ($code = $this->generateLifecycleCallbackMethod($name, $callback, $metadata)) { - $methods[] = $code; - } - } - } - - return implode("\n\n", $methods); - } - - return ""; - } - - private function generateEntityAssociationMappingProperties(ClassMetadataInfo $metadata) - { - $lines = array(); - - foreach ($metadata->associationMappings as $associationMapping) { - if ($this->hasProperty($associationMapping['fieldName'], $metadata)) { - continue; - } - - $lines[] = $this->generateAssociationMappingPropertyDocBlock($associationMapping, $metadata); - $lines[] = $this->spaces . $this->fieldVisibility . ' $' . $associationMapping['fieldName'] - . ($associationMapping['type'] == 'manyToMany' ? ' = array()' : null) . ";\n"; - } - - return implode("\n", $lines); - } - - private function generateEntityFieldMappingProperties(ClassMetadataInfo $metadata) - { - $lines = array(); - - foreach ($metadata->fieldMappings as $fieldMapping) { - if ($this->hasProperty($fieldMapping['fieldName'], $metadata) || - $metadata->isInheritedField($fieldMapping['fieldName'])) { - continue; - } - - $lines[] = $this->generateFieldMappingPropertyDocBlock($fieldMapping, $metadata); - $lines[] = $this->spaces . $this->fieldVisibility . ' $' . $fieldMapping['fieldName'] - . (isset($fieldMapping['default']) ? ' = ' . var_export($fieldMapping['default'], true) : null) . ";\n"; - } - - return implode("\n", $lines); - } - - private function generateEntityStubMethod(ClassMetadataInfo $metadata, $type, $fieldName, $typeHint = null, $defaultValue = null) - { - $methodName = $type . Inflector::classify($fieldName); - if (in_array($type, array("add", "remove")) && substr($methodName, -1) == "s") { - $methodName = substr($methodName, 0, -1); - } - - if ($this->hasMethod($methodName, $metadata)) { - return; - } - $this->staticReflection[$metadata->name]['methods'][] = $methodName; - - $var = sprintf('%sMethodTemplate', $type); - $template = self::$$var; - - $methodTypeHint = null; - $types = Type::getTypesMap(); - $variableType = $typeHint ? $this->getType($typeHint) . ' ' : null; - - if ($typeHint && ! isset($types[$typeHint])) { - $variableType = '\\' . ltrim($variableType, '\\'); - $methodTypeHint = '\\' . $typeHint . ' '; - } - - $replacements = array( - '' => ucfirst($type) . ' ' . $fieldName, - '' => $methodTypeHint, - '' => $variableType, - '' => Inflector::camelize($fieldName), - '' => $methodName, - '' => $fieldName, - '' => ($defaultValue !== null ) ? (' = '.$defaultValue) : '', - '' => $this->getClassName($metadata) - ); - - $method = str_replace( - array_keys($replacements), - array_values($replacements), - $template - ); - - return $this->prefixCodeWithSpaces($method); - } - - private function generateLifecycleCallbackMethod($name, $methodName, $metadata) - { - if ($this->hasMethod($methodName, $metadata)) { - return; - } - $this->staticReflection[$metadata->name]['methods'][] = $methodName; - - $replacements = array( - '' => $this->annotationsPrefix . ucfirst($name), - '' => $methodName, - ); - - $method = str_replace( - array_keys($replacements), - array_values($replacements), - self::$lifecycleCallbackMethodTemplate - ); - - return $this->prefixCodeWithSpaces($method); - } - - private function generateJoinColumnAnnotation(array $joinColumn) - { - $joinColumnAnnot = array(); - - if (isset($joinColumn['name'])) { - $joinColumnAnnot[] = 'name="' . $joinColumn['name'] . '"'; - } - - if (isset($joinColumn['referencedColumnName'])) { - $joinColumnAnnot[] = 'referencedColumnName="' . $joinColumn['referencedColumnName'] . '"'; - } - - if (isset($joinColumn['unique']) && $joinColumn['unique']) { - $joinColumnAnnot[] = 'unique=' . ($joinColumn['unique'] ? 'true' : 'false'); - } - - if (isset($joinColumn['nullable'])) { - $joinColumnAnnot[] = 'nullable=' . ($joinColumn['nullable'] ? 'true' : 'false'); - } - - if (isset($joinColumn['onDelete'])) { - $joinColumnAnnot[] = 'onDelete="' . ($joinColumn['onDelete'] . '"'); - } - - if (isset($joinColumn['columnDefinition'])) { - $joinColumnAnnot[] = 'columnDefinition="' . $joinColumn['columnDefinition'] . '"'; - } - - return '@' . $this->annotationsPrefix . 'JoinColumn(' . implode(', ', $joinColumnAnnot) . ')'; - } - - private function generateAssociationMappingPropertyDocBlock(array $associationMapping, ClassMetadataInfo $metadata) - { - $lines = array(); - $lines[] = $this->spaces . '/**'; - - if ($associationMapping['type'] & ClassMetadataInfo::TO_MANY) { - $lines[] = $this->spaces . ' * @var \Doctrine\Common\Collections\Collection'; - } else { - $lines[] = $this->spaces . ' * @var \\' . ltrim($associationMapping['targetEntity'], '\\'); - } - - if ($this->generateAnnotations) { - $lines[] = $this->spaces . ' *'; - - if (isset($associationMapping['id']) && $associationMapping['id']) { - $lines[] = $this->spaces . ' * @' . $this->annotationsPrefix . 'Id'; - - if ($generatorType = $this->getIdGeneratorTypeString($metadata->generatorType)) { - $lines[] = $this->spaces . ' * @' . $this->annotationsPrefix . 'GeneratedValue(strategy="' . $generatorType . '")'; - } - } - - $type = null; - switch ($associationMapping['type']) { - case ClassMetadataInfo::ONE_TO_ONE: - $type = 'OneToOne'; - break; - case ClassMetadataInfo::MANY_TO_ONE: - $type = 'ManyToOne'; - break; - case ClassMetadataInfo::ONE_TO_MANY: - $type = 'OneToMany'; - break; - case ClassMetadataInfo::MANY_TO_MANY: - $type = 'ManyToMany'; - break; - } - $typeOptions = array(); - - if (isset($associationMapping['targetEntity'])) { - $typeOptions[] = 'targetEntity="' . $associationMapping['targetEntity'] . '"'; - } - - if (isset($associationMapping['inversedBy'])) { - $typeOptions[] = 'inversedBy="' . $associationMapping['inversedBy'] . '"'; - } - - if (isset($associationMapping['mappedBy'])) { - $typeOptions[] = 'mappedBy="' . $associationMapping['mappedBy'] . '"'; - } - - if ($associationMapping['cascade']) { - $cascades = array(); - - if ($associationMapping['isCascadePersist']) $cascades[] = '"persist"'; - if ($associationMapping['isCascadeRemove']) $cascades[] = '"remove"'; - if ($associationMapping['isCascadeDetach']) $cascades[] = '"detach"'; - if ($associationMapping['isCascadeMerge']) $cascades[] = '"merge"'; - if ($associationMapping['isCascadeRefresh']) $cascades[] = '"refresh"'; - - $typeOptions[] = 'cascade={' . implode(',', $cascades) . '}'; - } - - if (isset($associationMapping['orphanRemoval']) && $associationMapping['orphanRemoval']) { - $typeOptions[] = 'orphanRemoval=' . ($associationMapping['orphanRemoval'] ? 'true' : 'false'); - } - - $lines[] = $this->spaces . ' * @' . $this->annotationsPrefix . '' . $type . '(' . implode(', ', $typeOptions) . ')'; - - if (isset($associationMapping['joinColumns']) && $associationMapping['joinColumns']) { - $lines[] = $this->spaces . ' * @' . $this->annotationsPrefix . 'JoinColumns({'; - - $joinColumnsLines = array(); - - foreach ($associationMapping['joinColumns'] as $joinColumn) { - if ($joinColumnAnnot = $this->generateJoinColumnAnnotation($joinColumn)) { - $joinColumnsLines[] = $this->spaces . ' * ' . $joinColumnAnnot; - } - } - - $lines[] = implode(",\n", $joinColumnsLines); - $lines[] = $this->spaces . ' * })'; - } - - if (isset($associationMapping['joinTable']) && $associationMapping['joinTable']) { - $joinTable = array(); - $joinTable[] = 'name="' . $associationMapping['joinTable']['name'] . '"'; - - if (isset($associationMapping['joinTable']['schema'])) { - $joinTable[] = 'schema="' . $associationMapping['joinTable']['schema'] . '"'; - } - - $lines[] = $this->spaces . ' * @' . $this->annotationsPrefix . 'JoinTable(' . implode(', ', $joinTable) . ','; - $lines[] = $this->spaces . ' * joinColumns={'; - - $joinColumnsLines = array(); - - foreach ($associationMapping['joinTable']['joinColumns'] as $joinColumn) { - $joinColumnsLines[] = $this->spaces . ' * ' . $this->generateJoinColumnAnnotation($joinColumn); - } - - $lines[] = implode(",". PHP_EOL, $joinColumnsLines); - $lines[] = $this->spaces . ' * },'; - $lines[] = $this->spaces . ' * inverseJoinColumns={'; - - $inverseJoinColumnsLines = array(); - - foreach ($associationMapping['joinTable']['inverseJoinColumns'] as $joinColumn) { - $inverseJoinColumnsLines[] = $this->spaces . ' * ' . $this->generateJoinColumnAnnotation($joinColumn); - } - - $lines[] = implode(",". PHP_EOL, $inverseJoinColumnsLines); - $lines[] = $this->spaces . ' * }'; - $lines[] = $this->spaces . ' * )'; - } - - if (isset($associationMapping['orderBy'])) { - $lines[] = $this->spaces . ' * @' . $this->annotationsPrefix . 'OrderBy({'; - - foreach ($associationMapping['orderBy'] as $name => $direction) { - $lines[] = $this->spaces . ' * "' . $name . '"="' . $direction . '",'; - } - - $lines[count($lines) - 1] = substr($lines[count($lines) - 1], 0, strlen($lines[count($lines) - 1]) - 1); - $lines[] = $this->spaces . ' * })'; - } - } - - $lines[] = $this->spaces . ' */'; - - return implode("\n", $lines); - } - - private function generateFieldMappingPropertyDocBlock(array $fieldMapping, ClassMetadataInfo $metadata) - { - $lines = array(); - $lines[] = $this->spaces . '/**'; - $lines[] = $this->spaces . ' * @var ' . $this->getType($fieldMapping['type']); - - if ($this->generateAnnotations) { - $lines[] = $this->spaces . ' *'; - - $column = array(); - if (isset($fieldMapping['columnName'])) { - $column[] = 'name="' . $fieldMapping['columnName'] . '"'; - } - - if (isset($fieldMapping['type'])) { - $column[] = 'type="' . $fieldMapping['type'] . '"'; - } - - if (isset($fieldMapping['length'])) { - $column[] = 'length=' . $fieldMapping['length']; - } - - if (isset($fieldMapping['precision'])) { - $column[] = 'precision=' . $fieldMapping['precision']; - } - - if (isset($fieldMapping['scale'])) { - $column[] = 'scale=' . $fieldMapping['scale']; - } - - if (isset($fieldMapping['nullable'])) { - $column[] = 'nullable=' . var_export($fieldMapping['nullable'], true); - } - - if (isset($fieldMapping['columnDefinition'])) { - $column[] = 'columnDefinition="' . $fieldMapping['columnDefinition'] . '"'; - } - - if (isset($fieldMapping['unique'])) { - $column[] = 'unique=' . var_export($fieldMapping['unique'], true); - } - - $lines[] = $this->spaces . ' * @' . $this->annotationsPrefix . 'Column(' . implode(', ', $column) . ')'; - - if (isset($fieldMapping['id']) && $fieldMapping['id']) { - $lines[] = $this->spaces . ' * @' . $this->annotationsPrefix . 'Id'; - - if ($generatorType = $this->getIdGeneratorTypeString($metadata->generatorType)) { - $lines[] = $this->spaces.' * @' . $this->annotationsPrefix . 'GeneratedValue(strategy="' . $generatorType . '")'; - } - - if ($metadata->sequenceGeneratorDefinition) { - $sequenceGenerator = array(); - - if (isset($metadata->sequenceGeneratorDefinition['sequenceName'])) { - $sequenceGenerator[] = 'sequenceName="' . $metadata->sequenceGeneratorDefinition['sequenceName'] . '"'; - } - - if (isset($metadata->sequenceGeneratorDefinition['allocationSize'])) { - $sequenceGenerator[] = 'allocationSize=' . $metadata->sequenceGeneratorDefinition['allocationSize']; - } - - if (isset($metadata->sequenceGeneratorDefinition['initialValue'])) { - $sequenceGenerator[] = 'initialValue=' . $metadata->sequenceGeneratorDefinition['initialValue']; - } - - $lines[] = $this->spaces . ' * @' . $this->annotationsPrefix . 'SequenceGenerator(' . implode(', ', $sequenceGenerator) . ')'; - } - } - - if (isset($fieldMapping['version']) && $fieldMapping['version']) { - $lines[] = $this->spaces . ' * @' . $this->annotationsPrefix . 'Version'; - } - } - - $lines[] = $this->spaces . ' */'; - - return implode("\n", $lines); - } - - private function prefixCodeWithSpaces($code, $num = 1) - { - $lines = explode("\n", $code); - - foreach ($lines as $key => $value) { - $lines[$key] = str_repeat($this->spaces, $num) . $lines[$key]; - } - - return implode("\n", $lines); - } - - /** - * @param integer $type The inheritance type used by the class and it's subclasses. - * @return string The literal string for the inheritance type. - * @throws \InvalidArgumentException When the inheritance type does not exists. - */ - protected function getInheritanceTypeString($type) - { - if ( ! isset(self::$inheritanceTypeMap[$type])) { - throw new \InvalidArgumentException(sprintf('Invalid provided InheritanceType: %s', $type)); - } - - return self::$inheritanceTypeMap[$type]; - } - - /** - * @param integer $type The policy used for change-tracking for the mapped class. - * @return string The literal string for the change-tracking type. - * @throws \InvalidArgumentException When the change-tracking type does not exists. - */ - protected function getChangeTrackingPolicyString($type) - { - if ( ! isset(self::$changeTrackingPolicyMap[$type])) { - throw new \InvalidArgumentException(sprintf('Invalid provided ChangeTrackingPolicy: %s', $type)); - } - - return self::$changeTrackingPolicyMap[$type]; - } - - /** - * @param integer $type The generator to use for the mapped class. - * @return string The literal string for the generetor type. - * @throws \InvalidArgumentException When the generator type does not exists. - */ - protected function getIdGeneratorTypeString($type) - { - if ( ! isset(self::$generatorStrategyMap[$type])) { - throw new \InvalidArgumentException(sprintf('Invalid provided IdGeneratorType: %s', $type)); - } - - return self::$generatorStrategyMap[$type]; - } -} diff --git a/framework/library/Doctrine/ORM/Tools/EntityRepositoryGenerator.php b/framework/library/Doctrine/ORM/Tools/EntityRepositoryGenerator.php deleted file mode 100644 index e696abc..0000000 --- a/framework/library/Doctrine/ORM/Tools/EntityRepositoryGenerator.php +++ /dev/null @@ -1,81 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools; - -/** - * Class to generate entity repository classes - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class EntityRepositoryGenerator -{ - protected static $_template = -'; - -use Doctrine\ORM\EntityRepository; - -/** - * - * - * This class was generated by the Doctrine ORM. Add your own custom - * repository methods below. - */ -class extends EntityRepository -{ -} -'; - - public function generateEntityRepositoryClass($fullClassName) - { - $namespace = substr($fullClassName, 0, strrpos($fullClassName, '\\')); - $className = substr($fullClassName, strrpos($fullClassName, '\\') + 1, strlen($fullClassName)); - - $variables = array( - '' => $namespace, - '' => $className - ); - return str_replace(array_keys($variables), array_values($variables), self::$_template); - } - - public function writeEntityRepositoryClass($fullClassName, $outputDirectory) - { - $code = $this->generateEntityRepositoryClass($fullClassName); - - $path = $outputDirectory . DIRECTORY_SEPARATOR - . str_replace('\\', \DIRECTORY_SEPARATOR, $fullClassName) . '.php'; - $dir = dirname($path); - - if ( ! is_dir($dir)) { - mkdir($dir, 0777, true); - } - - if ( ! file_exists($path)) { - file_put_contents($path, $code); - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Event/GenerateSchemaEventArgs.php b/framework/library/Doctrine/ORM/Tools/Event/GenerateSchemaEventArgs.php deleted file mode 100644 index 0473111..0000000 --- a/framework/library/Doctrine/ORM/Tools/Event/GenerateSchemaEventArgs.php +++ /dev/null @@ -1,62 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Event; - -use Doctrine\DBAL\Schema\Schema; -use Doctrine\ORM\EntityManager; - -/** - * Event Args used for the Events::postGenerateSchema event. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @author Benjamin Eberlei - */ -class GenerateSchemaEventArgs extends \Doctrine\Common\EventArgs -{ - private $_em = null; - private $_schema = null; - - /** - * @param ClassMetadata $classMetadata - * @param Schema $schema - * @param Table $classTable - */ - public function __construct(EntityManager $em, Schema $schema) - { - $this->_em = $em; - $this->_schema = $schema; - } - - /** - * @return EntityManager - */ - public function getEntityManager() { - return $this->_em; - } - - /** - * @return Schema - */ - public function getSchema() { - return $this->_schema; - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Event/GenerateSchemaTableEventArgs.php b/framework/library/Doctrine/ORM/Tools/Event/GenerateSchemaTableEventArgs.php deleted file mode 100644 index 060c554..0000000 --- a/framework/library/Doctrine/ORM/Tools/Event/GenerateSchemaTableEventArgs.php +++ /dev/null @@ -1,71 +0,0 @@ -. - */ -namespace Doctrine\ORM\Tools\Event; - -use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\DBAL\Schema\Schema; -use Doctrine\DBAL\Schema\Table; - -/** - * Event Args used for the Events::postGenerateSchemaTable event. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @author Benjamin Eberlei - */ -class GenerateSchemaTableEventArgs extends \Doctrine\Common\EventArgs -{ - private $_classMetadata = null; - private $_schema = null; - private $_classTable = null; - - /** - * @param ClassMetadata $classMetadata - * @param Schema $schema - * @param Table $classTable - */ - public function __construct(ClassMetadata $classMetadata, Schema $schema, Table $classTable) - { - $this->_classMetadata = $classMetadata; - $this->_schema = $schema; - $this->_classTable = $classTable; - } - - /** - * @return ClassMetadata - */ - public function getClassMetadata() { - return $this->_classMetadata; - } - - /** - * @return Schema - */ - public function getSchema() { - return $this->_schema; - } - - /** - * @return Table - */ - public function getClassTable() { - return $this->_classTable; - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Export/ClassMetadataExporter.php b/framework/library/Doctrine/ORM/Tools/Export/ClassMetadataExporter.php deleted file mode 100644 index 843c004..0000000 --- a/framework/library/Doctrine/ORM/Tools/Export/ClassMetadataExporter.php +++ /dev/null @@ -1,72 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Export; - -use Doctrine\ORM\Tools\Export\ExportException, - Doctrine\ORM\EntityManager; - -/** - * Class used for converting your mapping information between the - * supported formats: yaml, xml, and php/annotation. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Jonathan Wage - */ -class ClassMetadataExporter -{ - private static $_exporterDrivers = array( - 'xml' => 'Doctrine\ORM\Tools\Export\Driver\XmlExporter', - 'yaml' => 'Doctrine\ORM\Tools\Export\Driver\YamlExporter', - 'yml' => 'Doctrine\ORM\Tools\Export\Driver\YamlExporter', - 'php' => 'Doctrine\ORM\Tools\Export\Driver\PhpExporter', - 'annotation' => 'Doctrine\ORM\Tools\Export\Driver\AnnotationExporter' - ); - - /** - * Register a new exporter driver class under a specified name - * - * @param string $name - * @param string $class - */ - public static function registerExportDriver($name, $class) - { - self::$_exporterDrivers[$name] = $class; - } - - /** - * Get a exporter driver instance - * - * @param string $type The type to get (yml, xml, etc.) - * @param string $source The directory where the exporter will export to - * @return AbstractExporter $exporter - */ - public function getExporter($type, $dest = null) - { - if ( ! isset(self::$_exporterDrivers[$type])) { - throw ExportException::invalidExporterDriverType($type); - } - - $class = self::$_exporterDrivers[$type]; - - return new $class($dest); - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php b/framework/library/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php deleted file mode 100644 index 7c13397..0000000 --- a/framework/library/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php +++ /dev/null @@ -1,213 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Export\Driver; - -use Doctrine\ORM\Mapping\ClassMetadataInfo; -use Doctrine\ORM\Tools\Export\ExportException; - -/** - * Abstract base class which is to be used for the Exporter drivers - * which can be found in \Doctrine\ORM\Tools\Export\Driver - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Jonathan Wage - */ -abstract class AbstractExporter -{ - protected $_metadata = array(); - protected $_outputDir; - protected $_extension; - protected $_overwriteExistingFiles = false; - - public function __construct($dir = null) - { - $this->_outputDir = $dir; - } - - public function setOverwriteExistingFiles($overwrite) - { - $this->_overwriteExistingFiles = $overwrite; - } - - /** - * Converts a single ClassMetadata instance to the exported format - * and returns it - * - * @param ClassMetadataInfo $metadata - * @return mixed $exported - */ - abstract public function exportClassMetadata(ClassMetadataInfo $metadata); - - /** - * Set the array of ClassMetadataInfo instances to export - * - * @param array $metadata - * @return void - */ - public function setMetadata(array $metadata) - { - $this->_metadata = $metadata; - } - - /** - * Get the extension used to generated the path to a class - * - * @return string $extension - */ - public function getExtension() - { - return $this->_extension; - } - - /** - * Set the directory to output the mapping files to - * - * [php] - * $exporter = new YamlExporter($metadata); - * $exporter->setOutputDir(__DIR__ . '/yaml'); - * $exporter->export(); - * - * @param string $dir - * @return void - */ - public function setOutputDir($dir) - { - $this->_outputDir = $dir; - } - - /** - * Export each ClassMetadata instance to a single Doctrine Mapping file - * named after the entity - * - * @return void - */ - public function export() - { - if ( ! is_dir($this->_outputDir)) { - mkdir($this->_outputDir, 0777, true); - } - - foreach ($this->_metadata as $metadata) { - //In case output is returned, write it to a file, skip otherwise - if($output = $this->exportClassMetadata($metadata)){ - $path = $this->_generateOutputPath($metadata); - $dir = dirname($path); - if ( ! is_dir($dir)) { - mkdir($dir, 0777, true); - } - if (file_exists($path) && !$this->_overwriteExistingFiles) { - throw ExportException::attemptOverwriteExistingFile($path); - } - file_put_contents($path, $output); - } - } - } - - /** - * Generate the path to write the class for the given ClassMetadataInfo instance - * - * @param ClassMetadataInfo $metadata - * @return string $path - */ - protected function _generateOutputPath(ClassMetadataInfo $metadata) - { - return $this->_outputDir . '/' . str_replace('\\', '.', $metadata->name) . $this->_extension; - } - - /** - * Set the directory to output the mapping files to - * - * [php] - * $exporter = new YamlExporter($metadata, __DIR__ . '/yaml'); - * $exporter->setExtension('.yml'); - * $exporter->export(); - * - * @param string $extension - * @return void - */ - public function setExtension($extension) - { - $this->_extension = $extension; - } - - protected function _getInheritanceTypeString($type) - { - switch ($type) - { - case ClassMetadataInfo::INHERITANCE_TYPE_NONE: - return 'NONE'; - break; - - case ClassMetadataInfo::INHERITANCE_TYPE_JOINED: - return 'JOINED'; - break; - - case ClassMetadataInfo::INHERITANCE_TYPE_SINGLE_TABLE: - return 'SINGLE_TABLE'; - break; - - case ClassMetadataInfo::INHERITANCE_TYPE_TABLE_PER_CLASS: - return 'PER_CLASS'; - break; - } - } - - protected function _getChangeTrackingPolicyString($policy) - { - switch ($policy) - { - case ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT: - return 'DEFERRED_IMPLICIT'; - break; - - case ClassMetadataInfo::CHANGETRACKING_DEFERRED_EXPLICIT: - return 'DEFERRED_EXPLICIT'; - break; - - case ClassMetadataInfo::CHANGETRACKING_NOTIFY: - return 'NOTIFY'; - break; - } - } - - protected function _getIdGeneratorTypeString($type) - { - switch ($type) - { - case ClassMetadataInfo::GENERATOR_TYPE_AUTO: - return 'AUTO'; - break; - - case ClassMetadataInfo::GENERATOR_TYPE_SEQUENCE: - return 'SEQUENCE'; - break; - - case ClassMetadataInfo::GENERATOR_TYPE_TABLE: - return 'TABLE'; - break; - - case ClassMetadataInfo::GENERATOR_TYPE_IDENTITY: - return 'IDENTITY'; - break; - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Export/Driver/AnnotationExporter.php b/framework/library/Doctrine/ORM/Tools/Export/Driver/AnnotationExporter.php deleted file mode 100644 index d1ec92a..0000000 --- a/framework/library/Doctrine/ORM/Tools/Export/Driver/AnnotationExporter.php +++ /dev/null @@ -1,67 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Export\Driver; - -use Doctrine\ORM\Mapping\ClassMetadataInfo, - Doctrine\ORM\Tools\EntityGenerator; - -/** - * ClassMetadata exporter for PHP classes with annotations - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Jonathan Wage - */ -class AnnotationExporter extends AbstractExporter -{ - protected $_extension = '.php'; - private $_entityGenerator; - - /** - * Converts a single ClassMetadata instance to the exported format - * and returns it - * - * @param ClassMetadataInfo $metadata - * @return string $exported - */ - public function exportClassMetadata(ClassMetadataInfo $metadata) - { - if ( ! $this->_entityGenerator) { - throw new \RuntimeException('For the AnnotationExporter you must set an EntityGenerator instance with the setEntityGenerator() method.'); - } - $this->_entityGenerator->setGenerateAnnotations(true); - $this->_entityGenerator->setGenerateStubMethods(false); - $this->_entityGenerator->setRegenerateEntityIfExists(false); - $this->_entityGenerator->setUpdateEntityIfExists(false); - - return $this->_entityGenerator->generateEntityClass($metadata); - } - - protected function _generateOutputPath(ClassMetadataInfo $metadata) - { - return $this->_outputDir . '/' . str_replace('\\', '/', $metadata->name) . $this->_extension; - } - - public function setEntityGenerator(EntityGenerator $entityGenerator) - { - $this->_entityGenerator = $entityGenerator; - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php b/framework/library/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php deleted file mode 100644 index 24f7243..0000000 --- a/framework/library/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php +++ /dev/null @@ -1,165 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Export\Driver; - -use Doctrine\ORM\Mapping\ClassMetadataInfo; - -/** - * ClassMetadata exporter for PHP code - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Jonathan Wage - */ -class PhpExporter extends AbstractExporter -{ - protected $_extension = '.php'; - - /** - * Converts a single ClassMetadata instance to the exported format - * and returns it - * - * @param ClassMetadataInfo $metadata - * @return mixed $exported - */ - public function exportClassMetadata(ClassMetadataInfo $metadata) - { - $lines = array(); - $lines[] = 'isMappedSuperclass) { - $lines[] = '$metadata->isMappedSuperclass = true;'; - } - - if ($metadata->inheritanceType) { - $lines[] = '$metadata->setInheritanceType(ClassMetadataInfo::INHERITANCE_TYPE_' . $this->_getInheritanceTypeString($metadata->inheritanceType) . ');'; - } - - if ($metadata->customRepositoryClassName) { - $lines[] = "\$metadata->customRepositoryClassName = '" . $metadata->customRepositoryClassName . "';"; - } - - if ($metadata->table) { - $lines[] = '$metadata->setPrimaryTable(' . $this->_varExport($metadata->table) . ');'; - } - - if ($metadata->discriminatorColumn) { - $lines[] = '$metadata->setDiscriminatorColumn(' . $this->_varExport($metadata->discriminatorColumn) . ');'; - } - - if ($metadata->discriminatorMap) { - $lines[] = '$metadata->setDiscriminatorMap(' . $this->_varExport($metadata->discriminatorMap) . ');'; - } - - if ($metadata->changeTrackingPolicy) { - $lines[] = '$metadata->setChangeTrackingPolicy(ClassMetadataInfo::CHANGETRACKING_' . $this->_getChangeTrackingPolicyString($metadata->changeTrackingPolicy) . ');'; - } - - if ($metadata->lifecycleCallbacks) { - foreach ($metadata->lifecycleCallbacks as $event => $callbacks) { - foreach ($callbacks as $callback) { - $lines[] = "\$metadata->addLifecycleCallback('$callback', '$event');"; - } - } - } - - foreach ($metadata->fieldMappings as $fieldMapping) { - $lines[] = '$metadata->mapField(' . $this->_varExport($fieldMapping) . ');'; - } - - if ( ! $metadata->isIdentifierComposite && $generatorType = $this->_getIdGeneratorTypeString($metadata->generatorType)) { - $lines[] = '$metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_' . $generatorType . ');'; - } - - foreach ($metadata->associationMappings as $associationMapping) { - $cascade = array('remove', 'persist', 'refresh', 'merge', 'detach'); - foreach ($cascade as $key => $value) { - if ( ! $associationMapping['isCascade'.ucfirst($value)]) { - unset($cascade[$key]); - } - } - $associationMappingArray = array( - 'fieldName' => $associationMapping['fieldName'], - 'targetEntity' => $associationMapping['targetEntity'], - 'cascade' => $cascade, - ); - - if ($associationMapping['type'] & ClassMetadataInfo::TO_ONE) { - $method = 'mapOneToOne'; - $oneToOneMappingArray = array( - 'mappedBy' => $associationMapping['mappedBy'], - 'inversedBy' => $associationMapping['inversedBy'], - 'joinColumns' => $associationMapping['joinColumns'], - 'orphanRemoval' => $associationMapping['orphanRemoval'], - ); - - $associationMappingArray = array_merge($associationMappingArray, $oneToOneMappingArray); - } else if ($associationMapping['type'] == ClassMetadataInfo::ONE_TO_MANY) { - $method = 'mapOneToMany'; - $potentialAssociationMappingIndexes = array( - 'mappedBy', - 'orphanRemoval', - 'orderBy', - ); - foreach ($potentialAssociationMappingIndexes as $index) { - if (isset($associationMapping[$index])) { - $oneToManyMappingArray[$index] = $associationMapping[$index]; - } - } - $associationMappingArray = array_merge($associationMappingArray, $oneToManyMappingArray); - } else if ($associationMapping['type'] == ClassMetadataInfo::MANY_TO_MANY) { - $method = 'mapManyToMany'; - $potentialAssociationMappingIndexes = array( - 'mappedBy', - 'joinTable', - 'orderBy', - ); - foreach ($potentialAssociationMappingIndexes as $index) { - if (isset($associationMapping[$index])) { - $manyToManyMappingArray[$index] = $associationMapping[$index]; - } - } - $associationMappingArray = array_merge($associationMappingArray, $manyToManyMappingArray); - } - - $lines[] = '$metadata->' . $method . '(' . $this->_varExport($associationMappingArray) . ');'; - } - - return implode("\n", $lines); - } - - protected function _varExport($var) - { - $export = var_export($var, true); - $export = str_replace("\n", PHP_EOL . str_repeat(' ', 8), $export); - $export = str_replace(' ', ' ', $export); - $export = str_replace('array (', 'array(', $export); - $export = str_replace('array( ', 'array(', $export); - $export = str_replace(',)', ')', $export); - $export = str_replace(', )', ')', $export); - $export = str_replace(' ', ' ', $export); - - return $export; - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php b/framework/library/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php deleted file mode 100644 index 75eee15..0000000 --- a/framework/library/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php +++ /dev/null @@ -1,337 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Export\Driver; - -use Doctrine\ORM\Mapping\ClassMetadataInfo; - -/** - * ClassMetadata exporter for Doctrine XML mapping files - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Jonathan Wage - */ -class XmlExporter extends AbstractExporter -{ - protected $_extension = '.dcm.xml'; - - /** - * Converts a single ClassMetadata instance to the exported format - * and returns it - * - * @param ClassMetadataInfo $metadata - * @return mixed $exported - */ - public function exportClassMetadata(ClassMetadataInfo $metadata) - { - $xml = new \SimpleXmlElement(""); - - /*$xml->addAttribute('xmlns', 'http://doctrine-project.org/schemas/orm/doctrine-mapping'); - $xml->addAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); - $xml->addAttribute('xsi:schemaLocation', 'http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd');*/ - - if ($metadata->isMappedSuperclass) { - $root = $xml->addChild('mapped-superclass'); - } else { - $root = $xml->addChild('entity'); - } - - if ($metadata->customRepositoryClassName) { - $root->addAttribute('repository-class', $metadata->customRepositoryClassName); - } - - $root->addAttribute('name', $metadata->name); - - if (isset($metadata->table['name'])) { - $root->addAttribute('table', $metadata->table['name']); - } - - if (isset($metadata->table['schema'])) { - $root->addAttribute('schema', $metadata->table['schema']); - } - - if (isset($metadata->table['inheritance-type'])) { - $root->addAttribute('inheritance-type', $metadata->table['inheritance-type']); - } - - if ($metadata->discriminatorColumn) { - $discriminatorColumnXml = $root->addChild('discriminator-column'); - $discriminatorColumnXml->addAttribute('name', $metadata->discriminatorColumn['name']); - $discriminatorColumnXml->addAttribute('type', $metadata->discriminatorColumn['type']); - if (isset($metadata->discriminatorColumn['length'])) { - $discriminatorColumnXml->addAttribute('length', $metadata->discriminatorColumn['length']); - } - } - - if ($metadata->discriminatorMap) { - $discriminatorMapXml = $root->addChild('discriminator-map'); - foreach ($metadata->discriminatorMap as $value => $className) { - $discriminatorMappingXml = $discriminatorMapXml->addChild('discriminator-mapping'); - $discriminatorMappingXml->addAttribute('value', $value); - $discriminatorMappingXml->addAttribute('class', $className); - } - } - - $trackingPolicy = $this->_getChangeTrackingPolicyString($metadata->changeTrackingPolicy); - if ( $trackingPolicy != 'DEFERRED_IMPLICIT') { - $root->addChild('change-tracking-policy', $trackingPolicy); - } - - if (isset($metadata->table['indexes'])) { - $indexesXml = $root->addChild('indexes'); - - foreach ($metadata->table['indexes'] as $name => $index) { - $indexXml = $indexesXml->addChild('index'); - $indexXml->addAttribute('name', $name); - $indexXml->addAttribute('columns', implode(',', $index['columns'])); - } - } - - if (isset($metadata->table['uniqueConstraints'])) { - $uniqueConstraintsXml = $root->addChild('unique-constraints'); - - foreach ($metadata->table['uniqueConstraints'] as $name => $unique) { - $uniqueConstraintXml = $uniqueConstraintsXml->addChild('unique-constraint'); - $uniqueConstraintXml->addAttribute('name', $name); - $uniqueConstraintXml->addAttribute('columns', implode(',', $unique['columns'])); - } - } - - $fields = $metadata->fieldMappings; - - $id = array(); - foreach ($fields as $name => $field) { - if (isset($field['id']) && $field['id']) { - $id[$name] = $field; - unset($fields[$name]); - } - } - - if ( ! $metadata->isIdentifierComposite && $idGeneratorType = $this->_getIdGeneratorTypeString($metadata->generatorType)) { - $id[$metadata->getSingleIdentifierFieldName()]['generator']['strategy'] = $idGeneratorType; - } - - if ($id) { - foreach ($id as $field) { - $idXml = $root->addChild('id'); - $idXml->addAttribute('name', $field['fieldName']); - $idXml->addAttribute('type', $field['type']); - if (isset($field['columnName'])) { - $idXml->addAttribute('column', $field['columnName']); - } - if (isset($field['associationKey']) && $field['associationKey']) { - $idXml->addAttribute('association-key', 'true'); - } - if ($idGeneratorType = $this->_getIdGeneratorTypeString($metadata->generatorType)) { - $generatorXml = $idXml->addChild('generator'); - $generatorXml->addAttribute('strategy', $idGeneratorType); - } - } - } - - if ($fields) { - foreach ($fields as $field) { - $fieldXml = $root->addChild('field'); - $fieldXml->addAttribute('name', $field['fieldName']); - $fieldXml->addAttribute('type', $field['type']); - if (isset($field['columnName'])) { - $fieldXml->addAttribute('column', $field['columnName']); - } - if (isset($field['length'])) { - $fieldXml->addAttribute('length', $field['length']); - } - if (isset($field['precision'])) { - $fieldXml->addAttribute('precision', $field['precision']); - } - if (isset($field['scale'])) { - $fieldXml->addAttribute('scale', $field['scale']); - } - if (isset($field['unique']) && $field['unique']) { - $fieldXml->addAttribute('unique', $field['unique']); - } - if (isset($field['options'])) { - $optionsXml = $fieldXml->addChild('options'); - foreach ($field['options'] as $key => $value) { - $optionsXml->addAttribute($key, $value); - } - } - if (isset($field['version'])) { - $fieldXml->addAttribute('version', $field['version']); - } - if (isset($field['columnDefinition'])) { - $fieldXml->addAttribute('column-definition', $field['columnDefinition']); - } - if (isset($field['nullable'])) { - $fieldXml->addAttribute('nullable', $field['nullable'] ? 'true' : 'false'); - } - } - } - $orderMap = array( - ClassMetadataInfo::ONE_TO_ONE, - ClassMetadataInfo::ONE_TO_MANY, - ClassMetadataInfo::MANY_TO_ONE, - ClassMetadataInfo::MANY_TO_MANY, - ); - uasort($metadata->associationMappings, function($m1, $m2)use(&$orderMap){ - $a1 = array_search($m1['type'],$orderMap); - $a2 = array_search($m2['type'],$orderMap); - return strcmp($a1, $a2); - }); - foreach ($metadata->associationMappings as $name => $associationMapping) { - if ($associationMapping['type'] == ClassMetadataInfo::ONE_TO_ONE) { - $associationMappingXml = $root->addChild('one-to-one'); - } else if ($associationMapping['type'] == ClassMetadataInfo::MANY_TO_ONE) { - $associationMappingXml = $root->addChild('many-to-one'); - } else if ($associationMapping['type'] == ClassMetadataInfo::ONE_TO_MANY) { - $associationMappingXml = $root->addChild('one-to-many'); - } else if ($associationMapping['type'] == ClassMetadataInfo::MANY_TO_MANY) { - $associationMappingXml = $root->addChild('many-to-many'); - } - - $associationMappingXml->addAttribute('field', $associationMapping['fieldName']); - $associationMappingXml->addAttribute('target-entity', $associationMapping['targetEntity']); - - if (isset($associationMapping['mappedBy'])) { - $associationMappingXml->addAttribute('mapped-by', $associationMapping['mappedBy']); - } - if (isset($associationMapping['inversedBy'])) { - $associationMappingXml->addAttribute('inversed-by', $associationMapping['inversedBy']); - } - if (isset($associationMapping['indexBy'])) { - $associationMappingXml->addAttribute('index-by', $associationMapping['indexBy']); - } - if (isset($associationMapping['orphanRemoval']) && $associationMapping['orphanRemoval']!==false) { - $associationMappingXml->addAttribute('orphan-removal', 'true'); - } - if (isset($associationMapping['joinTable']) && $associationMapping['joinTable']) { - $joinTableXml = $associationMappingXml->addChild('join-table'); - $joinTableXml->addAttribute('name', $associationMapping['joinTable']['name']); - $joinColumnsXml = $joinTableXml->addChild('join-columns'); - foreach ($associationMapping['joinTable']['joinColumns'] as $joinColumn) { - $joinColumnXml = $joinColumnsXml->addChild('join-column'); - $joinColumnXml->addAttribute('name', $joinColumn['name']); - $joinColumnXml->addAttribute('referenced-column-name', $joinColumn['referencedColumnName']); - if (isset($joinColumn['onDelete'])) { - $joinColumnXml->addAttribute('on-delete', $joinColumn['onDelete']); - } - } - $inverseJoinColumnsXml = $joinTableXml->addChild('inverse-join-columns'); - foreach ($associationMapping['joinTable']['inverseJoinColumns'] as $inverseJoinColumn) { - $inverseJoinColumnXml = $inverseJoinColumnsXml->addChild('join-column'); - $inverseJoinColumnXml->addAttribute('name', $inverseJoinColumn['name']); - $inverseJoinColumnXml->addAttribute('referenced-column-name', $inverseJoinColumn['referencedColumnName']); - if (isset($inverseJoinColumn['onDelete'])) { - $inverseJoinColumnXml->addAttribute('on-delete', $inverseJoinColumn['onDelete']); - } - if (isset($inverseJoinColumn['columnDefinition'])) { - $inverseJoinColumnXml->addAttribute('column-definition', $inverseJoinColumn['columnDefinition']); - } - if (isset($inverseJoinColumn['nullable'])) { - $inverseJoinColumnXml->addAttribute('nullable', $inverseJoinColumn['nullable']); - } - if (isset($inverseJoinColumn['orderBy'])) { - $inverseJoinColumnXml->addAttribute('order-by', $inverseJoinColumn['orderBy']); - } - } - } - if (isset($associationMapping['joinColumns'])) { - $joinColumnsXml = $associationMappingXml->addChild('join-columns'); - foreach ($associationMapping['joinColumns'] as $joinColumn) { - $joinColumnXml = $joinColumnsXml->addChild('join-column'); - $joinColumnXml->addAttribute('name', $joinColumn['name']); - $joinColumnXml->addAttribute('referenced-column-name', $joinColumn['referencedColumnName']); - if (isset($joinColumn['onDelete'])) { - $joinColumnXml->addAttribute('on-delete', $joinColumn['onDelete']); - } - if (isset($joinColumn['columnDefinition'])) { - $joinColumnXml->addAttribute('column-definition', $joinColumn['columnDefinition']); - } - if (isset($joinColumn['nullable'])) { - $joinColumnXml->addAttribute('nullable', $joinColumn['nullable']); - } - } - } - if (isset($associationMapping['orderBy'])) { - $orderByXml = $associationMappingXml->addChild('order-by'); - foreach ($associationMapping['orderBy'] as $name => $direction) { - $orderByFieldXml = $orderByXml->addChild('order-by-field'); - $orderByFieldXml->addAttribute('name', $name); - $orderByFieldXml->addAttribute('direction', $direction); - } - } - $cascade = array(); - if ($associationMapping['isCascadeRemove']) { - $cascade[] = 'cascade-remove'; - } - if ($associationMapping['isCascadePersist']) { - $cascade[] = 'cascade-persist'; - } - if ($associationMapping['isCascadeRefresh']) { - $cascade[] = 'cascade-refresh'; - } - if ($associationMapping['isCascadeMerge']) { - $cascade[] = 'cascade-merge'; - } - if ($associationMapping['isCascadeDetach']) { - $cascade[] = 'cascade-detach'; - } - if (count($cascade) === 5) { - $cascade = array('cascade-all'); - } - if ($cascade) { - $cascadeXml = $associationMappingXml->addChild('cascade'); - foreach ($cascade as $type) { - $cascadeXml->addChild($type); - } - } - } - - if (isset($metadata->lifecycleCallbacks) && count($metadata->lifecycleCallbacks)>0) { - $lifecycleCallbacksXml = $root->addChild('lifecycle-callbacks'); - foreach ($metadata->lifecycleCallbacks as $name => $methods) { - foreach ($methods as $method) { - $lifecycleCallbackXml = $lifecycleCallbacksXml->addChild('lifecycle-callback'); - $lifecycleCallbackXml->addAttribute('type', $name); - $lifecycleCallbackXml->addAttribute('method', $method); - } - } - } - - return $this->_asXml($xml); - } - - /** - * @param \SimpleXMLElement $simpleXml - * @return string $xml - */ - private function _asXml($simpleXml) - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->loadXML($simpleXml->asXML()); - $dom->formatOutput = true; - - $result = $dom->saveXML(); - return $result; - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php b/framework/library/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php deleted file mode 100644 index ceafa83..0000000 --- a/framework/library/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php +++ /dev/null @@ -1,205 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Export\Driver; - -use Doctrine\ORM\Mapping\ClassMetadataInfo; - -/** - * ClassMetadata exporter for Doctrine YAML mapping files - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Jonathan Wage - */ -class YamlExporter extends AbstractExporter -{ - protected $_extension = '.dcm.yml'; - - /** - * Converts a single ClassMetadata instance to the exported format - * and returns it - * - * TODO: Should this code be pulled out in to a toArray() method in ClassMetadata - * - * @param ClassMetadataInfo $metadata - * @return mixed $exported - */ - public function exportClassMetadata(ClassMetadataInfo $metadata) - { - $array = array(); - - if ($metadata->isMappedSuperclass) { - $array['type'] = 'mappedSuperclass'; - } else { - $array['type'] = 'entity'; - } - - $array['table'] = $metadata->table['name']; - - if (isset($metadata->table['schema'])) { - $array['schema'] = $metadata->table['schema']; - } - - $inheritanceType = $metadata->inheritanceType; - if ($inheritanceType !== ClassMetadataInfo::INHERITANCE_TYPE_NONE) { - $array['inheritanceType'] = $this->_getInheritanceTypeString($inheritanceType); - } - - if ($column = $metadata->discriminatorColumn) { - $array['discriminatorColumn'] = $column; - } - - if ($map = $metadata->discriminatorMap) { - $array['discriminatorMap'] = $map; - } - - if ($metadata->changeTrackingPolicy !== ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT) { - $array['changeTrackingPolicy'] = $this->_getChangeTrackingPolicyString($metadata->changeTrackingPolicy); - } - - if (isset($metadata->table['indexes'])) { - $array['indexes'] = $metadata->table['indexes']; - } - - if ($metadata->customRepositoryClassName) { - $array['repositoryClass'] = $metadata->customRepositoryClassName; - } - - if (isset($metadata->table['uniqueConstraints'])) { - $array['uniqueConstraints'] = $metadata->table['uniqueConstraints']; - } - - $fieldMappings = $metadata->fieldMappings; - - $ids = array(); - foreach ($fieldMappings as $name => $fieldMapping) { - $fieldMapping['column'] = $fieldMapping['columnName']; - unset( - $fieldMapping['columnName'], - $fieldMapping['fieldName'] - ); - - if ($fieldMapping['column'] == $name) { - unset($fieldMapping['column']); - } - - if (isset($fieldMapping['id']) && $fieldMapping['id']) { - $ids[$name] = $fieldMapping; - unset($fieldMappings[$name]); - continue; - } - - $fieldMappings[$name] = $fieldMapping; - } - - if ( ! $metadata->isIdentifierComposite && $idGeneratorType = $this->_getIdGeneratorTypeString($metadata->generatorType)) { - $ids[$metadata->getSingleIdentifierFieldName()]['generator']['strategy'] = $idGeneratorType; - } - - if ($ids) { - $array['fields'] = $ids; - } - - if ($fieldMappings) { - if ( ! isset($array['fields'])) { - $array['fields'] = array(); - } - $array['fields'] = array_merge($array['fields'], $fieldMappings); - } - - foreach ($metadata->associationMappings as $name => $associationMapping) { - $cascade = array(); - if ($associationMapping['isCascadeRemove']) { - $cascade[] = 'remove'; - } - if ($associationMapping['isCascadePersist']) { - $cascade[] = 'persist'; - } - if ($associationMapping['isCascadeRefresh']) { - $cascade[] = 'refresh'; - } - if ($associationMapping['isCascadeMerge']) { - $cascade[] = 'merge'; - } - if ($associationMapping['isCascadeDetach']) { - $cascade[] = 'detach'; - } - if (count($cascade) === 5) { - $cascade = array('all'); - } - $associationMappingArray = array( - 'targetEntity' => $associationMapping['targetEntity'], - 'cascade' => $cascade, - ); - - if ($associationMapping['type'] & ClassMetadataInfo::TO_ONE) { - $joinColumns = $associationMapping['joinColumns']; - $newJoinColumns = array(); - foreach ($joinColumns as $joinColumn) { - $newJoinColumns[$joinColumn['name']]['referencedColumnName'] = $joinColumn['referencedColumnName']; - if (isset($joinColumn['onDelete'])) { - $newJoinColumns[$joinColumn['name']]['onDelete'] = $joinColumn['onDelete']; - } - } - $oneToOneMappingArray = array( - 'mappedBy' => $associationMapping['mappedBy'], - 'inversedBy' => $associationMapping['inversedBy'], - 'joinColumns' => $newJoinColumns, - 'orphanRemoval' => $associationMapping['orphanRemoval'], - ); - - $associationMappingArray = array_merge($associationMappingArray, $oneToOneMappingArray); - - if ($associationMapping['type'] & ClassMetadataInfo::ONE_TO_ONE) { - $array['oneToOne'][$name] = $associationMappingArray; - } else { - $array['manyToOne'][$name] = $associationMappingArray; - } - - } else if ($associationMapping['type'] == ClassMetadataInfo::ONE_TO_MANY) { - $oneToManyMappingArray = array( - 'mappedBy' => $associationMapping['mappedBy'], - 'inversedBy' => $associationMapping['inversedBy'], - 'orphanRemoval' => $associationMapping['orphanRemoval'], - 'orderBy' => isset($associationMapping['orderBy']) ? $associationMapping['orderBy'] : null - ); - - $associationMappingArray = array_merge($associationMappingArray, $oneToManyMappingArray); - $array['oneToMany'][$name] = $associationMappingArray; - } else if ($associationMapping['type'] == ClassMetadataInfo::MANY_TO_MANY) { - $manyToManyMappingArray = array( - 'mappedBy' => $associationMapping['mappedBy'], - 'inversedBy' => $associationMapping['inversedBy'], - 'joinTable' => isset($associationMapping['joinTable']) ? $associationMapping['joinTable'] : null, - 'orderBy' => isset($associationMapping['orderBy']) ? $associationMapping['orderBy'] : null - ); - - $associationMappingArray = array_merge($associationMappingArray, $manyToManyMappingArray); - $array['manyToMany'][$name] = $associationMappingArray; - } - } - if (isset($metadata->lifecycleCallbacks)) { - $array['lifecycleCallbacks'] = $metadata->lifecycleCallbacks; - } - - return \Symfony\Component\Yaml\Yaml::dump(array($metadata->name => $array), 10); - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Export/ExportException.php b/framework/library/Doctrine/ORM/Tools/Export/ExportException.php deleted file mode 100644 index 5ba8bd2..0000000 --- a/framework/library/Doctrine/ORM/Tools/Export/ExportException.php +++ /dev/null @@ -1,23 +0,0 @@ - FROM ()) - * - * Works with composite keys but cannot deal with queries that have multiple - * root entities (e.g. `SELECT f, b from Foo, Bar`) - * - * @author Sander Marechal - */ -class CountOutputWalker extends SqlWalker -{ - /** - * @var Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $platform; - - /** - * @var Doctrine\ORM\Query\ResultSetMapping - */ - private $rsm; - - /** - * @var array - */ - private $queryComponents; - - /** - * Constructor. Stores various parameters that are otherwise unavailable - * because Doctrine\ORM\Query\SqlWalker keeps everything private without - * accessors. - * - * @param Doctrine\ORM\Query $query - * @param Doctrine\ORM\Query\ParserResult $parserResult - * @param array $queryComponents - */ - public function __construct($query, $parserResult, array $queryComponents) - { - $this->platform = $query->getEntityManager()->getConnection()->getDatabasePlatform(); - $this->rsm = $parserResult->getResultSetMapping(); - $this->queryComponents = $queryComponents; - - parent::__construct($query, $parserResult, $queryComponents); - } - - /** - * Walks down a SelectStatement AST node, wrapping it in a COUNT (SELECT DISTINCT) - * - * Note that the ORDER BY clause is not removed. Many SQL implementations (e.g. MySQL) - * are able to cache subqueries. By keeping the ORDER BY clause intact, the limitSubQuery - * that will most likely be executed next can be read from the native SQL cache. - * - * @param SelectStatement $AST - * @return string - */ - public function walkSelectStatement(SelectStatement $AST) - { - if ($this->platform->getName() === "mssql") { - $AST->orderByClause = null; - } - - $sql = parent::walkSelectStatement($AST); - - // Find out the SQL alias of the identifier column of the root entity - // It may be possible to make this work with multiple root entities but that - // would probably require issuing multiple queries or doing a UNION SELECT - // so for now, It's not supported. - - // Get the root entity and alias from the AST fromClause - $from = $AST->fromClause->identificationVariableDeclarations; - if (count($from) > 1) { - throw new \RuntimeException("Cannot count query which selects two FROM components, cannot make distinction"); - } - - $rootAlias = $from[0]->rangeVariableDeclaration->aliasIdentificationVariable; - $rootClass = $this->queryComponents[$rootAlias]['metadata']; - $rootIdentifier = $rootClass->identifier; - - // For every identifier, find out the SQL alias by combing through the ResultSetMapping - $sqlIdentifier = array(); - foreach ($rootIdentifier as $property) { - if (isset($rootClass->fieldMappings[$property])) { - foreach (array_keys($this->rsm->fieldMappings, $property) as $alias) { - if ($this->rsm->columnOwnerMap[$alias] == $rootAlias) { - $sqlIdentifier[$property] = $alias; - } - } - } - - if (isset($rootClass->associationMappings[$property])) { - $joinColumn = $rootClass->associationMappings[$property]['joinColumns'][0]['name']; - - foreach (array_keys($this->rsm->metaMappings, $joinColumn) as $alias) { - if ($this->rsm->columnOwnerMap[$alias] == $rootAlias) { - $sqlIdentifier[$property] = $alias; - } - } - } - } - - if (count($rootIdentifier) != count($sqlIdentifier)) { - throw new \RuntimeException(sprintf( - 'Not all identifier properties can be found in the ResultSetMapping: %s', - implode(', ', array_diff($rootIdentifier, array_keys($sqlIdentifier))) - )); - } - - // Build the counter query - return sprintf('SELECT %s AS dctrn_count FROM (SELECT DISTINCT %s FROM (%s) dctrn_result) dctrn_table', - $this->platform->getCountExpression('*'), - implode(', ', $sqlIdentifier), - $sql - ); - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Pagination/CountWalker.php b/framework/library/Doctrine/ORM/Tools/Pagination/CountWalker.php deleted file mode 100644 index 0fc7e75..0000000 --- a/framework/library/Doctrine/ORM/Tools/Pagination/CountWalker.php +++ /dev/null @@ -1,90 +0,0 @@ - - * @copyright Copyright (c) 2010 David Abdemoulaie (http://hobodave.com/) - * @license http://hobodave.com/license.txt New BSD License - */ -class CountWalker extends TreeWalkerAdapter -{ - /** - * Distinct mode hint name - */ - const HINT_DISTINCT = 'doctrine_paginator.distinct'; - - /** - * Walks down a SelectStatement AST node, modifying it to retrieve a COUNT - * - * @param SelectStatement $AST - * @return void - */ - public function walkSelectStatement(SelectStatement $AST) - { - if ($AST->havingClause) { - throw new \RuntimeException('Cannot count query that uses a HAVING clause. Use the output walkers for pagination'); - } - - $rootComponents = array(); - foreach ($this->_getQueryComponents() as $dqlAlias => $qComp) { - $isParent = array_key_exists('parent', $qComp) - && $qComp['parent'] === null - && $qComp['nestingLevel'] == 0 - ; - if ($isParent) { - $rootComponents[] = array($dqlAlias => $qComp); - } - } - if (count($rootComponents) > 1) { - throw new \RuntimeException("Cannot count query which selects two FROM components, cannot make distinction"); - } - $root = reset($rootComponents); - $parentName = key($root); - $parent = current($root); - $identifierFieldName = $parent['metadata']->getSingleIdentifierFieldName(); - - $pathType = PathExpression::TYPE_STATE_FIELD; - if (isset($parent['metadata']->associationMappings[$identifierFieldName])) { - $pathType = PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION; - } - - $pathExpression = new PathExpression( - PathExpression::TYPE_STATE_FIELD | PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION, $parentName, - $identifierFieldName - ); - $pathExpression->type = $pathType; - - $distinct = $this->_getQuery()->getHint(self::HINT_DISTINCT); - $AST->selectClause->selectExpressions = array( - new SelectExpression( - new AggregateExpression('count', $pathExpression, $distinct), null - ) - ); - - // ORDER BY is not needed, only increases query execution through unnecessary sorting. - $AST->orderByClause = null; - } -} - diff --git a/framework/library/Doctrine/ORM/Tools/Pagination/LimitSubqueryOutputWalker.php b/framework/library/Doctrine/ORM/Tools/Pagination/LimitSubqueryOutputWalker.php deleted file mode 100644 index 35f8219..0000000 --- a/framework/library/Doctrine/ORM/Tools/Pagination/LimitSubqueryOutputWalker.php +++ /dev/null @@ -1,202 +0,0 @@ - FROM () LIMIT x OFFSET y - * - * Works with composite keys but cannot deal with queries that have multiple - * root entities (e.g. `SELECT f, b from Foo, Bar`) - * - * @author Sander Marechal - */ -class LimitSubqueryOutputWalker extends SqlWalker -{ - /** - * @var Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $platform; - - /** - * @var Doctrine\ORM\Query\ResultSetMapping - */ - private $rsm; - - /** - * @var array - */ - private $queryComponents; - - /** - * @var int - */ - private $firstResult; - - /** - * @var int - */ - private $maxResults; - - /** - * Constructor. Stores various parameters that are otherwise unavailable - * because Doctrine\ORM\Query\SqlWalker keeps everything private without - * accessors. - * - * @param Doctrine\ORM\Query $query - * @param Doctrine\ORM\Query\ParserResult $parserResult - * @param array $queryComponents - */ - public function __construct($query, $parserResult, array $queryComponents) - { - $this->platform = $query->getEntityManager()->getConnection()->getDatabasePlatform(); - $this->rsm = $parserResult->getResultSetMapping(); - $this->queryComponents = $queryComponents; - - // Reset limit and offset - $this->firstResult = $query->getFirstResult(); - $this->maxResults = $query->getMaxResults(); - $query->setFirstResult(null)->setMaxResults(null); - - parent::__construct($query, $parserResult, $queryComponents); - } - - /** - * Walks down a SelectStatement AST node, wrapping it in a SELECT DISTINCT - * - * @param SelectStatement $AST - * @return string - */ - public function walkSelectStatement(SelectStatement $AST) - { - $innerSql = parent::walkSelectStatement($AST); - - // Find out the SQL alias of the identifier column of the root entity - // It may be possible to make this work with multiple root entities but that - // would probably require issuing multiple queries or doing a UNION SELECT - // so for now, It's not supported. - - // Get the root entity and alias from the AST fromClause - $from = $AST->fromClause->identificationVariableDeclarations; - if (count($from) !== 1) { - throw new \RuntimeException("Cannot count query which selects two FROM components, cannot make distinction"); - } - - $rootAlias = $from[0]->rangeVariableDeclaration->aliasIdentificationVariable; - $rootClass = $this->queryComponents[$rootAlias]['metadata']; - $rootIdentifier = $rootClass->identifier; - - // For every identifier, find out the SQL alias by combing through the ResultSetMapping - $sqlIdentifier = array(); - foreach ($rootIdentifier as $property) { - if (isset($rootClass->fieldMappings[$property])) { - foreach (array_keys($this->rsm->fieldMappings, $property) as $alias) { - if ($this->rsm->columnOwnerMap[$alias] == $rootAlias) { - $sqlIdentifier[$property] = $alias; - } - } - } - - if (isset($rootClass->associationMappings[$property])) { - $joinColumn = $rootClass->associationMappings[$property]['joinColumns'][0]['name']; - - foreach (array_keys($this->rsm->metaMappings, $joinColumn) as $alias) { - if ($this->rsm->columnOwnerMap[$alias] == $rootAlias) { - $sqlIdentifier[$property] = $alias; - } - } - } - } - - if (count($rootIdentifier) != count($sqlIdentifier)) { - throw new \RuntimeException(sprintf( - 'Not all identifier properties can be found in the ResultSetMapping: %s', - implode(', ', array_diff($rootIdentifier, array_keys($sqlIdentifier))) - )); - } - - // Build the counter query - $sql = sprintf('SELECT DISTINCT %s FROM (%s) dctrn_result', - implode(', ', $sqlIdentifier), $innerSql); - - if ($this->platform instanceof PostgreSqlPlatform) { - //http://www.doctrine-project.org/jira/browse/DDC-1958 - $this->getPostgresqlSql($AST, $sqlIdentifier, $innerSql, $sql); - } - - // Apply the limit and offset - $sql = $this->platform->modifyLimitQuery( - $sql, $this->maxResults, $this->firstResult - ); - - // Add the columns to the ResultSetMapping. It's not really nice but - // it works. Preferably I'd clear the RSM or simply create a new one - // but that is not possible from inside the output walker, so we dirty - // up the one we have. - foreach ($sqlIdentifier as $property => $alias) { - $this->rsm->addScalarResult($alias, $property); - } - - return $sql; - } - - /** - * Generate new SQL for postgresql if necessary - * - * @param SelectStatement $AST - * @param array sqlIdentifier - * @param string $sql - */ - public function getPostgresqlSql(SelectStatement $AST, array $sqlIdentifier, $innerSql, &$sql) - { - // For every order by, find out the SQL alias by inspecting the ResultSetMapping - $sqlOrderColumns = array(); - $orderBy = array(); - if (isset($AST->orderByClause)) { - foreach ($AST->orderByClause->orderByItems as $item) { - $possibleAliases = array_keys($this->rsm->fieldMappings, $item->expression->field); - - foreach ($possibleAliases as $alias) { - if ($this->rsm->columnOwnerMap[$alias] == $item->expression->identificationVariable) { - $sqlOrderColumns[] = $alias; - $orderBy[] = $alias . ' ' . $item->type; - break; - } - } - } - //remove identifier aliases - $sqlOrderColumns = array_diff($sqlOrderColumns, $sqlIdentifier); - } - - //we don't need orderBy in inner query - //However at least on 5.4.6 I'm getting a segmentation fault and thus we don't clear it for now - /*$AST->orderByClause = null; - $innerSql = parent::walkSelectStatement($AST);*/ - - if (count($orderBy)) { - $sql = sprintf( - 'SELECT DISTINCT %s FROM (%s) dctrn_result ORDER BY %s', - implode(', ', array_merge($sqlIdentifier, $sqlOrderColumns)), - $innerSql, - implode(', ', $orderBy) - ); - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Pagination/LimitSubqueryWalker.php b/framework/library/Doctrine/ORM/Tools/Pagination/LimitSubqueryWalker.php deleted file mode 100644 index 1ae74f4..0000000 --- a/framework/library/Doctrine/ORM/Tools/Pagination/LimitSubqueryWalker.php +++ /dev/null @@ -1,119 +0,0 @@ - - * @copyright Copyright (c) 2010 David Abdemoulaie (http://hobodave.com/) - * @license http://hobodave.com/license.txt New BSD License - */ - -namespace Doctrine\ORM\Tools\Pagination; - -use Doctrine\DBAL\Types\Type, - Doctrine\ORM\Query\TreeWalkerAdapter, - Doctrine\ORM\Query\AST\SelectStatement, - Doctrine\ORM\Query\AST\SelectExpression, - Doctrine\ORM\Query\AST\PathExpression, - Doctrine\ORM\Query\AST\AggregateExpression; - -/** - * Replaces the selectClause of the AST with a SELECT DISTINCT root.id equivalent - * - * @category DoctrineExtensions - * @package DoctrineExtensions\Paginate - * @author David Abdemoulaie - * @copyright Copyright (c) 2010 David Abdemoulaie (http://hobodave.com/) - * @license http://hobodave.com/license.txt New BSD License - */ -class LimitSubqueryWalker extends TreeWalkerAdapter -{ - /** - * ID type hint - */ - const IDENTIFIER_TYPE = 'doctrine_paginator.id.type'; - - /** - * @var int Counter for generating unique order column aliases - */ - private $_aliasCounter = 0; - - /** - * Walks down a SelectStatement AST node, modifying it to retrieve DISTINCT ids - * of the root Entity - * - * @param SelectStatement $AST - * @return void - */ - public function walkSelectStatement(SelectStatement $AST) - { - $parent = null; - $parentName = null; - $selectExpressions = array(); - - foreach ($this->_getQueryComponents() as $dqlAlias => $qComp) { - // preserve mixed data in query for ordering - if (isset($qComp['resultVariable'])) { - $selectExpressions[] = new SelectExpression($qComp['resultVariable'], $dqlAlias); - continue; - } - - if ($qComp['parent'] === null && $qComp['nestingLevel'] == 0) { - $parent = $qComp; - $parentName = $dqlAlias; - continue; - } - } - - $identifier = $parent['metadata']->getSingleIdentifierFieldName(); - if (isset($parent['metadata']->associationMappings[$identifier])) { - throw new \RuntimeException("Paginating an entity with foreign key as identifier only works when using the Output Walkers. Call Paginator#setUseOutputWalkers(true) before iterating the paginator."); - } - - $this->_getQuery()->setHint( - self::IDENTIFIER_TYPE, - Type::getType($parent['metadata']->getTypeOfField($identifier)) - ); - - $pathExpression = new PathExpression( - PathExpression::TYPE_STATE_FIELD | PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION, - $parentName, - $identifier - ); - $pathExpression->type = PathExpression::TYPE_STATE_FIELD; - - array_unshift($selectExpressions, new SelectExpression($pathExpression, '_dctrn_id')); - $AST->selectClause->selectExpressions = $selectExpressions; - - if (isset($AST->orderByClause)) { - foreach ($AST->orderByClause->orderByItems as $item) { - if ($item->expression instanceof PathExpression) { - $pathExpression = new PathExpression( - PathExpression::TYPE_STATE_FIELD | PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION, - $item->expression->identificationVariable, - $item->expression->field - ); - $pathExpression->type = PathExpression::TYPE_STATE_FIELD; - $AST->selectClause->selectExpressions[] = new SelectExpression( - $pathExpression, - '_dctrn_ord' . $this->_aliasCounter++ - ); - } - } - } - - $AST->selectClause->isDistinct = true; - } - -} - - - diff --git a/framework/library/Doctrine/ORM/Tools/Pagination/Paginator.php b/framework/library/Doctrine/ORM/Tools/Pagination/Paginator.php deleted file mode 100644 index ee139f7..0000000 --- a/framework/library/Doctrine/ORM/Tools/Pagination/Paginator.php +++ /dev/null @@ -1,234 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools\Pagination; - -use Doctrine\ORM\QueryBuilder, - Doctrine\ORM\Query, - Doctrine\ORM\Query\ResultSetMapping, - Doctrine\ORM\NoResultException; - -/** - * Paginator - * - * The paginator can handle various complex scenarios with DQL. - * - * @author Pablo Díez - * @author Benjamin Eberlei - * @license New BSD - */ -class Paginator implements \Countable, \IteratorAggregate -{ - /** - * @var Query - */ - private $query; - - /** - * @var bool - */ - private $fetchJoinCollection; - - /** - * @var bool|null - */ - private $useOutputWalkers; - - /** - * @var int - */ - private $count; - - /** - * Constructor. - * - * @param Query|QueryBuilder $query A Doctrine ORM query or query builder. - * @param Boolean $fetchJoinCollection Whether the query joins a collection (true by default). - */ - public function __construct($query, $fetchJoinCollection = true) - { - if ($query instanceof QueryBuilder) { - $query = $query->getQuery(); - } - - $this->query = $query; - $this->fetchJoinCollection = (Boolean) $fetchJoinCollection; - } - - /** - * Returns the query - * - * @return Query - */ - public function getQuery() - { - return $this->query; - } - - /** - * Returns whether the query joins a collection. - * - * @return Boolean Whether the query joins a collection. - */ - public function getFetchJoinCollection() - { - return $this->fetchJoinCollection; - } - - /** - * Returns whether the paginator will use an output walker - * - * @return bool|null - */ - public function getUseOutputWalkers() - { - return $this->useOutputWalkers; - } - - /** - * Set whether the paginator will use an output walker - * - * @param bool|null $useOutputWalkers - * @return $this - */ - public function setUseOutputWalkers($useOutputWalkers) - { - $this->useOutputWalkers = $useOutputWalkers; - return $this; - } - - /** - * {@inheritdoc} - */ - public function count() - { - if ($this->count === null) { - /* @var $countQuery Query */ - $countQuery = $this->cloneQuery($this->query); - - if ( ! $countQuery->getHint(CountWalker::HINT_DISTINCT)) { - $countQuery->setHint(CountWalker::HINT_DISTINCT, true); - } - - if ($this->useOutputWalker($countQuery)) { - $platform = $countQuery->getEntityManager()->getConnection()->getDatabasePlatform(); // law of demeter win - - $rsm = new ResultSetMapping(); - $rsm->addScalarResult($platform->getSQLResultCasing('dctrn_count'), 'count'); - - $countQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Tools\Pagination\CountOutputWalker'); - $countQuery->setResultSetMapping($rsm); - } else { - $countQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Doctrine\ORM\Tools\Pagination\CountWalker')); - } - - $countQuery->setFirstResult(null)->setMaxResults(null); - - try { - $data = $countQuery->getScalarResult(); - $data = array_map('current', $data); - $this->count = array_sum($data); - } catch(NoResultException $e) { - $this->count = 0; - } - } - return $this->count; - } - - /** - * {@inheritdoc} - */ - public function getIterator() - { - $offset = $this->query->getFirstResult(); - $length = $this->query->getMaxResults(); - - if ($this->fetchJoinCollection) { - $subQuery = $this->cloneQuery($this->query); - - if ($this->useOutputWalker($subQuery)) { - $subQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Tools\Pagination\LimitSubqueryOutputWalker'); - } else { - $subQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Doctrine\ORM\Tools\Pagination\LimitSubqueryWalker')); - } - - $subQuery->setFirstResult($offset)->setMaxResults($length); - - $ids = array_map('current', $subQuery->getScalarResult()); - - $whereInQuery = $this->cloneQuery($this->query); - // don't do this for an empty id array - if (count($ids) == 0) { - return new \ArrayIterator(array()); - } - - $whereInQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Doctrine\ORM\Tools\Pagination\WhereInWalker')); - $whereInQuery->setHint(WhereInWalker::HINT_PAGINATOR_ID_COUNT, count($ids)); - $whereInQuery->setFirstResult(null)->setMaxResults(null); - $whereInQuery->setParameter(WhereInWalker::PAGINATOR_ID_ALIAS, $ids); - - $result = $whereInQuery->getResult($this->query->getHydrationMode()); - } else { - $result = $this->cloneQuery($this->query) - ->setMaxResults($length) - ->setFirstResult($offset) - ->getResult($this->query->getHydrationMode()) - ; - } - return new \ArrayIterator($result); - } - - /** - * Clones a query. - * - * @param Query $query The query. - * - * @return Query The cloned query. - */ - private function cloneQuery(Query $query) - { - /* @var $cloneQuery Query */ - $cloneQuery = clone $query; - - $cloneQuery->setParameters(clone $query->getParameters()); - - foreach ($query->getHints() as $name => $value) { - $cloneQuery->setHint($name, $value); - } - - return $cloneQuery; - } - - /** - * Determine whether to use an output walker for the query - * - * @param Query $query The query. - * - * @return bool - */ - private function useOutputWalker(Query $query) - { - if ($this->useOutputWalkers === null) { - return (Boolean) $query->getHint(Query::HINT_CUSTOM_OUTPUT_WALKER) == false; - } - - return $this->useOutputWalkers; - } -} - diff --git a/framework/library/Doctrine/ORM/Tools/Pagination/WhereInWalker.php b/framework/library/Doctrine/ORM/Tools/Pagination/WhereInWalker.php deleted file mode 100644 index d65b581..0000000 --- a/framework/library/Doctrine/ORM/Tools/Pagination/WhereInWalker.php +++ /dev/null @@ -1,145 +0,0 @@ - - * @copyright Copyright (c) 2010 David Abdemoulaie (http://hobodave.com/) - * @license http://hobodave.com/license.txt New BSD License - */ - -namespace Doctrine\ORM\Tools\Pagination; - -use Doctrine\ORM\Query\AST\ArithmeticExpression, - Doctrine\ORM\Query\AST\SimpleArithmeticExpression, - Doctrine\ORM\Query\TreeWalkerAdapter, - Doctrine\ORM\Query\AST\SelectStatement, - Doctrine\ORM\Query\AST\PathExpression, - Doctrine\ORM\Query\AST\InExpression, - Doctrine\ORM\Query\AST\NullComparisonExpression, - Doctrine\ORM\Query\AST\InputParameter, - Doctrine\ORM\Query\AST\ConditionalPrimary, - Doctrine\ORM\Query\AST\ConditionalTerm, - Doctrine\ORM\Query\AST\ConditionalExpression, - Doctrine\ORM\Query\AST\ConditionalFactor, - Doctrine\ORM\Query\AST\WhereClause; - -/** - * Replaces the whereClause of the AST with a WHERE id IN (:foo_1, :foo_2) equivalent - * - * @category DoctrineExtensions - * @package DoctrineExtensions\Paginate - * @author David Abdemoulaie - * @copyright Copyright (c) 2010 David Abdemoulaie (http://hobodave.com/) - * @license http://hobodave.com/license.txt New BSD License - */ -class WhereInWalker extends TreeWalkerAdapter -{ - /** - * ID Count hint name - */ - const HINT_PAGINATOR_ID_COUNT = 'doctrine.id.count'; - - /** - * Primary key alias for query - */ - const PAGINATOR_ID_ALIAS = 'dpid'; - - /** - * Replaces the whereClause in the AST - * - * Generates a clause equivalent to WHERE IN (:dpid_1, :dpid_2, ...) - * - * The parameter namespace (dpid) is defined by - * the PAGINATOR_ID_ALIAS - * - * The total number of parameters is retrieved from - * the HINT_PAGINATOR_ID_COUNT query hint - * - * @param SelectStatement $AST - * @return void - */ - public function walkSelectStatement(SelectStatement $AST) - { - $rootComponents = array(); - foreach ($this->_getQueryComponents() as $dqlAlias => $qComp) { - $isParent = array_key_exists('parent', $qComp) - && $qComp['parent'] === null - && $qComp['nestingLevel'] == 0 - ; - if ($isParent) { - $rootComponents[] = array($dqlAlias => $qComp); - } - } - if (count($rootComponents) > 1) { - throw new \RuntimeException("Cannot count query which selects two FROM components, cannot make distinction"); - } - $root = reset($rootComponents); - $parentName = key($root); - $parent = current($root); - $identifierFieldName = $parent['metadata']->getSingleIdentifierFieldName(); - - $pathType = PathExpression::TYPE_STATE_FIELD; - if (isset($parent['metadata']->associationMappings[$identifierFieldName])) { - $pathType = PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION; - } - - $pathExpression = new PathExpression(PathExpression::TYPE_STATE_FIELD | PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION, $parentName, $identifierFieldName); - $pathExpression->type = $pathType; - - $count = $this->_getQuery()->getHint(self::HINT_PAGINATOR_ID_COUNT); - - if ($count > 0) { - $arithmeticExpression = new ArithmeticExpression(); - $arithmeticExpression->simpleArithmeticExpression = new SimpleArithmeticExpression( - array($pathExpression) - ); - $expression = new InExpression($arithmeticExpression); - $expression->literals[] = new InputParameter(":" . self::PAGINATOR_ID_ALIAS); - - } else { - $expression = new NullComparisonExpression($pathExpression); - $expression->not = false; - } - - $conditionalPrimary = new ConditionalPrimary; - $conditionalPrimary->simpleConditionalExpression = $expression; - if ($AST->whereClause) { - if ($AST->whereClause->conditionalExpression instanceof ConditionalTerm) { - $AST->whereClause->conditionalExpression->conditionalFactors[] = $conditionalPrimary; - } elseif ($AST->whereClause->conditionalExpression instanceof ConditionalPrimary) { - $AST->whereClause->conditionalExpression = new ConditionalExpression(array( - new ConditionalTerm(array( - $AST->whereClause->conditionalExpression, - $conditionalPrimary - )) - )); - } elseif ($AST->whereClause->conditionalExpression instanceof ConditionalExpression - || $AST->whereClause->conditionalExpression instanceof ConditionalFactor - ) { - $tmpPrimary = new ConditionalPrimary; - $tmpPrimary->conditionalExpression = $AST->whereClause->conditionalExpression; - $AST->whereClause->conditionalExpression = new ConditionalTerm(array( - $tmpPrimary, - $conditionalPrimary - )); - } - } else { - $AST->whereClause = new WhereClause( - new ConditionalExpression(array( - new ConditionalTerm(array( - $conditionalPrimary - )) - )) - ); - } - } -} - diff --git a/framework/library/Doctrine/ORM/Tools/ResolveTargetEntityListener.php b/framework/library/Doctrine/ORM/Tools/ResolveTargetEntityListener.php deleted file mode 100644 index ac14140..0000000 --- a/framework/library/Doctrine/ORM/Tools/ResolveTargetEntityListener.php +++ /dev/null @@ -1,95 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools; - -use Doctrine\ORM\Event\LoadClassMetadataEventArgs; -use Doctrine\ORM\Mapping\ClassMetadata; - -/** - * ResolveTargetEntityListener - * - * Mechanism to overwrite interfaces or classes specified as association - * targets. - * - * @author Benjamin Eberlei - * @since 2.2 - */ -class ResolveTargetEntityListener -{ - /** - * @var array - */ - private $resolveTargetEntities = array(); - - /** - * Add a target-entity class name to resolve to a new class name. - * - * @param string $originalEntity - * @param string $newEntity - * @param array $mapping - * @return void - */ - public function addResolveTargetEntity($originalEntity, $newEntity, array $mapping) - { - $mapping['targetEntity'] = ltrim($newEntity, "\\"); - $this->resolveTargetEntities[ltrim($originalEntity, "\\")] = $mapping; - } - - /** - * Process event and resolve new target entity names. - * - * @param LoadClassMetadataEventArgs $args - * @return void - */ - public function loadClassMetadata(LoadClassMetadataEventArgs $args) - { - $cm = $args->getClassMetadata(); - foreach ($cm->associationMappings as $mapping) { - if (isset($this->resolveTargetEntities[$mapping['targetEntity']])) { - $this->remapAssociation($cm, $mapping); - } - } - } - - private function remapAssociation($classMetadata, $mapping) - { - $newMapping = $this->resolveTargetEntities[$mapping['targetEntity']]; - $newMapping = array_replace_recursive($mapping, $newMapping); - $newMapping['fieldName'] = $mapping['fieldName']; - - unset($classMetadata->associationMappings[$mapping['fieldName']]); - - switch ($mapping['type']) { - case ClassMetadata::MANY_TO_MANY: - $classMetadata->mapManyToMany($newMapping); - break; - case ClassMetadata::MANY_TO_ONE: - $classMetadata->mapManyToOne($newMapping); - break; - case ClassMetadata::ONE_TO_MANY: - $classMetadata->mapOneToMany($newMapping); - break; - case ClassMetadata::ONE_TO_ONE: - $classMetadata->mapOneToOne($newMapping); - break; - } - } -} - diff --git a/framework/library/Doctrine/ORM/Tools/SchemaTool.php b/framework/library/Doctrine/ORM/Tools/SchemaTool.php deleted file mode 100644 index f525646..0000000 --- a/framework/library/Doctrine/ORM/Tools/SchemaTool.php +++ /dev/null @@ -1,745 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools; - -use Doctrine\ORM\ORMException, - Doctrine\DBAL\Types\Type, - Doctrine\DBAL\Schema\Schema, - Doctrine\DBAL\Schema\Visitor\RemoveNamespacedAssets, - Doctrine\ORM\EntityManager, - Doctrine\ORM\Mapping\ClassMetadata, - Doctrine\ORM\Internal\CommitOrderCalculator, - Doctrine\ORM\Tools\Event\GenerateSchemaTableEventArgs, - Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs; - -/** - * The SchemaTool is a tool to create/drop/update database schemas based on - * ClassMetadata class descriptors. - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Benjamin Eberlei - */ -class SchemaTool -{ - /** - * @var \Doctrine\ORM\EntityManager - */ - private $em; - - /** - * @var \Doctrine\DBAL\Platforms\AbstractPlatform - */ - private $platform; - - /** - * The quote strategy. - * - * @var \Doctrine\ORM\Mapping\QuoteStrategy - */ - private $quoteStrategy; - - /** - * Initializes a new SchemaTool instance that uses the connection of the - * provided EntityManager. - * - * @param \Doctrine\ORM\EntityManager $em - */ - public function __construct(EntityManager $em) - { - $this->em = $em; - $this->platform = $em->getConnection()->getDatabasePlatform(); - $this->quoteStrategy = $em->getConfiguration()->getQuoteStrategy(); - } - - /** - * Creates the database schema for the given array of ClassMetadata instances. - * - * @throws ToolsException - * @param array $classes - * @return void - */ - public function createSchema(array $classes) - { - $createSchemaSql = $this->getCreateSchemaSql($classes); - $conn = $this->em->getConnection(); - - foreach ($createSchemaSql as $sql) { - try { - $conn->executeQuery($sql); - } catch(\Exception $e) { - throw ToolsException::schemaToolFailure($sql, $e); - } - } - } - - /** - * Gets the list of DDL statements that are required to create the database schema for - * the given list of ClassMetadata instances. - * - * @param array $classes - * @return array $sql The SQL statements needed to create the schema for the classes. - */ - public function getCreateSchemaSql(array $classes) - { - $schema = $this->getSchemaFromMetadata($classes); - return $schema->toSql($this->platform); - } - - /** - * Some instances of ClassMetadata don't need to be processed in the SchemaTool context. This method detects them. - * - * @param ClassMetadata $class - * @param array $processedClasses - * @return bool - */ - private function processingNotRequired($class, array $processedClasses) - { - return ( - isset($processedClasses[$class->name]) || - $class->isMappedSuperclass || - ($class->isInheritanceTypeSingleTable() && $class->name != $class->rootEntityName) - ); - } - - /** - * From a given set of metadata classes this method creates a Schema instance. - * - * @param array $classes - * @return Schema - */ - public function getSchemaFromMetadata(array $classes) - { - // Reminder for processed classes, used for hierarchies - $processedClasses = array(); - $eventManager = $this->em->getEventManager(); - $schemaManager = $this->em->getConnection()->getSchemaManager(); - $metadataSchemaConfig = $schemaManager->createSchemaConfig(); - - $metadataSchemaConfig->setExplicitForeignKeyIndexes(false); - $schema = new Schema(array(), array(), $metadataSchemaConfig); - - foreach ($classes as $class) { - if ($this->processingNotRequired($class, $processedClasses)) { - continue; - } - - $table = $schema->createTable($this->quoteStrategy->getTableName($class, $this->platform)); - $columns = array(); // table columns - - if ($class->isInheritanceTypeSingleTable()) { - $columns = $this->_gatherColumns($class, $table); - $this->_gatherRelationsSql($class, $table, $schema); - - // Add the discriminator column - $this->addDiscriminatorColumnDefinition($class, $table); - - // Aggregate all the information from all classes in the hierarchy - foreach ($class->parentClasses as $parentClassName) { - // Parent class information is already contained in this class - $processedClasses[$parentClassName] = true; - } - - foreach ($class->subClasses as $subClassName) { - $subClass = $this->em->getClassMetadata($subClassName); - $this->_gatherColumns($subClass, $table); - $this->_gatherRelationsSql($subClass, $table, $schema); - $processedClasses[$subClassName] = true; - } - } else if ($class->isInheritanceTypeJoined()) { - // Add all non-inherited fields as columns - $pkColumns = array(); - foreach ($class->fieldMappings as $fieldName => $mapping) { - if ( ! isset($mapping['inherited'])) { - $columnName = $this->quoteStrategy->getColumnName($mapping['fieldName'], $class, $this->platform); - $this->_gatherColumn($class, $mapping, $table); - - if ($class->isIdentifier($fieldName)) { - $pkColumns[] = $columnName; - } - } - } - - $this->_gatherRelationsSql($class, $table, $schema); - - // Add the discriminator column only to the root table - if ($class->name == $class->rootEntityName) { - $this->addDiscriminatorColumnDefinition($class, $table); - } else { - // Add an ID FK column to child tables - /* @var \Doctrine\ORM\Mapping\ClassMetadata $class */ - $idMapping = $class->fieldMappings[$class->identifier[0]]; - $this->_gatherColumn($class, $idMapping, $table); - $columnName = $this->quoteStrategy->getColumnName($class->identifier[0], $class, $this->platform); - // TODO: This seems rather hackish, can we optimize it? - $table->getColumn($columnName)->setAutoincrement(false); - - $pkColumns[] = $columnName; - - // Add a FK constraint on the ID column - $table->addUnnamedForeignKeyConstraint( - $this->quoteStrategy->getTableName($this->em->getClassMetadata($class->rootEntityName), $this->platform), - array($columnName), array($columnName), array('onDelete' => 'CASCADE') - ); - } - - $table->setPrimaryKey($pkColumns); - - } else if ($class->isInheritanceTypeTablePerClass()) { - throw ORMException::notSupported(); - } else { - $this->_gatherColumns($class, $table); - $this->_gatherRelationsSql($class, $table, $schema); - } - - $pkColumns = array(); - foreach ($class->identifier as $identifierField) { - if (isset($class->fieldMappings[$identifierField])) { - $pkColumns[] = $this->quoteStrategy->getColumnName($identifierField, $class, $this->platform); - } else if (isset($class->associationMappings[$identifierField])) { - /* @var $assoc \Doctrine\ORM\Mapping\OneToOne */ - $assoc = $class->associationMappings[$identifierField]; - foreach ($assoc['joinColumns'] as $joinColumn) { - $pkColumns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform); - } - } - } - - if ( ! $table->hasIndex('primary')) { - $table->setPrimaryKey($pkColumns); - } - - if (isset($class->table['indexes'])) { - foreach ($class->table['indexes'] as $indexName => $indexData) { - $table->addIndex($indexData['columns'], is_numeric($indexName) ? null : $indexName); - } - } - - if (isset($class->table['uniqueConstraints'])) { - foreach ($class->table['uniqueConstraints'] as $indexName => $indexData) { - $table->addUniqueIndex($indexData['columns'], is_numeric($indexName) ? null : $indexName); - } - } - - if (isset($class->table['options'])) { - foreach ($class->table['options'] as $key => $val) { - $table->addOption($key, $val); - } - } - - $processedClasses[$class->name] = true; - - if ($class->isIdGeneratorSequence() && $class->name == $class->rootEntityName) { - $seqDef = $class->sequenceGeneratorDefinition; - $quotedName = $this->quoteStrategy->getSequenceName($seqDef, $class, $this->platform); - if ( ! $schema->hasSequence($quotedName)) { - $schema->createSequence( - $quotedName, - $seqDef['allocationSize'], - $seqDef['initialValue'] - ); - } - } - - if ($eventManager->hasListeners(ToolEvents::postGenerateSchemaTable)) { - $eventManager->dispatchEvent(ToolEvents::postGenerateSchemaTable, new GenerateSchemaTableEventArgs($class, $schema, $table)); - } - } - - if ( ! $this->platform->supportsSchemas() && ! $this->platform->canEmulateSchemas() ) { - $schema->visit(new RemoveNamespacedAssets()); - } - - if ($eventManager->hasListeners(ToolEvents::postGenerateSchema)) { - $eventManager->dispatchEvent(ToolEvents::postGenerateSchema, new GenerateSchemaEventArgs($this->em, $schema)); - } - - return $schema; - } - - /** - * Gets a portable column definition as required by the DBAL for the discriminator - * column of a class. - * - * @param ClassMetadata $class - * @return array The portable column definition of the discriminator column as required by - * the DBAL. - */ - private function addDiscriminatorColumnDefinition($class, $table) - { - $discrColumn = $class->discriminatorColumn; - - if ( ! isset($discrColumn['type']) || (strtolower($discrColumn['type']) == 'string' && $discrColumn['length'] === null)) { - $discrColumn['type'] = 'string'; - $discrColumn['length'] = 255; - } - - $options = array( - 'length' => isset($discrColumn['length']) ? $discrColumn['length'] : null, - 'notnull' => true - ); - - if (isset($discrColumn['columnDefinition'])) { - $options['columnDefinition'] = $discrColumn['columnDefinition']; - } - - $table->addColumn($discrColumn['name'], $discrColumn['type'], $options); - } - - /** - * Gathers the column definitions as required by the DBAL of all field mappings - * found in the given class. - * - * @param ClassMetadata $class - * @param Table $table - * @return array The list of portable column definitions as required by the DBAL. - */ - private function _gatherColumns($class, $table) - { - $columns = array(); - $pkColumns = array(); - - foreach ($class->fieldMappings as $fieldName => $mapping) { - if ($class->isInheritanceTypeSingleTable() && isset($mapping['inherited'])) { - continue; - } - - $column = $this->_gatherColumn($class, $mapping, $table); - - if ($class->isIdentifier($mapping['fieldName'])) { - $pkColumns[] = $this->quoteStrategy->getColumnName($mapping['fieldName'], $class, $this->platform); - } - } - - // For now, this is a hack required for single table inheritence, since this method is called - // twice by single table inheritence relations - if(!$table->hasIndex('primary')) { - //$table->setPrimaryKey($pkColumns); - } - - return $columns; - } - - /** - * Creates a column definition as required by the DBAL from an ORM field mapping definition. - * - * @param ClassMetadata $class The class that owns the field mapping. - * @param array $mapping The field mapping. - * @param Table $table - * @return array The portable column definition as required by the DBAL. - */ - private function _gatherColumn($class, array $mapping, $table) - { - $columnName = $this->quoteStrategy->getColumnName($mapping['fieldName'], $class, $this->platform); - $columnType = $mapping['type']; - - $options = array(); - $options['length'] = isset($mapping['length']) ? $mapping['length'] : null; - $options['notnull'] = isset($mapping['nullable']) ? ! $mapping['nullable'] : true; - if ($class->isInheritanceTypeSingleTable() && count($class->parentClasses) > 0) { - $options['notnull'] = false; - } - - $options['platformOptions'] = array(); - $options['platformOptions']['version'] = $class->isVersioned && $class->versionField == $mapping['fieldName'] ? true : false; - - if(strtolower($columnType) == 'string' && $options['length'] === null) { - $options['length'] = 255; - } - - if (isset($mapping['precision'])) { - $options['precision'] = $mapping['precision']; - } - - if (isset($mapping['scale'])) { - $options['scale'] = $mapping['scale']; - } - - if (isset($mapping['default'])) { - $options['default'] = $mapping['default']; - } - - if (isset($mapping['columnDefinition'])) { - $options['columnDefinition'] = $mapping['columnDefinition']; - } - - if (isset($mapping['options'])) { - if (isset($mapping['options']['comment'])) { - $options['comment'] = $mapping['options']['comment']; - - unset($mapping['options']['comment']); - } - - if (isset($mapping['options']['unsigned'])) { - $options['unsigned'] = $mapping['options']['unsigned']; - - unset($mapping['options']['unsigned']); - } - - if (isset($mapping['options']['fixed'])) { - $options['fixed'] = $mapping['options']['fixed']; - - unset($mapping['options']['fixed']); - } - - $options['customSchemaOptions'] = $mapping['options']; - } - - if ($class->isIdGeneratorIdentity() && $class->getIdentifierFieldNames() == array($mapping['fieldName'])) { - $options['autoincrement'] = true; - } - if ($class->isInheritanceTypeJoined() && $class->name != $class->rootEntityName) { - $options['autoincrement'] = false; - } - - if ($table->hasColumn($columnName)) { - // required in some inheritance scenarios - $table->changeColumn($columnName, $options); - } else { - $table->addColumn($columnName, $columnType, $options); - } - - $isUnique = isset($mapping['unique']) ? $mapping['unique'] : false; - if ($isUnique) { - $table->addUniqueIndex(array($columnName)); - } - } - - /** - * Gathers the SQL for properly setting up the relations of the given class. - * This includes the SQL for foreign key constraints and join tables. - * - * @param ClassMetadata $class - * @param \Doctrine\DBAL\Schema\Table $table - * @param \Doctrine\DBAL\Schema\Schema $schema - * @return void - */ - private function _gatherRelationsSql($class, $table, $schema) - { - foreach ($class->associationMappings as $fieldName => $mapping) { - if (isset($mapping['inherited'])) { - continue; - } - - $foreignClass = $this->em->getClassMetadata($mapping['targetEntity']); - - if ($mapping['type'] & ClassMetadata::TO_ONE && $mapping['isOwningSide']) { - $primaryKeyColumns = $uniqueConstraints = array(); // PK is unnecessary for this relation-type - - $this->_gatherRelationJoinColumns($mapping['joinColumns'], $table, $foreignClass, $mapping, $primaryKeyColumns, $uniqueConstraints); - - foreach($uniqueConstraints as $indexName => $unique) { - $table->addUniqueIndex($unique['columns'], is_numeric($indexName) ? null : $indexName); - } - } else if ($mapping['type'] == ClassMetadata::ONE_TO_MANY && $mapping['isOwningSide']) { - //... create join table, one-many through join table supported later - throw ORMException::notSupported(); - } else if ($mapping['type'] == ClassMetadata::MANY_TO_MANY && $mapping['isOwningSide']) { - // create join table - $joinTable = $mapping['joinTable']; - - $theJoinTable = $schema->createTable($this->quoteStrategy->getJoinTableName($mapping, $foreignClass, $this->platform)); - - $primaryKeyColumns = $uniqueConstraints = array(); - - // Build first FK constraint (relation table => source table) - $this->_gatherRelationJoinColumns($joinTable['joinColumns'], $theJoinTable, $class, $mapping, $primaryKeyColumns, $uniqueConstraints); - - // Build second FK constraint (relation table => target table) - $this->_gatherRelationJoinColumns($joinTable['inverseJoinColumns'], $theJoinTable, $foreignClass, $mapping, $primaryKeyColumns, $uniqueConstraints); - - $theJoinTable->setPrimaryKey($primaryKeyColumns); - - foreach($uniqueConstraints as $indexName => $unique) { - $theJoinTable->addUniqueIndex($unique['columns'], is_numeric($indexName) ? null : $indexName); - } - } - } - } - - /** - * Get the class metadata that is responsible for the definition of the referenced column name. - * - * Previously this was a simple task, but with DDC-117 this problem is actually recursive. If its - * not a simple field, go through all identifier field names that are associations recursivly and - * find that referenced column name. - * - * TODO: Is there any way to make this code more pleasing? - * - * @param ClassMetadata $class - * @param string $referencedColumnName - * @return array(ClassMetadata, referencedFieldName) - */ - private function getDefiningClass($class, $referencedColumnName) - { - $referencedFieldName = $class->getFieldName($referencedColumnName); - - if ($class->hasField($referencedFieldName)) { - return array($class, $referencedFieldName); - } else if (in_array($referencedColumnName, $class->getIdentifierColumnNames())) { - // it seems to be an entity as foreign key - foreach ($class->getIdentifierFieldNames() as $fieldName) { - if ($class->hasAssociation($fieldName) && $class->getSingleAssociationJoinColumnName($fieldName) == $referencedColumnName) { - return $this->getDefiningClass( - $this->em->getClassMetadata($class->associationMappings[$fieldName]['targetEntity']), - $class->getSingleAssociationReferencedJoinColumnName($fieldName) - ); - } - } - } - - return null; - } - - /** - * Gather columns and fk constraints that are required for one part of relationship. - * - * @param array $joinColumns - * @param \Doctrine\DBAL\Schema\Table $theJoinTable - * @param ClassMetadata $class - * @param array $mapping - * @param array $primaryKeyColumns - * @param array $uniqueConstraints - */ - private function _gatherRelationJoinColumns($joinColumns, $theJoinTable, $class, $mapping, &$primaryKeyColumns, &$uniqueConstraints) - { - $localColumns = array(); - $foreignColumns = array(); - $fkOptions = array(); - $foreignTableName = $this->quoteStrategy->getTableName($class, $this->platform); - - foreach ($joinColumns as $joinColumn) { - - list($definingClass, $referencedFieldName) = $this->getDefiningClass($class, $joinColumn['referencedColumnName']); - - if ( ! $definingClass) { - throw new \Doctrine\ORM\ORMException( - "Column name `".$joinColumn['referencedColumnName']."` referenced for relation from ". - $mapping['sourceEntity'] . " towards ". $mapping['targetEntity'] . " does not exist." - ); - } - - $quotedColumnName = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform); - $quotedRefColumnName = $this->quoteStrategy->getReferencedJoinColumnName($joinColumn, $class, $this->platform); - - $primaryKeyColumns[] = $quotedColumnName; - $localColumns[] = $quotedColumnName; - $foreignColumns[] = $quotedRefColumnName; - - if ( ! $theJoinTable->hasColumn($quotedColumnName)) { - // Only add the column to the table if it does not exist already. - // It might exist already if the foreign key is mapped into a regular - // property as well. - - $fieldMapping = $definingClass->getFieldMapping($referencedFieldName); - - $columnDef = null; - if (isset($joinColumn['columnDefinition'])) { - $columnDef = $joinColumn['columnDefinition']; - } else if (isset($fieldMapping['columnDefinition'])) { - $columnDef = $fieldMapping['columnDefinition']; - } - $columnOptions = array('notnull' => false, 'columnDefinition' => $columnDef); - if (isset($joinColumn['nullable'])) { - $columnOptions['notnull'] = !$joinColumn['nullable']; - } - - if (isset($fieldMapping['options'])) { - $columnOptions['options'] = $fieldMapping['options']; - } - - if ($fieldMapping['type'] == "string" && isset($fieldMapping['length'])) { - $columnOptions['length'] = $fieldMapping['length']; - } else if ($fieldMapping['type'] == "decimal") { - $columnOptions['scale'] = $fieldMapping['scale']; - $columnOptions['precision'] = $fieldMapping['precision']; - } - - $theJoinTable->addColumn($quotedColumnName, $fieldMapping['type'], $columnOptions); - } - - if (isset($joinColumn['unique']) && $joinColumn['unique'] == true) { - $uniqueConstraints[] = array('columns' => array($quotedColumnName)); - } - - if (isset($joinColumn['onDelete'])) { - $fkOptions['onDelete'] = $joinColumn['onDelete']; - } - } - - $theJoinTable->addUnnamedForeignKeyConstraint( - $foreignTableName, $localColumns, $foreignColumns, $fkOptions - ); - } - - /** - * Drops the database schema for the given classes. - * - * In any way when an exception is thrown it is supressed since drop was - * issued for all classes of the schema and some probably just don't exist. - * - * @param array $classes - * @return void - */ - public function dropSchema(array $classes) - { - $dropSchemaSql = $this->getDropSchemaSQL($classes); - $conn = $this->em->getConnection(); - - foreach ($dropSchemaSql as $sql) { - try { - $conn->executeQuery($sql); - } catch(\Exception $e) { - - } - } - } - - /** - * Drops all elements in the database of the current connection. - * - * @return void - */ - public function dropDatabase() - { - $dropSchemaSql = $this->getDropDatabaseSQL(); - $conn = $this->em->getConnection(); - - foreach ($dropSchemaSql as $sql) { - $conn->executeQuery($sql); - } - } - - /** - * Gets the SQL needed to drop the database schema for the connections database. - * - * @return array - */ - public function getDropDatabaseSQL() - { - $sm = $this->em->getConnection()->getSchemaManager(); - $schema = $sm->createSchema(); - - $visitor = new \Doctrine\DBAL\Schema\Visitor\DropSchemaSqlCollector($this->platform); - /* @var $schema \Doctrine\DBAL\Schema\Schema */ - $schema->visit($visitor); - return $visitor->getQueries(); - } - - /** - * Get SQL to drop the tables defined by the passed classes. - * - * @param array $classes - * @return array - */ - public function getDropSchemaSQL(array $classes) - { - $visitor = new \Doctrine\DBAL\Schema\Visitor\DropSchemaSqlCollector($this->platform); - $schema = $this->getSchemaFromMetadata($classes); - - $sm = $this->em->getConnection()->getSchemaManager(); - $fullSchema = $sm->createSchema(); - foreach ($fullSchema->getTables() as $table) { - if ( ! $schema->hasTable($table->getName())) { - foreach ($table->getForeignKeys() as $foreignKey) { - /* @var $foreignKey \Doctrine\DBAL\Schema\ForeignKeyConstraint */ - if ($schema->hasTable($foreignKey->getForeignTableName())) { - $visitor->acceptForeignKey($table, $foreignKey); - } - } - } else { - $visitor->acceptTable($table); - foreach ($table->getForeignKeys() as $foreignKey) { - $visitor->acceptForeignKey($table, $foreignKey); - } - } - } - - if ($this->platform->supportsSequences()) { - foreach ($schema->getSequences() as $sequence) { - $visitor->acceptSequence($sequence); - } - foreach ($schema->getTables() as $table) { - /* @var $sequence Table */ - if ($table->hasPrimaryKey()) { - $columns = $table->getPrimaryKey()->getColumns(); - if (count($columns) == 1) { - $checkSequence = $table->getName() . "_" . $columns[0] . "_seq"; - if ($fullSchema->hasSequence($checkSequence)) { - $visitor->acceptSequence($fullSchema->getSequence($checkSequence)); - } - } - } - } - } - - return $visitor->getQueries(); - } - - /** - * Updates the database schema of the given classes by comparing the ClassMetadata - * instances to the current database schema that is inspected. If $saveMode is set - * to true the command is executed in the Database, else SQL is returned. - * - * @param array $classes - * @param boolean $saveMode - * @return void - */ - public function updateSchema(array $classes, $saveMode=false) - { - $updateSchemaSql = $this->getUpdateSchemaSql($classes, $saveMode); - $conn = $this->em->getConnection(); - - foreach ($updateSchemaSql as $sql) { - $conn->executeQuery($sql); - } - } - - /** - * Gets the sequence of SQL statements that need to be performed in order - * to bring the given class mappings in-synch with the relational schema. - * If $saveMode is set to true the command is executed in the Database, - * else SQL is returned. - * - * @param array $classes The classes to consider. - * @param boolean $saveMode True for writing to DB, false for SQL string - * @return array The sequence of SQL statements. - */ - public function getUpdateSchemaSql(array $classes, $saveMode=false) - { - $sm = $this->em->getConnection()->getSchemaManager(); - - $fromSchema = $sm->createSchema(); - $toSchema = $this->getSchemaFromMetadata($classes); - - $comparator = new \Doctrine\DBAL\Schema\Comparator(); - $schemaDiff = $comparator->compare($fromSchema, $toSchema); - - if ($saveMode) { - return $schemaDiff->toSaveSql($this->platform); - } else { - return $schemaDiff->toSql($this->platform); - } - } -} diff --git a/framework/library/Doctrine/ORM/Tools/SchemaValidator.php b/framework/library/Doctrine/ORM/Tools/SchemaValidator.php deleted file mode 100644 index 7a3f6f5..0000000 --- a/framework/library/Doctrine/ORM/Tools/SchemaValidator.php +++ /dev/null @@ -1,289 +0,0 @@ -. -*/ - -namespace Doctrine\ORM\Tools; - -use Doctrine\ORM\EntityManager; -use Doctrine\ORM\Mapping\ClassMetadataInfo; -use Doctrine\DBAL\Types\Type; - -/** - * Performs strict validation of the mapping schema - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class SchemaValidator -{ - /** - * @var EntityManager - */ - private $em; - - /** - * @param EntityManager $em - */ - public function __construct(EntityManager $em) - { - $this->em = $em; - } - - /** - * Checks the internal consistency of all mapping files. - * - * There are several checks that can't be done at runtime or are too expensive, which can be verified - * with this command. For example: - * - * 1. Check if a relation with "mappedBy" is actually connected to that specified field. - * 2. Check if "mappedBy" and "inversedBy" are consistent to each other. - * 3. Check if "referencedColumnName" attributes are really pointing to primary key columns. - * 4. Check if there are public properties that might cause problems with lazy loading. - * - * @return array - */ - public function validateMapping() - { - $errors = array(); - $cmf = $this->em->getMetadataFactory(); - $classes = $cmf->getAllMetadata(); - - foreach ($classes as $class) { - if ($ce = $this->validateClass($class)) { - $errors[$class->name] = $ce; - } - } - - return $errors; - } - - /** - * Validate a single class of the current - * - * @param ClassMetadataInfo $class - * @return array - */ - public function validateClass(ClassMetadataInfo $class) - { - $ce = array(); - $cmf = $this->em->getMetadataFactory(); - - foreach ($class->fieldMappings as $fieldName => $mapping) { - if (!Type::hasType($mapping['type'])) { - $ce[] = "The field '" . $class->name . "#" . $fieldName."' uses a non-existant type '" . $mapping['type'] . "'."; - } - } - - foreach ($class->associationMappings as $fieldName => $assoc) { - if (!class_exists($assoc['targetEntity']) || $cmf->isTransient($assoc['targetEntity'])) { - $ce[] = "The target entity '" . $assoc['targetEntity'] . "' specified on " . $class->name . '#' . $fieldName . ' is unknown or not an entity.'; - return $ce; - } - - if ($assoc['mappedBy'] && $assoc['inversedBy']) { - $ce[] = "The association " . $class . "#" . $fieldName . " cannot be defined as both inverse and owning."; - } - - $targetMetadata = $cmf->getMetadataFor($assoc['targetEntity']); - - if (isset($assoc['id']) && $targetMetadata->containsForeignIdentifier) { - $ce[] = "Cannot map association '" . $class->name. "#". $fieldName ." as identifier, because " . - "the target entity '". $targetMetadata->name . "' also maps an association as identifier."; - } - - /* @var $assoc AssociationMapping */ - if ($assoc['mappedBy']) { - if ($targetMetadata->hasField($assoc['mappedBy'])) { - $ce[] = "The association " . $class->name . "#" . $fieldName . " refers to the owning side ". - "field " . $assoc['targetEntity'] . "#" . $assoc['mappedBy'] . " which is not defined as association."; - } - if (!$targetMetadata->hasAssociation($assoc['mappedBy'])) { - $ce[] = "The association " . $class->name . "#" . $fieldName . " refers to the owning side ". - "field " . $assoc['targetEntity'] . "#" . $assoc['mappedBy'] . " which does not exist."; - } else if ($targetMetadata->associationMappings[$assoc['mappedBy']]['inversedBy'] == null) { - $ce[] = "The field " . $class->name . "#" . $fieldName . " is on the inverse side of a ". - "bi-directional relationship, but the specified mappedBy association on the target-entity ". - $assoc['targetEntity'] . "#" . $assoc['mappedBy'] . " does not contain the required ". - "'inversedBy=".$fieldName."' attribute."; - } else if ($targetMetadata->associationMappings[$assoc['mappedBy']]['inversedBy'] != $fieldName) { - $ce[] = "The mappings " . $class->name . "#" . $fieldName . " and " . - $assoc['targetEntity'] . "#" . $assoc['mappedBy'] . " are ". - "incosistent with each other."; - } - } - - if ($assoc['inversedBy']) { - if ($targetMetadata->hasField($assoc['inversedBy'])) { - $ce[] = "The association " . $class->name . "#" . $fieldName . " refers to the inverse side ". - "field " . $assoc['targetEntity'] . "#" . $assoc['inversedBy'] . " which is not defined as association."; - } - if (!$targetMetadata->hasAssociation($assoc['inversedBy'])) { - $ce[] = "The association " . $class->name . "#" . $fieldName . " refers to the inverse side ". - "field " . $assoc['targetEntity'] . "#" . $assoc['inversedBy'] . " which does not exist."; - } else if ($targetMetadata->associationMappings[$assoc['inversedBy']]['mappedBy'] == null) { - $ce[] = "The field " . $class->name . "#" . $fieldName . " is on the owning side of a ". - "bi-directional relationship, but the specified mappedBy association on the target-entity ". - $assoc['targetEntity'] . "#" . $assoc['mappedBy'] . " does not contain the required ". - "'inversedBy' attribute."; - } else if ($targetMetadata->associationMappings[$assoc['inversedBy']]['mappedBy'] != $fieldName) { - $ce[] = "The mappings " . $class->name . "#" . $fieldName . " and " . - $assoc['targetEntity'] . "#" . $assoc['inversedBy'] . " are ". - "incosistent with each other."; - } - - // Verify inverse side/owning side match each other - if (array_key_exists($assoc['inversedBy'], $targetMetadata->associationMappings)) { - $targetAssoc = $targetMetadata->associationMappings[$assoc['inversedBy']]; - if ($assoc['type'] == ClassMetadataInfo::ONE_TO_ONE && $targetAssoc['type'] !== ClassMetadataInfo::ONE_TO_ONE){ - $ce[] = "If association " . $class->name . "#" . $fieldName . " is one-to-one, then the inversed " . - "side " . $targetMetadata->name . "#" . $assoc['inversedBy'] . " has to be one-to-one as well."; - } else if ($assoc['type'] == ClassMetadataInfo::MANY_TO_ONE && $targetAssoc['type'] !== ClassMetadataInfo::ONE_TO_MANY){ - $ce[] = "If association " . $class->name . "#" . $fieldName . " is many-to-one, then the inversed " . - "side " . $targetMetadata->name . "#" . $assoc['inversedBy'] . " has to be one-to-many."; - } else if ($assoc['type'] == ClassMetadataInfo::MANY_TO_MANY && $targetAssoc['type'] !== ClassMetadataInfo::MANY_TO_MANY){ - $ce[] = "If association " . $class->name . "#" . $fieldName . " is many-to-many, then the inversed " . - "side " . $targetMetadata->name . "#" . $assoc['inversedBy'] . " has to be many-to-many as well."; - } - } - } - - if ($assoc['isOwningSide']) { - if ($assoc['type'] == ClassMetadataInfo::MANY_TO_MANY) { - $identifierColumns = $class->getIdentifierColumnNames(); - foreach ($assoc['joinTable']['joinColumns'] as $joinColumn) { - if (!in_array($joinColumn['referencedColumnName'], $identifierColumns)) { - $ce[] = "The referenced column name '" . $joinColumn['referencedColumnName'] . "' " . - "has to be a primary key column on the target entity class '".$class->name."'."; - break; - } - } - - $identifierColumns = $targetMetadata->getIdentifierColumnNames(); - foreach ($assoc['joinTable']['inverseJoinColumns'] as $inverseJoinColumn) { - if (!in_array($inverseJoinColumn['referencedColumnName'], $identifierColumns)) { - $ce[] = "The referenced column name '" . $joinColumn['referencedColumnName'] . "' " . - "has to be a primary key column on the target entity class '".$targetMetadata->name."'."; - break; - } - } - - if (count($targetMetadata->getIdentifierColumnNames()) != count($assoc['joinTable']['inverseJoinColumns'])) { - $ce[] = "The inverse join columns of the many-to-many table '" . $assoc['joinTable']['name'] . "' " . - "have to contain to ALL identifier columns of the target entity '". $targetMetadata->name . "', " . - "however '" . implode(", ", array_diff($targetMetadata->getIdentifierColumnNames(), array_values($assoc['relationToTargetKeyColumns']))) . - "' are missing."; - } - - if (count($class->getIdentifierColumnNames()) != count($assoc['joinTable']['joinColumns'])) { - $ce[] = "The join columns of the many-to-many table '" . $assoc['joinTable']['name'] . "' " . - "have to contain to ALL identifier columns of the source entity '". $class->name . "', " . - "however '" . implode(", ", array_diff($class->getIdentifierColumnNames(), array_values($assoc['relationToSourceKeyColumns']))) . - "' are missing."; - } - - } else if ($assoc['type'] & ClassMetadataInfo::TO_ONE) { - $identifierColumns = $targetMetadata->getIdentifierColumnNames(); - foreach ($assoc['joinColumns'] as $joinColumn) { - if (!in_array($joinColumn['referencedColumnName'], $identifierColumns)) { - $ce[] = "The referenced column name '" . $joinColumn['referencedColumnName'] . "' " . - "has to be a primary key column on the target entity class '".$targetMetadata->name."'."; - } - } - - if (count($identifierColumns) != count($assoc['joinColumns'])) { - $ids = array(); - foreach ($assoc['joinColumns'] as $joinColumn) { - $ids[] = $joinColumn['name']; - } - - $ce[] = "The join columns of the association '" . $assoc['fieldName'] . "' " . - "have to match to ALL identifier columns of the target entity '". $class->name . "', " . - "however '" . implode(", ", array_diff($targetMetadata->getIdentifierColumnNames(), $ids)) . - "' are missing."; - } - } - } - - if (isset($assoc['orderBy']) && $assoc['orderBy'] !== null) { - foreach ($assoc['orderBy'] as $orderField => $orientation) { - if (!$targetMetadata->hasField($orderField)) { - $ce[] = "The association " . $class->name."#".$fieldName." is ordered by a foreign field " . - $orderField . " that is not a field on the target entity " . $targetMetadata->name; - } - } - } - } - - foreach ($class->reflClass->getProperties(\ReflectionProperty::IS_PUBLIC) as $publicAttr) { - if ($publicAttr->isStatic()) { - continue; - } - $ce[] = "Field '".$publicAttr->getName()."' in class '".$class->name."' must be private ". - "or protected. Public fields may break lazy-loading."; - } - - foreach ($class->subClasses as $subClass) { - if (!in_array($class->name, class_parents($subClass))) { - $ce[] = "According to the discriminator map class '" . $subClass . "' has to be a child ". - "of '" . $class->name . "' but these entities are not related through inheritance."; - } - } - - return $ce; - } - - /** - * @param string $columnName - * @param ClassMetadataInfo $class - * @return bool - */ - private function columnExistsOnEntity($columnName, $class) - { - if (isset($class->fieldNames[$columnName])) { - return true; - } - foreach ($class->associationMappings as $assoc) { - if ($assoc['isOwningSide']) { - foreach ($assoc['joinColumns'] as $columnMapping) { - if ($columnMapping['name'] == $columnName) { - return true; - } - } - } - } - return false; - } - - /** - * Check if the Database Schema is in sync with the current metadata state. - * - * @return bool - */ - public function schemaInSyncWithMetadata() - { - $schemaTool = new SchemaTool($this->em); - - $allMetadata = $this->em->getMetadataFactory()->getAllMetadata(); - return (count($schemaTool->getUpdateSchemaSql($allMetadata, true)) == 0); - } -} diff --git a/framework/library/Doctrine/ORM/Tools/Setup.php b/framework/library/Doctrine/ORM/Tools/Setup.php deleted file mode 100644 index fe4be7a..0000000 --- a/framework/library/Doctrine/ORM/Tools/Setup.php +++ /dev/null @@ -1,196 +0,0 @@ -. -*/ - -namespace Doctrine\ORM\Tools; - -use Doctrine\Common\ClassLoader; -use Doctrine\Common\Cache\Cache; -use Doctrine\Common\Cache\ArrayCache; -use Doctrine\ORM\Configuration; -use Doctrine\ORM\Mapping\Driver\XmlDriver; -use Doctrine\ORM\Mapping\Driver\YamlDriver; - -/** - * Convenience class for setting up Doctrine from different installations and configurations. - * - * @author Benjamin Eberlei - */ -class Setup -{ - /** - * Use this method to register all autoloaders for a setup where Doctrine is checked out from - * its github repository at {@link http://github.com/doctrine/doctrine2} - * - * @param string $gitCheckoutRootPath - * @return void - */ - static public function registerAutoloadGit($gitCheckoutRootPath) - { - if (!class_exists('Doctrine\Common\ClassLoader', false)) { - require_once $gitCheckoutRootPath . "/lib/vendor/doctrine-common/lib/Doctrine/Common/ClassLoader.php"; - } - - $loader = new ClassLoader("Doctrine\Common", $gitCheckoutRootPath . "/lib/vendor/doctrine-common/lib"); - $loader->register(); - - $loader = new ClassLoader("Doctrine\DBAL", $gitCheckoutRootPath . "/lib/vendor/doctrine-dbal/lib"); - $loader->register(); - - $loader = new ClassLoader("Doctrine\ORM", $gitCheckoutRootPath . "/lib"); - $loader->register(); - - $loader = new ClassLoader("Symfony\Component", $gitCheckoutRootPath . "/lib/vendor"); - $loader->register(); - } - - /** - * Use this method to register all autoloaders for a setup where Doctrine is installed - * though {@link http://pear.doctrine-project.org}. - * - * This method registers autoloaders for both Doctrine and Symfony top - * level namespaces. - * - * @return void - */ - static public function registerAutoloadPEAR() - { - if (!class_exists('Doctrine\Common\ClassLoader', false)) { - require_once "Doctrine/Common/ClassLoader.php"; - } - - $loader = new ClassLoader("Doctrine"); - $loader->register(); - - $loader = new ClassLoader("Symfony"); - $loader->register(); - } - - /** - * Use this method to register all autoloads for a downloaded Doctrine library. - * Pick the directory the library was uncompressed into. - * - * @param string $directory - */ - static public function registerAutoloadDirectory($directory) - { - if (!class_exists('Doctrine\Common\ClassLoader', false)) { - require_once $directory . "/Doctrine/Common/ClassLoader.php"; - } - - $loader = new ClassLoader("Doctrine", $directory); - $loader->register(); - - $loader = new ClassLoader("Symfony\Component", $directory . "/Doctrine"); - $loader->register(); - } - - /** - * Create a configuration with an annotation metadata driver. - * - * @param array $paths - * @param boolean $isDevMode - * @param string $proxyDir - * @param Cache $cache - * @param bool $useSimpleAnnotationReader - * @return Configuration - */ - static public function createAnnotationMetadataConfiguration(array $paths, $isDevMode = false, $proxyDir = null, Cache $cache = null, $useSimpleAnnotationReader = true) - { - $config = self::createConfiguration($isDevMode, $proxyDir, $cache); - $config->setMetadataDriverImpl($config->newDefaultAnnotationDriver($paths, $useSimpleAnnotationReader)); - return $config; - } - - /** - * Create a configuration with a xml metadata driver. - * - * @param array $paths - * @param boolean $isDevMode - * @param string $proxyDir - * @param Cache $cache - * @return Configuration - */ - static public function createXMLMetadataConfiguration(array $paths, $isDevMode = false, $proxyDir = null, Cache $cache = null) - { - $config = self::createConfiguration($isDevMode, $proxyDir, $cache); - $config->setMetadataDriverImpl(new XmlDriver($paths)); - return $config; - } - - /** - * Create a configuration with a yaml metadata driver. - * - * @param array $paths - * @param boolean $isDevMode - * @param string $proxyDir - * @param Cache $cache - * @return Configuration - */ - static public function createYAMLMetadataConfiguration(array $paths, $isDevMode = false, $proxyDir = null, Cache $cache = null) - { - $config = self::createConfiguration($isDevMode, $proxyDir, $cache); - $config->setMetadataDriverImpl(new YamlDriver($paths)); - return $config; - } - - /** - * Create a configuration without a metadata driver. - * - * @param bool $isDevMode - * @param string $proxyDir - * @param Cache $cache - * @return Configuration - */ - static public function createConfiguration($isDevMode = false, $proxyDir = null, Cache $cache = null) - { - $proxyDir = $proxyDir ?: sys_get_temp_dir(); - if ($isDevMode === false && $cache === null) { - if (extension_loaded('apc')) { - $cache = new \Doctrine\Common\Cache\ApcCache(); - } else if (extension_loaded('xcache')) { - $cache = new \Doctrine\Common\Cache\XcacheCache(); - } else if (extension_loaded('memcache')) { - $memcache = new \Memcache(); - $memcache->connect('127.0.0.1'); - $cache = new \Doctrine\Common\Cache\MemcacheCache(); - $cache->setMemcache($memcache); - } else if (extension_loaded('redis')) { - $redis = new \Redis(); - $redis->connect('127.0.0.1'); - $cache = new \Doctrine\Common\Cache\RedisCache(); - $cache->setRedis($redis); - } else { - $cache = new ArrayCache(); - } - } else if ($cache === null) { - $cache = new ArrayCache(); - } - $cache->setNamespace("dc2_" . md5($proxyDir) . "_"); // to avoid collisions - - $config = new Configuration(); - $config->setMetadataCacheImpl($cache); - $config->setQueryCacheImpl($cache); - $config->setResultCacheImpl($cache); - $config->setProxyDir($proxyDir); - $config->setProxyNamespace('DoctrineProxies'); - $config->setAutoGenerateProxyClasses($isDevMode); - - return $config; - } -} diff --git a/framework/library/Doctrine/ORM/Tools/ToolEvents.php b/framework/library/Doctrine/ORM/Tools/ToolEvents.php deleted file mode 100644 index 7aa98d9..0000000 --- a/framework/library/Doctrine/ORM/Tools/ToolEvents.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools; - -class ToolEvents -{ - /** - * The postGenerateSchemaTable event occurs in SchemaTool#getSchemaFromMetadata() - * whenever an entity class is transformed into its table representation. It recieves - * the current non-complete Schema instance, the Entity Metadata Class instance and - * the Schema Table instance of this entity. - * - * @var string - */ - const postGenerateSchemaTable = 'postGenerateSchemaTable'; - - /** - * The postGenerateSchema event is triggered in SchemaTool#getSchemaFromMetadata() - * after all entity classes have been transformed into the related Schema structure. - * The EventArgs contain the EntityManager and the created Schema instance. - * - * @var string - */ - const postGenerateSchema = 'postGenerateSchema'; -} diff --git a/framework/library/Doctrine/ORM/Tools/ToolsException.php b/framework/library/Doctrine/ORM/Tools/ToolsException.php deleted file mode 100644 index 30f7ea1..0000000 --- a/framework/library/Doctrine/ORM/Tools/ToolsException.php +++ /dev/null @@ -1,40 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools; - -use Doctrine\ORM\ORMException; - -/** - * Tools related Exceptions - * - * @author Benjamin Eberlei - */ -class ToolsException extends ORMException -{ - public static function schemaToolFailure($sql, \Exception $e) - { - return new self("Schema-Tool failed with Error '" . $e->getMessage() . "' while executing DDL: " . $sql, "0", $e); - } - - public static function couldNotMapDoctrine1Type($type) - { - return new self("Could not map doctrine 1 type '$type'!"); - } -} diff --git a/framework/library/Doctrine/ORM/TransactionRequiredException.php b/framework/library/Doctrine/ORM/TransactionRequiredException.php deleted file mode 100644 index 3e04224..0000000 --- a/framework/library/Doctrine/ORM/TransactionRequiredException.php +++ /dev/null @@ -1,37 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -/** - * Is thrown when a transaction is required for the current operation, but there is none open. - * - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.doctrine-project.com - * @since 1.0 - * @author Benjamin Eberlei - * @author Roman Borschel - */ -class TransactionRequiredException extends ORMException -{ - static public function transactionRequired() - { - return new self('An open transaction is required for this operation.'); - } -} diff --git a/framework/library/Doctrine/ORM/UnexpectedResultException.php b/framework/library/Doctrine/ORM/UnexpectedResultException.php deleted file mode 100644 index 5d6b6d1..0000000 --- a/framework/library/Doctrine/ORM/UnexpectedResultException.php +++ /dev/null @@ -1,31 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -/** - * Exception for a unexpected query result. - * - * @author Fabio B. Silva - * @since 2.3 - */ -class UnexpectedResultException extends ORMException -{ - -} diff --git a/framework/library/Doctrine/ORM/UnitOfWork.php b/framework/library/Doctrine/ORM/UnitOfWork.php deleted file mode 100644 index 1d56af3..0000000 --- a/framework/library/Doctrine/ORM/UnitOfWork.php +++ /dev/null @@ -1,3073 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -use Exception, InvalidArgumentException, UnexpectedValueException, - Doctrine\Common\Collections\ArrayCollection, - Doctrine\Common\Collections\Collection, - Doctrine\Common\NotifyPropertyChanged, - Doctrine\Common\PropertyChangedListener, - Doctrine\Common\Persistence\ObjectManagerAware, - Doctrine\ORM\Event\LifecycleEventArgs, - Doctrine\ORM\Mapping\ClassMetadata, - Doctrine\ORM\Proxy\Proxy; - -/** - * The UnitOfWork is responsible for tracking changes to objects during an - * "object-level" transaction and for writing out changes to the database - * in the correct order. - * - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @internal This class contains highly performance-sensitive code. - */ -class UnitOfWork implements PropertyChangedListener -{ - /** - * An entity is in MANAGED state when its persistence is managed by an EntityManager. - */ - const STATE_MANAGED = 1; - - /** - * An entity is new if it has just been instantiated (i.e. using the "new" operator) - * and is not (yet) managed by an EntityManager. - */ - const STATE_NEW = 2; - - /** - * A detached entity is an instance with persistent state and identity that is not - * (or no longer) associated with an EntityManager (and a UnitOfWork). - */ - const STATE_DETACHED = 3; - - /** - * A removed entity instance is an instance with a persistent identity, - * associated with an EntityManager, whose persistent state will be deleted - * on commit. - */ - const STATE_REMOVED = 4; - - /** - * The identity map that holds references to all managed entities that have - * an identity. The entities are grouped by their class name. - * Since all classes in a hierarchy must share the same identifier set, - * we always take the root class name of the hierarchy. - * - * @var array - */ - private $identityMap = array(); - - /** - * Map of all identifiers of managed entities. - * Keys are object ids (spl_object_hash). - * - * @var array - */ - private $entityIdentifiers = array(); - - /** - * Map of the original entity data of managed entities. - * Keys are object ids (spl_object_hash). This is used for calculating changesets - * at commit time. - * - * @var array - * @internal Note that PHPs "copy-on-write" behavior helps a lot with memory usage. - * A value will only really be copied if the value in the entity is modified - * by the user. - */ - private $originalEntityData = array(); - - /** - * Map of entity changes. Keys are object ids (spl_object_hash). - * Filled at the beginning of a commit of the UnitOfWork and cleaned at the end. - * - * @var array - */ - private $entityChangeSets = array(); - - /** - * The (cached) states of any known entities. - * Keys are object ids (spl_object_hash). - * - * @var array - */ - private $entityStates = array(); - - /** - * Map of entities that are scheduled for dirty checking at commit time. - * This is only used for entities with a change tracking policy of DEFERRED_EXPLICIT. - * Keys are object ids (spl_object_hash). - * - * @var array - * @todo rename: scheduledForSynchronization - */ - private $scheduledForDirtyCheck = array(); - - /** - * A list of all pending entity insertions. - * - * @var array - */ - private $entityInsertions = array(); - - /** - * A list of all pending entity updates. - * - * @var array - */ - private $entityUpdates = array(); - - /** - * Any pending extra updates that have been scheduled by persisters. - * - * @var array - */ - private $extraUpdates = array(); - - /** - * A list of all pending entity deletions. - * - * @var array - */ - private $entityDeletions = array(); - - /** - * All pending collection deletions. - * - * @var array - */ - private $collectionDeletions = array(); - - /** - * All pending collection updates. - * - * @var array - */ - private $collectionUpdates = array(); - - /** - * List of collections visited during changeset calculation on a commit-phase of a UnitOfWork. - * At the end of the UnitOfWork all these collections will make new snapshots - * of their data. - * - * @var array - */ - private $visitedCollections = array(); - - /** - * The EntityManager that "owns" this UnitOfWork instance. - * - * @var \Doctrine\ORM\EntityManager - */ - private $em; - - /** - * The calculator used to calculate the order in which changes to - * entities need to be written to the database. - * - * @var \Doctrine\ORM\Internal\CommitOrderCalculator - */ - private $commitOrderCalculator; - - /** - * The entity persister instances used to persist entity instances. - * - * @var array - */ - private $persisters = array(); - - /** - * The collection persister instances used to persist collections. - * - * @var array - */ - private $collectionPersisters = array(); - - /** - * The EventManager used for dispatching events. - * - * @var \Doctrine\Common\EventManager - */ - private $evm; - - /** - * Orphaned entities that are scheduled for removal. - * - * @var array - */ - private $orphanRemovals = array(); - - /** - * Read-Only objects are never evaluated - * - * @var array - */ - private $readOnlyObjects = array(); - - /** - * Map of Entity Class-Names and corresponding IDs that should eager loaded when requested. - * - * @var array - */ - private $eagerLoadingEntities = array(); - - /** - * Initializes a new UnitOfWork instance, bound to the given EntityManager. - * - * @param \Doctrine\ORM\EntityManager $em - */ - public function __construct(EntityManager $em) - { - $this->em = $em; - $this->evm = $em->getEventManager(); - } - - /** - * Commits the UnitOfWork, executing all operations that have been postponed - * up to this point. The state of all managed entities will be synchronized with - * the database. - * - * The operations are executed in the following order: - * - * 1) All entity insertions - * 2) All entity updates - * 3) All collection deletions - * 4) All collection updates - * 5) All entity deletions - * - * @param null|object|array $entity - * - * @throws \Exception - * - * @return void - */ - public function commit($entity = null) - { - // Raise preFlush - if ($this->evm->hasListeners(Events::preFlush)) { - $this->evm->dispatchEvent(Events::preFlush, new Event\PreFlushEventArgs($this->em)); - } - - // Compute changes done since last commit. - if ($entity === null) { - $this->computeChangeSets(); - } elseif (is_object($entity)) { - $this->computeSingleEntityChangeSet($entity); - } elseif (is_array($entity)) { - foreach ($entity as $object) { - $this->computeSingleEntityChangeSet($object); - } - } - - if ( ! ($this->entityInsertions || - $this->entityDeletions || - $this->entityUpdates || - $this->collectionUpdates || - $this->collectionDeletions || - $this->orphanRemovals)) { - return; // Nothing to do. - } - - if ($this->orphanRemovals) { - foreach ($this->orphanRemovals as $orphan) { - $this->remove($orphan); - } - } - - // Raise onFlush - if ($this->evm->hasListeners(Events::onFlush)) { - $this->evm->dispatchEvent(Events::onFlush, new Event\OnFlushEventArgs($this->em)); - } - - // Now we need a commit order to maintain referential integrity - $commitOrder = $this->getCommitOrder(); - - $conn = $this->em->getConnection(); - $conn->beginTransaction(); - - try { - if ($this->entityInsertions) { - foreach ($commitOrder as $class) { - $this->executeInserts($class); - } - } - - if ($this->entityUpdates) { - foreach ($commitOrder as $class) { - $this->executeUpdates($class); - } - } - - // Extra updates that were requested by persisters. - if ($this->extraUpdates) { - $this->executeExtraUpdates(); - } - - // Collection deletions (deletions of complete collections) - foreach ($this->collectionDeletions as $collectionToDelete) { - $this->getCollectionPersister($collectionToDelete->getMapping())->delete($collectionToDelete); - } - // Collection updates (deleteRows, updateRows, insertRows) - foreach ($this->collectionUpdates as $collectionToUpdate) { - $this->getCollectionPersister($collectionToUpdate->getMapping())->update($collectionToUpdate); - } - - // Entity deletions come last and need to be in reverse commit order - if ($this->entityDeletions) { - for ($count = count($commitOrder), $i = $count - 1; $i >= 0; --$i) { - $this->executeDeletions($commitOrder[$i]); - } - } - - $conn->commit(); - } catch (Exception $e) { - $this->em->close(); - $conn->rollback(); - - throw $e; - } - - // Take new snapshots from visited collections - foreach ($this->visitedCollections as $coll) { - $coll->takeSnapshot(); - } - - // Raise postFlush - if ($this->evm->hasListeners(Events::postFlush)) { - $this->evm->dispatchEvent(Events::postFlush, new Event\PostFlushEventArgs($this->em)); - } - - // Clear up - $this->entityInsertions = - $this->entityUpdates = - $this->entityDeletions = - $this->extraUpdates = - $this->entityChangeSets = - $this->collectionUpdates = - $this->collectionDeletions = - $this->visitedCollections = - $this->scheduledForDirtyCheck = - $this->orphanRemovals = array(); - } - - /** - * Compute the changesets of all entities scheduled for insertion - * - * @return void - */ - private function computeScheduleInsertsChangeSets() - { - foreach ($this->entityInsertions as $entity) { - $class = $this->em->getClassMetadata(get_class($entity)); - - $this->computeChangeSet($class, $entity); - } - } - - /** - * Only flush the given entity according to a ruleset that keeps the UoW consistent. - * - * 1. All entities scheduled for insertion, (orphan) removals and changes in collections are processed as well! - * 2. Read Only entities are skipped. - * 3. Proxies are skipped. - * 4. Only if entity is properly managed. - * - * @param object $entity - * - * @throws \InvalidArgumentException - * - * @return void - */ - private function computeSingleEntityChangeSet($entity) - { - if ( $this->getEntityState($entity) !== self::STATE_MANAGED) { - throw new \InvalidArgumentException("Entity has to be managed for single computation " . self::objToStr($entity)); - } - - $class = $this->em->getClassMetadata(get_class($entity)); - - if ($class->isChangeTrackingDeferredImplicit()) { - $this->persist($entity); - } - - // Compute changes for INSERTed entities first. This must always happen even in this case. - $this->computeScheduleInsertsChangeSets(); - - if ($class->isReadOnly) { - return; - } - - // Ignore uninitialized proxy objects - if ($entity instanceof Proxy && ! $entity->__isInitialized__) { - return; - } - - // Only MANAGED entities that are NOT SCHEDULED FOR INSERTION are processed here. - $oid = spl_object_hash($entity); - - if ( ! isset($this->entityInsertions[$oid]) && isset($this->entityStates[$oid])) { - $this->computeChangeSet($class, $entity); - } - } - - /** - * Executes any extra updates that have been scheduled. - */ - private function executeExtraUpdates() - { - foreach ($this->extraUpdates as $oid => $update) { - list ($entity, $changeset) = $update; - - $this->entityChangeSets[$oid] = $changeset; - $this->getEntityPersister(get_class($entity))->update($entity); - } - } - - /** - * Gets the changeset for an entity. - * - * @param object $entity - * - * @return array - */ - public function getEntityChangeSet($entity) - { - $oid = spl_object_hash($entity); - - if (isset($this->entityChangeSets[$oid])) { - return $this->entityChangeSets[$oid]; - } - - return array(); - } - - /** - * Computes the changes that happened to a single entity. - * - * Modifies/populates the following properties: - * - * {@link _originalEntityData} - * If the entity is NEW or MANAGED but not yet fully persisted (only has an id) - * then it was not fetched from the database and therefore we have no original - * entity data yet. All of the current entity data is stored as the original entity data. - * - * {@link _entityChangeSets} - * The changes detected on all properties of the entity are stored there. - * A change is a tuple array where the first entry is the old value and the second - * entry is the new value of the property. Changesets are used by persisters - * to INSERT/UPDATE the persistent entity state. - * - * {@link _entityUpdates} - * If the entity is already fully MANAGED (has been fetched from the database before) - * and any changes to its properties are detected, then a reference to the entity is stored - * there to mark it for an update. - * - * {@link _collectionDeletions} - * If a PersistentCollection has been de-referenced in a fully MANAGED entity, - * then this collection is marked for deletion. - * - * @ignore - * @internal Don't call from the outside. - * @param ClassMetadata $class The class descriptor of the entity. - * @param object $entity The entity for which to compute the changes. - */ - public function computeChangeSet(ClassMetadata $class, $entity) - { - $oid = spl_object_hash($entity); - - if (isset($this->readOnlyObjects[$oid])) { - return; - } - - if ( ! $class->isInheritanceTypeNone()) { - $class = $this->em->getClassMetadata(get_class($entity)); - } - - // Fire PreFlush lifecycle callbacks - if (isset($class->lifecycleCallbacks[Events::preFlush])) { - $class->invokeLifecycleCallbacks(Events::preFlush, $entity); - } - - $actualData = array(); - - foreach ($class->reflFields as $name => $refProp) { - $value = $refProp->getValue($entity); - - if ($class->isCollectionValuedAssociation($name) && $value !== null && ! ($value instanceof PersistentCollection)) { - // If $value is not a Collection then use an ArrayCollection. - if ( ! $value instanceof Collection) { - $value = new ArrayCollection($value); - } - - $assoc = $class->associationMappings[$name]; - - // Inject PersistentCollection - $value = new PersistentCollection( - $this->em, $this->em->getClassMetadata($assoc['targetEntity']), $value - ); - $value->setOwner($entity, $assoc); - $value->setDirty( ! $value->isEmpty()); - - $class->reflFields[$name]->setValue($entity, $value); - - $actualData[$name] = $value; - - continue; - } - - if (( ! $class->isIdentifier($name) || ! $class->isIdGeneratorIdentity()) && ($name !== $class->versionField)) { - $actualData[$name] = $value; - } - } - - if ( ! isset($this->originalEntityData[$oid])) { - // Entity is either NEW or MANAGED but not yet fully persisted (only has an id). - // These result in an INSERT. - $this->originalEntityData[$oid] = $actualData; - $changeSet = array(); - - foreach ($actualData as $propName => $actualValue) { - if ( ! isset($class->associationMappings[$propName])) { - $changeSet[$propName] = array(null, $actualValue); - - continue; - } - - $assoc = $class->associationMappings[$propName]; - - if ($assoc['isOwningSide'] && $assoc['type'] & ClassMetadata::TO_ONE) { - $changeSet[$propName] = array(null, $actualValue); - } - } - - $this->entityChangeSets[$oid] = $changeSet; - } else { - // Entity is "fully" MANAGED: it was already fully persisted before - // and we have a copy of the original data - $originalData = $this->originalEntityData[$oid]; - $isChangeTrackingNotify = $class->isChangeTrackingNotify(); - $changeSet = ($isChangeTrackingNotify && isset($this->entityChangeSets[$oid])) - ? $this->entityChangeSets[$oid] - : array(); - - foreach ($actualData as $propName => $actualValue) { - // skip field, its a partially omitted one! - if ( ! (isset($originalData[$propName]) || array_key_exists($propName, $originalData))) { - continue; - } - - $orgValue = $originalData[$propName]; - - // skip if value havent changed - if ($orgValue === $actualValue) { - continue; - } - - // if regular field - if ( ! isset($class->associationMappings[$propName])) { - if ($isChangeTrackingNotify) { - continue; - } - - $changeSet[$propName] = array($orgValue, $actualValue); - - continue; - } - - $assoc = $class->associationMappings[$propName]; - - // Persistent collection was exchanged with the "originally" - // created one. This can only mean it was cloned and replaced - // on another entity. - if ($actualValue instanceof PersistentCollection) { - $owner = $actualValue->getOwner(); - if ($owner === null) { // cloned - $actualValue->setOwner($entity, $assoc); - } else if ($owner !== $entity) { // no clone, we have to fix - if (!$actualValue->isInitialized()) { - $actualValue->initialize(); // we have to do this otherwise the cols share state - } - $newValue = clone $actualValue; - $newValue->setOwner($entity, $assoc); - $class->reflFields[$propName]->setValue($entity, $newValue); - } - } - - if ($orgValue instanceof PersistentCollection) { - // A PersistentCollection was de-referenced, so delete it. - $coid = spl_object_hash($orgValue); - - if (isset($this->collectionDeletions[$coid])) { - continue; - } - - $this->collectionDeletions[$coid] = $orgValue; - $changeSet[$propName] = $orgValue; // Signal changeset, to-many assocs will be ignored. - - continue; - } - - if ($assoc['type'] & ClassMetadata::TO_ONE) { - if ($assoc['isOwningSide']) { - $changeSet[$propName] = array($orgValue, $actualValue); - } - - if ($orgValue !== null && $assoc['orphanRemoval']) { - $this->scheduleOrphanRemoval($orgValue); - } - } - } - - if ($changeSet) { - $this->entityChangeSets[$oid] = $changeSet; - $this->originalEntityData[$oid] = $actualData; - $this->entityUpdates[$oid] = $entity; - } - } - - // Look for changes in associations of the entity - foreach ($class->associationMappings as $field => $assoc) { - if (($val = $class->reflFields[$field]->getValue($entity)) !== null) { - $this->computeAssociationChanges($assoc, $val); - if (!isset($this->entityChangeSets[$oid]) && - $assoc['isOwningSide'] && - $assoc['type'] == ClassMetadata::MANY_TO_MANY && - $val instanceof PersistentCollection && - $val->isDirty()) { - $this->entityChangeSets[$oid] = array(); - $this->originalEntityData[$oid] = $actualData; - $this->entityUpdates[$oid] = $entity; - } - } - } - } - - /** - * Computes all the changes that have been done to entities and collections - * since the last commit and stores these changes in the _entityChangeSet map - * temporarily for access by the persisters, until the UoW commit is finished. - */ - public function computeChangeSets() - { - // Compute changes for INSERTed entities first. This must always happen. - $this->computeScheduleInsertsChangeSets(); - - // Compute changes for other MANAGED entities. Change tracking policies take effect here. - foreach ($this->identityMap as $className => $entities) { - $class = $this->em->getClassMetadata($className); - - // Skip class if instances are read-only - if ($class->isReadOnly) { - continue; - } - - // If change tracking is explicit or happens through notification, then only compute - // changes on entities of that type that are explicitly marked for synchronization. - switch (true) { - case ($class->isChangeTrackingDeferredImplicit()): - $entitiesToProcess = $entities; - break; - - case (isset($this->scheduledForDirtyCheck[$className])): - $entitiesToProcess = $this->scheduledForDirtyCheck[$className]; - break; - - default: - $entitiesToProcess = array(); - - } - - foreach ($entitiesToProcess as $entity) { - // Ignore uninitialized proxy objects - if ($entity instanceof Proxy && ! $entity->__isInitialized__) { - continue; - } - - // Only MANAGED entities that are NOT SCHEDULED FOR INSERTION are processed here. - $oid = spl_object_hash($entity); - - if ( ! isset($this->entityInsertions[$oid]) && isset($this->entityStates[$oid])) { - $this->computeChangeSet($class, $entity); - } - } - } - } - - /** - * Computes the changes of an association. - * - * @param array $assoc - * @param mixed $value The value of the association. - * - * @throws ORMInvalidArgumentException - * @throws ORMException - * - * @return void - */ - private function computeAssociationChanges($assoc, $value) - { - if ($value instanceof Proxy && ! $value->__isInitialized__) { - return; - } - - if ($value instanceof PersistentCollection && $value->isDirty()) { - $coid = spl_object_hash($value); - - if ($assoc['isOwningSide']) { - $this->collectionUpdates[$coid] = $value; - } - - $this->visitedCollections[$coid] = $value; - } - - // Look through the entities, and in any of their associations, - // for transient (new) entities, recursively. ("Persistence by reachability") - // Unwrap. Uninitialized collections will simply be empty. - $unwrappedValue = ($assoc['type'] & ClassMetadata::TO_ONE) ? array($value) : $value->unwrap(); - $targetClass = $this->em->getClassMetadata($assoc['targetEntity']); - - foreach ($unwrappedValue as $key => $entry) { - $state = $this->getEntityState($entry, self::STATE_NEW); - - if ( ! ($entry instanceof $assoc['targetEntity'])) { - throw new ORMException( - sprintf( - 'Found entity of type %s on association %s#%s, but expecting %s', - get_class($entry), - $assoc['sourceEntity'], - $assoc['fieldName'], - $targetClass->name - ) - ); - } - - switch ($state) { - case self::STATE_NEW: - if ( ! $assoc['isCascadePersist']) { - throw ORMInvalidArgumentException::newEntityFoundThroughRelationship($assoc, $entry); - } - - $this->persistNew($targetClass, $entry); - $this->computeChangeSet($targetClass, $entry); - break; - - case self::STATE_REMOVED: - // Consume the $value as array (it's either an array or an ArrayAccess) - // and remove the element from Collection. - if ($assoc['type'] & ClassMetadata::TO_MANY) { - unset($value[$key]); - } - break; - - case self::STATE_DETACHED: - // Can actually not happen right now as we assume STATE_NEW, - // so the exception will be raised from the DBAL layer (constraint violation). - throw ORMInvalidArgumentException::detachedEntityFoundThroughRelationship($assoc, $entry); - break; - - default: - // MANAGED associated entities are already taken into account - // during changeset calculation anyway, since they are in the identity map. - } - } - } - - /** - * @param ClassMetadata $class - * @param object $entity - */ - private function persistNew($class, $entity) - { - $oid = spl_object_hash($entity); - - if (isset($class->lifecycleCallbacks[Events::prePersist])) { - $class->invokeLifecycleCallbacks(Events::prePersist, $entity); - } - - if ($this->evm->hasListeners(Events::prePersist)) { - $this->evm->dispatchEvent(Events::prePersist, new LifecycleEventArgs($entity, $this->em)); - } - - $idGen = $class->idGenerator; - - if ( ! $idGen->isPostInsertGenerator()) { - $idValue = $idGen->generate($this->em, $entity); - - if ( ! $idGen instanceof \Doctrine\ORM\Id\AssignedGenerator) { - $idValue = array($class->identifier[0] => $idValue); - - $class->setIdentifierValues($entity, $idValue); - } - - $this->entityIdentifiers[$oid] = $idValue; - } - - $this->entityStates[$oid] = self::STATE_MANAGED; - - $this->scheduleForInsert($entity); - } - - /** - * INTERNAL: - * Computes the changeset of an individual entity, independently of the - * computeChangeSets() routine that is used at the beginning of a UnitOfWork#commit(). - * - * The passed entity must be a managed entity. If the entity already has a change set - * because this method is invoked during a commit cycle then the change sets are added. - * whereby changes detected in this method prevail. - * - * @ignore - * @param ClassMetadata $class The class descriptor of the entity. - * @param object $entity The entity for which to (re)calculate the change set. - * - * @throws ORMInvalidArgumentException If the passed entity is not MANAGED. - */ - public function recomputeSingleEntityChangeSet(ClassMetadata $class, $entity) - { - $oid = spl_object_hash($entity); - - if ( ! isset($this->entityStates[$oid]) || $this->entityStates[$oid] != self::STATE_MANAGED) { - throw ORMInvalidArgumentException::entityNotManaged($entity); - } - - // skip if change tracking is "NOTIFY" - if ($class->isChangeTrackingNotify()) { - return; - } - - if ( ! $class->isInheritanceTypeNone()) { - $class = $this->em->getClassMetadata(get_class($entity)); - } - - $actualData = array(); - - foreach ($class->reflFields as $name => $refProp) { - if ( ! $class->isIdentifier($name) || ! $class->isIdGeneratorIdentity()) { - $actualData[$name] = $refProp->getValue($entity); - } - } - - $originalData = $this->originalEntityData[$oid]; - $changeSet = array(); - - foreach ($actualData as $propName => $actualValue) { - $orgValue = isset($originalData[$propName]) ? $originalData[$propName] : null; - - if (is_object($orgValue) && $orgValue !== $actualValue) { - $changeSet[$propName] = array($orgValue, $actualValue); - } else if ($orgValue != $actualValue || ($orgValue === null ^ $actualValue === null)) { - $changeSet[$propName] = array($orgValue, $actualValue); - } - } - - if ($changeSet) { - if (isset($this->entityChangeSets[$oid])) { - $this->entityChangeSets[$oid] = array_merge($this->entityChangeSets[$oid], $changeSet); - } - - $this->originalEntityData[$oid] = $actualData; - } - } - - /** - * Executes all entity insertions for entities of the specified type. - * - * @param \Doctrine\ORM\Mapping\ClassMetadata $class - */ - private function executeInserts($class) - { - $className = $class->name; - $persister = $this->getEntityPersister($className); - $entities = array(); - - $hasLifecycleCallbacks = isset($class->lifecycleCallbacks[Events::postPersist]); - $hasListeners = $this->evm->hasListeners(Events::postPersist); - - foreach ($this->entityInsertions as $oid => $entity) { - if ($this->em->getClassMetadata(get_class($entity))->name !== $className) { - continue; - } - - $persister->addInsert($entity); - - unset($this->entityInsertions[$oid]); - - if ($hasLifecycleCallbacks || $hasListeners) { - $entities[] = $entity; - } - } - - $postInsertIds = $persister->executeInserts(); - - if ($postInsertIds) { - // Persister returned post-insert IDs - foreach ($postInsertIds as $id => $entity) { - $oid = spl_object_hash($entity); - $idField = $class->identifier[0]; - - $class->reflFields[$idField]->setValue($entity, $id); - - $this->entityIdentifiers[$oid] = array($idField => $id); - $this->entityStates[$oid] = self::STATE_MANAGED; - $this->originalEntityData[$oid][$idField] = $id; - - $this->addToIdentityMap($entity); - } - } - - foreach ($entities as $entity) { - if ($hasLifecycleCallbacks) { - $class->invokeLifecycleCallbacks(Events::postPersist, $entity); - } - - if ($hasListeners) { - $this->evm->dispatchEvent(Events::postPersist, new LifecycleEventArgs($entity, $this->em)); - } - } - } - - /** - * Executes all entity updates for entities of the specified type. - * - * @param \Doctrine\ORM\Mapping\ClassMetadata $class - */ - private function executeUpdates($class) - { - $className = $class->name; - $persister = $this->getEntityPersister($className); - - $hasPreUpdateLifecycleCallbacks = isset($class->lifecycleCallbacks[Events::preUpdate]); - $hasPreUpdateListeners = $this->evm->hasListeners(Events::preUpdate); - - $hasPostUpdateLifecycleCallbacks = isset($class->lifecycleCallbacks[Events::postUpdate]); - $hasPostUpdateListeners = $this->evm->hasListeners(Events::postUpdate); - - foreach ($this->entityUpdates as $oid => $entity) { - if ($this->em->getClassMetadata(get_class($entity))->name !== $className) { - continue; - } - - if ($hasPreUpdateLifecycleCallbacks) { - $class->invokeLifecycleCallbacks(Events::preUpdate, $entity); - - $this->recomputeSingleEntityChangeSet($class, $entity); - } - - if ($hasPreUpdateListeners) { - $this->evm->dispatchEvent( - Events::preUpdate, - new Event\PreUpdateEventArgs($entity, $this->em, $this->entityChangeSets[$oid]) - ); - } - - if (!empty($this->entityChangeSets[$oid])) { - $persister->update($entity); - } - - unset($this->entityUpdates[$oid]); - - if ($hasPostUpdateLifecycleCallbacks) { - $class->invokeLifecycleCallbacks(Events::postUpdate, $entity); - } - - if ($hasPostUpdateListeners) { - $this->evm->dispatchEvent(Events::postUpdate, new LifecycleEventArgs($entity, $this->em)); - } - } - } - - /** - * Executes all entity deletions for entities of the specified type. - * - * @param \Doctrine\ORM\Mapping\ClassMetadata $class - */ - private function executeDeletions($class) - { - $className = $class->name; - $persister = $this->getEntityPersister($className); - - $hasLifecycleCallbacks = isset($class->lifecycleCallbacks[Events::postRemove]); - $hasListeners = $this->evm->hasListeners(Events::postRemove); - - foreach ($this->entityDeletions as $oid => $entity) { - if ($this->em->getClassMetadata(get_class($entity))->name !== $className) { - continue; - } - - $persister->delete($entity); - - unset( - $this->entityDeletions[$oid], - $this->entityIdentifiers[$oid], - $this->originalEntityData[$oid], - $this->entityStates[$oid] - ); - - // Entity with this $oid after deletion treated as NEW, even if the $oid - // is obtained by a new entity because the old one went out of scope. - //$this->entityStates[$oid] = self::STATE_NEW; - if ( ! $class->isIdentifierNatural()) { - $class->reflFields[$class->identifier[0]]->setValue($entity, null); - } - - if ($hasLifecycleCallbacks) { - $class->invokeLifecycleCallbacks(Events::postRemove, $entity); - } - - if ($hasListeners) { - $this->evm->dispatchEvent(Events::postRemove, new LifecycleEventArgs($entity, $this->em)); - } - } - } - - /** - * Gets the commit order. - * - * @param array $entityChangeSet - * - * @return array - */ - private function getCommitOrder(array $entityChangeSet = null) - { - if ($entityChangeSet === null) { - $entityChangeSet = array_merge($this->entityInsertions, $this->entityUpdates, $this->entityDeletions); - } - - $calc = $this->getCommitOrderCalculator(); - - // See if there are any new classes in the changeset, that are not in the - // commit order graph yet (dont have a node). - // We have to inspect changeSet to be able to correctly build dependencies. - // It is not possible to use IdentityMap here because post inserted ids - // are not yet available. - $newNodes = array(); - - foreach ($entityChangeSet as $entity) { - $className = $this->em->getClassMetadata(get_class($entity))->name; - - if ($calc->hasClass($className)) { - continue; - } - - $class = $this->em->getClassMetadata($className); - $calc->addClass($class); - - $newNodes[] = $class; - } - - // Calculate dependencies for new nodes - while ($class = array_pop($newNodes)) { - foreach ($class->associationMappings as $assoc) { - if ( ! ($assoc['isOwningSide'] && $assoc['type'] & ClassMetadata::TO_ONE)) { - continue; - } - - $targetClass = $this->em->getClassMetadata($assoc['targetEntity']); - - if ( ! $calc->hasClass($targetClass->name)) { - $calc->addClass($targetClass); - - $newNodes[] = $targetClass; - } - - $calc->addDependency($targetClass, $class); - - // If the target class has mapped subclasses, these share the same dependency. - if ( ! $targetClass->subClasses) { - continue; - } - - foreach ($targetClass->subClasses as $subClassName) { - $targetSubClass = $this->em->getClassMetadata($subClassName); - - if ( ! $calc->hasClass($subClassName)) { - $calc->addClass($targetSubClass); - - $newNodes[] = $targetSubClass; - } - - $calc->addDependency($targetSubClass, $class); - } - } - } - - return $calc->getCommitOrder(); - } - - /** - * Schedules an entity for insertion into the database. - * If the entity already has an identifier, it will be added to the identity map. - * - * @param object $entity The entity to schedule for insertion. - * - * @throws ORMInvalidArgumentException - * @throws \InvalidArgumentException - */ - public function scheduleForInsert($entity) - { - $oid = spl_object_hash($entity); - - if (isset($this->entityUpdates[$oid])) { - throw new InvalidArgumentException("Dirty entity can not be scheduled for insertion."); - } - - if (isset($this->entityDeletions[$oid])) { - throw ORMInvalidArgumentException::scheduleInsertForRemovedEntity($entity); - } - if (isset($this->originalEntityData[$oid]) && ! isset($this->entityInsertions[$oid])) { - throw ORMInvalidArgumentException::scheduleInsertForManagedEntity($entity); - } - - if (isset($this->entityInsertions[$oid])) { - throw ORMInvalidArgumentException::scheduleInsertTwice($entity); - } - - $this->entityInsertions[$oid] = $entity; - - if (isset($this->entityIdentifiers[$oid])) { - $this->addToIdentityMap($entity); - } - - if ($entity instanceof NotifyPropertyChanged) { - $entity->addPropertyChangedListener($this); - } - } - - /** - * Checks whether an entity is scheduled for insertion. - * - * @param object $entity - * - * @return boolean - */ - public function isScheduledForInsert($entity) - { - return isset($this->entityInsertions[spl_object_hash($entity)]); - } - - /** - * Schedules an entity for being updated. - * - * @param object $entity The entity to schedule for being updated. - * - * @throws ORMInvalidArgumentException - */ - public function scheduleForUpdate($entity) - { - $oid = spl_object_hash($entity); - - if ( ! isset($this->entityIdentifiers[$oid])) { - throw ORMInvalidArgumentException::entityHasNoIdentity($entity, "scheduling for update"); - } - - if (isset($this->entityDeletions[$oid])) { - throw ORMInvalidArgumentException::entityIsRemoved($entity, "schedule for update"); - } - - if ( ! isset($this->entityUpdates[$oid]) && ! isset($this->entityInsertions[$oid])) { - $this->entityUpdates[$oid] = $entity; - } - } - - /** - * INTERNAL: - * Schedules an extra update that will be executed immediately after the - * regular entity updates within the currently running commit cycle. - * - * Extra updates for entities are stored as (entity, changeset) tuples. - * - * @ignore - * @param object $entity The entity for which to schedule an extra update. - * @param array $changeset The changeset of the entity (what to update). - */ - public function scheduleExtraUpdate($entity, array $changeset) - { - $oid = spl_object_hash($entity); - $extraUpdate = array($entity, $changeset); - - if (isset($this->extraUpdates[$oid])) { - list($ignored, $changeset2) = $this->extraUpdates[$oid]; - - $extraUpdate = array($entity, $changeset + $changeset2); - } - - $this->extraUpdates[$oid] = $extraUpdate; - } - - /** - * Checks whether an entity is registered as dirty in the unit of work. - * Note: Is not very useful currently as dirty entities are only registered - * at commit time. - * - * @param object $entity - * - * @return boolean - */ - public function isScheduledForUpdate($entity) - { - return isset($this->entityUpdates[spl_object_hash($entity)]); - } - - - /** - * Checks whether an entity is registered to be checked in the unit of work. - * - * @param object $entity - * - * @return boolean - */ - public function isScheduledForDirtyCheck($entity) - { - $rootEntityName = $this->em->getClassMetadata(get_class($entity))->rootEntityName; - - return isset($this->scheduledForDirtyCheck[$rootEntityName][spl_object_hash($entity)]); - } - - /** - * INTERNAL: - * Schedules an entity for deletion. - * - * @param object $entity - */ - public function scheduleForDelete($entity) - { - $oid = spl_object_hash($entity); - - if (isset($this->entityInsertions[$oid])) { - if ($this->isInIdentityMap($entity)) { - $this->removeFromIdentityMap($entity); - } - - unset($this->entityInsertions[$oid], $this->entityStates[$oid]); - - return; // entity has not been persisted yet, so nothing more to do. - } - - if ( ! $this->isInIdentityMap($entity)) { - return; - } - - $this->removeFromIdentityMap($entity); - - if (isset($this->entityUpdates[$oid])) { - unset($this->entityUpdates[$oid]); - } - - if ( ! isset($this->entityDeletions[$oid])) { - $this->entityDeletions[$oid] = $entity; - $this->entityStates[$oid] = self::STATE_REMOVED; - } - } - - /** - * Checks whether an entity is registered as removed/deleted with the unit - * of work. - * - * @param object $entity - * - * @return boolean - */ - public function isScheduledForDelete($entity) - { - return isset($this->entityDeletions[spl_object_hash($entity)]); - } - - /** - * Checks whether an entity is scheduled for insertion, update or deletion. - * - * @param $entity - * - * @return boolean - */ - public function isEntityScheduled($entity) - { - $oid = spl_object_hash($entity); - - return isset($this->entityInsertions[$oid]) - || isset($this->entityUpdates[$oid]) - || isset($this->entityDeletions[$oid]); - } - - /** - * INTERNAL: - * Registers an entity in the identity map. - * Note that entities in a hierarchy are registered with the class name of - * the root entity. - * - * @ignore - * @param object $entity The entity to register. - * - * @throws ORMInvalidArgumentException - * - * @return boolean TRUE if the registration was successful, FALSE if the identity of - * the entity in question is already managed. - */ - public function addToIdentityMap($entity) - { - $classMetadata = $this->em->getClassMetadata(get_class($entity)); - $idHash = implode(' ', $this->entityIdentifiers[spl_object_hash($entity)]); - - if ($idHash === '') { - throw ORMInvalidArgumentException::entityWithoutIdentity($classMetadata->name, $entity); - } - - $className = $classMetadata->rootEntityName; - - if (isset($this->identityMap[$className][$idHash])) { - return false; - } - - $this->identityMap[$className][$idHash] = $entity; - - return true; - } - - /** - * Gets the state of an entity with regard to the current unit of work. - * - * @param object $entity - * @param integer $assume The state to assume if the state is not yet known (not MANAGED or REMOVED). - * This parameter can be set to improve performance of entity state detection - * by potentially avoiding a database lookup if the distinction between NEW and DETACHED - * is either known or does not matter for the caller of the method. - * - * @return int The entity state. - */ - public function getEntityState($entity, $assume = null) - { - $oid = spl_object_hash($entity); - - if (isset($this->entityStates[$oid])) { - return $this->entityStates[$oid]; - } - - if ($assume !== null) { - return $assume; - } - - // State can only be NEW or DETACHED, because MANAGED/REMOVED states are known. - // Note that you can not remember the NEW or DETACHED state in _entityStates since - // the UoW does not hold references to such objects and the object hash can be reused. - // More generally because the state may "change" between NEW/DETACHED without the UoW being aware of it. - $class = $this->em->getClassMetadata(get_class($entity)); - $id = $class->getIdentifierValues($entity); - - if ( ! $id) { - return self::STATE_NEW; - } - - if ($class->containsForeignIdentifier) { - $id = $this->flattenIdentifier($class, $id); - } - - switch (true) { - case ($class->isIdentifierNatural()); - // Check for a version field, if available, to avoid a db lookup. - if ($class->isVersioned) { - return ($class->getFieldValue($entity, $class->versionField)) - ? self::STATE_DETACHED - : self::STATE_NEW; - } - - // Last try before db lookup: check the identity map. - if ($this->tryGetById($id, $class->rootEntityName)) { - return self::STATE_DETACHED; - } - - // db lookup - if ($this->getEntityPersister($class->name)->exists($entity)) { - return self::STATE_DETACHED; - } - - return self::STATE_NEW; - - case ( ! $class->idGenerator->isPostInsertGenerator()): - // if we have a pre insert generator we can't be sure that having an id - // really means that the entity exists. We have to verify this through - // the last resort: a db lookup - - // Last try before db lookup: check the identity map. - if ($this->tryGetById($id, $class->rootEntityName)) { - return self::STATE_DETACHED; - } - - // db lookup - if ($this->getEntityPersister($class->name)->exists($entity)) { - return self::STATE_DETACHED; - } - - return self::STATE_NEW; - - default: - return self::STATE_DETACHED; - } - } - - /** - * INTERNAL: - * Removes an entity from the identity map. This effectively detaches the - * entity from the persistence management of Doctrine. - * - * @ignore - * @param object $entity - * - * @throws ORMInvalidArgumentException - * - * @return boolean - */ - public function removeFromIdentityMap($entity) - { - $oid = spl_object_hash($entity); - $classMetadata = $this->em->getClassMetadata(get_class($entity)); - $idHash = implode(' ', $this->entityIdentifiers[$oid]); - - if ($idHash === '') { - throw ORMInvalidArgumentException::entityHasNoIdentity($entity, "remove from identity map"); - } - - $className = $classMetadata->rootEntityName; - - if (isset($this->identityMap[$className][$idHash])) { - unset($this->identityMap[$className][$idHash]); - unset($this->readOnlyObjects[$oid]); - - //$this->entityStates[$oid] = self::STATE_DETACHED; - - return true; - } - - return false; - } - - /** - * INTERNAL: - * Gets an entity in the identity map by its identifier hash. - * - * @ignore - * @param string $idHash - * @param string $rootClassName - * - * @return object - */ - public function getByIdHash($idHash, $rootClassName) - { - return $this->identityMap[$rootClassName][$idHash]; - } - - /** - * INTERNAL: - * Tries to get an entity by its identifier hash. If no entity is found for - * the given hash, FALSE is returned. - * - * @ignore - * @param string $idHash - * @param string $rootClassName - * - * @return mixed The found entity or FALSE. - */ - public function tryGetByIdHash($idHash, $rootClassName) - { - if (isset($this->identityMap[$rootClassName][$idHash])) { - return $this->identityMap[$rootClassName][$idHash]; - } - - return false; - } - - /** - * Checks whether an entity is registered in the identity map of this UnitOfWork. - * - * @param object $entity - * - * @return boolean - */ - public function isInIdentityMap($entity) - { - $oid = spl_object_hash($entity); - - if ( ! isset($this->entityIdentifiers[$oid])) { - return false; - } - - $classMetadata = $this->em->getClassMetadata(get_class($entity)); - $idHash = implode(' ', $this->entityIdentifiers[$oid]); - - if ($idHash === '') { - return false; - } - - return isset($this->identityMap[$classMetadata->rootEntityName][$idHash]); - } - - /** - * INTERNAL: - * Checks whether an identifier hash exists in the identity map. - * - * @ignore - * @param string $idHash - * @param string $rootClassName - * - * @return boolean - */ - public function containsIdHash($idHash, $rootClassName) - { - return isset($this->identityMap[$rootClassName][$idHash]); - } - - /** - * Persists an entity as part of the current unit of work. - * - * @param object $entity The entity to persist. - */ - public function persist($entity) - { - $visited = array(); - - $this->doPersist($entity, $visited); - } - - /** - * Persists an entity as part of the current unit of work. - * - * This method is internally called during persist() cascades as it tracks - * the already visited entities to prevent infinite recursions. - * - * @param object $entity The entity to persist. - * @param array $visited The already visited entities. - * - * @throws ORMInvalidArgumentException - * @throws UnexpectedValueException - */ - private function doPersist($entity, array &$visited) - { - $oid = spl_object_hash($entity); - - if (isset($visited[$oid])) { - return; // Prevent infinite recursion - } - - $visited[$oid] = $entity; // Mark visited - - $class = $this->em->getClassMetadata(get_class($entity)); - - // We assume NEW, so DETACHED entities result in an exception on flush (constraint violation). - // If we would detect DETACHED here we would throw an exception anyway with the same - // consequences (not recoverable/programming error), so just assuming NEW here - // lets us avoid some database lookups for entities with natural identifiers. - $entityState = $this->getEntityState($entity, self::STATE_NEW); - - switch ($entityState) { - case self::STATE_MANAGED: - // Nothing to do, except if policy is "deferred explicit" - if ($class->isChangeTrackingDeferredExplicit()) { - $this->scheduleForDirtyCheck($entity); - } - break; - - case self::STATE_NEW: - $this->persistNew($class, $entity); - break; - - case self::STATE_REMOVED: - // Entity becomes managed again - unset($this->entityDeletions[$oid]); - - $this->entityStates[$oid] = self::STATE_MANAGED; - break; - - case self::STATE_DETACHED: - // Can actually not happen right now since we assume STATE_NEW. - throw ORMInvalidArgumentException::detachedEntityCannot($entity, "persisted"); - - default: - throw new UnexpectedValueException("Unexpected entity state: $entityState." . self::objToStr($entity)); - } - - $this->cascadePersist($entity, $visited); - } - - /** - * Deletes an entity as part of the current unit of work. - * - * @param object $entity The entity to remove. - */ - public function remove($entity) - { - $visited = array(); - - $this->doRemove($entity, $visited); - } - - /** - * Deletes an entity as part of the current unit of work. - * - * This method is internally called during delete() cascades as it tracks - * the already visited entities to prevent infinite recursions. - * - * @param object $entity The entity to delete. - * @param array $visited The map of the already visited entities. - * - * @throws ORMInvalidArgumentException If the instance is a detached entity. - * @throws UnexpectedValueException - */ - private function doRemove($entity, array &$visited) - { - $oid = spl_object_hash($entity); - - if (isset($visited[$oid])) { - return; // Prevent infinite recursion - } - - $visited[$oid] = $entity; // mark visited - - // Cascade first, because scheduleForDelete() removes the entity from the identity map, which - // can cause problems when a lazy proxy has to be initialized for the cascade operation. - $this->cascadeRemove($entity, $visited); - - $class = $this->em->getClassMetadata(get_class($entity)); - $entityState = $this->getEntityState($entity); - - switch ($entityState) { - case self::STATE_NEW: - case self::STATE_REMOVED: - // nothing to do - break; - - case self::STATE_MANAGED: - if (isset($class->lifecycleCallbacks[Events::preRemove])) { - $class->invokeLifecycleCallbacks(Events::preRemove, $entity); - } - - if ($this->evm->hasListeners(Events::preRemove)) { - $this->evm->dispatchEvent(Events::preRemove, new LifecycleEventArgs($entity, $this->em)); - } - - $this->scheduleForDelete($entity); - break; - - case self::STATE_DETACHED: - throw ORMInvalidArgumentException::detachedEntityCannot($entity, "removed"); - default: - throw new UnexpectedValueException("Unexpected entity state: $entityState." . self::objToStr($entity)); - } - - } - - /** - * Merges the state of the given detached entity into this UnitOfWork. - * - * @param object $entity - * - * @throws OptimisticLockException If the entity uses optimistic locking through a version - * attribute and the version check against the managed copy fails. - * - * @return object The managed copy of the entity. - * - * @todo Require active transaction!? OptimisticLockException may result in undefined state!? - */ - public function merge($entity) - { - $visited = array(); - - return $this->doMerge($entity, $visited); - } - - /** - * convert foreign identifiers into scalar foreign key values to avoid object to string conversion failures. - * - * @param ClassMetadata $class - * @param array $id - * @return array - */ - private function flattenIdentifier($class, $id) - { - $flatId = array(); - - foreach ($id as $idField => $idValue) { - if (isset($class->associationMappings[$idField])) { - $targetClassMetadata = $this->em->getClassMetadata($class->associationMappings[$idField]['targetEntity']); - $associatedId = $this->getEntityIdentifier($idValue); - - $flatId[$idField] = $associatedId[$targetClassMetadata->identifier[0]]; - } - } - - return $flatId; - } - - /** - * Executes a merge operation on an entity. - * - * @param object $entity - * @param array $visited - * @param object $prevManagedCopy - * @param array $assoc - * - * @throws OptimisticLockException If the entity uses optimistic locking through a version - * attribute and the version check against the managed copy fails. - * @throws ORMInvalidArgumentException If the entity instance is NEW. - * @throws EntityNotFoundException - * - * @return object The managed copy of the entity. - */ - private function doMerge($entity, array &$visited, $prevManagedCopy = null, $assoc = null) - { - $oid = spl_object_hash($entity); - - if (isset($visited[$oid])) { - return $visited[$oid]; // Prevent infinite recursion - } - - $visited[$oid] = $entity; // mark visited - - $class = $this->em->getClassMetadata(get_class($entity)); - - // First we assume DETACHED, although it can still be NEW but we can avoid - // an extra db-roundtrip this way. If it is not MANAGED but has an identity, - // we need to fetch it from the db anyway in order to merge. - // MANAGED entities are ignored by the merge operation. - $managedCopy = $entity; - - if ($this->getEntityState($entity, self::STATE_DETACHED) !== self::STATE_MANAGED) { - if ($entity instanceof Proxy && ! $entity->__isInitialized__) { - $entity->__load(); - } - - // Try to look the entity up in the identity map. - $id = $class->getIdentifierValues($entity); - - // If there is no ID, it is actually NEW. - if ( ! $id) { - $managedCopy = $this->newInstance($class); - - $this->persistNew($class, $managedCopy); - } else { - $flatId = ($class->containsForeignIdentifier) - ? $this->flattenIdentifier($class, $id) - : $id; - - $managedCopy = $this->tryGetById($flatId, $class->rootEntityName); - - if ($managedCopy) { - // We have the entity in-memory already, just make sure its not removed. - if ($this->getEntityState($managedCopy) == self::STATE_REMOVED) { - throw ORMInvalidArgumentException::entityIsRemoved($managedCopy, "merge"); - } - } else { - // We need to fetch the managed copy in order to merge. - $managedCopy = $this->em->find($class->name, $flatId); - } - - if ($managedCopy === null) { - // If the identifier is ASSIGNED, it is NEW, otherwise an error - // since the managed entity was not found. - if ( ! $class->isIdentifierNatural()) { - throw new EntityNotFoundException; - } - - $managedCopy = $this->newInstance($class); - $class->setIdentifierValues($managedCopy, $id); - - $this->persistNew($class, $managedCopy); - } else { - if ($managedCopy instanceof Proxy && ! $managedCopy->__isInitialized__) { - $managedCopy->__load(); - } - } - } - - if ($class->isVersioned) { - $managedCopyVersion = $class->reflFields[$class->versionField]->getValue($managedCopy); - $entityVersion = $class->reflFields[$class->versionField]->getValue($entity); - - // Throw exception if versions dont match. - if ($managedCopyVersion != $entityVersion) { - throw OptimisticLockException::lockFailedVersionMissmatch($entity, $entityVersion, $managedCopyVersion); - } - } - - // Merge state of $entity into existing (managed) entity - foreach ($class->reflClass->getProperties() as $prop) { - $name = $prop->name; - $prop->setAccessible(true); - if ( ! isset($class->associationMappings[$name])) { - if ( ! $class->isIdentifier($name)) { - $prop->setValue($managedCopy, $prop->getValue($entity)); - } - } else { - $assoc2 = $class->associationMappings[$name]; - if ($assoc2['type'] & ClassMetadata::TO_ONE) { - $other = $prop->getValue($entity); - if ($other === null) { - $prop->setValue($managedCopy, null); - } else if ($other instanceof Proxy && !$other->__isInitialized__) { - // do not merge fields marked lazy that have not been fetched. - continue; - } else if ( ! $assoc2['isCascadeMerge']) { - if ($this->getEntityState($other, self::STATE_DETACHED) !== self::STATE_MANAGED) { - $targetClass = $this->em->getClassMetadata($assoc2['targetEntity']); - $relatedId = $targetClass->getIdentifierValues($other); - - if ($targetClass->subClasses) { - $other = $this->em->find($targetClass->name, $relatedId); - } else { - $other = $this->em->getProxyFactory()->getProxy($assoc2['targetEntity'], $relatedId); - $this->registerManaged($other, $relatedId, array()); - } - } - $prop->setValue($managedCopy, $other); - } - } else { - $mergeCol = $prop->getValue($entity); - if ($mergeCol instanceof PersistentCollection && !$mergeCol->isInitialized()) { - // do not merge fields marked lazy that have not been fetched. - // keep the lazy persistent collection of the managed copy. - continue; - } - - $managedCol = $prop->getValue($managedCopy); - if (!$managedCol) { - $managedCol = new PersistentCollection($this->em, - $this->em->getClassMetadata($assoc2['targetEntity']), - new ArrayCollection - ); - $managedCol->setOwner($managedCopy, $assoc2); - $prop->setValue($managedCopy, $managedCol); - $this->originalEntityData[$oid][$name] = $managedCol; - } - if ($assoc2['isCascadeMerge']) { - $managedCol->initialize(); - - // clear and set dirty a managed collection if its not also the same collection to merge from. - if (!$managedCol->isEmpty() && $managedCol !== $mergeCol) { - $managedCol->unwrap()->clear(); - $managedCol->setDirty(true); - - if ($assoc2['isOwningSide'] && $assoc2['type'] == ClassMetadata::MANY_TO_MANY && $class->isChangeTrackingNotify()) { - $this->scheduleForDirtyCheck($managedCopy); - } - } - } - } - } - - if ($class->isChangeTrackingNotify()) { - // Just treat all properties as changed, there is no other choice. - $this->propertyChanged($managedCopy, $name, null, $prop->getValue($managedCopy)); - } - } - - if ($class->isChangeTrackingDeferredExplicit()) { - $this->scheduleForDirtyCheck($entity); - } - } - - if ($prevManagedCopy !== null) { - $assocField = $assoc['fieldName']; - $prevClass = $this->em->getClassMetadata(get_class($prevManagedCopy)); - - if ($assoc['type'] & ClassMetadata::TO_ONE) { - $prevClass->reflFields[$assocField]->setValue($prevManagedCopy, $managedCopy); - } else { - $prevClass->reflFields[$assocField]->getValue($prevManagedCopy)->add($managedCopy); - - if ($assoc['type'] == ClassMetadata::ONE_TO_MANY) { - $class->reflFields[$assoc['mappedBy']]->setValue($managedCopy, $prevManagedCopy); - } - } - } - - // Mark the managed copy visited as well - $visited[spl_object_hash($managedCopy)] = true; - - $this->cascadeMerge($entity, $managedCopy, $visited); - - return $managedCopy; - } - - /** - * Detaches an entity from the persistence management. It's persistence will - * no longer be managed by Doctrine. - * - * @param object $entity The entity to detach. - */ - public function detach($entity) - { - $visited = array(); - - $this->doDetach($entity, $visited); - } - - /** - * Executes a detach operation on the given entity. - * - * @param object $entity - * @param array $visited - * @param boolean $noCascade if true, don't cascade detach operation - */ - private function doDetach($entity, array &$visited, $noCascade = false) - { - $oid = spl_object_hash($entity); - - if (isset($visited[$oid])) { - return; // Prevent infinite recursion - } - - $visited[$oid] = $entity; // mark visited - - switch ($this->getEntityState($entity, self::STATE_DETACHED)) { - case self::STATE_MANAGED: - if ($this->isInIdentityMap($entity)) { - $this->removeFromIdentityMap($entity); - } - - unset( - $this->entityInsertions[$oid], - $this->entityUpdates[$oid], - $this->entityDeletions[$oid], - $this->entityIdentifiers[$oid], - $this->entityStates[$oid], - $this->originalEntityData[$oid] - ); - break; - case self::STATE_NEW: - case self::STATE_DETACHED: - return; - } - - if ( ! $noCascade) { - $this->cascadeDetach($entity, $visited); - } - } - - /** - * Refreshes the state of the given entity from the database, overwriting - * any local, unpersisted changes. - * - * @param object $entity The entity to refresh. - * - * @throws InvalidArgumentException If the entity is not MANAGED. - */ - public function refresh($entity) - { - $visited = array(); - - $this->doRefresh($entity, $visited); - } - - /** - * Executes a refresh operation on an entity. - * - * @param object $entity The entity to refresh. - * @param array $visited The already visited entities during cascades. - * - * @throws ORMInvalidArgumentException If the entity is not MANAGED. - */ - private function doRefresh($entity, array &$visited) - { - $oid = spl_object_hash($entity); - - if (isset($visited[$oid])) { - return; // Prevent infinite recursion - } - - $visited[$oid] = $entity; // mark visited - - $class = $this->em->getClassMetadata(get_class($entity)); - - if ($this->getEntityState($entity) !== self::STATE_MANAGED) { - throw ORMInvalidArgumentException::entityNotManaged($entity); - } - - $this->getEntityPersister($class->name)->refresh( - array_combine($class->getIdentifierFieldNames(), $this->entityIdentifiers[$oid]), - $entity - ); - - $this->cascadeRefresh($entity, $visited); - } - - /** - * Cascades a refresh operation to associated entities. - * - * @param object $entity - * @param array $visited - */ - private function cascadeRefresh($entity, array &$visited) - { - $class = $this->em->getClassMetadata(get_class($entity)); - - $associationMappings = array_filter( - $class->associationMappings, - function ($assoc) { return $assoc['isCascadeRefresh']; } - ); - - foreach ($associationMappings as $assoc) { - $relatedEntities = $class->reflFields[$assoc['fieldName']]->getValue($entity); - - switch (true) { - case ($relatedEntities instanceof PersistentCollection): - // Unwrap so that foreach() does not initialize - $relatedEntities = $relatedEntities->unwrap(); - // break; is commented intentionally! - - case ($relatedEntities instanceof Collection): - case (is_array($relatedEntities)): - foreach ($relatedEntities as $relatedEntity) { - $this->doRefresh($relatedEntity, $visited); - } - break; - - case ($relatedEntities !== null): - $this->doRefresh($relatedEntities, $visited); - break; - - default: - // Do nothing - } - } - } - - /** - * Cascades a detach operation to associated entities. - * - * @param object $entity - * @param array $visited - */ - private function cascadeDetach($entity, array &$visited) - { - $class = $this->em->getClassMetadata(get_class($entity)); - - $associationMappings = array_filter( - $class->associationMappings, - function ($assoc) { return $assoc['isCascadeDetach']; } - ); - - foreach ($associationMappings as $assoc) { - $relatedEntities = $class->reflFields[$assoc['fieldName']]->getValue($entity); - - switch (true) { - case ($relatedEntities instanceof PersistentCollection): - // Unwrap so that foreach() does not initialize - $relatedEntities = $relatedEntities->unwrap(); - // break; is commented intentionally! - - case ($relatedEntities instanceof Collection): - case (is_array($relatedEntities)): - foreach ($relatedEntities as $relatedEntity) { - $this->doDetach($relatedEntity, $visited); - } - break; - - case ($relatedEntities !== null): - $this->doDetach($relatedEntities, $visited); - break; - - default: - // Do nothing - } - } - } - - /** - * Cascades a merge operation to associated entities. - * - * @param object $entity - * @param object $managedCopy - * @param array $visited - */ - private function cascadeMerge($entity, $managedCopy, array &$visited) - { - $class = $this->em->getClassMetadata(get_class($entity)); - - $associationMappings = array_filter( - $class->associationMappings, - function ($assoc) { return $assoc['isCascadeMerge']; } - ); - - foreach ($associationMappings as $assoc) { - $relatedEntities = $class->reflFields[$assoc['fieldName']]->getValue($entity); - - if ($relatedEntities instanceof Collection) { - if ($relatedEntities === $class->reflFields[$assoc['fieldName']]->getValue($managedCopy)) { - continue; - } - - if ($relatedEntities instanceof PersistentCollection) { - // Unwrap so that foreach() does not initialize - $relatedEntities = $relatedEntities->unwrap(); - } - - foreach ($relatedEntities as $relatedEntity) { - $this->doMerge($relatedEntity, $visited, $managedCopy, $assoc); - } - } else if ($relatedEntities !== null) { - $this->doMerge($relatedEntities, $visited, $managedCopy, $assoc); - } - } - } - - /** - * Cascades the save operation to associated entities. - * - * @param object $entity - * @param array $visited - * - * @return void - */ - private function cascadePersist($entity, array &$visited) - { - $class = $this->em->getClassMetadata(get_class($entity)); - - $associationMappings = array_filter( - $class->associationMappings, - function ($assoc) { return $assoc['isCascadePersist']; } - ); - - foreach ($associationMappings as $assoc) { - $relatedEntities = $class->reflFields[$assoc['fieldName']]->getValue($entity); - - switch (true) { - case ($relatedEntities instanceof PersistentCollection): - // Unwrap so that foreach() does not initialize - $relatedEntities = $relatedEntities->unwrap(); - // break; is commented intentionally! - - case ($relatedEntities instanceof Collection): - case (is_array($relatedEntities)): - foreach ($relatedEntities as $relatedEntity) { - $this->doPersist($relatedEntity, $visited); - } - break; - - case ($relatedEntities !== null): - $this->doPersist($relatedEntities, $visited); - break; - - default: - // Do nothing - } - } - } - - /** - * Cascades the delete operation to associated entities. - * - * @param object $entity - * @param array $visited - */ - private function cascadeRemove($entity, array &$visited) - { - $class = $this->em->getClassMetadata(get_class($entity)); - - $associationMappings = array_filter( - $class->associationMappings, - function ($assoc) { return $assoc['isCascadeRemove']; } - ); - - foreach ($associationMappings as $assoc) { - if ($entity instanceof Proxy && !$entity->__isInitialized__) { - $entity->__load(); - } - - $relatedEntities = $class->reflFields[$assoc['fieldName']]->getValue($entity); - - switch (true) { - case ($relatedEntities instanceof Collection): - case (is_array($relatedEntities)): - // If its a PersistentCollection initialization is intended! No unwrap! - foreach ($relatedEntities as $relatedEntity) { - $this->doRemove($relatedEntity, $visited); - } - break; - - case ($relatedEntities !== null): - $this->doRemove($relatedEntities, $visited); - break; - - default: - // Do nothing - } - } - } - - /** - * Acquire a lock on the given entity. - * - * @param object $entity - * @param int $lockMode - * @param int $lockVersion - * - * @throws ORMInvalidArgumentException - * @throws TransactionRequiredException - * @throws OptimisticLockException - * - * @return void - */ - public function lock($entity, $lockMode, $lockVersion = null) - { - if ($this->getEntityState($entity, self::STATE_DETACHED) != self::STATE_MANAGED) { - throw ORMInvalidArgumentException::entityNotManaged($entity); - } - - $class = $this->em->getClassMetadata(get_class($entity)); - - switch ($lockMode) { - case \Doctrine\DBAL\LockMode::OPTIMISTIC; - if ( ! $class->isVersioned) { - throw OptimisticLockException::notVersioned($class->name); - } - - if ($lockVersion === null) { - return; - } - - $entityVersion = $class->reflFields[$class->versionField]->getValue($entity); - - if ($entityVersion != $lockVersion) { - throw OptimisticLockException::lockFailedVersionMissmatch($entity, $lockVersion, $entityVersion); - } - - break; - - case \Doctrine\DBAL\LockMode::PESSIMISTIC_READ: - case \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE: - if (!$this->em->getConnection()->isTransactionActive()) { - throw TransactionRequiredException::transactionRequired(); - } - - $oid = spl_object_hash($entity); - - $this->getEntityPersister($class->name)->lock( - array_combine($class->getIdentifierFieldNames(), $this->entityIdentifiers[$oid]), - $lockMode - ); - break; - - default: - // Do nothing - } - } - - /** - * Gets the CommitOrderCalculator used by the UnitOfWork to order commits. - * - * @return \Doctrine\ORM\Internal\CommitOrderCalculator - */ - public function getCommitOrderCalculator() - { - if ($this->commitOrderCalculator === null) { - $this->commitOrderCalculator = new Internal\CommitOrderCalculator; - } - - return $this->commitOrderCalculator; - } - - /** - * Clears the UnitOfWork. - * - * @param string $entityName if given, only entities of this type will get detached - */ - public function clear($entityName = null) - { - if ($entityName === null) { - $this->identityMap = - $this->entityIdentifiers = - $this->originalEntityData = - $this->entityChangeSets = - $this->entityStates = - $this->scheduledForDirtyCheck = - $this->entityInsertions = - $this->entityUpdates = - $this->entityDeletions = - $this->collectionDeletions = - $this->collectionUpdates = - $this->extraUpdates = - $this->readOnlyObjects = - $this->orphanRemovals = array(); - - if ($this->commitOrderCalculator !== null) { - $this->commitOrderCalculator->clear(); - } - } else { - $visited = array(); - foreach ($this->identityMap as $className => $entities) { - if ($className === $entityName) { - foreach ($entities as $entity) { - $this->doDetach($entity, $visited, true); - } - } - } - } - - if ($this->evm->hasListeners(Events::onClear)) { - $this->evm->dispatchEvent(Events::onClear, new Event\OnClearEventArgs($this->em, $entityName)); - } - } - - /** - * INTERNAL: - * Schedules an orphaned entity for removal. The remove() operation will be - * invoked on that entity at the beginning of the next commit of this - * UnitOfWork. - * - * @ignore - * @param object $entity - */ - public function scheduleOrphanRemoval($entity) - { - $this->orphanRemovals[spl_object_hash($entity)] = $entity; - } - - /** - * INTERNAL: - * Schedules a complete collection for removal when this UnitOfWork commits. - * - * @param PersistentCollection $coll - */ - public function scheduleCollectionDeletion(PersistentCollection $coll) - { - $coid = spl_object_hash($coll); - - //TODO: if $coll is already scheduled for recreation ... what to do? - // Just remove $coll from the scheduled recreations? - if (isset($this->collectionUpdates[$coid])) { - unset($this->collectionUpdates[$coid]); - } - - $this->collectionDeletions[$coid] = $coll; - } - - /** - * @param PersistentCollection $coll - * - * @return bool - */ - public function isCollectionScheduledForDeletion(PersistentCollection $coll) - { - return isset($this->collectionDeletions[spl_object_hash($coll)]); - } - - /** - * @param ClassMetadata $class - * - * @return \Doctrine\Common\Persistence\ObjectManagerAware|object - */ - private function newInstance($class) - { - $entity = $class->newInstance(); - - if ($entity instanceof \Doctrine\Common\Persistence\ObjectManagerAware) { - $entity->injectObjectManager($this->em, $class); - } - - return $entity; - } - - /** - * INTERNAL: - * Creates an entity. Used for reconstitution of persistent entities. - * - * @ignore - * @param string $className The name of the entity class. - * @param array $data The data for the entity. - * @param array $hints Any hints to account for during reconstitution/lookup of the entity. - * - * @return object The managed entity instance. - * @internal Highly performance-sensitive method. - * - * @todo Rename: getOrCreateEntity - */ - public function createEntity($className, array $data, &$hints = array()) - { - $class = $this->em->getClassMetadata($className); - //$isReadOnly = isset($hints[Query::HINT_READ_ONLY]); - - if ($class->isIdentifierComposite) { - $id = array(); - - foreach ($class->identifier as $fieldName) { - $id[$fieldName] = isset($class->associationMappings[$fieldName]) - ? $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']] - : $data[$fieldName]; - } - - $idHash = implode(' ', $id); - } else { - $idHash = isset($class->associationMappings[$class->identifier[0]]) - ? $data[$class->associationMappings[$class->identifier[0]]['joinColumns'][0]['name']] - : $data[$class->identifier[0]]; - - $id = array($class->identifier[0] => $idHash); - } - - if (isset($this->identityMap[$class->rootEntityName][$idHash])) { - $entity = $this->identityMap[$class->rootEntityName][$idHash]; - $oid = spl_object_hash($entity); - - if ($entity instanceof Proxy && ! $entity->__isInitialized__) { - $entity->__isInitialized__ = true; - $overrideLocalValues = true; - - if ($entity instanceof NotifyPropertyChanged) { - $entity->addPropertyChangedListener($this); - } - - // inject ObjectManager into just loaded proxies. - if ($overrideLocalValues && $entity instanceof ObjectManagerAware) { - $entity->injectObjectManager($this->em, $class); - } - - } else { - $overrideLocalValues = isset($hints[Query::HINT_REFRESH]); - - // If only a specific entity is set to refresh, check that it's the one - if(isset($hints[Query::HINT_REFRESH_ENTITY])) { - $overrideLocalValues = $hints[Query::HINT_REFRESH_ENTITY] === $entity; - } - - // inject ObjectManager upon refresh. - if ($overrideLocalValues && $entity instanceof ObjectManagerAware) { - $entity->injectObjectManager($this->em, $class); - } - } - - if ($overrideLocalValues) { - $this->originalEntityData[$oid] = $data; - } - } else { - $entity = $this->newInstance($class); - $oid = spl_object_hash($entity); - - $this->entityIdentifiers[$oid] = $id; - $this->entityStates[$oid] = self::STATE_MANAGED; - $this->originalEntityData[$oid] = $data; - - $this->identityMap[$class->rootEntityName][$idHash] = $entity; - - if ($entity instanceof NotifyPropertyChanged) { - $entity->addPropertyChangedListener($this); - } - - $overrideLocalValues = true; - } - - if ( ! $overrideLocalValues) { - return $entity; - } - - foreach ($data as $field => $value) { - if (isset($class->fieldMappings[$field])) { - $class->reflFields[$field]->setValue($entity, $value); - } - } - - // Loading the entity right here, if its in the eager loading map get rid of it there. - unset($this->eagerLoadingEntities[$class->rootEntityName][$idHash]); - - if (isset($this->eagerLoadingEntities[$class->rootEntityName]) && ! $this->eagerLoadingEntities[$class->rootEntityName]) { - unset($this->eagerLoadingEntities[$class->rootEntityName]); - } - - // Properly initialize any unfetched associations, if partial objects are not allowed. - if (isset($hints[Query::HINT_FORCE_PARTIAL_LOAD])) { - return $entity; - } - - foreach ($class->associationMappings as $field => $assoc) { - // Check if the association is not among the fetch-joined associations already. - if (isset($hints['fetchAlias']) && isset($hints['fetched'][$hints['fetchAlias']][$field])) { - continue; - } - - $targetClass = $this->em->getClassMetadata($assoc['targetEntity']); - - switch (true) { - case ($assoc['type'] & ClassMetadata::TO_ONE): - if ( ! $assoc['isOwningSide']) { - // Inverse side of x-to-one can never be lazy - $class->reflFields[$field]->setValue($entity, $this->getEntityPersister($assoc['targetEntity'])->loadOneToOneEntity($assoc, $entity)); - - continue 2; - } - - $associatedId = array(); - - // TODO: Is this even computed right in all cases of composite keys? - foreach ($assoc['targetToSourceKeyColumns'] as $targetColumn => $srcColumn) { - $joinColumnValue = isset($data[$srcColumn]) ? $data[$srcColumn] : null; - - if ($joinColumnValue !== null) { - if ($targetClass->containsForeignIdentifier) { - $associatedId[$targetClass->getFieldForColumn($targetColumn)] = $joinColumnValue; - } else { - $associatedId[$targetClass->fieldNames[$targetColumn]] = $joinColumnValue; - } - } - } - - if ( ! $associatedId) { - // Foreign key is NULL - $class->reflFields[$field]->setValue($entity, null); - $this->originalEntityData[$oid][$field] = null; - - continue; - } - - if ( ! isset($hints['fetchMode'][$class->name][$field])) { - $hints['fetchMode'][$class->name][$field] = $assoc['fetch']; - } - - // Foreign key is set - // Check identity map first - // FIXME: Can break easily with composite keys if join column values are in - // wrong order. The correct order is the one in ClassMetadata#identifier. - $relatedIdHash = implode(' ', $associatedId); - - switch (true) { - case (isset($this->identityMap[$targetClass->rootEntityName][$relatedIdHash])): - $newValue = $this->identityMap[$targetClass->rootEntityName][$relatedIdHash]; - - // If this is an uninitialized proxy, we are deferring eager loads, - // this association is marked as eager fetch, and its an uninitialized proxy (wtf!) - // then we can append this entity for eager loading! - if ($hints['fetchMode'][$class->name][$field] == ClassMetadata::FETCH_EAGER && - isset($hints['deferEagerLoad']) && - !$targetClass->isIdentifierComposite && - $newValue instanceof Proxy && - $newValue->__isInitialized__ === false) { - - $this->eagerLoadingEntities[$targetClass->rootEntityName][$relatedIdHash] = current($associatedId); - } - - break; - - case ($targetClass->subClasses): - // If it might be a subtype, it can not be lazy. There isn't even - // a way to solve this with deferred eager loading, which means putting - // an entity with subclasses at a *-to-one location is really bad! (performance-wise) - $newValue = $this->getEntityPersister($assoc['targetEntity'])->loadOneToOneEntity($assoc, $entity, $associatedId); - break; - - default: - switch (true) { - // We are negating the condition here. Other cases will assume it is valid! - case ($hints['fetchMode'][$class->name][$field] !== ClassMetadata::FETCH_EAGER): - $newValue = $this->em->getProxyFactory()->getProxy($assoc['targetEntity'], $associatedId); - break; - - // Deferred eager load only works for single identifier classes - case (isset($hints['deferEagerLoad']) && ! $targetClass->isIdentifierComposite): - // TODO: Is there a faster approach? - $this->eagerLoadingEntities[$targetClass->rootEntityName][$relatedIdHash] = current($associatedId); - - $newValue = $this->em->getProxyFactory()->getProxy($assoc['targetEntity'], $associatedId); - break; - - default: - // TODO: This is very imperformant, ignore it? - $newValue = $this->em->find($assoc['targetEntity'], $associatedId); - break; - } - - // PERF: Inlined & optimized code from UnitOfWork#registerManaged() - $newValueOid = spl_object_hash($newValue); - $this->entityIdentifiers[$newValueOid] = $associatedId; - $this->identityMap[$targetClass->rootEntityName][$relatedIdHash] = $newValue; - - if ($newValue instanceof NotifyPropertyChanged) { - $newValue->addPropertyChangedListener($this); - } - $this->entityStates[$newValueOid] = self::STATE_MANAGED; - // make sure that when an proxy is then finally loaded, $this->originalEntityData is set also! - break; - } - - $this->originalEntityData[$oid][$field] = $newValue; - $class->reflFields[$field]->setValue($entity, $newValue); - - if ($assoc['inversedBy'] && $assoc['type'] & ClassMetadata::ONE_TO_ONE) { - $inverseAssoc = $targetClass->associationMappings[$assoc['inversedBy']]; - $targetClass->reflFields[$inverseAssoc['fieldName']]->setValue($newValue, $entity); - } - - break; - - default: - // Inject collection - $pColl = new PersistentCollection($this->em, $targetClass, new ArrayCollection); - $pColl->setOwner($entity, $assoc); - $pColl->setInitialized(false); - - $reflField = $class->reflFields[$field]; - $reflField->setValue($entity, $pColl); - - if ($assoc['fetch'] == ClassMetadata::FETCH_EAGER) { - $this->loadCollection($pColl); - $pColl->takeSnapshot(); - } - - $this->originalEntityData[$oid][$field] = $pColl; - break; - } - } - - if ($overrideLocalValues) { - if (isset($class->lifecycleCallbacks[Events::postLoad])) { - $class->invokeLifecycleCallbacks(Events::postLoad, $entity); - } - - - if ($this->evm->hasListeners(Events::postLoad)) { - $this->evm->dispatchEvent(Events::postLoad, new LifecycleEventArgs($entity, $this->em)); - } - } - - return $entity; - } - - /** - * @return void - */ - public function triggerEagerLoads() - { - if ( ! $this->eagerLoadingEntities) { - return; - } - - // avoid infinite recursion - $eagerLoadingEntities = $this->eagerLoadingEntities; - $this->eagerLoadingEntities = array(); - - foreach ($eagerLoadingEntities as $entityName => $ids) { - if ( ! $ids) { - continue; - } - - $class = $this->em->getClassMetadata($entityName); - - $this->getEntityPersister($entityName)->loadAll( - array_combine($class->identifier, array(array_values($ids))) - ); - } - } - - /** - * Initializes (loads) an uninitialized persistent collection of an entity. - * - * @param \Doctrine\ORM\PersistentCollection $collection The collection to initialize. - * - * @return void - * @todo Maybe later move to EntityManager#initialize($proxyOrCollection). See DDC-733. - */ - public function loadCollection(PersistentCollection $collection) - { - $assoc = $collection->getMapping(); - $persister = $this->getEntityPersister($assoc['targetEntity']); - - switch ($assoc['type']) { - case ClassMetadata::ONE_TO_MANY: - $persister->loadOneToManyCollection($assoc, $collection->getOwner(), $collection); - break; - - case ClassMetadata::MANY_TO_MANY: - $persister->loadManyToManyCollection($assoc, $collection->getOwner(), $collection); - break; - } - } - - /** - * Gets the identity map of the UnitOfWork. - * - * @return array - */ - public function getIdentityMap() - { - return $this->identityMap; - } - - /** - * Gets the original data of an entity. The original data is the data that was - * present at the time the entity was reconstituted from the database. - * - * @param object $entity - * - * @return array - */ - public function getOriginalEntityData($entity) - { - $oid = spl_object_hash($entity); - - if (isset($this->originalEntityData[$oid])) { - return $this->originalEntityData[$oid]; - } - - return array(); - } - - /** - * @ignore - */ - public function setOriginalEntityData($entity, array $data) - { - $this->originalEntityData[spl_object_hash($entity)] = $data; - } - - /** - * INTERNAL: - * Sets a property value of the original data array of an entity. - * - * @ignore - * @param string $oid - * @param string $property - * @param mixed $value - */ - public function setOriginalEntityProperty($oid, $property, $value) - { - $this->originalEntityData[$oid][$property] = $value; - } - - /** - * Gets the identifier of an entity. - * The returned value is always an array of identifier values. If the entity - * has a composite identifier then the identifier values are in the same - * order as the identifier field names as returned by ClassMetadata#getIdentifierFieldNames(). - * - * @param object $entity - * - * @return array The identifier values. - */ - public function getEntityIdentifier($entity) - { - return $this->entityIdentifiers[spl_object_hash($entity)]; - } - - /** - * Tries to find an entity with the given identifier in the identity map of - * this UnitOfWork. - * - * @param mixed $id The entity identifier to look for. - * @param string $rootClassName The name of the root class of the mapped entity hierarchy. - * - * @return mixed Returns the entity with the specified identifier if it exists in - * this UnitOfWork, FALSE otherwise. - */ - public function tryGetById($id, $rootClassName) - { - $idHash = implode(' ', (array) $id); - - if (isset($this->identityMap[$rootClassName][$idHash])) { - return $this->identityMap[$rootClassName][$idHash]; - } - - return false; - } - - /** - * Schedules an entity for dirty-checking at commit-time. - * - * @param object $entity The entity to schedule for dirty-checking. - * @todo Rename: scheduleForSynchronization - */ - public function scheduleForDirtyCheck($entity) - { - $rootClassName = $this->em->getClassMetadata(get_class($entity))->rootEntityName; - - $this->scheduledForDirtyCheck[$rootClassName][spl_object_hash($entity)] = $entity; - } - - /** - * Checks whether the UnitOfWork has any pending insertions. - * - * @return boolean TRUE if this UnitOfWork has pending insertions, FALSE otherwise. - */ - public function hasPendingInsertions() - { - return ! empty($this->entityInsertions); - } - - /** - * Calculates the size of the UnitOfWork. The size of the UnitOfWork is the - * number of entities in the identity map. - * - * @return integer - */ - public function size() - { - $countArray = array_map(function ($item) { return count($item); }, $this->identityMap); - - return array_sum($countArray); - } - - /** - * Gets the EntityPersister for an Entity. - * - * @param string $entityName The name of the Entity. - * - * @return \Doctrine\ORM\Persisters\BasicEntityPersister - */ - public function getEntityPersister($entityName) - { - if (isset($this->persisters[$entityName])) { - return $this->persisters[$entityName]; - } - - $class = $this->em->getClassMetadata($entityName); - - switch (true) { - case ($class->isInheritanceTypeNone()): - $persister = new Persisters\BasicEntityPersister($this->em, $class); - break; - - case ($class->isInheritanceTypeSingleTable()): - $persister = new Persisters\SingleTablePersister($this->em, $class); - break; - - case ($class->isInheritanceTypeJoined()): - $persister = new Persisters\JoinedSubclassPersister($this->em, $class); - break; - - default: - $persister = new Persisters\UnionSubclassPersister($this->em, $class); - } - - $this->persisters[$entityName] = $persister; - - return $this->persisters[$entityName]; - } - - /** - * Gets a collection persister for a collection-valued association. - * - * @param array $association - * - * @return \Doctrine\ORM\Persisters\AbstractCollectionPersister - */ - public function getCollectionPersister(array $association) - { - $type = $association['type']; - - if (isset($this->collectionPersisters[$type])) { - return $this->collectionPersisters[$type]; - } - - switch ($type) { - case ClassMetadata::ONE_TO_MANY: - $persister = new Persisters\OneToManyPersister($this->em); - break; - - case ClassMetadata::MANY_TO_MANY: - $persister = new Persisters\ManyToManyPersister($this->em); - break; - } - - $this->collectionPersisters[$type] = $persister; - - return $this->collectionPersisters[$type]; - } - - /** - * INTERNAL: - * Registers an entity as managed. - * - * @param object $entity The entity. - * @param array $id The identifier values. - * @param array $data The original entity data. - */ - public function registerManaged($entity, array $id, array $data) - { - $oid = spl_object_hash($entity); - - $this->entityIdentifiers[$oid] = $id; - $this->entityStates[$oid] = self::STATE_MANAGED; - $this->originalEntityData[$oid] = $data; - - $this->addToIdentityMap($entity); - - if ($entity instanceof NotifyPropertyChanged) { - $entity->addPropertyChangedListener($this); - } - } - - /** - * INTERNAL: - * Clears the property changeset of the entity with the given OID. - * - * @param string $oid The entity's OID. - */ - public function clearEntityChangeSet($oid) - { - $this->entityChangeSets[$oid] = array(); - } - - /* PropertyChangedListener implementation */ - - /** - * Notifies this UnitOfWork of a property change in an entity. - * - * @param object $entity The entity that owns the property. - * @param string $propertyName The name of the property that changed. - * @param mixed $oldValue The old value of the property. - * @param mixed $newValue The new value of the property. - */ - public function propertyChanged($entity, $propertyName, $oldValue, $newValue) - { - $oid = spl_object_hash($entity); - $class = $this->em->getClassMetadata(get_class($entity)); - - $isAssocField = isset($class->associationMappings[$propertyName]); - - if ( ! $isAssocField && ! isset($class->fieldMappings[$propertyName])) { - return; // ignore non-persistent fields - } - - // Update changeset and mark entity for synchronization - $this->entityChangeSets[$oid][$propertyName] = array($oldValue, $newValue); - - if ( ! isset($this->scheduledForDirtyCheck[$class->rootEntityName][$oid])) { - $this->scheduleForDirtyCheck($entity); - } - } - - /** - * Gets the currently scheduled entity insertions in this UnitOfWork. - * - * @return array - */ - public function getScheduledEntityInsertions() - { - return $this->entityInsertions; - } - - /** - * Gets the currently scheduled entity updates in this UnitOfWork. - * - * @return array - */ - public function getScheduledEntityUpdates() - { - return $this->entityUpdates; - } - - /** - * Gets the currently scheduled entity deletions in this UnitOfWork. - * - * @return array - */ - public function getScheduledEntityDeletions() - { - return $this->entityDeletions; - } - - /** - * Get the currently scheduled complete collection deletions - * - * @return array - */ - public function getScheduledCollectionDeletions() - { - return $this->collectionDeletions; - } - - /** - * Gets the currently scheduled collection inserts, updates and deletes. - * - * @return array - */ - public function getScheduledCollectionUpdates() - { - return $this->collectionUpdates; - } - - /** - * Helper method to initialize a lazy loading proxy or persistent collection. - * - * @param object - * - * @return void - */ - public function initializeObject($obj) - { - if ($obj instanceof Proxy) { - $obj->__load(); - - return; - } - - if ($obj instanceof PersistentCollection) { - $obj->initialize(); - } - } - - /** - * Helper method to show an object as string. - * - * @param object $obj - * - * @return string - */ - private static function objToStr($obj) - { - return method_exists($obj, '__toString') ? (string)$obj : get_class($obj).'@'.spl_object_hash($obj); - } - - /** - * Marks an entity as read-only so that it will not be considered for updates during UnitOfWork#commit(). - * - * This operation cannot be undone as some parts of the UnitOfWork now keep gathering information - * on this object that might be necessary to perform a correct update. - * - * - * @param object $object - * - * @throws ORMInvalidArgumentException - * - * @return void - */ - public function markReadOnly($object) - { - if ( ! is_object($object) || ! $this->isInIdentityMap($object)) { - throw ORMInvalidArgumentException::readOnlyRequiresManagedEntity($object); - } - - $this->readOnlyObjects[spl_object_hash($object)] = true; - } - - /** - * Is this entity read only? - * - * @param object $object - * - * @throws ORMInvalidArgumentException - * - * @return bool - */ - public function isReadOnly($object) - { - if ( ! is_object($object)) { - throw ORMInvalidArgumentException::readOnlyRequiresManagedEntity($object); - } - - return isset($this->readOnlyObjects[spl_object_hash($object)]); - } -} diff --git a/framework/library/Doctrine/ORM/Version.php b/framework/library/Doctrine/ORM/Version.php deleted file mode 100644 index 9f32726..0000000 --- a/framework/library/Doctrine/ORM/Version.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ - -namespace Doctrine\ORM; - -/** - * Class to store and retrieve the version of Doctrine - * - * - * @link www.doctrine-project.org - * @since 2.0 - * @version $Revision$ - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Version -{ - /** - * Current Doctrine Version - */ - const VERSION = '2.3.3'; - - /** - * Compares a Doctrine version with the current one. - * - * @param string $version Doctrine version to compare. - * @return int Returns -1 if older, 0 if it is the same, 1 if version - * passed as argument is newer. - */ - public static function compare($version) - { - $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); - $version = str_replace(' ', '', $version); - - return version_compare($version, $currentVersion); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Application.php b/framework/library/Doctrine/Symfony/Component/Console/Application.php deleted file mode 100644 index 0c49df8..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Application.php +++ /dev/null @@ -1,1080 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\Output; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Command\HelpCommand; -use Symfony\Component\Console\Command\ListCommand; -use Symfony\Component\Console\Helper\HelperSet; -use Symfony\Component\Console\Helper\FormatterHelper; -use Symfony\Component\Console\Helper\DialogHelper; - -/** - * An Application is the container for a collection of commands. - * - * It is the main entry point of a Console application. - * - * This class is optimized for a standard CLI environment. - * - * Usage: - * - * $app = new Application('myapp', '1.0 (stable)'); - * $app->add(new SimpleCommand()); - * $app->run(); - * - * @author Fabien Potencier - * - * @api - */ -class Application -{ - private $commands; - private $wantHelps = false; - private $runningCommand; - private $name; - private $version; - private $catchExceptions; - private $autoExit; - private $definition; - private $helperSet; - - /** - * Constructor. - * - * @param string $name The name of the application - * @param string $version The version of the application - * - * @api - */ - public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN') - { - $this->name = $name; - $this->version = $version; - $this->catchExceptions = true; - $this->autoExit = true; - $this->commands = array(); - $this->helperSet = $this->getDefaultHelperSet(); - $this->definition = $this->getDefaultInputDefinition(); - - foreach ($this->getDefaultCommands() as $command) { - $this->add($command); - } - } - - /** - * Runs the current application. - * - * @param InputInterface $input An Input instance - * @param OutputInterface $output An Output instance - * - * @return integer 0 if everything went fine, or an error code - * - * @throws \Exception When doRun returns Exception - * - * @api - */ - public function run(InputInterface $input = null, OutputInterface $output = null) - { - if (null === $input) { - $input = new ArgvInput(); - } - - if (null === $output) { - $output = new ConsoleOutput(); - } - - try { - $statusCode = $this->doRun($input, $output); - } catch (\Exception $e) { - if (!$this->catchExceptions) { - throw $e; - } - - if ($output instanceof ConsoleOutputInterface) { - $this->renderException($e, $output->getErrorOutput()); - } else { - $this->renderException($e, $output); - } - $statusCode = $e->getCode(); - - $statusCode = is_numeric($statusCode) && $statusCode ? $statusCode : 1; - } - - if ($this->autoExit) { - if ($statusCode > 255) { - $statusCode = 255; - } - // @codeCoverageIgnoreStart - exit($statusCode); - // @codeCoverageIgnoreEnd - } - - return $statusCode; - } - - /** - * Runs the current application. - * - * @param InputInterface $input An Input instance - * @param OutputInterface $output An Output instance - * - * @return integer 0 if everything went fine, or an error code - */ - public function doRun(InputInterface $input, OutputInterface $output) - { - $name = $this->getCommandName($input); - - if (true === $input->hasParameterOption(array('--ansi'))) { - $output->setDecorated(true); - } elseif (true === $input->hasParameterOption(array('--no-ansi'))) { - $output->setDecorated(false); - } - - if (true === $input->hasParameterOption(array('--help', '-h'))) { - if (!$name) { - $name = 'help'; - $input = new ArrayInput(array('command' => 'help')); - } else { - $this->wantHelps = true; - } - } - - if (true === $input->hasParameterOption(array('--no-interaction', '-n'))) { - $input->setInteractive(false); - } - - if (function_exists('posix_isatty') && $this->getHelperSet()->has('dialog')) { - $inputStream = $this->getHelperSet()->get('dialog')->getInputStream(); - if (!posix_isatty($inputStream)) { - $input->setInteractive(false); - } - } - - if (true === $input->hasParameterOption(array('--quiet', '-q'))) { - $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); - } elseif (true === $input->hasParameterOption(array('--verbose', '-v'))) { - $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); - } - - if (true === $input->hasParameterOption(array('--version', '-V'))) { - $output->writeln($this->getLongVersion()); - - return 0; - } - - if (!$name) { - $name = 'list'; - $input = new ArrayInput(array('command' => 'list')); - } - - // the command name MUST be the first element of the input - $command = $this->find($name); - - $this->runningCommand = $command; - $statusCode = $command->run($input, $output); - $this->runningCommand = null; - - return is_numeric($statusCode) ? $statusCode : 0; - } - - /** - * Set a helper set to be used with the command. - * - * @param HelperSet $helperSet The helper set - * - * @api - */ - public function setHelperSet(HelperSet $helperSet) - { - $this->helperSet = $helperSet; - } - - /** - * Get the helper set associated with the command. - * - * @return HelperSet The HelperSet instance associated with this command - * - * @api - */ - public function getHelperSet() - { - return $this->helperSet; - } - - /** - * Gets the InputDefinition related to this Application. - * - * @return InputDefinition The InputDefinition instance - */ - public function getDefinition() - { - return $this->definition; - } - - /** - * Gets the help message. - * - * @return string A help message. - */ - public function getHelp() - { - $messages = array( - $this->getLongVersion(), - '', - 'Usage:', - sprintf(" [options] command [arguments]\n"), - 'Options:', - ); - - foreach ($this->getDefinition()->getOptions() as $option) { - $messages[] = sprintf(' %-29s %s %s', - '--'.$option->getName().'', - $option->getShortcut() ? '-'.$option->getShortcut().'' : ' ', - $option->getDescription() - ); - } - - return implode(PHP_EOL, $messages); - } - - /** - * Sets whether to catch exceptions or not during commands execution. - * - * @param Boolean $boolean Whether to catch exceptions or not during commands execution - * - * @api - */ - public function setCatchExceptions($boolean) - { - $this->catchExceptions = (Boolean) $boolean; - } - - /** - * Sets whether to automatically exit after a command execution or not. - * - * @param Boolean $boolean Whether to automatically exit after a command execution or not - * - * @api - */ - public function setAutoExit($boolean) - { - $this->autoExit = (Boolean) $boolean; - } - - /** - * Gets the name of the application. - * - * @return string The application name - * - * @api - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the application name. - * - * @param string $name The application name - * - * @api - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Gets the application version. - * - * @return string The application version - * - * @api - */ - public function getVersion() - { - return $this->version; - } - - /** - * Sets the application version. - * - * @param string $version The application version - * - * @api - */ - public function setVersion($version) - { - $this->version = $version; - } - - /** - * Returns the long version of the application. - * - * @return string The long application version - * - * @api - */ - public function getLongVersion() - { - if ('UNKNOWN' !== $this->getName() && 'UNKNOWN' !== $this->getVersion()) { - return sprintf('%s version %s', $this->getName(), $this->getVersion()); - } - - return 'Console Tool'; - } - - /** - * Registers a new command. - * - * @param string $name The command name - * - * @return Command The newly created command - * - * @api - */ - public function register($name) - { - return $this->add(new Command($name)); - } - - /** - * Adds an array of command objects. - * - * @param Command[] $commands An array of commands - * - * @api - */ - public function addCommands(array $commands) - { - foreach ($commands as $command) { - $this->add($command); - } - } - - /** - * Adds a command object. - * - * If a command with the same name already exists, it will be overridden. - * - * @param Command $command A Command object - * - * @return Command The registered command - * - * @api - */ - public function add(Command $command) - { - $command->setApplication($this); - - if (!$command->isEnabled()) { - $command->setApplication(null); - - return; - } - - $this->commands[$command->getName()] = $command; - - foreach ($command->getAliases() as $alias) { - $this->commands[$alias] = $command; - } - - return $command; - } - - /** - * Returns a registered command by name or alias. - * - * @param string $name The command name or alias - * - * @return Command A Command object - * - * @throws \InvalidArgumentException When command name given does not exist - * - * @api - */ - public function get($name) - { - if (!isset($this->commands[$name])) { - throw new \InvalidArgumentException(sprintf('The command "%s" does not exist.', $name)); - } - - $command = $this->commands[$name]; - - if ($this->wantHelps) { - $this->wantHelps = false; - - $helpCommand = $this->get('help'); - $helpCommand->setCommand($command); - - return $helpCommand; - } - - return $command; - } - - /** - * Returns true if the command exists, false otherwise. - * - * @param string $name The command name or alias - * - * @return Boolean true if the command exists, false otherwise - * - * @api - */ - public function has($name) - { - return isset($this->commands[$name]); - } - - /** - * Returns an array of all unique namespaces used by currently registered commands. - * - * It does not returns the global namespace which always exists. - * - * @return array An array of namespaces - */ - public function getNamespaces() - { - $namespaces = array(); - foreach ($this->commands as $command) { - $namespaces[] = $this->extractNamespace($command->getName()); - - foreach ($command->getAliases() as $alias) { - $namespaces[] = $this->extractNamespace($alias); - } - } - - return array_values(array_unique(array_filter($namespaces))); - } - - /** - * Finds a registered namespace by a name or an abbreviation. - * - * @param string $namespace A namespace or abbreviation to search for - * - * @return string A registered namespace - * - * @throws \InvalidArgumentException When namespace is incorrect or ambiguous - */ - public function findNamespace($namespace) - { - $allNamespaces = array(); - foreach ($this->getNamespaces() as $n) { - $allNamespaces[$n] = explode(':', $n); - } - - $found = array(); - foreach (explode(':', $namespace) as $i => $part) { - $abbrevs = static::getAbbreviations(array_unique(array_values(array_filter(array_map(function ($p) use ($i) { return isset($p[$i]) ? $p[$i] : ''; }, $allNamespaces))))); - - if (!isset($abbrevs[$part])) { - $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace); - - if (1 <= $i) { - $part = implode(':', $found).':'.$part; - } - - if ($alternatives = $this->findAlternativeNamespace($part, $abbrevs)) { - $message .= "\n\nDid you mean one of these?\n "; - $message .= implode("\n ", $alternatives); - } - - throw new \InvalidArgumentException($message); - } - - if (count($abbrevs[$part]) > 1) { - throw new \InvalidArgumentException(sprintf('The namespace "%s" is ambiguous (%s).', $namespace, $this->getAbbreviationSuggestions($abbrevs[$part]))); - } - - $found[] = $abbrevs[$part][0]; - } - - return implode(':', $found); - } - - /** - * Finds a command by name or alias. - * - * Contrary to get, this command tries to find the best - * match if you give it an abbreviation of a name or alias. - * - * @param string $name A command name or a command alias - * - * @return Command A Command instance - * - * @throws \InvalidArgumentException When command name is incorrect or ambiguous - * - * @api - */ - public function find($name) - { - // namespace - $namespace = ''; - $searchName = $name; - if (false !== $pos = strrpos($name, ':')) { - $namespace = $this->findNamespace(substr($name, 0, $pos)); - $searchName = $namespace.substr($name, $pos); - } - - // name - $commands = array(); - foreach ($this->commands as $command) { - if ($this->extractNamespace($command->getName()) == $namespace) { - $commands[] = $command->getName(); - } - } - - $abbrevs = static::getAbbreviations(array_unique($commands)); - if (isset($abbrevs[$searchName]) && 1 == count($abbrevs[$searchName])) { - return $this->get($abbrevs[$searchName][0]); - } - - if (isset($abbrevs[$searchName]) && count($abbrevs[$searchName]) > 1) { - $suggestions = $this->getAbbreviationSuggestions($abbrevs[$searchName]); - - throw new \InvalidArgumentException(sprintf('Command "%s" is ambiguous (%s).', $name, $suggestions)); - } - - // aliases - $aliases = array(); - foreach ($this->commands as $command) { - foreach ($command->getAliases() as $alias) { - if ($this->extractNamespace($alias) == $namespace) { - $aliases[] = $alias; - } - } - } - - $aliases = static::getAbbreviations(array_unique($aliases)); - if (!isset($aliases[$searchName])) { - $message = sprintf('Command "%s" is not defined.', $name); - - if ($alternatives = $this->findAlternativeCommands($searchName, $abbrevs)) { - $message .= "\n\nDid you mean one of these?\n "; - $message .= implode("\n ", $alternatives); - } - - throw new \InvalidArgumentException($message); - } - - if (count($aliases[$searchName]) > 1) { - throw new \InvalidArgumentException(sprintf('Command "%s" is ambiguous (%s).', $name, $this->getAbbreviationSuggestions($aliases[$searchName]))); - } - - return $this->get($aliases[$searchName][0]); - } - - /** - * Gets the commands (registered in the given namespace if provided). - * - * The array keys are the full names and the values the command instances. - * - * @param string $namespace A namespace name - * - * @return array An array of Command instances - * - * @api - */ - public function all($namespace = null) - { - if (null === $namespace) { - return $this->commands; - } - - $commands = array(); - foreach ($this->commands as $name => $command) { - if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) { - $commands[$name] = $command; - } - } - - return $commands; - } - - /** - * Returns an array of possible abbreviations given a set of names. - * - * @param array $names An array of names - * - * @return array An array of abbreviations - */ - static public function getAbbreviations($names) - { - $abbrevs = array(); - foreach ($names as $name) { - for ($len = strlen($name) - 1; $len > 0; --$len) { - $abbrev = substr($name, 0, $len); - if (!isset($abbrevs[$abbrev])) { - $abbrevs[$abbrev] = array($name); - } else { - $abbrevs[$abbrev][] = $name; - } - } - } - - // Non-abbreviations always get entered, even if they aren't unique - foreach ($names as $name) { - $abbrevs[$name] = array($name); - } - - return $abbrevs; - } - - /** - * Returns a text representation of the Application. - * - * @param string $namespace An optional namespace name - * @param boolean $raw Whether to return raw command list - * - * @return string A string representing the Application - */ - public function asText($namespace = null, $raw = false) - { - $commands = $namespace ? $this->all($this->findNamespace($namespace)) : $this->commands; - - $width = 0; - foreach ($commands as $command) { - $width = strlen($command->getName()) > $width ? strlen($command->getName()) : $width; - } - $width += 2; - - if ($raw) { - $messages = array(); - foreach ($this->sortCommands($commands) as $space => $commands) { - foreach ($commands as $name => $command) { - $messages[] = sprintf("%-${width}s %s", $name, $command->getDescription()); - } - } - - return implode(PHP_EOL, $messages); - } - - $messages = array($this->getHelp(), ''); - if ($namespace) { - $messages[] = sprintf("Available commands for the \"%s\" namespace:", $namespace); - } else { - $messages[] = 'Available commands:'; - } - - // add commands by namespace - foreach ($this->sortCommands($commands) as $space => $commands) { - if (!$namespace && '_global' !== $space) { - $messages[] = ''.$space.''; - } - - foreach ($commands as $name => $command) { - $messages[] = sprintf(" %-${width}s %s", $name, $command->getDescription()); - } - } - - return implode(PHP_EOL, $messages); - } - - /** - * Returns an XML representation of the Application. - * - * @param string $namespace An optional namespace name - * @param Boolean $asDom Whether to return a DOM or an XML string - * - * @return string|DOMDocument An XML string representing the Application - */ - public function asXml($namespace = null, $asDom = false) - { - $commands = $namespace ? $this->all($this->findNamespace($namespace)) : $this->commands; - - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - $dom->appendChild($xml = $dom->createElement('symfony')); - - $xml->appendChild($commandsXML = $dom->createElement('commands')); - - if ($namespace) { - $commandsXML->setAttribute('namespace', $namespace); - } else { - $namespacesXML = $dom->createElement('namespaces'); - $xml->appendChild($namespacesXML); - } - - // add commands by namespace - foreach ($this->sortCommands($commands) as $space => $commands) { - if (!$namespace) { - $namespaceArrayXML = $dom->createElement('namespace'); - $namespacesXML->appendChild($namespaceArrayXML); - $namespaceArrayXML->setAttribute('id', $space); - } - - foreach ($commands as $name => $command) { - if ($name !== $command->getName()) { - continue; - } - - if (!$namespace) { - $commandXML = $dom->createElement('command'); - $namespaceArrayXML->appendChild($commandXML); - $commandXML->appendChild($dom->createTextNode($name)); - } - - $node = $command->asXml(true)->getElementsByTagName('command')->item(0); - $node = $dom->importNode($node, true); - - $commandsXML->appendChild($node); - } - } - - return $asDom ? $dom : $dom->saveXml(); - } - - /** - * Renders a caught exception. - * - * @param Exception $e An exception instance - * @param OutputInterface $output An OutputInterface instance - */ - public function renderException($e, $output) - { - $strlen = function ($string) { - if (!function_exists('mb_strlen')) { - return strlen($string); - } - - if (false === $encoding = mb_detect_encoding($string)) { - return strlen($string); - } - - return mb_strlen($string, $encoding); - }; - - do { - $title = sprintf(' [%s] ', get_class($e)); - $len = $strlen($title); - $width = $this->getTerminalWidth() ? $this->getTerminalWidth() - 1 : PHP_INT_MAX; - $lines = array(); - foreach (preg_split("{\r?\n}", $e->getMessage()) as $line) { - foreach (str_split($line, $width - 4) as $line) { - $lines[] = sprintf(' %s ', $line); - $len = max($strlen($line) + 4, $len); - } - } - - $messages = array(str_repeat(' ', $len), $title.str_repeat(' ', max(0, $len - $strlen($title)))); - - foreach ($lines as $line) { - $messages[] = $line.str_repeat(' ', $len - $strlen($line)); - } - - $messages[] = str_repeat(' ', $len); - - $output->writeln(""); - $output->writeln(""); - foreach ($messages as $message) { - $output->writeln(''.$message.''); - } - $output->writeln(""); - $output->writeln(""); - - if (OutputInterface::VERBOSITY_VERBOSE === $output->getVerbosity()) { - $output->writeln('Exception trace:'); - - // exception related properties - $trace = $e->getTrace(); - array_unshift($trace, array( - 'function' => '', - 'file' => $e->getFile() != null ? $e->getFile() : 'n/a', - 'line' => $e->getLine() != null ? $e->getLine() : 'n/a', - 'args' => array(), - )); - - for ($i = 0, $count = count($trace); $i < $count; $i++) { - $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : ''; - $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : ''; - $function = $trace[$i]['function']; - $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a'; - $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a'; - - $output->writeln(sprintf(' %s%s%s() at %s:%s', $class, $type, $function, $file, $line)); - } - - $output->writeln(""); - $output->writeln(""); - } - } while ($e = $e->getPrevious()); - - if (null !== $this->runningCommand) { - $output->writeln(sprintf('%s', sprintf($this->runningCommand->getSynopsis(), $this->getName()))); - $output->writeln(""); - $output->writeln(""); - } - } - - /** - * Tries to figure out the terminal width in which this application runs - * - * @return int|null - */ - protected function getTerminalWidth() - { - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - if ($ansicon = getenv('ANSICON')) { - return preg_replace('{^(\d+)x.*$}', '$1', $ansicon); - } - - exec('mode CON', $execData); - if (preg_match('{columns:\s*(\d+)}i', $execData[4], $matches)) { - return $matches[1]; - } - } - - if (preg_match("{rows.(\d+);.columns.(\d+);}i", $this->getSttyColumns(), $match)) { - return $match[2]; - } - } - - /** - * Tries to figure out the terminal height in which this application runs - * - * @return int|null - */ - protected function getTerminalHeight() - { - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - if ($ansicon = getenv('ANSICON')) { - return preg_replace('{^\d+x\d+ \(\d+x(\d+)\)$}', '$1', trim($ansicon)); - } - - exec('mode CON', $execData); - if (preg_match('{lines:\s*(\d+)}i', $execData[3], $matches)) { - return $matches[1]; - } - } - - if (preg_match("{rows.(\d+);.columns.(\d+);}i", $this->getSttyColumns(), $match)) { - return $match[1]; - } - } - - /** - * Gets the name of the command based on input. - * - * @param InputInterface $input The input interface - * - * @return string The command name - */ - protected function getCommandName(InputInterface $input) - { - return $input->getFirstArgument('command'); - } - - /** - * Gets the default input definition. - * - * @return InputDefinition An InputDefinition instance - */ - protected function getDefaultInputDefinition() - { - return new InputDefinition(array( - new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'), - - new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message.'), - new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message.'), - new InputOption('--verbose', '-v', InputOption::VALUE_NONE, 'Increase verbosity of messages.'), - new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version.'), - new InputOption('--ansi', '', InputOption::VALUE_NONE, 'Force ANSI output.'), - new InputOption('--no-ansi', '', InputOption::VALUE_NONE, 'Disable ANSI output.'), - new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question.'), - )); - } - - /** - * Gets the default commands that should always be available. - * - * @return array An array of default Command instances - */ - protected function getDefaultCommands() - { - return array(new HelpCommand(), new ListCommand()); - } - - /** - * Gets the default helper set with the helpers that should always be available. - * - * @return HelperSet A HelperSet instance - */ - protected function getDefaultHelperSet() - { - return new HelperSet(array( - new FormatterHelper(), - new DialogHelper(), - )); - } - - /** - * Runs and parses stty -a if it's available, suppressing any error output - * - * @return string - */ - private function getSttyColumns() - { - if (!function_exists('proc_open')) { - return; - } - - $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w')); - $process = proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, array('suppress_errors' => true)); - if (is_resource($process)) { - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - return $info; - } - } - - /** - * Sorts commands in alphabetical order. - * - * @param array $commands An associative array of commands to sort - * - * @return array A sorted array of commands - */ - private function sortCommands($commands) - { - $namespacedCommands = array(); - foreach ($commands as $name => $command) { - $key = $this->extractNamespace($name, 1); - if (!$key) { - $key = '_global'; - } - - $namespacedCommands[$key][$name] = $command; - } - ksort($namespacedCommands); - - foreach ($namespacedCommands as &$commands) { - ksort($commands); - } - - return $namespacedCommands; - } - - /** - * Returns abbreviated suggestions in string format. - * - * @param array $abbrevs Abbreviated suggestions to convert - * - * @return string A formatted string of abbreviated suggestions - */ - private function getAbbreviationSuggestions($abbrevs) - { - return sprintf('%s, %s%s', $abbrevs[0], $abbrevs[1], count($abbrevs) > 2 ? sprintf(' and %d more', count($abbrevs) - 2) : ''); - } - - /** - * Returns the namespace part of the command name. - * - * @param string $name The full name of the command - * @param string $limit The maximum number of parts of the namespace - * - * @return string The namespace of the command - */ - private function extractNamespace($name, $limit = null) - { - $parts = explode(':', $name); - array_pop($parts); - - return implode(':', null === $limit ? $parts : array_slice($parts, 0, $limit)); - } - - /** - * Finds alternative commands of $name - * - * @param string $name The full name of the command - * @param array $abbrevs The abbreviations - * - * @return array A sorted array of similar commands - */ - private function findAlternativeCommands($name, $abbrevs) - { - $callback = function($item) { - return $item->getName(); - }; - - return $this->findAlternatives($name, $this->commands, $abbrevs, $callback); - } - - /** - * Finds alternative namespace of $name - * - * @param string $name The full name of the namespace - * @param array $abbrevs The abbreviations - * - * @return array A sorted array of similar namespace - */ - private function findAlternativeNamespace($name, $abbrevs) - { - return $this->findAlternatives($name, $this->getNamespaces(), $abbrevs); - } - - /** - * Finds alternative of $name among $collection, - * if nothing is found in $collection, try in $abbrevs - * - * @param string $name The string - * @param array|Traversable $collection The collecion - * @param array $abbrevs The abbreviations - * @param Closure|string|array $callback The callable to transform collection item before comparison - * - * @return array A sorted array of similar string - */ - private function findAlternatives($name, $collection, $abbrevs, $callback = null) - { - $alternatives = array(); - - foreach ($collection as $item) { - if (null !== $callback) { - $item = call_user_func($callback, $item); - } - - $lev = levenshtein($name, $item); - if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) { - $alternatives[$item] = $lev; - } - } - - if (!$alternatives) { - foreach ($abbrevs as $key => $values) { - $lev = levenshtein($name, $key); - if ($lev <= strlen($name) / 3 || false !== strpos($key, $name)) { - foreach ($values as $value) { - $alternatives[$value] = $lev; - } - } - } - } - - asort($alternatives); - - return array_keys($alternatives); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/CHANGELOG.md b/framework/library/Doctrine/Symfony/Component/Console/CHANGELOG.md deleted file mode 100644 index 79449d8..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/CHANGELOG.md +++ /dev/null @@ -1,19 +0,0 @@ -CHANGELOG -========= - -2.1.0 ------ - - * added ConsoleOutputInterface - * added the possibility to disable a command (Command::isEnabled()) - * added suggestions when a command does not exist - * added a --raw option to the list command - * added support for STDERR in the console output class (errors are now sent - to STDERR) - * made the defaults (helper set, commands, input definition) in Application - more easily customizable - * added support for the shell even if readline is not available - * added support for process isolation in Symfony shell via - `--process-isolation` switch - * added support for `--`, which disables options parsing after that point - (tokens will be parsed as arguments) diff --git a/framework/library/Doctrine/Symfony/Component/Console/Command/Command.php b/framework/library/Doctrine/Symfony/Component/Console/Command/Command.php deleted file mode 100644 index 001e364..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Command/Command.php +++ /dev/null @@ -1,614 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Helper\HelperSet; - -/** - * Base class for all commands. - * - * @author Fabien Potencier - * - * @api - */ -class Command -{ - private $application; - private $name; - private $aliases; - private $definition; - private $help; - private $description; - private $ignoreValidationErrors; - private $applicationDefinitionMerged; - private $code; - private $synopsis; - private $helperSet; - - /** - * Constructor. - * - * @param string $name The name of the command - * - * @throws \LogicException When the command name is empty - * - * @api - */ - public function __construct($name = null) - { - $this->definition = new InputDefinition(); - $this->ignoreValidationErrors = false; - $this->applicationDefinitionMerged = false; - $this->aliases = array(); - - if (null !== $name) { - $this->setName($name); - } - - $this->configure(); - - if (!$this->name) { - throw new \LogicException('The command name cannot be empty.'); - } - } - - /** - * Ignores validation errors. - * - * This is mainly useful for the help command. - */ - public function ignoreValidationErrors() - { - $this->ignoreValidationErrors = true; - } - - /** - * Sets the application instance for this command. - * - * @param Application $application An Application instance - * - * @api - */ - public function setApplication(Application $application = null) - { - $this->application = $application; - if ($application) { - $this->setHelperSet($application->getHelperSet()); - } else { - $this->helperSet = null; - } - } - - /** - * Sets the helper set. - * - * @param HelperSet $helperSet A HelperSet instance - */ - public function setHelperSet(HelperSet $helperSet) - { - $this->helperSet = $helperSet; - } - - /** - * Gets the helper set. - * - * @return HelperSet A HelperSet instance - */ - public function getHelperSet() - { - return $this->helperSet; - } - - /** - * Gets the application instance for this command. - * - * @return Application An Application instance - * - * @api - */ - public function getApplication() - { - return $this->application; - } - - /** - * Checks whether the command is enabled or not in the current environment - * - * Override this to check for x or y and return false if the command can not - * run properly under the current conditions. - * - * @return Boolean - */ - public function isEnabled() - { - return true; - } - - /** - * Configures the current command. - */ - protected function configure() - { - } - - /** - * Executes the current command. - * - * This method is not abstract because you can use this class - * as a concrete class. In this case, instead of defining the - * execute() method, you set the code to execute by passing - * a Closure to the setCode() method. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - * - * @return integer 0 if everything went fine, or an error code - * - * @throws \LogicException When this abstract method is not implemented - * @see setCode() - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - throw new \LogicException('You must override the execute() method in the concrete command class.'); - } - - /** - * Interacts with the user. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - */ - protected function interact(InputInterface $input, OutputInterface $output) - { - } - - /** - * Initializes the command just after the input has been validated. - * - * This is mainly useful when a lot of commands extends one main command - * where some things need to be initialized based on the input arguments and options. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - */ - protected function initialize(InputInterface $input, OutputInterface $output) - { - } - - /** - * Runs the command. - * - * The code to execute is either defined directly with the - * setCode() method or by overriding the execute() method - * in a sub-class. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - * - * @return integer The command exit code - * - * @see setCode() - * @see execute() - * - * @api - */ - public function run(InputInterface $input, OutputInterface $output) - { - // force the creation of the synopsis before the merge with the app definition - $this->getSynopsis(); - - // add the application arguments and options - $this->mergeApplicationDefinition(); - - // bind the input against the command specific arguments/options - try { - $input->bind($this->definition); - } catch (\Exception $e) { - if (!$this->ignoreValidationErrors) { - throw $e; - } - } - - $this->initialize($input, $output); - - if ($input->isInteractive()) { - $this->interact($input, $output); - } - - $input->validate(); - - if ($this->code) { - return call_user_func($this->code, $input, $output); - } - - return $this->execute($input, $output); - } - - /** - * Sets the code to execute when running this command. - * - * If this method is used, it overrides the code defined - * in the execute() method. - * - * @param \Closure $code A \Closure - * - * @return Command The current instance - * - * @see execute() - * - * @api - */ - public function setCode(\Closure $code) - { - $this->code = $code; - - return $this; - } - - /** - * Merges the application definition with the command definition. - */ - private function mergeApplicationDefinition() - { - if (null === $this->application || true === $this->applicationDefinitionMerged) { - return; - } - - $currentArguments = $this->definition->getArguments(); - $this->definition->setArguments($this->application->getDefinition()->getArguments()); - $this->definition->addArguments($currentArguments); - - $this->definition->addOptions($this->application->getDefinition()->getOptions()); - - $this->applicationDefinitionMerged = true; - } - - /** - * Sets an array of argument and option instances. - * - * @param array|InputDefinition $definition An array of argument and option instances or a definition instance - * - * @return Command The current instance - * - * @api - */ - public function setDefinition($definition) - { - if ($definition instanceof InputDefinition) { - $this->definition = $definition; - } else { - $this->definition->setDefinition($definition); - } - - $this->applicationDefinitionMerged = false; - - return $this; - } - - /** - * Gets the InputDefinition attached to this Command. - * - * @return InputDefinition An InputDefinition instance - * - * @api - */ - public function getDefinition() - { - return $this->definition; - } - - /** - * Gets the InputDefinition to be used to create XML and Text representations of this Command. - * - * Can be overridden to provide the original command representation when it would otherwise - * be changed by merging with the application InputDefinition. - * - * @return InputDefinition An InputDefinition instance - */ - protected function getNativeDefinition() - { - return $this->getDefinition(); - } - - /** - * Adds an argument. - * - * @param string $name The argument name - * @param integer $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL - * @param string $description A description text - * @param mixed $default The default value (for InputArgument::OPTIONAL mode only) - * - * @return Command The current instance - * - * @api - */ - public function addArgument($name, $mode = null, $description = '', $default = null) - { - $this->definition->addArgument(new InputArgument($name, $mode, $description, $default)); - - return $this; - } - - /** - * Adds an option. - * - * @param string $name The option name - * @param string $shortcut The shortcut (can be null) - * @param integer $mode The option mode: One of the InputOption::VALUE_* constants - * @param string $description A description text - * @param mixed $default The default value (must be null for InputOption::VALUE_REQUIRED or InputOption::VALUE_NONE) - * - * @return Command The current instance - * - * @api - */ - public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null) - { - $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default)); - - return $this; - } - - /** - * Sets the name of the command. - * - * This method can set both the namespace and the name if - * you separate them by a colon (:) - * - * $command->setName('foo:bar'); - * - * @param string $name The command name - * - * @return Command The current instance - * - * @throws \InvalidArgumentException When command name given is empty - * - * @api - */ - public function setName($name) - { - $this->validateName($name); - - $this->name = $name; - - return $this; - } - - /** - * Returns the command name. - * - * @return string The command name - * - * @api - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the description for the command. - * - * @param string $description The description for the command - * - * @return Command The current instance - * - * @api - */ - public function setDescription($description) - { - $this->description = $description; - - return $this; - } - - /** - * Returns the description for the command. - * - * @return string The description for the command - * - * @api - */ - public function getDescription() - { - return $this->description; - } - - /** - * Sets the help for the command. - * - * @param string $help The help for the command - * - * @return Command The current instance - * - * @api - */ - public function setHelp($help) - { - $this->help = $help; - - return $this; - } - - /** - * Returns the help for the command. - * - * @return string The help for the command - * - * @api - */ - public function getHelp() - { - return $this->help; - } - - /** - * Returns the processed help for the command replacing the %command.name% and - * %command.full_name% patterns with the real values dynamically. - * - * @return string The processed help for the command - */ - public function getProcessedHelp() - { - $name = $this->name; - - $placeholders = array( - '%command.name%', - '%command.full_name%' - ); - $replacements = array( - $name, - $_SERVER['PHP_SELF'].' '.$name - ); - - return str_replace($placeholders, $replacements, $this->getHelp()); - } - - /** - * Sets the aliases for the command. - * - * @param array $aliases An array of aliases for the command - * - * @return Command The current instance - * - * @api - */ - public function setAliases($aliases) - { - foreach ($aliases as $alias) { - $this->validateName($alias); - } - - $this->aliases = $aliases; - - return $this; - } - - /** - * Returns the aliases for the command. - * - * @return array An array of aliases for the command - * - * @api - */ - public function getAliases() - { - return $this->aliases; - } - - /** - * Returns the synopsis for the command. - * - * @return string The synopsis - */ - public function getSynopsis() - { - if (null === $this->synopsis) { - $this->synopsis = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis())); - } - - return $this->synopsis; - } - - /** - * Gets a helper instance by name. - * - * @param string $name The helper name - * - * @return mixed The helper value - * - * @throws \InvalidArgumentException if the helper is not defined - * - * @api - */ - public function getHelper($name) - { - return $this->helperSet->get($name); - } - - /** - * Returns a text representation of the command. - * - * @return string A string representing the command - */ - public function asText() - { - $messages = array( - 'Usage:', - ' '.$this->getSynopsis(), - '', - ); - - if ($this->getAliases()) { - $messages[] = 'Aliases: '.implode(', ', $this->getAliases()).''; - } - - $messages[] = $this->getNativeDefinition()->asText(); - - if ($help = $this->getProcessedHelp()) { - $messages[] = 'Help:'; - $messages[] = ' '.str_replace("\n", "\n ", $help)."\n"; - } - - return implode("\n", $messages); - } - - /** - * Returns an XML representation of the command. - * - * @param Boolean $asDom Whether to return a DOM or an XML string - * - * @return string|DOMDocument An XML string representing the command - */ - public function asXml($asDom = false) - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - $dom->appendChild($commandXML = $dom->createElement('command')); - $commandXML->setAttribute('id', $this->name); - $commandXML->setAttribute('name', $this->name); - - $commandXML->appendChild($usageXML = $dom->createElement('usage')); - $usageXML->appendChild($dom->createTextNode(sprintf($this->getSynopsis(), ''))); - - $commandXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $this->getDescription()))); - - $commandXML->appendChild($helpXML = $dom->createElement('help')); - $helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $this->getProcessedHelp()))); - - $commandXML->appendChild($aliasesXML = $dom->createElement('aliases')); - foreach ($this->getAliases() as $alias) { - $aliasesXML->appendChild($aliasXML = $dom->createElement('alias')); - $aliasXML->appendChild($dom->createTextNode($alias)); - } - - $definition = $this->getNativeDefinition()->asXml(true); - $commandXML->appendChild($dom->importNode($definition->getElementsByTagName('arguments')->item(0), true)); - $commandXML->appendChild($dom->importNode($definition->getElementsByTagName('options')->item(0), true)); - - return $asDom ? $dom : $dom->saveXml(); - } - - private function validateName($name) - { - if (!preg_match('/^[^\:]+(\:[^\:]+)*$/', $name)) { - throw new \InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name)); - } - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Command/HelpCommand.php b/framework/library/Doctrine/Symfony/Component/Console/Command/HelpCommand.php deleted file mode 100644 index 93c8104..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Command/HelpCommand.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\Output; -use Symfony\Component\Console\Command\Command; - -/** - * HelpCommand displays the help for a given command. - * - * @author Fabien Potencier - */ -class HelpCommand extends Command -{ - private $command; - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->ignoreValidationErrors(); - - $this - ->setName('help') - ->setDefinition(array( - new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'), - new InputOption('xml', null, InputOption::VALUE_NONE, 'To output help as XML'), - )) - ->setDescription('Displays help for a command') - ->setHelp(<<%command.name% command displays help for a given command: - - php %command.full_name% list - -You can also output the help as XML by using the --xml option: - - php %command.full_name% --xml list -EOF - ) - ; - } - - /** - * Sets the command - * - * @param Command $command The command to set - */ - public function setCommand(Command $command) - { - $this->command = $command; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - if (null === $this->command) { - $this->command = $this->getApplication()->get($input->getArgument('command_name')); - } - - if ($input->getOption('xml')) { - $output->writeln($this->command->asXml(), OutputInterface::OUTPUT_RAW); - } else { - $output->writeln($this->command->asText()); - } - - $this->command = null; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Command/ListCommand.php b/framework/library/Doctrine/Symfony/Component/Console/Command/ListCommand.php deleted file mode 100644 index 032de16..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Command/ListCommand.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\Output; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputDefinition; - -/** - * ListCommand displays the list of all available commands for the application. - * - * @author Fabien Potencier - */ -class ListCommand extends Command -{ - /** - * {@inheritdoc} - */ - protected function configure() - { - $this - ->setName('list') - ->setDefinition($this->createDefinition()) - ->setDescription('Lists commands') - ->setHelp(<<%command.name% command lists all commands: - - php %command.full_name% - -You can also display the commands for a specific namespace: - - php %command.full_name% test - -You can also output the information as XML by using the --xml option: - - php %command.full_name% --xml - -It's also possible to get raw list of commands (useful for embedding command runner): - - php %command.full_name% --raw -EOF - ) - ; - } - - /** - * {@inheritdoc} - */ - protected function getNativeDefinition() - { - return $this->createDefinition(); - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - if ($input->getOption('xml')) { - $output->writeln($this->getApplication()->asXml($input->getArgument('namespace')), OutputInterface::OUTPUT_RAW); - } else { - $output->writeln($this->getApplication()->asText($input->getArgument('namespace'), $input->getOption('raw'))); - } - } - - private function createDefinition() - { - return new InputDefinition(array( - new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'), - new InputOption('xml', null, InputOption::VALUE_NONE, 'To output help as XML'), - new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), - )); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatter.php b/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatter.php deleted file mode 100644 index 62e0754..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatter.php +++ /dev/null @@ -1,230 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter class for console output. - * - * @author Konstantin Kudryashov - * - * @api - */ -class OutputFormatter implements OutputFormatterInterface -{ - /** - * The pattern to phrase the format. - */ - const FORMAT_PATTERN = '#<(/?)([a-z][a-z0-9_=;-]+)?>([^<]*)#is'; - - private $decorated; - private $styles = array(); - private $styleStack; - - /** - * Initializes console output formatter. - * - * @param Boolean $decorated Whether this formatter should actually decorate strings - * @param array $styles Array of "name => FormatterStyle" instances - * - * @api - */ - public function __construct($decorated = null, array $styles = array()) - { - $this->decorated = (Boolean) $decorated; - - $this->setStyle('error', new OutputFormatterStyle('white', 'red')); - $this->setStyle('info', new OutputFormatterStyle('green')); - $this->setStyle('comment', new OutputFormatterStyle('yellow')); - $this->setStyle('question', new OutputFormatterStyle('black', 'cyan')); - - foreach ($styles as $name => $style) { - $this->setStyle($name, $style); - } - - $this->styleStack = new OutputFormatterStyleStack(); - } - - /** - * Sets the decorated flag. - * - * @param Boolean $decorated Whether to decorate the messages or not - * - * @api - */ - public function setDecorated($decorated) - { - $this->decorated = (Boolean) $decorated; - } - - /** - * Gets the decorated flag. - * - * @return Boolean true if the output will decorate messages, false otherwise - * - * @api - */ - public function isDecorated() - { - return $this->decorated; - } - - /** - * Sets a new style. - * - * @param string $name The style name - * @param OutputFormatterStyleInterface $style The style instance - * - * @api - */ - public function setStyle($name, OutputFormatterStyleInterface $style) - { - $this->styles[strtolower($name)] = $style; - } - - /** - * Checks if output formatter has style with specified name. - * - * @param string $name - * - * @return Boolean - * - * @api - */ - public function hasStyle($name) - { - return isset($this->styles[strtolower($name)]); - } - - /** - * Gets style options from style with specified name. - * - * @param string $name - * - * @return OutputFormatterStyleInterface - * - * @throws \InvalidArgumentException When style isn't defined - * - * @api - */ - public function getStyle($name) - { - if (!$this->hasStyle($name)) { - throw new \InvalidArgumentException('Undefined style: '.$name); - } - - return $this->styles[strtolower($name)]; - } - - /** - * Formats a message according to the given styles. - * - * @param string $message The message to style - * - * @return string The styled message - * - * @api - */ - public function format($message) - { - return preg_replace_callback(self::FORMAT_PATTERN, array($this, 'replaceStyle'), $message); - } - - /** - * @return OutputFormatterStyleStack - */ - public function getStyleStack() - { - return $this->styleStack; - } - - /** - * Replaces style of the output. - * - * @param array $match - * - * @return string The replaced style - */ - private function replaceStyle($match) - { - if ('' === $match[2]) { - if ('/' === $match[1]) { - // we got "" tag - $this->styleStack->pop(); - - return $this->applyStyle($this->styleStack->getCurrent(), $match[3]); - } - - // we got "<>" tag - return '<>'.$match[3]; - } - - if (isset($this->styles[strtolower($match[2])])) { - $style = $this->styles[strtolower($match[2])]; - } else { - $style = $this->createStyleFromString($match[2]); - - if (false === $style) { - return $match[0]; - } - } - - if ('/' === $match[1]) { - $this->styleStack->pop($style); - } else { - $this->styleStack->push($style); - } - - return $this->applyStyle($this->styleStack->getCurrent(), $match[3]); - } - - /** - * Tries to create new style instance from string. - * - * @param string $string - * - * @return OutputFormatterStyle|Boolean false if string is not format string - */ - private function createStyleFromString($string) - { - if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', strtolower($string), $matches, PREG_SET_ORDER)) { - return false; - } - - $style = new OutputFormatterStyle(); - foreach ($matches as $match) { - array_shift($match); - - if ('fg' == $match[0]) { - $style->setForeground($match[1]); - } elseif ('bg' == $match[0]) { - $style->setBackground($match[1]); - } else { - $style->setOption($match[1]); - } - } - - return $style; - } - - /** - * Applies style to text if must be applied. - * - * @param OutputFormatterStyleInterface $style Style to apply - * @param string $text Input text - * - * @return string string Styled text - */ - private function applyStyle(OutputFormatterStyleInterface $style, $text) - { - return $this->isDecorated() && strlen($text) > 0 ? $style->apply($text) : $text; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterInterface.php b/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterInterface.php deleted file mode 100644 index ca9f9d0..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterInterface.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter interface for console output. - * - * @author Konstantin Kudryashov - * - * @api - */ -interface OutputFormatterInterface -{ - /** - * Sets the decorated flag. - * - * @param Boolean $decorated Whether to decorate the messages or not - * - * @api - */ - function setDecorated($decorated); - - /** - * Gets the decorated flag. - * - * @return Boolean true if the output will decorate messages, false otherwise - * - * @api - */ - function isDecorated(); - - /** - * Sets a new style. - * - * @param string $name The style name - * @param OutputFormatterStyleInterface $style The style instance - * - * @api - */ - function setStyle($name, OutputFormatterStyleInterface $style); - - /** - * Checks if output formatter has style with specified name. - * - * @param string $name - * - * @return Boolean - * - * @api - */ - function hasStyle($name); - - /** - * Gets style options from style with specified name. - * - * @param string $name - * - * @return OutputFormatterStyleInterface - * - * @api - */ - function getStyle($name); - - /** - * Formats a message according to the given styles. - * - * @param string $message The message to style - * - * @return string The styled message - * - * @api - */ - function format($message); -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterStyle.php b/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterStyle.php deleted file mode 100644 index ad02b94..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterStyle.php +++ /dev/null @@ -1,218 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter style class for defining styles. - * - * @author Konstantin Kudryashov - * - * @api - */ -class OutputFormatterStyle implements OutputFormatterStyleInterface -{ - static private $availableForegroundColors = array( - 'black' => 30, - 'red' => 31, - 'green' => 32, - 'yellow' => 33, - 'blue' => 34, - 'magenta' => 35, - 'cyan' => 36, - 'white' => 37 - ); - static private $availableBackgroundColors = array( - 'black' => 40, - 'red' => 41, - 'green' => 42, - 'yellow' => 43, - 'blue' => 44, - 'magenta' => 45, - 'cyan' => 46, - 'white' => 47 - ); - static private $availableOptions = array( - 'bold' => 1, - 'underscore' => 4, - 'blink' => 5, - 'reverse' => 7, - 'conceal' => 8 - ); - - private $foreground; - private $background; - private $options = array(); - - /** - * Initializes output formatter style. - * - * @param string $foreground The style foreground color name - * @param string $background The style background color name - * @param array $options The style options - * - * @api - */ - public function __construct($foreground = null, $background = null, array $options = array()) - { - if (null !== $foreground) { - $this->setForeground($foreground); - } - if (null !== $background) { - $this->setBackground($background); - } - if (count($options)) { - $this->setOptions($options); - } - } - - /** - * Sets style foreground color. - * - * @param string $color The color name - * - * @throws \InvalidArgumentException When the color name isn't defined - * - * @api - */ - public function setForeground($color = null) - { - if (null === $color) { - $this->foreground = null; - - return; - } - - if (!isset(static::$availableForegroundColors[$color])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid foreground color specified: "%s". Expected one of (%s)', - $color, - implode(', ', array_keys(static::$availableForegroundColors)) - )); - } - - $this->foreground = static::$availableForegroundColors[$color]; - } - - /** - * Sets style background color. - * - * @param string $color The color name - * - * @throws \InvalidArgumentException When the color name isn't defined - * - * @api - */ - public function setBackground($color = null) - { - if (null === $color) { - $this->background = null; - - return; - } - - if (!isset(static::$availableBackgroundColors[$color])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid background color specified: "%s". Expected one of (%s)', - $color, - implode(', ', array_keys(static::$availableBackgroundColors)) - )); - } - - $this->background = static::$availableBackgroundColors[$color]; - } - - /** - * Sets some specific style option. - * - * @param string $option The option name - * - * @throws \InvalidArgumentException When the option name isn't defined - * - * @api - */ - public function setOption($option) - { - if (!isset(static::$availableOptions[$option])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid option specified: "%s". Expected one of (%s)', - $option, - implode(', ', array_keys(static::$availableOptions)) - )); - } - - if (false === array_search(static::$availableOptions[$option], $this->options)) { - $this->options[] = static::$availableOptions[$option]; - } - } - - /** - * Unsets some specific style option. - * - * @param string $option The option name - * - * @throws \InvalidArgumentException When the option name isn't defined - * - */ - public function unsetOption($option) - { - if (!isset(static::$availableOptions[$option])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid option specified: "%s". Expected one of (%s)', - $option, - implode(', ', array_keys(static::$availableOptions)) - )); - } - - $pos = array_search(static::$availableOptions[$option], $this->options); - if (false !== $pos) { - unset($this->options[$pos]); - } - } - - /** - * Sets multiple style options at once. - * - * @param array $options - */ - public function setOptions(array $options) - { - $this->options = array(); - - foreach ($options as $option) { - $this->setOption($option); - } - } - - /** - * Applies the style to a given text. - * - * @param string $text The text to style - * - * @return string - */ - public function apply($text) - { - $codes = array(); - - if (null !== $this->foreground) { - $codes[] = $this->foreground; - } - if (null !== $this->background) { - $codes[] = $this->background; - } - if (count($this->options)) { - $codes = array_merge($codes, $this->options); - } - - return sprintf("\033[%sm%s\033[0m", implode(';', $codes), $text); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php b/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php deleted file mode 100644 index 3d84d96..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter style interface for defining styles. - * - * @author Konstantin Kudryashov - * - * @api - */ -interface OutputFormatterStyleInterface -{ - /** - * Sets style foreground color. - * - * @param string $color The color name - * - * @api - */ - function setForeground($color = null); - - /** - * Sets style background color. - * - * @param string $color The color name - * - * @api - */ - function setBackground($color = null); - - /** - * Sets some specific style option. - * - * @param string $option The option name - * - * @api - */ - function setOption($option); - - /** - * Unsets some specific style option. - * - * @param string $option Theoption name - */ - function unsetOption($option); - - /** - * Sets multiple style options at once. - * - * @param array $options - */ - function setOptions(array $options); - - /** - * Applies the style to a given text. - * - * @param string $text The text to style - * - * @return string - */ - function apply($text); -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php b/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php deleted file mode 100644 index 5915023..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * @author Jean-François Simon - */ -class OutputFormatterStyleStack -{ - /** - * @var OutputFormatterStyleInterface[] - */ - private $styles; - - /** - * @var OutputFormatterStyleInterface - */ - private $emptyStyle; - - /** - * Constructor. - * - * @param OutputFormatterStyleInterface $emptyStyle - */ - public function __construct(OutputFormatterStyleInterface $emptyStyle = null) - { - $this->emptyStyle = $emptyStyle ?: new OutputFormatterStyle(); - $this->reset(); - } - - /** - * Resets stack (ie. empty internal arrays). - */ - public function reset() - { - $this->styles = array(); - } - - /** - * Pushes a style in the stack. - * - * @param OutputFormatterStyleInterface $style - */ - public function push(OutputFormatterStyleInterface $style) - { - $this->styles[] = $style; - } - - /** - * Pops a style from the stack. - * - * @param OutputFormatterStyleInterface $style - * - * @return OutputFormatterStyleInterface - * - * @throws \InvalidArgumentException When style tags incorrectly nested - */ - public function pop(OutputFormatterStyleInterface $style = null) - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - if (null === $style) { - return array_pop($this->styles); - } - - foreach (array_reverse($this->styles, true) as $index => $stackedStyle) { - if ($style->apply('') === $stackedStyle->apply('')) { - $this->styles = array_slice($this->styles, 0, $index); - - return $stackedStyle; - } - } - - throw new \InvalidArgumentException('Incorrectly nested style tag found.'); - } - - /** - * Computes current style with stacks top codes. - * - * @return OutputFormatterStyle - */ - public function getCurrent() - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - return $this->styles[count($this->styles)-1]; - } - - /** - * @param OutputFormatterStyleInterface $emptyStyle - * - * @return OutputFormatterStyleStack - */ - public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle) - { - $this->emptyStyle = $emptyStyle; - - return $this; - } - - /** - * @return OutputFormatterStyleInterface - */ - public function getEmptyStyle() - { - return $this->emptyStyle; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Helper/DialogHelper.php b/framework/library/Doctrine/Symfony/Component/Console/Helper/DialogHelper.php deleted file mode 100644 index 03daf8c..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Helper/DialogHelper.php +++ /dev/null @@ -1,141 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Output\OutputInterface; - -/** - * The Dialog class provides helpers to interact with the user. - * - * @author Fabien Potencier - */ -class DialogHelper extends Helper -{ - private $inputStream; - - /** - * Asks a question to the user. - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question to ask - * @param string $default The default answer if none is given by the user - * - * @return string The user answer - * - * @throws \RuntimeException If there is no data to read in the input stream - */ - public function ask(OutputInterface $output, $question, $default = null) - { - $output->write($question); - - $ret = fgets($this->inputStream ?: STDIN, 4096); - if (false === $ret) { - throw new \RuntimeException('Aborted'); - } - $ret = trim($ret); - - return strlen($ret) > 0 ? $ret : $default; - } - - /** - * Asks a confirmation to the user. - * - * The question will be asked until the user answers by nothing, yes, or no. - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question to ask - * @param Boolean $default The default answer if the user enters nothing - * - * @return Boolean true if the user has confirmed, false otherwise - */ - public function askConfirmation(OutputInterface $output, $question, $default = true) - { - $answer = 'z'; - while ($answer && !in_array(strtolower($answer[0]), array('y', 'n'))) { - $answer = $this->ask($output, $question); - } - - if (false === $default) { - return $answer && 'y' == strtolower($answer[0]); - } - - return !$answer || 'y' == strtolower($answer[0]); - } - - /** - * Asks for a value and validates the response. - * - * The validator receives the data to validate. It must return the - * validated data when the data is valid and throw an exception - * otherwise. - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question to ask - * @param callback $validator A PHP callback - * @param integer $attempts Max number of times to ask before giving up (false by default, which means infinite) - * @param string $default The default answer if none is given by the user - * - * @return mixed - * - * @throws \Exception When any of the validators return an error - */ - public function askAndValidate(OutputInterface $output, $question, $validator, $attempts = false, $default = null) - { - $error = null; - while (false === $attempts || $attempts--) { - if (null !== $error) { - $output->writeln($this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error')); - } - - $value = $this->ask($output, $question, $default); - - try { - return call_user_func($validator, $value); - } catch (\Exception $error) { - } - } - - throw $error; - } - - /** - * Sets the input stream to read from when interacting with the user. - * - * This is mainly useful for testing purpose. - * - * @param resource $stream The input stream - */ - public function setInputStream($stream) - { - $this->inputStream = $stream; - } - - /** - * Returns the helper's input stream - * - * @return string - */ - public function getInputStream() - { - return $this->inputStream; - } - - /** - * Returns the helper's canonical name. - * - * @return string The helper name - */ - public function getName() - { - return 'dialog'; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Helper/FormatterHelper.php b/framework/library/Doctrine/Symfony/Component/Console/Helper/FormatterHelper.php deleted file mode 100644 index dd9615b..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Helper/FormatterHelper.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * The Formatter class provides helpers to format messages. - * - * @author Fabien Potencier - */ -class FormatterHelper extends Helper -{ - /** - * Formats a message within a section. - * - * @param string $section The section name - * @param string $message The message - * @param string $style The style to apply to the section - * - * @return string The format section - */ - public function formatSection($section, $message, $style = 'info') - { - return sprintf('<%s>[%s] %s', $style, $section, $style, $message); - } - - /** - * Formats a message as a block of text. - * - * @param string|array $messages The message to write in the block - * @param string $style The style to apply to the whole block - * @param Boolean $large Whether to return a large block - * - * @return string The formatter message - */ - public function formatBlock($messages, $style, $large = false) - { - $messages = (array) $messages; - - $len = 0; - $lines = array(); - foreach ($messages as $message) { - $lines[] = sprintf($large ? ' %s ' : ' %s ', $message); - $len = max($this->strlen($message) + ($large ? 4 : 2), $len); - } - - $messages = $large ? array(str_repeat(' ', $len)) : array(); - foreach ($lines as $line) { - $messages[] = $line.str_repeat(' ', $len - $this->strlen($line)); - } - if ($large) { - $messages[] = str_repeat(' ', $len); - } - - foreach ($messages as &$message) { - $message = sprintf('<%s>%s', $style, $message, $style); - } - - return implode("\n", $messages); - } - - /** - * Returns the length of a string, using mb_strlen if it is available. - * - * @param string $string The string to check its length - * - * @return integer The length of the string - */ - private function strlen($string) - { - if (!function_exists('mb_strlen')) { - return strlen($string); - } - - if (false === $encoding = mb_detect_encoding($string)) { - return strlen($string); - } - - return mb_strlen($string, $encoding); - } - - /** - * Returns the helper's canonical name. - * - * @return string The canonical name of the helper - */ - public function getName() - { - return 'formatter'; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Helper/Helper.php b/framework/library/Doctrine/Symfony/Component/Console/Helper/Helper.php deleted file mode 100644 index 28488ca..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Helper/Helper.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * Helper is the base class for all helper classes. - * - * @author Fabien Potencier - */ -abstract class Helper implements HelperInterface -{ - protected $helperSet = null; - - /** - * Sets the helper set associated with this helper. - * - * @param HelperSet $helperSet A HelperSet instance - */ - public function setHelperSet(HelperSet $helperSet = null) - { - $this->helperSet = $helperSet; - } - - /** - * Gets the helper set associated with this helper. - * - * @return HelperSet A HelperSet instance - */ - public function getHelperSet() - { - return $this->helperSet; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Helper/HelperInterface.php b/framework/library/Doctrine/Symfony/Component/Console/Helper/HelperInterface.php deleted file mode 100644 index 25ee513..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Helper/HelperInterface.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * HelperInterface is the interface all helpers must implement. - * - * @author Fabien Potencier - * - * @api - */ -interface HelperInterface -{ - /** - * Sets the helper set associated with this helper. - * - * @param HelperSet $helperSet A HelperSet instance - * - * @api - */ - function setHelperSet(HelperSet $helperSet = null); - - /** - * Gets the helper set associated with this helper. - * - * @return HelperSet A HelperSet instance - * - * @api - */ - function getHelperSet(); - - /** - * Returns the canonical name of this helper. - * - * @return string The canonical name - * - * @api - */ - function getName(); -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Helper/HelperSet.php b/framework/library/Doctrine/Symfony/Component/Console/Helper/HelperSet.php deleted file mode 100644 index d95c9a3..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Helper/HelperSet.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Command\Command; - -/** - * HelperSet represents a set of helpers to be used with a command. - * - * @author Fabien Potencier - */ -class HelperSet -{ - private $helpers; - private $command; - - /** - * Constructor. - * - * @param Helper[] $helpers An array of helper. - */ - public function __construct(array $helpers = array()) - { - $this->helpers = array(); - foreach ($helpers as $alias => $helper) { - $this->set($helper, is_int($alias) ? null : $alias); - } - } - - /** - * Sets a helper. - * - * @param HelperInterface $helper The helper instance - * @param string $alias An alias - */ - public function set(HelperInterface $helper, $alias = null) - { - $this->helpers[$helper->getName()] = $helper; - if (null !== $alias) { - $this->helpers[$alias] = $helper; - } - - $helper->setHelperSet($this); - } - - /** - * Returns true if the helper if defined. - * - * @param string $name The helper name - * - * @return Boolean true if the helper is defined, false otherwise - */ - public function has($name) - { - return isset($this->helpers[$name]); - } - - /** - * Gets a helper value. - * - * @param string $name The helper name - * - * @return HelperInterface The helper instance - * - * @throws \InvalidArgumentException if the helper is not defined - */ - public function get($name) - { - if (!$this->has($name)) { - throw new \InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name)); - } - - return $this->helpers[$name]; - } - - /** - * Sets the command associated with this helper set. - * - * @param Command $command A Command instance - */ - public function setCommand(Command $command = null) - { - $this->command = $command; - } - - /** - * Gets the command associated with this helper set. - * - * @return Command A Command instance - */ - public function getCommand() - { - return $this->command; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Input/ArgvInput.php b/framework/library/Doctrine/Symfony/Component/Console/Input/ArgvInput.php deleted file mode 100644 index 3ca9b05..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Input/ArgvInput.php +++ /dev/null @@ -1,313 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * ArgvInput represents an input coming from the CLI arguments. - * - * Usage: - * - * $input = new ArgvInput(); - * - * By default, the `$_SERVER['argv']` array is used for the input values. - * - * This can be overridden by explicitly passing the input values in the constructor: - * - * $input = new ArgvInput($_SERVER['argv']); - * - * If you pass it yourself, don't forget that the first element of the array - * is the name of the running application. - * - * When passing an argument to the constructor, be sure that it respects - * the same rules as the argv one. It's almost always better to use the - * `StringInput` when you want to provide your own input. - * - * @author Fabien Potencier - * - * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html - * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02 - * - * @api - */ -class ArgvInput extends Input -{ - private $tokens; - private $parsed; - - /** - * Constructor. - * - * @param array $argv An array of parameters from the CLI (in the argv format) - * @param InputDefinition $definition A InputDefinition instance - * - * @api - */ - public function __construct(array $argv = null, InputDefinition $definition = null) - { - if (null === $argv) { - $argv = $_SERVER['argv']; - } - - // strip the application name - array_shift($argv); - - $this->tokens = $argv; - - parent::__construct($definition); - } - - protected function setTokens(array $tokens) - { - $this->tokens = $tokens; - } - - /** - * Processes command line arguments. - */ - protected function parse() - { - $parseOptions = true; - $this->parsed = $this->tokens; - while (null !== $token = array_shift($this->parsed)) { - if ($parseOptions && '' == $token) { - $this->parseArgument($token); - } elseif ($parseOptions && '--' == $token) { - $parseOptions = false; - } elseif ($parseOptions && 0 === strpos($token, '--')) { - $this->parseLongOption($token); - } elseif ($parseOptions && '-' === $token[0]) { - $this->parseShortOption($token); - } else { - $this->parseArgument($token); - } - } - } - - /** - * Parses a short option. - * - * @param string $token The current token. - */ - private function parseShortOption($token) - { - $name = substr($token, 1); - - if (strlen($name) > 1) { - if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) { - // an option with a value (with no space) - $this->addShortOption($name[0], substr($name, 1)); - } else { - $this->parseShortOptionSet($name); - } - } else { - $this->addShortOption($name, null); - } - } - - /** - * Parses a short option set. - * - * @param string $name The current token - * - * @throws \RuntimeException When option given doesn't exist - */ - private function parseShortOptionSet($name) - { - $len = strlen($name); - for ($i = 0; $i < $len; $i++) { - if (!$this->definition->hasShortcut($name[$i])) { - throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $name[$i])); - } - - $option = $this->definition->getOptionForShortcut($name[$i]); - if ($option->acceptValue()) { - $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1)); - - break; - } else { - $this->addLongOption($option->getName(), true); - } - } - } - - /** - * Parses a long option. - * - * @param string $token The current token - */ - private function parseLongOption($token) - { - $name = substr($token, 2); - - if (false !== $pos = strpos($name, '=')) { - $this->addLongOption(substr($name, 0, $pos), substr($name, $pos + 1)); - } else { - $this->addLongOption($name, null); - } - } - - /** - * Parses an argument. - * - * @param string $token The current token - * - * @throws \RuntimeException When too many arguments are given - */ - private function parseArgument($token) - { - $c = count($this->arguments); - - // if input is expecting another argument, add it - if ($this->definition->hasArgument($c)) { - $arg = $this->definition->getArgument($c); - $this->arguments[$arg->getName()] = $arg->isArray()? array($token) : $token; - - // if last argument isArray(), append token to last argument - } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) { - $arg = $this->definition->getArgument($c - 1); - $this->arguments[$arg->getName()][] = $token; - - // unexpected argument - } else { - throw new \RuntimeException('Too many arguments.'); - } - } - - /** - * Adds a short option value. - * - * @param string $shortcut The short option key - * @param mixed $value The value for the option - * - * @throws \RuntimeException When option given doesn't exist - */ - private function addShortOption($shortcut, $value) - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * Adds a long option value. - * - * @param string $name The long option key - * @param mixed $value The value for the option - * - * @throws \RuntimeException When option given doesn't exist - */ - private function addLongOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new \RuntimeException(sprintf('The "--%s" option does not exist.', $name)); - } - - $option = $this->definition->getOption($name); - - if (null === $value && $option->acceptValue()) { - // if option accepts an optional or mandatory argument - // let's see if there is one provided - $next = array_shift($this->parsed); - if ('-' !== $next[0]) { - $value = $next; - } else { - array_unshift($this->parsed, $next); - } - } - - if (null === $value) { - if ($option->isValueRequired()) { - throw new \RuntimeException(sprintf('The "--%s" option requires a value.', $name)); - } - - $value = $option->isValueOptional() ? $option->getDefault() : true; - } - - if ($option->isArray()) { - $this->options[$name][] = $value; - } else { - $this->options[$name] = $value; - } - } - - /** - * Returns the first argument from the raw parameters (not parsed). - * - * @return string The value of the first argument or null otherwise - */ - public function getFirstArgument() - { - foreach ($this->tokens as $token) { - if ($token && '-' === $token[0]) { - continue; - } - - return $token; - } - } - - /** - * Returns true if the raw parameters (not parsed) contain a value. - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * - * @return Boolean true if the value is contained in the raw parameters - */ - public function hasParameterOption($values) - { - $values = (array) $values; - - foreach ($this->tokens as $v) { - if (in_array($v, $values)) { - return true; - } - } - - return false; - } - - /** - * Returns the value of a raw option (not parsed). - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * @param mixed $default The default value to return if no result is found - * - * @return mixed The option value - */ - public function getParameterOption($values, $default = false) - { - $values = (array) $values; - - $tokens = $this->tokens; - while ($token = array_shift($tokens)) { - foreach ($values as $value) { - if (0 === strpos($token, $value)) { - if (false !== $pos = strpos($token, '=')) { - return substr($token, $pos + 1); - } - - return array_shift($tokens); - } - } - } - - return $default; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Input/ArrayInput.php b/framework/library/Doctrine/Symfony/Component/Console/Input/ArrayInput.php deleted file mode 100644 index 9921fff..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Input/ArrayInput.php +++ /dev/null @@ -1,190 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * ArrayInput represents an input provided as an array. - * - * Usage: - * - * $input = new ArrayInput(array('name' => 'foo', '--bar' => 'foobar')); - * - * @author Fabien Potencier - * - * @api - */ -class ArrayInput extends Input -{ - private $parameters; - - /** - * Constructor. - * - * @param array $parameters An array of parameters - * @param InputDefinition $definition A InputDefinition instance - * - * @api - */ - public function __construct(array $parameters, InputDefinition $definition = null) - { - $this->parameters = $parameters; - - parent::__construct($definition); - } - - /** - * Returns the first argument from the raw parameters (not parsed). - * - * @return string The value of the first argument or null otherwise - */ - public function getFirstArgument() - { - foreach ($this->parameters as $key => $value) { - if ($key && '-' === $key[0]) { - continue; - } - - return $value; - } - } - - /** - * Returns true if the raw parameters (not parsed) contain a value. - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The values to look for in the raw parameters (can be an array) - * - * @return Boolean true if the value is contained in the raw parameters - */ - public function hasParameterOption($values) - { - $values = (array) $values; - - foreach ($this->parameters as $k => $v) { - if (!is_int($k)) { - $v = $k; - } - - if (in_array($v, $values)) { - return true; - } - } - - return false; - } - - /** - * Returns the value of a raw option (not parsed). - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * @param mixed $default The default value to return if no result is found - * - * @return mixed The option value - */ - public function getParameterOption($values, $default = false) - { - $values = (array) $values; - - foreach ($this->parameters as $k => $v) { - if (is_int($k) && in_array($v, $values)) { - return true; - } elseif (in_array($k, $values)) { - return $v; - } - } - - return $default; - } - - /** - * Processes command line arguments. - */ - protected function parse() - { - foreach ($this->parameters as $key => $value) { - if (0 === strpos($key, '--')) { - $this->addLongOption(substr($key, 2), $value); - } elseif ('-' === $key[0]) { - $this->addShortOption(substr($key, 1), $value); - } else { - $this->addArgument($key, $value); - } - } - } - - /** - * Adds a short option value. - * - * @param string $shortcut The short option key - * @param mixed $value The value for the option - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - private function addShortOption($shortcut, $value) - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * Adds a long option value. - * - * @param string $name The long option key - * @param mixed $value The value for the option - * - * @throws \InvalidArgumentException When option given doesn't exist - * @throws \InvalidArgumentException When a required value is missing - */ - private function addLongOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); - } - - $option = $this->definition->getOption($name); - - if (null === $value) { - if ($option->isValueRequired()) { - throw new \InvalidArgumentException(sprintf('The "--%s" option requires a value.', $name)); - } - - $value = $option->isValueOptional() ? $option->getDefault() : true; - } - - $this->options[$name] = $value; - } - - /** - * Adds an argument value. - * - * @param string $name The argument name - * @param mixed $value The value for the argument - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - private function addArgument($name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Input/Input.php b/framework/library/Doctrine/Symfony/Component/Console/Input/Input.php deleted file mode 100644 index 70291be..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Input/Input.php +++ /dev/null @@ -1,211 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * Input is the base class for all concrete Input classes. - * - * Three concrete classes are provided by default: - * - * * `ArgvInput`: The input comes from the CLI arguments (argv) - * * `StringInput`: The input is provided as a string - * * `ArrayInput`: The input is provided as an array - * - * @author Fabien Potencier - */ -abstract class Input implements InputInterface -{ - protected $definition; - protected $options; - protected $arguments; - protected $interactive = true; - - /** - * Constructor. - * - * @param InputDefinition $definition A InputDefinition instance - */ - public function __construct(InputDefinition $definition = null) - { - if (null === $definition) { - $this->definition = new InputDefinition(); - } else { - $this->bind($definition); - $this->validate(); - } - } - - /** - * Binds the current Input instance with the given arguments and options. - * - * @param InputDefinition $definition A InputDefinition instance - */ - public function bind(InputDefinition $definition) - { - $this->arguments = array(); - $this->options = array(); - $this->definition = $definition; - - $this->parse(); - } - - /** - * Processes command line arguments. - */ - abstract protected function parse(); - - /** - * Validates the input. - * - * @throws \RuntimeException When not enough arguments are given - */ - public function validate() - { - if (count($this->arguments) < $this->definition->getArgumentRequiredCount()) { - throw new \RuntimeException('Not enough arguments.'); - } - } - - /** - * Checks if the input is interactive. - * - * @return Boolean Returns true if the input is interactive - */ - public function isInteractive() - { - return $this->interactive; - } - - /** - * Sets the input interactivity. - * - * @param Boolean $interactive If the input should be interactive - */ - public function setInteractive($interactive) - { - $this->interactive = (Boolean) $interactive; - } - - /** - * Returns the argument values. - * - * @return array An array of argument values - */ - public function getArguments() - { - return array_merge($this->definition->getArgumentDefaults(), $this->arguments); - } - - /** - * Returns the argument value for a given argument name. - * - * @param string $name The argument name - * - * @return mixed The argument value - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - public function getArgument($name) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - return isset($this->arguments[$name]) ? $this->arguments[$name] : $this->definition->getArgument($name)->getDefault(); - } - - /** - * Sets an argument value by name. - * - * @param string $name The argument name - * @param string $value The argument value - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - public function setArgument($name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|integer $name The InputArgument name or position - * - * @return Boolean true if the InputArgument object exists, false otherwise - */ - public function hasArgument($name) - { - return $this->definition->hasArgument($name); - } - - /** - * Returns the options values. - * - * @return array An array of option values - */ - public function getOptions() - { - return array_merge($this->definition->getOptionDefaults(), $this->options); - } - - /** - * Returns the option value for a given option name. - * - * @param string $name The option name - * - * @return mixed The option value - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - public function getOption($name) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - return isset($this->options[$name]) ? $this->options[$name] : $this->definition->getOption($name)->getDefault(); - } - - /** - * Sets an option value by name. - * - * @param string $name The option name - * @param string $value The option value - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - public function setOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - $this->options[$name] = $value; - } - - /** - * Returns true if an InputOption object exists by name. - * - * @param string $name The InputOption name - * - * @return Boolean true if the InputOption object exists, false otherwise - */ - public function hasOption($name) - { - return $this->definition->hasOption($name); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Input/InputArgument.php b/framework/library/Doctrine/Symfony/Component/Console/Input/InputArgument.php deleted file mode 100644 index e7cc935..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Input/InputArgument.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * Represents a command line argument. - * - * @author Fabien Potencier - * - * @api - */ -class InputArgument -{ - const REQUIRED = 1; - const OPTIONAL = 2; - const IS_ARRAY = 4; - - private $name; - private $mode; - private $default; - private $description; - - /** - * Constructor. - * - * @param string $name The argument name - * @param integer $mode The argument mode: self::REQUIRED or self::OPTIONAL - * @param string $description A description text - * @param mixed $default The default value (for self::OPTIONAL mode only) - * - * @throws \InvalidArgumentException When argument mode is not valid - * - * @api - */ - public function __construct($name, $mode = null, $description = '', $default = null) - { - if (null === $mode) { - $mode = self::OPTIONAL; - } elseif (!is_int($mode) || $mode > 7 || $mode < 1) { - throw new \InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->mode = $mode; - $this->description = $description; - - $this->setDefault($default); - } - - /** - * Returns the argument name. - * - * @return string The argument name - */ - public function getName() - { - return $this->name; - } - - /** - * Returns true if the argument is required. - * - * @return Boolean true if parameter mode is self::REQUIRED, false otherwise - */ - public function isRequired() - { - return self::REQUIRED === (self::REQUIRED & $this->mode); - } - - /** - * Returns true if the argument can take multiple values. - * - * @return Boolean true if mode is self::IS_ARRAY, false otherwise - */ - public function isArray() - { - return self::IS_ARRAY === (self::IS_ARRAY & $this->mode); - } - - /** - * Sets the default value. - * - * @param mixed $default The default value - * - * @throws \LogicException When incorrect default value is given - */ - public function setDefault($default = null) - { - if (self::REQUIRED === $this->mode && null !== $default) { - throw new \LogicException('Cannot set a default value except for Parameter::OPTIONAL mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = array(); - } elseif (!is_array($default)) { - throw new \LogicException('A default value for an array argument must be an array.'); - } - } - - $this->default = $default; - } - - /** - * Returns the default value. - * - * @return mixed The default value - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns the description text. - * - * @return string The description text - */ - public function getDescription() - { - return $this->description; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Input/InputDefinition.php b/framework/library/Doctrine/Symfony/Component/Console/Input/InputDefinition.php deleted file mode 100644 index 9551e96..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Input/InputDefinition.php +++ /dev/null @@ -1,535 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * A InputDefinition represents a set of valid command line arguments and options. - * - * Usage: - * - * $definition = new InputDefinition(array( - * new InputArgument('name', InputArgument::REQUIRED), - * new InputOption('foo', 'f', InputOption::VALUE_REQUIRED), - * )); - * - * @author Fabien Potencier - * - * @api - */ -class InputDefinition -{ - private $arguments; - private $requiredCount; - private $hasAnArrayArgument = false; - private $hasOptional; - private $options; - private $shortcuts; - - /** - * Constructor. - * - * @param array $definition An array of InputArgument and InputOption instance - * - * @api - */ - public function __construct(array $definition = array()) - { - $this->setDefinition($definition); - } - - /** - * Sets the definition of the input. - * - * @param array $definition The definition array - * - * @api - */ - public function setDefinition(array $definition) - { - $arguments = array(); - $options = array(); - foreach ($definition as $item) { - if ($item instanceof InputOption) { - $options[] = $item; - } else { - $arguments[] = $item; - } - } - - $this->setArguments($arguments); - $this->setOptions($options); - } - - /** - * Sets the InputArgument objects. - * - * @param array $arguments An array of InputArgument objects - * - * @api - */ - public function setArguments($arguments = array()) - { - $this->arguments = array(); - $this->requiredCount = 0; - $this->hasOptional = false; - $this->hasAnArrayArgument = false; - $this->addArguments($arguments); - } - - /** - * Adds an array of InputArgument objects. - * - * @param InputArgument[] $arguments An array of InputArgument objects - * - * @api - */ - public function addArguments($arguments = array()) - { - if (null !== $arguments) { - foreach ($arguments as $argument) { - $this->addArgument($argument); - } - } - } - - /** - * Adds an InputArgument object. - * - * @param InputArgument $argument An InputArgument object - * - * @throws \LogicException When incorrect argument is given - * - * @api - */ - public function addArgument(InputArgument $argument) - { - if (isset($this->arguments[$argument->getName()])) { - throw new \LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName())); - } - - if ($this->hasAnArrayArgument) { - throw new \LogicException('Cannot add an argument after an array argument.'); - } - - if ($argument->isRequired() && $this->hasOptional) { - throw new \LogicException('Cannot add a required argument after an optional one.'); - } - - if ($argument->isArray()) { - $this->hasAnArrayArgument = true; - } - - if ($argument->isRequired()) { - ++$this->requiredCount; - } else { - $this->hasOptional = true; - } - - $this->arguments[$argument->getName()] = $argument; - } - - /** - * Returns an InputArgument by name or by position. - * - * @param string|integer $name The InputArgument name or position - * - * @return InputArgument An InputArgument object - * - * @throws \InvalidArgumentException When argument given doesn't exist - * - * @api - */ - public function getArgument($name) - { - $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; - - if (!$this->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - return $arguments[$name]; - } - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|integer $name The InputArgument name or position - * - * @return Boolean true if the InputArgument object exists, false otherwise - * - * @api - */ - public function hasArgument($name) - { - $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; - - return isset($arguments[$name]); - } - - /** - * Gets the array of InputArgument objects. - * - * @return array An array of InputArgument objects - * - * @api - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Returns the number of InputArguments. - * - * @return integer The number of InputArguments - */ - public function getArgumentCount() - { - return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments); - } - - /** - * Returns the number of required InputArguments. - * - * @return integer The number of required InputArguments - */ - public function getArgumentRequiredCount() - { - return $this->requiredCount; - } - - /** - * Gets the default values. - * - * @return array An array of default values - */ - public function getArgumentDefaults() - { - $values = array(); - foreach ($this->arguments as $argument) { - $values[$argument->getName()] = $argument->getDefault(); - } - - return $values; - } - - /** - * Sets the InputOption objects. - * - * @param array $options An array of InputOption objects - * - * @api - */ - public function setOptions($options = array()) - { - $this->options = array(); - $this->shortcuts = array(); - $this->addOptions($options); - } - - /** - * Adds an array of InputOption objects. - * - * @param InputOption[] $options An array of InputOption objects - * - * @api - */ - public function addOptions($options = array()) - { - foreach ($options as $option) { - $this->addOption($option); - } - } - - /** - * Adds an InputOption object. - * - * @param InputOption $option An InputOption object - * - * @throws \LogicException When option given already exist - * - * @api - */ - public function addOption(InputOption $option) - { - if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { - throw new \LogicException(sprintf('An option named "%s" already exists.', $option->getName())); - } elseif (isset($this->shortcuts[$option->getShortcut()]) && !$option->equals($this->options[$this->shortcuts[$option->getShortcut()]])) { - throw new \LogicException(sprintf('An option with shortcut "%s" already exists.', $option->getShortcut())); - } - - $this->options[$option->getName()] = $option; - if ($option->getShortcut()) { - $this->shortcuts[$option->getShortcut()] = $option->getName(); - } - } - - /** - * Returns an InputOption by name. - * - * @param string $name The InputOption name - * - * @return InputOption A InputOption object - * - * @throws \InvalidArgumentException When option given doesn't exist - * - * @api - */ - public function getOption($name) - { - if (!$this->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); - } - - return $this->options[$name]; - } - - /** - * Returns true if an InputOption object exists by name. - * - * @param string $name The InputOption name - * - * @return Boolean true if the InputOption object exists, false otherwise - * - * @api - */ - public function hasOption($name) - { - return isset($this->options[$name]); - } - - /** - * Gets the array of InputOption objects. - * - * @return array An array of InputOption objects - * - * @api - */ - public function getOptions() - { - return $this->options; - } - - /** - * Returns true if an InputOption object exists by shortcut. - * - * @param string $name The InputOption shortcut - * - * @return Boolean true if the InputOption object exists, false otherwise - */ - public function hasShortcut($name) - { - return isset($this->shortcuts[$name]); - } - - /** - * Gets an InputOption by shortcut. - * - * @param string $shortcut the Shortcut name - * - * @return InputOption An InputOption object - */ - public function getOptionForShortcut($shortcut) - { - return $this->getOption($this->shortcutToName($shortcut)); - } - - /** - * Gets an array of default values. - * - * @return array An array of all default values - */ - public function getOptionDefaults() - { - $values = array(); - foreach ($this->options as $option) { - $values[$option->getName()] = $option->getDefault(); - } - - return $values; - } - - /** - * Returns the InputOption name given a shortcut. - * - * @param string $shortcut The shortcut - * - * @return string The InputOption name - * - * @throws \InvalidArgumentException When option given does not exist - */ - private function shortcutToName($shortcut) - { - if (!isset($this->shortcuts[$shortcut])) { - throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - return $this->shortcuts[$shortcut]; - } - - /** - * Gets the synopsis. - * - * @return string The synopsis - */ - public function getSynopsis() - { - $elements = array(); - foreach ($this->getOptions() as $option) { - $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : ''; - $elements[] = sprintf('['.($option->isValueRequired() ? '%s--%s="..."' : ($option->isValueOptional() ? '%s--%s[="..."]' : '%s--%s')).']', $shortcut, $option->getName()); - } - - foreach ($this->getArguments() as $argument) { - $elements[] = sprintf($argument->isRequired() ? '%s' : '[%s]', $argument->getName().($argument->isArray() ? '1' : '')); - - if ($argument->isArray()) { - $elements[] = sprintf('... [%sN]', $argument->getName()); - } - } - - return implode(' ', $elements); - } - - /** - * Returns a textual representation of the InputDefinition. - * - * @return string A string representing the InputDefinition - */ - public function asText() - { - // find the largest option or argument name - $max = 0; - foreach ($this->getOptions() as $option) { - $nameLength = strlen($option->getName()) + 2; - if ($option->getShortcut()) { - $nameLength += strlen($option->getShortcut()) + 3; - } - - $max = max($max, $nameLength); - } - foreach ($this->getArguments() as $argument) { - $max = max($max, strlen($argument->getName())); - } - ++$max; - - $text = array(); - - if ($this->getArguments()) { - $text[] = 'Arguments:'; - foreach ($this->getArguments() as $argument) { - if (null !== $argument->getDefault() && (!is_array($argument->getDefault()) || count($argument->getDefault()))) { - $default = sprintf(' (default: %s)', $this->formatDefaultValue($argument->getDefault())); - } else { - $default = ''; - } - - $description = str_replace("\n", "\n".str_pad('', $max + 2, ' '), $argument->getDescription()); - - $text[] = sprintf(" %-${max}s %s%s", $argument->getName(), $description, $default); - } - - $text[] = ''; - } - - if ($this->getOptions()) { - $text[] = 'Options:'; - - foreach ($this->getOptions() as $option) { - if ($option->acceptValue() && null !== $option->getDefault() && (!is_array($option->getDefault()) || count($option->getDefault()))) { - $default = sprintf(' (default: %s)', $this->formatDefaultValue($option->getDefault())); - } else { - $default = ''; - } - - $multiple = $option->isArray() ? ' (multiple values allowed)' : ''; - $description = str_replace("\n", "\n".str_pad('', $max + 2, ' '), $option->getDescription()); - - $optionMax = $max - strlen($option->getName()) - 2; - $text[] = sprintf(" %s %-${optionMax}s%s%s%s", - '--'.$option->getName(), - $option->getShortcut() ? sprintf('(-%s) ', $option->getShortcut()) : '', - $description, - $default, - $multiple - ); - } - - $text[] = ''; - } - - return implode("\n", $text); - } - - /** - * Returns an XML representation of the InputDefinition. - * - * @param Boolean $asDom Whether to return a DOM or an XML string - * - * @return string|DOMDocument An XML string representing the InputDefinition - */ - public function asXml($asDom = false) - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - $dom->appendChild($definitionXML = $dom->createElement('definition')); - - $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments')); - foreach ($this->getArguments() as $argument) { - $argumentsXML->appendChild($argumentXML = $dom->createElement('argument')); - $argumentXML->setAttribute('name', $argument->getName()); - $argumentXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0); - $argumentXML->setAttribute('is_array', $argument->isArray() ? 1 : 0); - $argumentXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode($argument->getDescription())); - - $argumentXML->appendChild($defaultsXML = $dom->createElement('defaults')); - $defaults = is_array($argument->getDefault()) ? $argument->getDefault() : (is_bool($argument->getDefault()) ? array(var_export($argument->getDefault(), true)) : ($argument->getDefault() ? array($argument->getDefault()) : array())); - foreach ($defaults as $default) { - $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); - $defaultXML->appendChild($dom->createTextNode($default)); - } - } - - $definitionXML->appendChild($optionsXML = $dom->createElement('options')); - foreach ($this->getOptions() as $option) { - $optionsXML->appendChild($optionXML = $dom->createElement('option')); - $optionXML->setAttribute('name', '--'.$option->getName()); - $optionXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : ''); - $optionXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0); - $optionXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0); - $optionXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0); - $optionXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode($option->getDescription())); - - if ($option->acceptValue()) { - $optionXML->appendChild($defaultsXML = $dom->createElement('defaults')); - $defaults = is_array($option->getDefault()) ? $option->getDefault() : (is_bool($option->getDefault()) ? array(var_export($option->getDefault(), true)) : ($option->getDefault() ? array($option->getDefault()) : array())); - foreach ($defaults as $default) { - $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); - $defaultXML->appendChild($dom->createTextNode($default)); - } - } - } - - return $asDom ? $dom : $dom->saveXml(); - } - - private function formatDefaultValue($default) - { - if (is_array($default) && $default === array_values($default)) { - return sprintf("array('%s')", implode("', '", $default)); - } - - return str_replace("\n", '', var_export($default, true)); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Input/InputInterface.php b/framework/library/Doctrine/Symfony/Component/Console/Input/InputInterface.php deleted file mode 100644 index 8a3d519..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Input/InputInterface.php +++ /dev/null @@ -1,152 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * InputInterface is the interface implemented by all input classes. - * - * @author Fabien Potencier - */ -interface InputInterface -{ - /** - * Returns the first argument from the raw parameters (not parsed). - * - * @return string The value of the first argument or null otherwise - */ - function getFirstArgument(); - - /** - * Returns true if the raw parameters (not parsed) contain a value. - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The values to look for in the raw parameters (can be an array) - * - * @return Boolean true if the value is contained in the raw parameters - */ - function hasParameterOption($values); - - /** - * Returns the value of a raw option (not parsed). - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * @param mixed $default The default value to return if no result is found - * - * @return mixed The option value - */ - function getParameterOption($values, $default = false); - - /** - * Binds the current Input instance with the given arguments and options. - * - * @param InputDefinition $definition A InputDefinition instance - */ - function bind(InputDefinition $definition); - - /** - * Validates if arguments given are correct. - * - * Throws an exception when not enough arguments are given. - * - * @throws \RuntimeException - */ - function validate(); - - /** - * Returns all the given arguments merged with the default values. - * - * @return array - */ - function getArguments(); - - /** - * Gets argument by name. - * - * @param string $name The name of the argument - * - * @return mixed - */ - function getArgument($name); - - /** - * Sets an argument value by name. - * - * @param string $name The argument name - * @param string $value The argument value - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - function setArgument($name, $value); - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|integer $name The InputArgument name or position - * - * @return Boolean true if the InputArgument object exists, false otherwise - */ - function hasArgument($name); - - /** - * Returns all the given options merged with the default values. - * - * @return array - */ - function getOptions(); - - /** - * Gets an option by name. - * - * @param string $name The name of the option - * - * @return mixed - */ - function getOption($name); - - /** - * Sets an option value by name. - * - * @param string $name The option name - * @param string $value The option value - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - function setOption($name, $value); - - /** - * Returns true if an InputOption object exists by name. - * - * @param string $name The InputOption name - * - * @return Boolean true if the InputOption object exists, false otherwise - */ - function hasOption($name); - - /** - * Is this input means interactive? - * - * @return Boolean - */ - function isInteractive(); - - /** - * Sets the input interactivity. - * - * @param Boolean $interactive If the input should be interactive - */ - function setInteractive($interactive); -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Input/InputOption.php b/framework/library/Doctrine/Symfony/Component/Console/Input/InputOption.php deleted file mode 100644 index e194b32..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Input/InputOption.php +++ /dev/null @@ -1,209 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * Represents a command line option. - * - * @author Fabien Potencier - * - * @api - */ -class InputOption -{ - const VALUE_NONE = 1; - const VALUE_REQUIRED = 2; - const VALUE_OPTIONAL = 4; - const VALUE_IS_ARRAY = 8; - - private $name; - private $shortcut; - private $mode; - private $default; - private $description; - - /** - * Constructor. - * - * @param string $name The option name - * @param string $shortcut The shortcut (can be null) - * @param integer $mode The option mode: One of the VALUE_* constants - * @param string $description A description text - * @param mixed $default The default value (must be null for self::VALUE_REQUIRED or self::VALUE_NONE) - * - * @throws \InvalidArgumentException If option mode is invalid or incompatible - * - * @api - */ - public function __construct($name, $shortcut = null, $mode = null, $description = '', $default = null) - { - if (0 === strpos($name, '--')) { - $name = substr($name, 2); - } - - if (empty($name)) { - throw new \InvalidArgumentException('An option name cannot be empty.'); - } - - if (empty($shortcut)) { - $shortcut = null; - } - - if (null !== $shortcut) { - if ('-' === $shortcut[0]) { - $shortcut = substr($shortcut, 1); - } - - if (empty($shortcut)) { - throw new \InvalidArgumentException('An option shortcut cannot be empty.'); - } - } - - if (null === $mode) { - $mode = self::VALUE_NONE; - } elseif (!is_int($mode) || $mode > 15 || $mode < 1) { - throw new \InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->shortcut = $shortcut; - $this->mode = $mode; - $this->description = $description; - - if ($this->isArray() && !$this->acceptValue()) { - throw new \InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.'); - } - - $this->setDefault($default); - } - - /** - * Returns the option shortcut. - * - * @return string The shortcut - */ - public function getShortcut() - { - return $this->shortcut; - } - - /** - * Returns the option name. - * - * @return string The name - */ - public function getName() - { - return $this->name; - } - - /** - * Returns true if the option accepts a value. - * - * @return Boolean true if value mode is not self::VALUE_NONE, false otherwise - */ - public function acceptValue() - { - return $this->isValueRequired() || $this->isValueOptional(); - } - - /** - * Returns true if the option requires a value. - * - * @return Boolean true if value mode is self::VALUE_REQUIRED, false otherwise - */ - public function isValueRequired() - { - return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode); - } - - /** - * Returns true if the option takes an optional value. - * - * @return Boolean true if value mode is self::VALUE_OPTIONAL, false otherwise - */ - public function isValueOptional() - { - return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode); - } - - /** - * Returns true if the option can take multiple values. - * - * @return Boolean true if mode is self::VALUE_IS_ARRAY, false otherwise - */ - public function isArray() - { - return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode); - } - - /** - * Sets the default value. - * - * @param mixed $default The default value - * - * @throws \LogicException When incorrect default value is given - */ - public function setDefault($default = null) - { - if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) { - throw new \LogicException('Cannot set a default value when using Option::VALUE_NONE mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = array(); - } elseif (!is_array($default)) { - throw new \LogicException('A default value for an array option must be an array.'); - } - } - - $this->default = $this->acceptValue() ? $default : false; - } - - /** - * Returns the default value. - * - * @return mixed The default value - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns the description text. - * - * @return string The description text - */ - public function getDescription() - { - return $this->description; - } - - /** - * Checks whether the given option equals this one - * - * @param InputOption $option option to compare - * @return Boolean - */ - public function equals(InputOption $option) - { - return $option->getName() === $this->getName() - && $option->getShortcut() === $this->getShortcut() - && $option->getDefault() === $this->getDefault() - && $option->isArray() === $this->isArray() - && $option->isValueRequired() === $this->isValueRequired() - && $option->isValueOptional() === $this->isValueOptional() - ; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Input/StringInput.php b/framework/library/Doctrine/Symfony/Component/Console/Input/StringInput.php deleted file mode 100644 index 93b1b83..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Input/StringInput.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * StringInput represents an input provided as a string. - * - * Usage: - * - * $input = new StringInput('foo --bar="foobar"'); - * - * @author Fabien Potencier - * - * @api - */ -class StringInput extends ArgvInput -{ - const REGEX_STRING = '([^ ]+?)(?: |(?setTokens($this->tokenize($input)); - } - - /** - * Tokenizes a string. - * - * @param string $input The input to tokenize - * - * @return array An array of tokens - * - * @throws \InvalidArgumentException When unable to parse input (should never happen) - */ - private function tokenize($input) - { - $input = preg_replace('/(\r\n|\r|\n|\t)/', ' ', $input); - - $tokens = array(); - $length = strlen($input); - $cursor = 0; - while ($cursor < $length) { - if (preg_match('/\s+/A', $input, $match, null, $cursor)) { - } elseif (preg_match('/([^="\' ]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, null, $cursor)) { - $tokens[] = $match[1].$match[2].stripcslashes(str_replace(array('"\'', '\'"', '\'\'', '""'), '', substr($match[3], 1, strlen($match[3]) - 2))); - } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, null, $cursor)) { - $tokens[] = stripcslashes(substr($match[0], 1, strlen($match[0]) - 2)); - } elseif (preg_match('/'.self::REGEX_STRING.'/A', $input, $match, null, $cursor)) { - $tokens[] = stripcslashes($match[1]); - } else { - // should never happen - // @codeCoverageIgnoreStart - throw new \InvalidArgumentException(sprintf('Unable to parse input near "... %s ..."', substr($input, $cursor, 10))); - // @codeCoverageIgnoreEnd - } - - $cursor += strlen($match[0]); - } - - return $tokens; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/LICENSE b/framework/library/Doctrine/Symfony/Component/Console/LICENSE deleted file mode 100644 index cdffe7a..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2012 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/framework/library/Doctrine/Symfony/Component/Console/Output/ConsoleOutput.php b/framework/library/Doctrine/Symfony/Component/Console/Output/ConsoleOutput.php deleted file mode 100644 index 0b7e083..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Output/ConsoleOutput.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\Console\Output\ConsoleOutputInterface; - -/** - * ConsoleOutput is the default class for all CLI output. It uses STDOUT. - * - * This class is a convenient wrapper around `StreamOutput`. - * - * $output = new ConsoleOutput(); - * - * This is equivalent to: - * - * $output = new StreamOutput(fopen('php://stdout', 'w')); - * - * @author Fabien Potencier - * - * @api - */ -class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface -{ - private $stderr; - - /** - * Constructor. - * - * @param integer $verbosity The verbosity level (self::VERBOSITY_QUIET, self::VERBOSITY_NORMAL, - * self::VERBOSITY_VERBOSE) - * @param Boolean $decorated Whether to decorate messages or not (null for auto-guessing) - * @param OutputFormatter $formatter Output formatter instance - * - * @api - */ - public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null) - { - $outputStream = 'php://stdout'; - if (!$this->hasStdoutSupport()) { - $outputStream = 'php://output'; - } - - parent::__construct(fopen($outputStream, 'w'), $verbosity, $decorated, $formatter); - - $this->stderr = new StreamOutput(fopen('php://stderr', 'w'), $verbosity, $decorated, $formatter); - } - - public function setDecorated($decorated) - { - parent::setDecorated($decorated); - $this->stderr->setDecorated($decorated); - } - - public function setFormatter(OutputFormatterInterface $formatter) - { - parent::setFormatter($formatter); - $this->stderr->setFormatter($formatter); - } - - public function setVerbosity($level) - { - parent::setVerbosity($level); - $this->stderr->setVerbosity($level); - } - - /** - * @return OutputInterface - */ - public function getErrorOutput() - { - return $this->stderr; - } - - public function setErrorOutput(OutputInterface $error) - { - $this->stderr = $error; - } - - /** - * Returns true if current environment supports writing console output to - * STDOUT. - * - * IBM iSeries (OS400) exhibits character-encoding issues when writing to - * STDOUT and doesn't properly convert ASCII to EBCDIC, resulting in garbage - * output. - * - * @return boolean - */ - protected function hasStdoutSupport() - { - return ('OS400' != php_uname('s')); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Output/ConsoleOutputInterface.php b/framework/library/Doctrine/Symfony/Component/Console/Output/ConsoleOutputInterface.php deleted file mode 100644 index 5006b80..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Output/ConsoleOutputInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Output\OutputInterface; - -/** - * ConsoleOutputInterface is the interface implemented by ConsoleOutput class. - * This adds information about stderr output stream. - * - * @author Dariusz Górecki - */ -interface ConsoleOutputInterface extends OutputInterface -{ - /** - * @return OutputInterface - */ - public function getErrorOutput(); - - public function setErrorOutput(OutputInterface $error); -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Output/NullOutput.php b/framework/library/Doctrine/Symfony/Component/Console/Output/NullOutput.php deleted file mode 100644 index 783d42b..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Output/NullOutput.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -/** - * NullOutput suppresses all output. - * - * $output = new NullOutput(); - * - * @author Fabien Potencier - * - * @api - */ -class NullOutput extends Output -{ - /** - * Writes a message to the output. - * - * @param string $message A message to write to the output - * @param Boolean $newline Whether to add a newline or not - */ - protected function doWrite($message, $newline) - { - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Output/Output.php b/framework/library/Doctrine/Symfony/Component/Console/Output/Output.php deleted file mode 100644 index 3866dbc..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Output/Output.php +++ /dev/null @@ -1,180 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * Base class for output classes. - * - * There are three levels of verbosity: - * - * * normal: no option passed (normal output - information) - * * verbose: -v (more output - debug) - * * quiet: -q (no output) - * - * @author Fabien Potencier - * - * @api - */ -abstract class Output implements OutputInterface -{ - private $verbosity; - private $formatter; - - /** - * Constructor. - * - * @param integer $verbosity The verbosity level (self::VERBOSITY_QUIET, self::VERBOSITY_NORMAL, self::VERBOSITY_VERBOSE) - * @param Boolean $decorated Whether to decorate messages or not (null for auto-guessing) - * @param OutputFormatterInterface $formatter Output formatter instance - * - * @api - */ - public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null) - { - $this->verbosity = null === $verbosity ? self::VERBOSITY_NORMAL : $verbosity; - $this->formatter = null === $formatter ? new OutputFormatter() : $formatter; - $this->formatter->setDecorated((Boolean) $decorated); - } - - /** - * Sets output formatter. - * - * @param OutputFormatterInterface $formatter - * - * @api - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - $this->formatter = $formatter; - } - - /** - * Returns current output formatter instance. - * - * @return OutputFormatterInterface - * - * @api - */ - public function getFormatter() - { - return $this->formatter; - } - - /** - * Sets the decorated flag. - * - * @param Boolean $decorated Whether to decorate the messages or not - * - * @api - */ - public function setDecorated($decorated) - { - $this->formatter->setDecorated((Boolean) $decorated); - } - - /** - * Gets the decorated flag. - * - * @return Boolean true if the output will decorate messages, false otherwise - * - * @api - */ - public function isDecorated() - { - return $this->formatter->isDecorated(); - } - - /** - * Sets the verbosity of the output. - * - * @param integer $level The level of verbosity - * - * @api - */ - public function setVerbosity($level) - { - $this->verbosity = (int) $level; - } - - /** - * Gets the current verbosity of the output. - * - * @return integer The current level of verbosity - * - * @api - */ - public function getVerbosity() - { - return $this->verbosity; - } - - /** - * Writes a message to the output and adds a newline at the end. - * - * @param string|array $messages The message as an array of lines of a single string - * @param integer $type The type of output - * - * @api - */ - public function writeln($messages, $type = 0) - { - $this->write($messages, true, $type); - } - - /** - * Writes a message to the output. - * - * @param string|array $messages The message as an array of lines of a single string - * @param Boolean $newline Whether to add a newline or not - * @param integer $type The type of output - * - * @throws \InvalidArgumentException When unknown output type is given - * - * @api - */ - public function write($messages, $newline = false, $type = 0) - { - if (self::VERBOSITY_QUIET === $this->verbosity) { - return; - } - - $messages = (array) $messages; - - foreach ($messages as $message) { - switch ($type) { - case OutputInterface::OUTPUT_NORMAL: - $message = $this->formatter->format($message); - break; - case OutputInterface::OUTPUT_RAW: - break; - case OutputInterface::OUTPUT_PLAIN: - $message = strip_tags($this->formatter->format($message)); - break; - default: - throw new \InvalidArgumentException(sprintf('Unknown output type given (%s)', $type)); - } - - $this->doWrite($message, $newline); - } - } - - /** - * Writes a message to the output. - * - * @param string $message A message to write to the output - * @param Boolean $newline Whether to add a newline or not - */ - abstract protected function doWrite($message, $newline); -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Output/OutputInterface.php b/framework/library/Doctrine/Symfony/Component/Console/Output/OutputInterface.php deleted file mode 100644 index 8423d48..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Output/OutputInterface.php +++ /dev/null @@ -1,109 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * OutputInterface is the interface implemented by all Output classes. - * - * @author Fabien Potencier - * - * @api - */ -interface OutputInterface -{ - const VERBOSITY_QUIET = 0; - const VERBOSITY_NORMAL = 1; - const VERBOSITY_VERBOSE = 2; - - const OUTPUT_NORMAL = 0; - const OUTPUT_RAW = 1; - const OUTPUT_PLAIN = 2; - - /** - * Writes a message to the output. - * - * @param string|array $messages The message as an array of lines of a single string - * @param Boolean $newline Whether to add a newline or not - * @param integer $type The type of output - * - * @throws \InvalidArgumentException When unknown output type is given - * - * @api - */ - function write($messages, $newline = false, $type = 0); - - /** - * Writes a message to the output and adds a newline at the end. - * - * @param string|array $messages The message as an array of lines of a single string - * @param integer $type The type of output - * - * @api - */ - function writeln($messages, $type = 0); - - /** - * Sets the verbosity of the output. - * - * @param integer $level The level of verbosity - * - * @api - */ - function setVerbosity($level); - - /** - * Gets the current verbosity of the output. - * - * @return integer The current level of verbosity - * - * @api - */ - function getVerbosity(); - - /** - * Sets the decorated flag. - * - * @param Boolean $decorated Whether to decorate the messages or not - * - * @api - */ - function setDecorated($decorated); - - /** - * Gets the decorated flag. - * - * @return Boolean true if the output will decorate messages, false otherwise - * - * @api - */ - function isDecorated(); - - /** - * Sets output formatter. - * - * @param OutputFormatterInterface $formatter - * - * @api - */ - function setFormatter(OutputFormatterInterface $formatter); - - /** - * Returns current output formatter instance. - * - * @return OutputFormatterInterface - * - * @api - */ - function getFormatter(); -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Output/StreamOutput.php b/framework/library/Doctrine/Symfony/Component/Console/Output/StreamOutput.php deleted file mode 100644 index e00d065..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Output/StreamOutput.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * StreamOutput writes the output to a given stream. - * - * Usage: - * - * $output = new StreamOutput(fopen('php://stdout', 'w')); - * - * As `StreamOutput` can use any stream, you can also use a file: - * - * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false)); - * - * @author Fabien Potencier - * - * @api - */ -class StreamOutput extends Output -{ - private $stream; - - /** - * Constructor. - * - * @param mixed $stream A stream resource - * @param integer $verbosity The verbosity level (self::VERBOSITY_QUIET, self::VERBOSITY_NORMAL, - * self::VERBOSITY_VERBOSE) - * @param Boolean $decorated Whether to decorate messages or not (null for auto-guessing) - * @param OutputFormatter $formatter Output formatter instance - * - * @throws \InvalidArgumentException When first argument is not a real stream - * - * @api - */ - public function __construct($stream, $verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null) - { - if (!is_resource($stream) || 'stream' !== get_resource_type($stream)) { - throw new \InvalidArgumentException('The StreamOutput class needs a stream as its first argument.'); - } - - $this->stream = $stream; - - if (null === $decorated) { - $decorated = $this->hasColorSupport($decorated); - } - - parent::__construct($verbosity, $decorated, $formatter); - } - - /** - * Gets the stream attached to this StreamOutput instance. - * - * @return resource A stream resource - */ - public function getStream() - { - return $this->stream; - } - - /** - * Writes a message to the output. - * - * @param string $message A message to write to the output - * @param Boolean $newline Whether to add a newline or not - * - * @throws \RuntimeException When unable to write output (should never happen) - */ - protected function doWrite($message, $newline) - { - if (false === @fwrite($this->stream, $message.($newline ? PHP_EOL : ''))) { - // @codeCoverageIgnoreStart - // should never happen - throw new \RuntimeException('Unable to write output.'); - // @codeCoverageIgnoreEnd - } - - fflush($this->stream); - } - - /** - * Returns true if the stream supports colorization. - * - * Colorization is disabled if not supported by the stream: - * - * - windows without ansicon - * - non tty consoles - * - * @return Boolean true if the stream supports colorization, false otherwise - */ - protected function hasColorSupport() - { - // @codeCoverageIgnoreStart - if (DIRECTORY_SEPARATOR == '\\') { - return false !== getenv('ANSICON'); - } - - return function_exists('posix_isatty') && @posix_isatty($this->stream); - // @codeCoverageIgnoreEnd - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/README.md b/framework/library/Doctrine/Symfony/Component/Console/README.md deleted file mode 100644 index d817952..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/README.md +++ /dev/null @@ -1,55 +0,0 @@ -Console Component -================= - -Console eases the creation of beautiful and testable command line interfaces. - -The Application object manages the CLI application: - - use Symfony\Component\Console\Application; - - $console = new Application(); - $console->run(); - -The ``run()`` method parses the arguments and options passed on the command -line and executes the right command. - -Registering a new command can easily be done via the ``register()`` method, -which returns a ``Command`` instance: - - use Symfony\Component\Console\Input\InputInterface; - use Symfony\Component\Console\Input\InputArgument; - use Symfony\Component\Console\Input\InputOption; - use Symfony\Component\Console\Output\OutputInterface; - - $console - ->register('ls') - ->setDefinition(array( - new InputArgument('dir', InputArgument::REQUIRED, 'Directory name'), - )) - ->setDescription('Displays the files in the given directory') - ->setCode(function (InputInterface $input, OutputInterface $output) { - $dir = $input->getArgument('dir'); - - $output->writeln(sprintf('Dir listing for %s', $dir)); - }) - ; - -You can also register new commands via classes. - -The component provides a lot of features like output coloring, input and -output abstractions (so that you can easily unit-test your commands), -validation, automatic help messages, ... - -Tests ---------- - -You can run the unit tests with the following command: - - phpunit - -Resources ---------- - -[The Console Component](http://symfony.com/doc/current/components/console.html) - -[How to create a Console Command](http://symfony.com/doc/current/cookbook/console/console_command.html) diff --git a/framework/library/Doctrine/Symfony/Component/Console/Shell.php b/framework/library/Doctrine/Symfony/Component/Console/Shell.php deleted file mode 100644 index 2dc51b6..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Shell.php +++ /dev/null @@ -1,207 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\StringInput; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Process\ProcessBuilder; -use Symfony\Component\Process\PhpExecutableFinder; - -/** - * A Shell wraps an Application to add shell capabilities to it. - * - * Support for history and completion only works with a PHP compiled - * with readline support (either --with-readline or --with-libedit) - * - * @author Fabien Potencier - * @author Martin Hasoň - */ -class Shell -{ - private $application; - private $history; - private $output; - private $hasReadline; - private $prompt; - private $processIsolation; - - /** - * Constructor. - * - * If there is no readline support for the current PHP executable - * a \RuntimeException exception is thrown. - * - * @param Application $application An application instance - */ - public function __construct(Application $application) - { - $this->hasReadline = function_exists('readline'); - $this->application = $application; - $this->history = getenv('HOME').'/.history_'.$application->getName(); - $this->output = new ConsoleOutput(); - $this->prompt = $application->getName().' > '; - $this->processIsolation = false; - } - - /** - * Runs the shell. - */ - public function run() - { - $this->application->setAutoExit(false); - $this->application->setCatchExceptions(true); - - if ($this->hasReadline) { - readline_read_history($this->history); - readline_completion_function(array($this, 'autocompleter')); - } - - $this->output->writeln($this->getHeader()); - $php = null; - if ($this->processIsolation) { - $finder = new PhpExecutableFinder(); - $php = $finder->find(); - $this->output->writeln(<<Running with process isolation, you should consider this: - * each command is executed as separate process, - * commands don't support interactivity, all params must be passed explicitly, - * commands output is not colorized. - -EOF - ); - } - - while (true) { - $command = $this->readline(); - - if (false === $command) { - $this->output->writeln("\n"); - - break; - } - - if ($this->hasReadline) { - readline_add_history($command); - readline_write_history($this->history); - } - - if ($this->processIsolation) { - $pb = new ProcessBuilder(); - - $process = $pb - ->add($php) - ->add($_SERVER['argv'][0]) - ->add($command) - ->inheritEnvironmentVariables(true) - ->getProcess() - ; - - $output = $this->output; - $process->run(function($type, $data) use ($output) { - $output->writeln($data); - }); - - $ret = $process->getExitCode(); - } else { - $ret = $this->application->run(new StringInput($command), $this->output); - } - - if (0 !== $ret) { - $this->output->writeln(sprintf('The command terminated with an error status (%s)', $ret)); - } - } - } - - /** - * Returns the shell header. - * - * @return string The header string - */ - protected function getHeader() - { - return <<{$this->application->getName()} shell ({$this->application->getVersion()}). - -At the prompt, type help for some help, -or list to get a list of available commands. - -To exit the shell, type ^D. - -EOF; - } - - /** - * Tries to return autocompletion for the current entered text. - * - * @param string $text The last segment of the entered text - * - * @return Boolean|array A list of guessed strings or true - */ - private function autocompleter($text) - { - $info = readline_info(); - $text = substr($info['line_buffer'], 0, $info['end']); - - if ($info['point'] !== $info['end']) { - return true; - } - - // task name? - if (false === strpos($text, ' ') || !$text) { - return array_keys($this->application->all()); - } - - // options and arguments? - try { - $command = $this->application->find(substr($text, 0, strpos($text, ' '))); - } catch (\Exception $e) { - return true; - } - - $list = array('--help'); - foreach ($command->getDefinition()->getOptions() as $option) { - $list[] = '--'.$option->getName(); - } - - return $list; - } - - /** - * Reads a single line from standard input. - * - * @return string The single line from standard input - */ - private function readline() - { - if ($this->hasReadline) { - $line = readline($this->prompt); - } else { - $this->output->write($this->prompt); - $line = fgets(STDIN, 1024); - $line = (!$line && strlen($line) == 0) ? false : rtrim($line); - } - - return $line; - } - - public function getProcessIsolation() - { - return $this->processIsolation; - } - - public function setProcessIsolation($processIsolation) - { - $this->processIsolation = (Boolean) $processIsolation; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tester/ApplicationTester.php b/framework/library/Doctrine/Symfony/Component/Console/Tester/ApplicationTester.php deleted file mode 100644 index 2c576aa..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tester/ApplicationTester.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\StreamOutput; - -/** - * Eases the testing of console applications. - * - * @author Fabien Potencier - */ -class ApplicationTester -{ - private $application; - private $input; - private $output; - - /** - * Constructor. - * - * @param Application $application An Application instance to test. - */ - public function __construct(Application $application) - { - $this->application = $application; - } - - /** - * Executes the application. - * - * Available options: - * - * * interactive: Sets the input interactive flag - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * - * @param array $input An array of arguments and options - * @param array $options An array of options - * - * @return integer The command exit code - */ - public function run(array $input, $options = array()) - { - $this->input = new ArrayInput($input); - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); - } - - $this->output = new StreamOutput(fopen('php://memory', 'w', false)); - if (isset($options['decorated'])) { - $this->output->setDecorated($options['decorated']); - } - if (isset($options['verbosity'])) { - $this->output->setVerbosity($options['verbosity']); - } - - return $this->application->run($this->input, $this->output); - } - - /** - * Gets the display returned by the last execution of the application. - * - * @return string The display - */ - public function getDisplay() - { - rewind($this->output->getStream()); - - return stream_get_contents($this->output->getStream()); - } - - /** - * Gets the input instance used by the last execution of the application. - * - * @return InputInterface The current input instance - */ - public function getInput() - { - return $this->input; - } - - /** - * Gets the output instance used by the last execution of the application. - * - * @return OutputInterface The current output instance - */ - public function getOutput() - { - return $this->output; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tester/CommandTester.php b/framework/library/Doctrine/Symfony/Component/Console/Tester/CommandTester.php deleted file mode 100644 index c840574..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tester/CommandTester.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Output\StreamOutput; - -/** - * Eases the testing of console commands. - * - * @author Fabien Potencier - */ -class CommandTester -{ - private $command; - private $input; - private $output; - - /** - * Constructor. - * - * @param Command $command A Command instance to test. - */ - public function __construct(Command $command) - { - $this->command = $command; - } - - /** - * Executes the command. - * - * Available options: - * - * * interactive: Sets the input interactive flag - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * - * @param array $input An array of arguments and options - * @param array $options An array of options - * - * @return integer The command exit code - */ - public function execute(array $input, array $options = array()) - { - $this->input = new ArrayInput($input); - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); - } - - $this->output = new StreamOutput(fopen('php://memory', 'w', false)); - if (isset($options['decorated'])) { - $this->output->setDecorated($options['decorated']); - } - if (isset($options['verbosity'])) { - $this->output->setVerbosity($options['verbosity']); - } - - return $this->command->run($this->input, $this->output); - } - - /** - * Gets the display returned by the last execution of the command. - * - * @return string The display - */ - public function getDisplay() - { - rewind($this->output->getStream()); - - return stream_get_contents($this->output->getStream()); - } - - /** - * Gets the input instance used by the last execution of the command. - * - * @return InputInterface The current input instance - */ - public function getInput() - { - return $this->input; - } - - /** - * Gets the output instance used by the last execution of the command. - * - * @return OutputInterface The current output instance - */ - public function getOutput() - { - return $this->output; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/ApplicationTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/ApplicationTest.php deleted file mode 100644 index 6fa4cff..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/ApplicationTest.php +++ /dev/null @@ -1,470 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\NullOutput; -use Symfony\Component\Console\Output\Output; -use Symfony\Component\Console\Tester\ApplicationTester; - -class ApplicationTest extends \PHPUnit_Framework_TestCase -{ - static protected $fixturesPath; - - static public function setUpBeforeClass() - { - self::$fixturesPath = realpath(__DIR__.'/Fixtures/'); - require_once self::$fixturesPath.'/FooCommand.php'; - require_once self::$fixturesPath.'/Foo1Command.php'; - require_once self::$fixturesPath.'/Foo2Command.php'; - require_once self::$fixturesPath.'/Foo3Command.php'; - } - - protected function normalizeLineBreaks($text) - { - return str_replace(PHP_EOL, "\n", $text); - } - - /** - * Replaces the dynamic placeholders of the command help text with a static version. - * The placeholder %command.full_name% includes the script path that is not predictable - * and can not be tested against. - */ - protected function ensureStaticCommandHelp(Application $application) - { - foreach ($application->all() as $command) { - $command->setHelp(str_replace('%command.full_name%', 'app/console %command.name%', $command->getHelp())); - } - } - - public function testConstructor() - { - $application = new Application('foo', 'bar'); - $this->assertEquals('foo', $application->getName(), '__construct() takes the application name as its first argument'); - $this->assertEquals('bar', $application->getVersion(), '__construct() takes the application version as its first argument'); - $this->assertEquals(array('help', 'list'), array_keys($application->all()), '__construct() registered the help and list commands by default'); - } - - public function testSetGetName() - { - $application = new Application(); - $application->setName('foo'); - $this->assertEquals('foo', $application->getName(), '->setName() sets the name of the application'); - } - - public function testSetGetVersion() - { - $application = new Application(); - $application->setVersion('bar'); - $this->assertEquals('bar', $application->getVersion(), '->setVersion() sets the version of the application'); - } - - public function testGetLongVersion() - { - $application = new Application('foo', 'bar'); - $this->assertEquals('foo version bar', $application->getLongVersion(), '->getLongVersion() returns the long version of the application'); - } - - public function testHelp() - { - $application = new Application(); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_gethelp.txt', $this->normalizeLineBreaks($application->getHelp()), '->setHelp() returns a help message'); - } - - public function testAll() - { - $application = new Application(); - $commands = $application->all(); - $this->assertEquals('Symfony\\Component\\Console\\Command\\HelpCommand', get_class($commands['help']), '->all() returns the registered commands'); - - $application->add(new \FooCommand()); - $commands = $application->all('foo'); - $this->assertEquals(1, count($commands), '->all() takes a namespace as its first argument'); - } - - public function testRegister() - { - $application = new Application(); - $command = $application->register('foo'); - $this->assertEquals('foo', $command->getName(), '->register() registers a new command'); - } - - public function testAdd() - { - $application = new Application(); - $application->add($foo = new \FooCommand()); - $commands = $application->all(); - $this->assertEquals($foo, $commands['foo:bar'], '->add() registers a command'); - - $application = new Application(); - $application->addCommands(array($foo = new \FooCommand(), $foo1 = new \Foo1Command())); - $commands = $application->all(); - $this->assertEquals(array($foo, $foo1), array($commands['foo:bar'], $commands['foo:bar1']), '->addCommands() registers an array of commands'); - } - - public function testHasGet() - { - $application = new Application(); - $this->assertTrue($application->has('list'), '->has() returns true if a named command is registered'); - $this->assertFalse($application->has('afoobar'), '->has() returns false if a named command is not registered'); - - $application->add($foo = new \FooCommand()); - $this->assertTrue($application->has('afoobar'), '->has() returns true if an alias is registered'); - $this->assertEquals($foo, $application->get('foo:bar'), '->get() returns a command by name'); - $this->assertEquals($foo, $application->get('afoobar'), '->get() returns a command by alias'); - - try { - $application->get('foofoo'); - $this->fail('->get() throws an \InvalidArgumentException if the command does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->get() throws an \InvalidArgumentException if the command does not exist'); - $this->assertEquals('The command "foofoo" does not exist.', $e->getMessage(), '->get() throws an \InvalidArgumentException if the command does not exist'); - } - - $application = new Application(); - $application->add($foo = new \FooCommand()); - // simulate --help - $r = new \ReflectionObject($application); - $p = $r->getProperty('wantHelps'); - $p->setAccessible(true); - $p->setValue($application, true); - $command = $application->get('foo:bar'); - $this->assertEquals('Symfony\Component\Console\Command\HelpCommand', get_class($command), '->get() returns the help command if --help is provided as the input'); - } - - public function testGetNamespaces() - { - $application = new Application(); - $application->add(new \FooCommand()); - $application->add(new \Foo1Command()); - $this->assertEquals(array('foo'), $application->getNamespaces(), '->getNamespaces() returns an array of unique used namespaces'); - } - - public function testFindNamespace() - { - $application = new Application(); - $application->add(new \FooCommand()); - $this->assertEquals('foo', $application->findNamespace('foo'), '->findNamespace() returns the given namespace if it exists'); - $this->assertEquals('foo', $application->findNamespace('f'), '->findNamespace() finds a namespace given an abbreviation'); - $application->add(new \Foo2Command()); - $this->assertEquals('foo', $application->findNamespace('foo'), '->findNamespace() returns the given namespace if it exists'); - try { - $application->findNamespace('f'); - $this->fail('->findNamespace() throws an \InvalidArgumentException if the abbreviation is ambiguous'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->findNamespace() throws an \InvalidArgumentException if the abbreviation is ambiguous'); - $this->assertEquals('The namespace "f" is ambiguous (foo, foo1).', $e->getMessage(), '->findNamespace() throws an \InvalidArgumentException if the abbreviation is ambiguous'); - } - - try { - $application->findNamespace('bar'); - $this->fail('->findNamespace() throws an \InvalidArgumentException if no command is in the given namespace'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->findNamespace() throws an \InvalidArgumentException if no command is in the given namespace'); - $this->assertEquals('There are no commands defined in the "bar" namespace.', $e->getMessage(), '->findNamespace() throws an \InvalidArgumentException if no command is in the given namespace'); - } - } - - public function testFind() - { - $application = new Application(); - $application->add(new \FooCommand()); - $this->assertEquals('FooCommand', get_class($application->find('foo:bar')), '->find() returns a command if its name exists'); - $this->assertEquals('Symfony\Component\Console\Command\HelpCommand', get_class($application->find('h')), '->find() returns a command if its name exists'); - $this->assertEquals('FooCommand', get_class($application->find('f:bar')), '->find() returns a command if the abbreviation for the namespace exists'); - $this->assertEquals('FooCommand', get_class($application->find('f:b')), '->find() returns a command if the abbreviation for the namespace and the command name exist'); - $this->assertEquals('FooCommand', get_class($application->find('a')), '->find() returns a command if the abbreviation exists for an alias'); - - $application->add(new \Foo1Command()); - $application->add(new \Foo2Command()); - - try { - $application->find('f'); - $this->fail('->find() throws an \InvalidArgumentException if the abbreviation is ambiguous for a namespace'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if the abbreviation is ambiguous for a namespace'); - $this->assertRegExp('/Command "f" is not defined./', $e->getMessage(), '->find() throws an \InvalidArgumentException if the abbreviation is ambiguous for a namespace'); - } - - try { - $application->find('a'); - $this->fail('->find() throws an \InvalidArgumentException if the abbreviation is ambiguous for an alias'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if the abbreviation is ambiguous for an alias'); - $this->assertEquals('Command "a" is ambiguous (afoobar, afoobar1 and 1 more).', $e->getMessage(), '->find() throws an \InvalidArgumentException if the abbreviation is ambiguous for an alias'); - } - - try { - $application->find('foo:b'); - $this->fail('->find() throws an \InvalidArgumentException if the abbreviation is ambiguous for a command'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if the abbreviation is ambiguous for a command'); - $this->assertEquals('Command "foo:b" is ambiguous (foo:bar, foo:bar1).', $e->getMessage(), '->find() throws an \InvalidArgumentException if the abbreviation is ambiguous for a command'); - } - } - - public function testFindAlternativeCommands() - { - $application = new Application(); - - $application->add(new \FooCommand()); - $application->add(new \Foo1Command()); - $application->add(new \Foo2Command()); - - try { - $application->find($commandName = 'Unknow command'); - $this->fail('->find() throws an \InvalidArgumentException if command does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if command does not exist'); - $this->assertEquals(sprintf('Command "%s" is not defined.', $commandName), $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, without alternatives'); - } - - try { - $application->find($commandName = 'foo'); - $this->fail('->find() throws an \InvalidArgumentException if command does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if command does not exist'); - $this->assertRegExp(sprintf('/Command "%s" is not defined./', $commandName), $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, with alternatives'); - $this->assertRegExp('/foo:bar/', $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, with alternative : "foo:bar"'); - $this->assertRegExp('/foo1:bar/', $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, with alternative : "foo1:bar"'); - $this->assertRegExp('/foo:bar1/', $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, with alternative : "foo:bar1"'); - } - - // Test if "foo1" command throw an "\InvalidArgumentException" and does not contain - // "foo:bar" as alternative because "foo1" is too far from "foo:bar" - try { - $application->find($commandName = 'foo1'); - $this->fail('->find() throws an \InvalidArgumentException if command does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if command does not exist'); - $this->assertRegExp(sprintf('/Command "%s" is not defined./', $commandName), $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, with alternatives'); - $this->assertFalse(strpos($e->getMessage(), 'foo:bar'), '->find() throws an \InvalidArgumentException if command does not exist, without "foo:bar" alternative'); - } - } - - public function testFindAlternativeNamespace() - { - $application = new Application(); - - $application->add(new \FooCommand()); - $application->add(new \Foo1Command()); - $application->add(new \Foo2Command()); - $application->add(new \foo3Command()); - - try { - $application->find('Unknow-namespace:Unknow-command'); - $this->fail('->find() throws an \InvalidArgumentException if namespace does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if namespace does not exist'); - $this->assertEquals('There are no commands defined in the "Unknow-namespace" namespace.', $e->getMessage(), '->find() throws an \InvalidArgumentException if namespace does not exist, without alternatives'); - } - - try { - $application->find('foo2:command'); - $this->fail('->find() throws an \InvalidArgumentException if namespace does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if namespace does not exist'); - $this->assertRegExp('/There are no commands defined in the "foo2" namespace./', $e->getMessage(), '->find() throws an \InvalidArgumentException if namespace does not exist, with alternative'); - $this->assertRegExp('/foo/', $e->getMessage(), '->find() throws an \InvalidArgumentException if namespace does not exist, with alternative : "foo"'); - $this->assertRegExp('/foo1/', $e->getMessage(), '->find() throws an \InvalidArgumentException if namespace does not exist, with alternative : "foo1"'); - $this->assertRegExp('/foo3/', $e->getMessage(), '->find() throws an \InvalidArgumentException if namespace does not exist, with alternative : "foo3"'); - } - } - - public function testSetCatchExceptions() - { - $application = $this->getMock('Symfony\Component\Console\Application', array('getTerminalWidth')); - $application->setAutoExit(false); - $application->expects($this->any()) - ->method('getTerminalWidth') - ->will($this->returnValue(120)); - $tester = new ApplicationTester($application); - - $application->setCatchExceptions(true); - $tester->run(array('command' => 'foo'), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception1.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->setCatchExceptions() sets the catch exception flag'); - - $application->setCatchExceptions(false); - try { - $tester->run(array('command' => 'foo'), array('decorated' => false)); - $this->fail('->setCatchExceptions() sets the catch exception flag'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->setCatchExceptions() sets the catch exception flag'); - $this->assertEquals('Command "foo" is not defined.', $e->getMessage(), '->setCatchExceptions() sets the catch exception flag'); - } - } - - public function testAsText() - { - $application = new Application(); - $application->add(new \FooCommand); - $this->ensureStaticCommandHelp($application); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_astext1.txt', $this->normalizeLineBreaks($application->asText()), '->asText() returns a text representation of the application'); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_astext2.txt', $this->normalizeLineBreaks($application->asText('foo')), '->asText() returns a text representation of the application'); - } - - public function testAsXml() - { - $application = new Application(); - $application->add(new \FooCommand); - $this->ensureStaticCommandHelp($application); - $this->assertXmlStringEqualsXmlFile(self::$fixturesPath.'/application_asxml1.txt', $application->asXml(), '->asXml() returns an XML representation of the application'); - $this->assertXmlStringEqualsXmlFile(self::$fixturesPath.'/application_asxml2.txt', $application->asXml('foo'), '->asXml() returns an XML representation of the application'); - } - - public function testRenderException() - { - $application = $this->getMock('Symfony\Component\Console\Application', array('getTerminalWidth')); - $application->setAutoExit(false); - $application->expects($this->any()) - ->method('getTerminalWidth') - ->will($this->returnValue(120)); - $tester = new ApplicationTester($application); - - $tester->run(array('command' => 'foo'), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception1.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->renderException() renders a pretty exception'); - - $tester->run(array('command' => 'foo'), array('decorated' => false, 'verbosity' => Output::VERBOSITY_VERBOSE)); - $this->assertContains('Exception trace', $tester->getDisplay(), '->renderException() renders a pretty exception with a stack trace when verbosity is verbose'); - - $tester->run(array('command' => 'list', '--foo' => true), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception2.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->renderException() renders the command synopsis when an exception occurs in the context of a command'); - - $application->add(new \Foo3Command); - $tester = new ApplicationTester($application); - $tester->run(array('command' => 'foo3:bar'), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception3.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->renderException() renders a pretty exceptions with previous exceptions'); - - $application = $this->getMock('Symfony\Component\Console\Application', array('getTerminalWidth')); - $application->setAutoExit(false); - $application->expects($this->any()) - ->method('getTerminalWidth') - ->will($this->returnValue(32)); - $tester = new ApplicationTester($application); - - $application = $this->getMock('Symfony\Component\Console\Application', array('getTerminalWidth')); - $application->setAutoExit(false); - $application->expects($this->any()) - ->method('getTerminalWidth') - ->will($this->returnValue(32)); - $tester = new ApplicationTester($application); - - $tester->run(array('command' => 'foo'), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception4.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->renderException() wraps messages when they are bigger than the terminal'); - } - - public function testRun() - { - $application = new Application(); - $application->setAutoExit(false); - $application->setCatchExceptions(false); - $application->add($command = new \Foo1Command()); - $_SERVER['argv'] = array('cli.php', 'foo:bar1'); - - ob_start(); - $application->run(); - ob_end_clean(); - - $this->assertSame('Symfony\Component\Console\Input\ArgvInput', get_class($command->input), '->run() creates an ArgvInput by default if none is given'); - $this->assertSame('Symfony\Component\Console\Output\ConsoleOutput', get_class($command->output), '->run() creates a ConsoleOutput by default if none is given'); - - $application = new Application(); - $application->setAutoExit(false); - $application->setCatchExceptions(false); - - $this->ensureStaticCommandHelp($application); - $tester = new ApplicationTester($application); - - $tester->run(array(), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_run1.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->run() runs the list command if no argument is passed'); - - $tester->run(array('--help' => true), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_run2.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->run() runs the help command if --help is passed'); - - $tester->run(array('-h' => true), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_run2.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->run() runs the help command if -h is passed'); - - $tester->run(array('command' => 'list', '--help' => true), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_run3.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->run() displays the help if --help is passed'); - - $tester->run(array('command' => 'list', '-h' => true), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_run3.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->run() displays the help if -h is passed'); - - $tester->run(array('--ansi' => true)); - $this->assertTrue($tester->getOutput()->isDecorated(), '->run() forces color output if --ansi is passed'); - - $tester->run(array('--no-ansi' => true)); - $this->assertFalse($tester->getOutput()->isDecorated(), '->run() forces color output to be disabled if --no-ansi is passed'); - - $tester->run(array('--version' => true), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_run4.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->run() displays the program version if --version is passed'); - - $tester->run(array('-V' => true), array('decorated' => false)); - $this->assertStringEqualsFile(self::$fixturesPath.'/application_run4.txt', $this->normalizeLineBreaks($tester->getDisplay()), '->run() displays the program version if -v is passed'); - - $tester->run(array('command' => 'list', '--quiet' => true)); - $this->assertSame('', $tester->getDisplay(), '->run() removes all output if --quiet is passed'); - - $tester->run(array('command' => 'list', '-q' => true)); - $this->assertSame('', $tester->getDisplay(), '->run() removes all output if -q is passed'); - - $tester->run(array('command' => 'list', '--verbose' => true)); - $this->assertSame(Output::VERBOSITY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if --verbose is passed'); - - $tester->run(array('command' => 'list', '-v' => true)); - $this->assertSame(Output::VERBOSITY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if -v is passed'); - - $application = new Application(); - $application->setAutoExit(false); - $application->setCatchExceptions(false); - $application->add(new \FooCommand()); - $tester = new ApplicationTester($application); - - $tester->run(array('command' => 'foo:bar', '--no-interaction' => true), array('decorated' => false)); - $this->assertSame('called'.PHP_EOL, $tester->getDisplay(), '->run() does not call interact() if --no-interaction is passed'); - - $tester->run(array('command' => 'foo:bar', '-n' => true), array('decorated' => false)); - $this->assertSame('called'.PHP_EOL, $tester->getDisplay(), '->run() does not call interact() if -n is passed'); - } - - /** - * @expectedException \LogicException - * @dataProvider getAddingAlreadySetDefinitionElementData - */ - public function testAddingAlreadySetDefinitionElementData($def) - { - $application = new Application(); - $application->setAutoExit(false); - $application->setCatchExceptions(false); - $application - ->register('foo') - ->setDefinition(array($def)) - ->setCode(function (InputInterface $input, OutputInterface $output) {}) - ; - - $input = new ArrayInput(array('command' => 'foo')); - $output = new NullOutput(); - $application->run($input, $output); - } - - public function getAddingAlreadySetDefinitionElementData() - { - return array( - array(new InputArgument('command', InputArgument::REQUIRED)), - array(new InputOption('quiet', '', InputOption::VALUE_NONE)), - array(new InputOption('query', 'q', InputOption::VALUE_NONE)), - ); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Command/CommandTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Command/CommandTest.php deleted file mode 100644 index 557116e..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Command/CommandTest.php +++ /dev/null @@ -1,253 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Command; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\FormatterHelper; -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\StringInput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\NullOutput; -use Symfony\Component\Console\Tester\CommandTester; - -class CommandTest extends \PHPUnit_Framework_TestCase -{ - static protected $fixturesPath; - - static public function setUpBeforeClass() - { - self::$fixturesPath = __DIR__.'/../Fixtures/'; - require_once self::$fixturesPath.'/TestCommand.php'; - } - - public function testConstructor() - { - try { - $command = new Command(); - $this->fail('__construct() throws a \LogicException if the name is null'); - } catch (\Exception $e) { - $this->assertInstanceOf('\LogicException', $e, '__construct() throws a \LogicException if the name is null'); - $this->assertEquals('The command name cannot be empty.', $e->getMessage(), '__construct() throws a \LogicException if the name is null'); - } - $command = new Command('foo:bar'); - $this->assertEquals('foo:bar', $command->getName(), '__construct() takes the command name as its first argument'); - } - - public function testSetApplication() - { - $application = new Application(); - $command = new \TestCommand(); - $command->setApplication($application); - $this->assertEquals($application, $command->getApplication(), '->setApplication() sets the current application'); - } - - public function testSetGetDefinition() - { - $command = new \TestCommand(); - $ret = $command->setDefinition($definition = new InputDefinition()); - $this->assertEquals($command, $ret, '->setDefinition() implements a fluent interface'); - $this->assertEquals($definition, $command->getDefinition(), '->setDefinition() sets the current InputDefinition instance'); - $command->setDefinition(array(new InputArgument('foo'), new InputOption('bar'))); - $this->assertTrue($command->getDefinition()->hasArgument('foo'), '->setDefinition() also takes an array of InputArguments and InputOptions as an argument'); - $this->assertTrue($command->getDefinition()->hasOption('bar'), '->setDefinition() also takes an array of InputArguments and InputOptions as an argument'); - $command->setDefinition(new InputDefinition()); - } - - public function testAddArgument() - { - $command = new \TestCommand(); - $ret = $command->addArgument('foo'); - $this->assertEquals($command, $ret, '->addArgument() implements a fluent interface'); - $this->assertTrue($command->getDefinition()->hasArgument('foo'), '->addArgument() adds an argument to the command'); - } - - public function testAddOption() - { - $command = new \TestCommand(); - $ret = $command->addOption('foo'); - $this->assertEquals($command, $ret, '->addOption() implements a fluent interface'); - $this->assertTrue($command->getDefinition()->hasOption('foo'), '->addOption() adds an option to the command'); - } - - public function testGetNamespaceGetNameSetName() - { - $command = new \TestCommand(); - $this->assertEquals('namespace:name', $command->getName(), '->getName() returns the command name'); - $command->setName('foo'); - $this->assertEquals('foo', $command->getName(), '->setName() sets the command name'); - - $ret = $command->setName('foobar:bar'); - $this->assertEquals($command, $ret, '->setName() implements a fluent interface'); - $this->assertEquals('foobar:bar', $command->getName(), '->setName() sets the command name'); - - try { - $command->setName(''); - $this->fail('->setName() throws an \InvalidArgumentException if the name is empty'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->setName() throws an \InvalidArgumentException if the name is empty'); - $this->assertEquals('Command name "" is invalid.', $e->getMessage(), '->setName() throws an \InvalidArgumentException if the name is empty'); - } - - try { - $command->setName('foo:'); - $this->fail('->setName() throws an \InvalidArgumentException if the name is empty'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->setName() throws an \InvalidArgumentException if the name is empty'); - $this->assertEquals('Command name "foo:" is invalid.', $e->getMessage(), '->setName() throws an \InvalidArgumentException if the name is empty'); - } - } - - public function testGetSetDescription() - { - $command = new \TestCommand(); - $this->assertEquals('description', $command->getDescription(), '->getDescription() returns the description'); - $ret = $command->setDescription('description1'); - $this->assertEquals($command, $ret, '->setDescription() implements a fluent interface'); - $this->assertEquals('description1', $command->getDescription(), '->setDescription() sets the description'); - } - - public function testGetSetHelp() - { - $command = new \TestCommand(); - $this->assertEquals('help', $command->getHelp(), '->getHelp() returns the help'); - $ret = $command->setHelp('help1'); - $this->assertEquals($command, $ret, '->setHelp() implements a fluent interface'); - $this->assertEquals('help1', $command->getHelp(), '->setHelp() sets the help'); - } - - public function testGetProcessedHelp() - { - $command = new \TestCommand(); - $command->setHelp('The %command.name% command does... Example: php %command.full_name%.'); - $this->assertContains('The namespace:name command does...', $command->getProcessedHelp(), '->getProcessedHelp() replaces %command.name% correctly'); - $this->assertNotContains('%command.full_name%', $command->getProcessedHelp(), '->getProcessedHelp() replaces %command.full_name%'); - } - - public function testGetSetAliases() - { - $command = new \TestCommand(); - $this->assertEquals(array('name'), $command->getAliases(), '->getAliases() returns the aliases'); - $ret = $command->setAliases(array('name1')); - $this->assertEquals($command, $ret, '->setAliases() implements a fluent interface'); - $this->assertEquals(array('name1'), $command->getAliases(), '->setAliases() sets the aliases'); - } - - public function testGetSynopsis() - { - $command = new \TestCommand(); - $command->addOption('foo'); - $command->addArgument('foo'); - $this->assertEquals('namespace:name [--foo] [foo]', $command->getSynopsis(), '->getSynopsis() returns the synopsis'); - } - - public function testGetHelper() - { - $application = new Application(); - $command = new \TestCommand(); - $command->setApplication($application); - $formatterHelper = new FormatterHelper(); - $this->assertEquals($formatterHelper->getName(), $command->getHelper('formatter')->getName(), '->getHelper() returns the correct helper'); - } - - public function testGet() - { - $application = new Application(); - $command = new \TestCommand(); - $command->setApplication($application); - $formatterHelper = new FormatterHelper(); - $this->assertEquals($formatterHelper->getName(), $command->getHelper('formatter')->getName(), '->__get() returns the correct helper'); - } - - public function testMergeApplicationDefinition() - { - $application1 = new Application(); - $application1->getDefinition()->addArguments(array(new InputArgument('foo'))); - $application1->getDefinition()->addOptions(array(new InputOption('bar'))); - $command = new \TestCommand(); - $command->setApplication($application1); - $command->setDefinition($definition = new InputDefinition(array(new InputArgument('bar'), new InputOption('foo')))); - - $r = new \ReflectionObject($command); - $m = $r->getMethod('mergeApplicationDefinition'); - $m->setAccessible(true); - $m->invoke($command); - $this->assertTrue($command->getDefinition()->hasArgument('foo'), '->mergeApplicationDefinition() merges the application arguments and the command arguments'); - $this->assertTrue($command->getDefinition()->hasArgument('bar'), '->mergeApplicationDefinition() merges the application arguments and the command arguments'); - $this->assertTrue($command->getDefinition()->hasOption('foo'), '->mergeApplicationDefinition() merges the application options and the command options'); - $this->assertTrue($command->getDefinition()->hasOption('bar'), '->mergeApplicationDefinition() merges the application options and the command options'); - - $m->invoke($command); - $this->assertEquals(3, $command->getDefinition()->getArgumentCount(), '->mergeApplicationDefinition() does not try to merge twice the application arguments and options'); - } - - public function testRun() - { - $command = new \TestCommand(); - $tester = new CommandTester($command); - try { - $tester->execute(array('--bar' => true)); - $this->fail('->run() throws a \InvalidArgumentException when the input does not validate the current InputDefinition'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->run() throws a \InvalidArgumentException when the input does not validate the current InputDefinition'); - $this->assertEquals('The "--bar" option does not exist.', $e->getMessage(), '->run() throws a \InvalidArgumentException when the input does not validate the current InputDefinition'); - } - - $tester->execute(array(), array('interactive' => true)); - $this->assertEquals('interact called'.PHP_EOL.'execute called'.PHP_EOL, $tester->getDisplay(), '->run() calls the interact() method if the input is interactive'); - - $tester->execute(array(), array('interactive' => false)); - $this->assertEquals('execute called'.PHP_EOL, $tester->getDisplay(), '->run() does not call the interact() method if the input is not interactive'); - - $command = new Command('foo'); - try { - $command->run(new StringInput(''), new NullOutput()); - $this->fail('->run() throws a \LogicException if the execute() method has not been overridden and no code has been provided'); - } catch (\Exception $e) { - $this->assertInstanceOf('\LogicException', $e, '->run() throws a \LogicException if the execute() method has not been overridden and no code has been provided'); - $this->assertEquals('You must override the execute() method in the concrete command class.', $e->getMessage(), '->run() throws a \LogicException if the execute() method has not been overridden and no code has been provided'); - } - } - - public function testSetCode() - { - $command = new \TestCommand(); - $ret = $command->setCode(function (InputInterface $input, OutputInterface $output) { - $output->writeln('from the code...'); - }); - $this->assertEquals($command, $ret, '->setCode() implements a fluent interface'); - $tester = new CommandTester($command); - $tester->execute(array()); - $this->assertEquals('interact called'.PHP_EOL.'from the code...'.PHP_EOL, $tester->getDisplay()); - } - - public function testAsText() - { - $command = new \TestCommand(); - $command->setApplication(new Application()); - $tester = new CommandTester($command); - $tester->execute(array('command' => $command->getName())); - $this->assertStringEqualsFile(self::$fixturesPath.'/command_astext.txt', $command->asText(), '->asText() returns a text representation of the command'); - } - - public function testAsXml() - { - $command = new \TestCommand(); - $command->setApplication(new Application()); - $tester = new CommandTester($command); - $tester->execute(array('command' => $command->getName())); - $this->assertXmlStringEqualsXmlFile(self::$fixturesPath.'/command_asxml.txt', $command->asXml(), '->asXml() returns an XML representation of the command'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Command/HelpCommandTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Command/HelpCommandTest.php deleted file mode 100644 index 417eea1..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Command/HelpCommandTest.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Command; - -use Symfony\Component\Console\Tester\CommandTester; -use Symfony\Component\Console\Command\HelpCommand; -use Symfony\Component\Console\Command\ListCommand; -use Symfony\Component\Console\Application; - -class HelpCommandTest extends \PHPUnit_Framework_TestCase -{ - public function testExecute() - { - $command = new HelpCommand(); - - $commandTester = new CommandTester($command); - $command->setCommand(new ListCommand()); - $commandTester->execute(array()); - $this->assertRegExp('/list \[--xml\] \[--raw\] \[namespace\]/', $commandTester->getDisplay(), '->execute() returns a text help for the given command'); - - $command->setCommand(new ListCommand()); - $commandTester->execute(array('--xml' => true)); - $this->assertRegExp('/getDisplay(), '->execute() returns an XML help text if --xml is passed'); - - $application = new Application(); - $commandTester = new CommandTester($application->get('help')); - $commandTester->execute(array('command_name' => 'list')); - $this->assertRegExp('/list \[--xml\] \[--raw\] \[namespace\]/', $commandTester->getDisplay(), '->execute() returns a text help for the given command'); - - $commandTester->execute(array('command_name' => 'list', '--xml' => true)); - $this->assertRegExp('/getDisplay(), '->execute() returns an XML help text if --xml is passed'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Command/ListCommandTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Command/ListCommandTest.php deleted file mode 100644 index fb0eacc..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Command/ListCommandTest.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Command; - -use Symfony\Component\Console\Tester\CommandTester; -use Symfony\Component\Console\Application; - -class ListCommandTest extends \PHPUnit_Framework_TestCase -{ - public function testExecute() - { - $application = new Application(); - - $commandTester = new CommandTester($command = $application->get('list')); - $commandTester->execute(array('command' => $command->getName()), array('decorated' => false)); - $this->assertRegExp('/help Displays help for a command/', $commandTester->getDisplay(), '->execute() returns a list of available commands'); - - $commandTester->execute(array('command' => $command->getName(), '--xml' => true)); - $this->assertRegExp('//', $commandTester->getDisplay(), '->execute() returns a list of available commands in XML if --xml is passed'); - - $commandTester->execute(array('command' => $command->getName(), '--raw' => true)); - $output = <<assertEquals(str_replace("\n", PHP_EOL, $output), $commandTester->getDisplay(), 'boo'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/Foo1Command.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/Foo1Command.php deleted file mode 100644 index 254162f..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/Foo1Command.php +++ /dev/null @@ -1,26 +0,0 @@ -setName('foo:bar1') - ->setDescription('The foo:bar1 command') - ->setAliases(array('afoobar1')) - ; - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - $this->input = $input; - $this->output = $output; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/Foo2Command.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/Foo2Command.php deleted file mode 100644 index 8071dc8..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/Foo2Command.php +++ /dev/null @@ -1,21 +0,0 @@ -setName('foo1:bar') - ->setDescription('The foo1:bar command') - ->setAliases(array('afoobar2')) - ; - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/Foo3Command.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/Foo3Command.php deleted file mode 100644 index 7349bc3..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/Foo3Command.php +++ /dev/null @@ -1,25 +0,0 @@ -setName('foo3:bar') - ->setDescription('The foo3:bar command') - ; - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - try { - throw new \Exception("First exception"); - } catch (\Exception $e) { - throw new \Exception("Second exception", 0, $e); - } - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/FooCommand.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/FooCommand.php deleted file mode 100644 index 355e0ad..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/FooCommand.php +++ /dev/null @@ -1,33 +0,0 @@ -setName('foo:bar') - ->setDescription('The foo:bar command') - ->setAliases(array('afoobar')) - ; - } - - protected function interact(InputInterface $input, OutputInterface $output) - { - $output->writeln('interact called'); - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - $this->input = $input; - $this->output = $output; - - $output->writeln('called'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/TestCommand.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/TestCommand.php deleted file mode 100644 index dcd3273..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/TestCommand.php +++ /dev/null @@ -1,28 +0,0 @@ -setName('namespace:name') - ->setAliases(array('name')) - ->setDescription('description') - ->setHelp('help') - ; - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - $output->writeln('execute called'); - } - - protected function interact(InputInterface $input, OutputInterface $output) - { - $output->writeln('interact called'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_astext1.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_astext1.txt deleted file mode 100644 index 2f692c0..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_astext1.txt +++ /dev/null @@ -1,20 +0,0 @@ -Console Tool - -Usage: - [options] command [arguments] - -Options: - --help -h Display this help message. - --quiet -q Do not output any message. - --verbose -v Increase verbosity of messages. - --version -V Display this application version. - --ansi Force ANSI output. - --no-ansi Disable ANSI output. - --no-interaction -n Do not ask any interactive question. - -Available commands: - afoobar The foo:bar command - help Displays help for a command - list Lists commands -foo - foo:bar The foo:bar command \ No newline at end of file diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_astext2.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_astext2.txt deleted file mode 100644 index 1457bf7..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_astext2.txt +++ /dev/null @@ -1,16 +0,0 @@ -Console Tool - -Usage: - [options] command [arguments] - -Options: - --help -h Display this help message. - --quiet -q Do not output any message. - --verbose -v Increase verbosity of messages. - --version -V Display this application version. - --ansi Force ANSI output. - --no-ansi Disable ANSI output. - --no-interaction -n Do not ask any interactive question. - -Available commands for the "foo" namespace: - foo:bar The foo:bar command \ No newline at end of file diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_asxml1.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_asxml1.txt deleted file mode 100644 index ce21a32..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_asxml1.txt +++ /dev/null @@ -1,83 +0,0 @@ - - - - - help [--xml] [command_name] - Displays help for a command - The <info>help</info> command displays help for a given command: - - <info>php app/console help list</info> - - You can also output the help as XML by using the <comment>--xml</comment> option: - - <info>php app/console help --xml list</info> - - - - The command name - - help - - - - - - - - - list [--xml] [--raw] [namespace] - Lists commands - The <info>list</info> command lists all commands: - - <info>php app/console list</info> - - You can also display the commands for a specific namespace: - - <info>php app/console list test</info> - - You can also output the information as XML by using the <comment>--xml</comment> option: - - <info>php app/console list --xml</info> - - It's also possible to get raw list of commands (useful for embedding command runner): - - <info>php app/console list --raw</info> - - - - The namespace name - - - - - - - - - - foo:bar - The foo:bar command - - - afoobar - - - - - - - - help - list - - - foo:bar - - - diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_asxml2.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_asxml2.txt deleted file mode 100644 index 9e1f4a1..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_asxml2.txt +++ /dev/null @@ -1,15 +0,0 @@ - - - - - foo:bar - The foo:bar command - - - afoobar - - - - - - diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_gethelp.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_gethelp.txt deleted file mode 100644 index 5ad5420..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_gethelp.txt +++ /dev/null @@ -1,13 +0,0 @@ -Console Tool - -Usage: - [options] command [arguments] - -Options: - --help -h Display this help message. - --quiet -q Do not output any message. - --verbose -v Increase verbosity of messages. - --version -V Display this application version. - --ansi Force ANSI output. - --no-ansi Disable ANSI output. - --no-interaction -n Do not ask any interactive question. \ No newline at end of file diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception1.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception1.txt deleted file mode 100644 index 4629345..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception1.txt +++ /dev/null @@ -1,8 +0,0 @@ - - - - [InvalidArgumentException] - Command "foo" is not defined. - - - diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception2.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception2.txt deleted file mode 100644 index 56dd52e..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception2.txt +++ /dev/null @@ -1,11 +0,0 @@ - - - - [InvalidArgumentException] - The "--foo" option does not exist. - - - -list [--xml] [--raw] [namespace] - - diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception3.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception3.txt deleted file mode 100644 index c639924..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception3.txt +++ /dev/null @@ -1,19 +0,0 @@ - - - - [Exception] - Second exception - - - - - - - [Exception] - First exception - - - -foo3:bar - - diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception4.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception4.txt deleted file mode 100644 index 19f893b..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_renderexception4.txt +++ /dev/null @@ -1,9 +0,0 @@ - - - - [InvalidArgumentException] - Command "foo" is not define - d. - - - diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run1.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run1.txt deleted file mode 100644 index 176dc88..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run1.txt +++ /dev/null @@ -1,17 +0,0 @@ -Console Tool - -Usage: - [options] command [arguments] - -Options: - --help -h Display this help message. - --quiet -q Do not output any message. - --verbose -v Increase verbosity of messages. - --version -V Display this application version. - --ansi Force ANSI output. - --no-ansi Disable ANSI output. - --no-interaction -n Do not ask any interactive question. - -Available commands: - help Displays help for a command - list Lists commands diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run2.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run2.txt deleted file mode 100644 index f717033..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run2.txt +++ /dev/null @@ -1,26 +0,0 @@ -Usage: - help [--xml] [command_name] - -Arguments: - command The command to execute - command_name The command name (default: 'help') - -Options: - --xml To output help as XML - --help (-h) Display this help message. - --quiet (-q) Do not output any message. - --verbose (-v) Increase verbosity of messages. - --version (-V) Display this application version. - --ansi Force ANSI output. - --no-ansi Disable ANSI output. - --no-interaction (-n) Do not ask any interactive question. - -Help: - The help command displays help for a given command: - - php app/console help list - - You can also output the help as XML by using the --xml option: - - php app/console help --xml list - diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run3.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run3.txt deleted file mode 100644 index 441db54..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run3.txt +++ /dev/null @@ -1,27 +0,0 @@ -Usage: - list [--xml] [--raw] [namespace] - -Arguments: - namespace The namespace name - -Options: - --xml To output help as XML - --raw To output raw command list - -Help: - The list command lists all commands: - - php app/console list - - You can also display the commands for a specific namespace: - - php app/console list test - - You can also output the information as XML by using the --xml option: - - php app/console list --xml - - It's also possible to get raw list of commands (useful for embedding command runner): - - php app/console list --raw - diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run4.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run4.txt deleted file mode 100644 index 47187fc..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/application_run4.txt +++ /dev/null @@ -1 +0,0 @@ -Console Tool diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/command_astext.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/command_astext.txt deleted file mode 100644 index e599903..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/command_astext.txt +++ /dev/null @@ -1,18 +0,0 @@ -Usage: - namespace:name - -Aliases: name -Arguments: - command The command to execute - -Options: - --help (-h) Display this help message. - --quiet (-q) Do not output any message. - --verbose (-v) Increase verbosity of messages. - --version (-V) Display this application version. - --ansi Force ANSI output. - --no-ansi Disable ANSI output. - --no-interaction (-n) Do not ask any interactive question. - -Help: - help diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/command_asxml.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/command_asxml.txt deleted file mode 100644 index 806c5a5..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/command_asxml.txt +++ /dev/null @@ -1,38 +0,0 @@ - - - namespace:name - description - help - - name - - - - The command to execute - - - - - - - - - - - - - diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/definition_astext.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/definition_astext.txt deleted file mode 100644 index 2ad6078..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/definition_astext.txt +++ /dev/null @@ -1,11 +0,0 @@ -Arguments: - foo The foo argument - baz The baz argument (default: true) - bar The bar argument (default: array('bar')) - -Options: - --foo (-f) The foo option - --baz The baz option (default: false) - --bar (-b) The bar option (default: 'bar') - --qux The qux option (default: array('foo', 'bar')) (multiple values allowed) - --qux2 The qux2 option (default: array ( 'foo' => 'bar',)) (multiple values allowed) diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/definition_asxml.txt b/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/definition_asxml.txt deleted file mode 100644 index eec8c07..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Fixtures/definition_asxml.txt +++ /dev/null @@ -1,39 +0,0 @@ - - - - - The foo argument - - - - The baz argument - - true - - - - The bar argument - - bar - - - - - - - - - diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleStackTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleStackTest.php deleted file mode 100644 index e99ebc5..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleStackTest.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Formatter; - -use Symfony\Component\Console\Formatter\OutputFormatterStyleStack; -use Symfony\Component\Console\Formatter\OutputFormatterStyle; - -class OutputFormatterStyleStackTest extends \PHPUnit_Framework_TestCase -{ - public function testPush() - { - $stack = new OutputFormatterStyleStack(); - $stack->push($s1 = new OutputFormatterStyle('white', 'black')); - $stack->push($s2 = new OutputFormatterStyle('yellow', 'blue')); - - $this->assertEquals($s2, $stack->getCurrent()); - - $stack->push($s3 = new OutputFormatterStyle('green', 'red')); - - $this->assertEquals($s3, $stack->getCurrent()); - } - - public function testPop() - { - $stack = new OutputFormatterStyleStack(); - $stack->push($s1 = new OutputFormatterStyle('white', 'black')); - $stack->push($s2 = new OutputFormatterStyle('yellow', 'blue')); - - $this->assertEquals($s2, $stack->pop()); - $this->assertEquals($s1, $stack->pop()); - } - - public function testPopEmpty() - { - $stack = new OutputFormatterStyleStack(); - $style = new OutputFormatterStyle(); - - $this->assertEquals($style, $stack->pop()); - } - - public function testPopNotLast() - { - $stack = new OutputFormatterStyleStack(); - $stack->push($s1 = new OutputFormatterStyle('white', 'black')); - $stack->push($s2 = new OutputFormatterStyle('yellow', 'blue')); - $stack->push($s3 = new OutputFormatterStyle('green', 'red')); - - $this->assertEquals($s2, $stack->pop($s2)); - $this->assertEquals($s1, $stack->pop()); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testInvalidPop() - { - $stack = new OutputFormatterStyleStack(); - $stack->push(new OutputFormatterStyle('white', 'black')); - $stack->pop(new OutputFormatterStyle('yellow', 'blue')); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php deleted file mode 100644 index b2875e9..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Formatter; - -use Symfony\Component\Console\Formatter\OutputFormatterStyle; - -class OutputFormatterStyleTest extends \PHPUnit_Framework_TestCase -{ - public function testConstructor() - { - $style = new OutputFormatterStyle('green', 'black', array('bold', 'underscore')); - $this->assertEquals("\033[32;40;1;4mfoo\033[0m", $style->apply('foo')); - - $style = new OutputFormatterStyle('red', null, array('blink')); - $this->assertEquals("\033[31;5mfoo\033[0m", $style->apply('foo')); - - $style = new OutputFormatterStyle(null, 'white'); - $this->assertEquals("\033[47mfoo\033[0m", $style->apply('foo')); - } - - public function testForeground() - { - $style = new OutputFormatterStyle(); - - $style->setForeground('black'); - $this->assertEquals("\033[30mfoo\033[0m", $style->apply('foo')); - - $style->setForeground('blue'); - $this->assertEquals("\033[34mfoo\033[0m", $style->apply('foo')); - - $this->setExpectedException('InvalidArgumentException'); - $style->setForeground('undefined-color'); - } - - public function testBackground() - { - $style = new OutputFormatterStyle(); - - $style->setBackground('black'); - $this->assertEquals("\033[40mfoo\033[0m", $style->apply('foo')); - - $style->setBackground('yellow'); - $this->assertEquals("\033[43mfoo\033[0m", $style->apply('foo')); - - $this->setExpectedException('InvalidArgumentException'); - $style->setBackground('undefined-color'); - } - - public function testOptions() - { - $style = new OutputFormatterStyle(); - - $style->setOptions(array('reverse', 'conceal')); - $this->assertEquals("\033[7;8mfoo\033[0m", $style->apply('foo')); - - $style->setOption('bold'); - $this->assertEquals("\033[7;8;1mfoo\033[0m", $style->apply('foo')); - - $style->unsetOption('reverse'); - $this->assertEquals("\033[8;1mfoo\033[0m", $style->apply('foo')); - - $style->setOption('bold'); - $this->assertEquals("\033[8;1mfoo\033[0m", $style->apply('foo')); - - $style->setOptions(array('bold')); - $this->assertEquals("\033[1mfoo\033[0m", $style->apply('foo')); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php deleted file mode 100644 index 0d1bf41..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php +++ /dev/null @@ -1,191 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Formatter; - -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\OutputFormatterStyle; - -class FormatterStyleTest extends \PHPUnit_Framework_TestCase -{ - public function testEmptyTag() - { - $formatter = new OutputFormatter(true); - $this->assertEquals("foo<>bar", $formatter->format('foo<>bar')); - } - - public function testBundledStyles() - { - $formatter = new OutputFormatter(true); - - $this->assertTrue($formatter->hasStyle('error')); - $this->assertTrue($formatter->hasStyle('info')); - $this->assertTrue($formatter->hasStyle('comment')); - $this->assertTrue($formatter->hasStyle('question')); - - $this->assertEquals( - "\033[37;41msome error\033[0m", - $formatter->format('some error') - ); - $this->assertEquals( - "\033[32msome info\033[0m", - $formatter->format('some info') - ); - $this->assertEquals( - "\033[33msome comment\033[0m", - $formatter->format('some comment') - ); - $this->assertEquals( - "\033[30;46msome question\033[0m", - $formatter->format('some question') - ); - } - - public function testNestedStyles() - { - $formatter = new OutputFormatter(true); - - $this->assertEquals( - "\033[37;41msome \033[0m\033[32msome info\033[0m\033[37;41m error\033[0m", - $formatter->format('some some info error') - ); - } - - public function testDeepNestedStyles() - { - $formatter = new OutputFormatter(true); - - $this->assertEquals( - "\033[37;41merror\033[0m\033[32minfo\033[0m\033[33mcomment\033[0m\033[37;41merror\033[0m", - $formatter->format('errorinfocommenterror') - ); - } - - public function testNewStyle() - { - $formatter = new OutputFormatter(true); - - $style = new OutputFormatterStyle('blue', 'white'); - $formatter->setStyle('test', $style); - - $this->assertEquals($style, $formatter->getStyle('test')); - $this->assertNotEquals($style, $formatter->getStyle('info')); - - $this->assertEquals("\033[34;47msome custom msg\033[0m", $formatter->format('some custom msg')); - } - - public function testRedefineStyle() - { - $formatter = new OutputFormatter(true); - - $style = new OutputFormatterStyle('blue', 'white'); - $formatter->setStyle('info', $style); - - $this->assertEquals("\033[34;47msome custom msg\033[0m", $formatter->format('some custom msg')); - } - - public function testInlineStyle() - { - $formatter = new OutputFormatter(true); - - $this->assertEquals("\033[34;41msome text\033[0m", $formatter->format('some text')); - $this->assertEquals("\033[34;41msome text\033[0m", $formatter->format('some text')); - } - - public function testNotDecoratedFormatter() - { - $formatter = new OutputFormatter(false); - - $this->assertTrue($formatter->hasStyle('error')); - $this->assertTrue($formatter->hasStyle('info')); - $this->assertTrue($formatter->hasStyle('comment')); - $this->assertTrue($formatter->hasStyle('question')); - - $this->assertEquals( - "some error", $formatter->format('some error') - ); - $this->assertEquals( - "some info", $formatter->format('some info') - ); - $this->assertEquals( - "some comment", $formatter->format('some comment') - ); - $this->assertEquals( - "some question", $formatter->format('some question') - ); - - $formatter->setDecorated(true); - - $this->assertEquals( - "\033[37;41msome error\033[0m", $formatter->format('some error') - ); - $this->assertEquals( - "\033[32msome info\033[0m", $formatter->format('some info') - ); - $this->assertEquals( - "\033[33msome comment\033[0m", $formatter->format('some comment') - ); - $this->assertEquals( - "\033[30;46msome question\033[0m", $formatter->format('some question') - ); - } - - public function testContentWithLineBreaks() - { - $formatter = new OutputFormatter(true); - - $this->assertEquals(<<format(<< -some text -EOF - )); - - $this->assertEquals(<<format(<<some text - -EOF - )); - - $this->assertEquals(<<format(<< -some text - -EOF - )); - - $this->assertEquals(<<format(<< -some text -more text - -EOF - )); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Helper/DialogHelperTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Helper/DialogHelperTest.php deleted file mode 100644 index a486f62..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Helper/DialogHelperTest.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Helper; - -use Symfony\Component\Console\Helper\DialogHelper; -use Symfony\Component\Console\Helper\HelperSet; -use Symfony\Component\Console\Helper\FormatterHelper; -use Symfony\Component\Console\Output\StreamOutput; - -class DialogHelperTest extends \PHPUnit_Framework_TestCase -{ - public function testAsk() - { - $dialog = new DialogHelper(); - - $dialog->setInputStream($this->getInputStream("\n8AM\n")); - - $this->assertEquals('2PM', $dialog->ask($this->getOutputStream(), 'What time is it?', '2PM')); - $this->assertEquals('8AM', $dialog->ask($output = $this->getOutputStream(), 'What time is it?', '2PM')); - - rewind($output->getStream()); - $this->assertEquals('What time is it?', stream_get_contents($output->getStream())); - } - - public function testAskConfirmation() - { - $dialog = new DialogHelper(); - - $dialog->setInputStream($this->getInputStream("\n\n")); - $this->assertTrue($dialog->askConfirmation($this->getOutputStream(), 'Do you like French fries?')); - $this->assertFalse($dialog->askConfirmation($this->getOutputStream(), 'Do you like French fries?', false)); - - $dialog->setInputStream($this->getInputStream("y\nyes\n")); - $this->assertTrue($dialog->askConfirmation($this->getOutputStream(), 'Do you like French fries?', false)); - $this->assertTrue($dialog->askConfirmation($this->getOutputStream(), 'Do you like French fries?', false)); - - $dialog->setInputStream($this->getInputStream("n\nno\n")); - $this->assertFalse($dialog->askConfirmation($this->getOutputStream(), 'Do you like French fries?', true)); - $this->assertFalse($dialog->askConfirmation($this->getOutputStream(), 'Do you like French fries?', true)); - } - - public function testAskAndValidate() - { - $dialog = new DialogHelper(); - $helperSet = new HelperSet(array(new FormatterHelper())); - $dialog->setHelperSet($helperSet); - - $question ='What color was the white horse of Henry IV?'; - $error = 'This is not a color!'; - $validator = function ($color) use ($error) { - if (!in_array($color, array('white', 'black'))) { - throw new \InvalidArgumentException($error); - } - - return $color; - }; - - $dialog->setInputStream($this->getInputStream("\nblack\n")); - $this->assertEquals('white', $dialog->askAndValidate($this->getOutputStream(), $question, $validator, 2, 'white')); - $this->assertEquals('black', $dialog->askAndValidate($this->getOutputStream(), $question, $validator, 2, 'white')); - - $dialog->setInputStream($this->getInputStream("green\nyellow\norange\n")); - try { - $this->assertEquals('white', $dialog->askAndValidate($this->getOutputStream(), $question, $validator, 2, 'white')); - $this->fail(); - } catch (\InvalidArgumentException $e) { - $this->assertEquals($error, $e->getMessage()); - } - } - - protected function getInputStream($input) - { - $stream = fopen('php://memory', 'r+', false); - fputs($stream, $input); - rewind($stream); - - return $stream; - } - - protected function getOutputStream() - { - return new StreamOutput(fopen('php://memory', 'r+', false)); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Helper/FormatterHelperTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Helper/FormatterHelperTest.php deleted file mode 100644 index 430c077..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Helper/FormatterHelperTest.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Helper; - -use Symfony\Component\Console\Helper\FormatterHelper; - -class FormatterHelperTest extends \PHPUnit_Framework_TestCase -{ - public function testFormatSection() - { - $formatter = new FormatterHelper(); - - $this->assertEquals( - '[cli] Some text to display', - $formatter->formatSection('cli', 'Some text to display'), - '::formatSection() formats a message in a section' - ); - } - - public function testFormatBlock() - { - $formatter = new FormatterHelper(); - - $this->assertEquals( - ' Some text to display ', - $formatter->formatBlock('Some text to display', 'error'), - '::formatBlock() formats a message in a block' - ); - - $this->assertEquals( - ' Some text to display ' . "\n" . - ' foo bar ', - $formatter->formatBlock(array('Some text to display', 'foo bar'), 'error'), - '::formatBlock() formats a message in a block' - ); - - $this->assertEquals( - ' ' . "\n" . - ' Some text to display ' . "\n" . - ' ', - $formatter->formatBlock('Some text to display', 'error', true), - '::formatBlock() formats a message in a block' - ); - } - - public function testFormatBlockWithDiacriticLetters() - { - if (!extension_loaded('mbstring')) { - $this->markTestSkipped('This test requires mbstring to work.'); - } - - $formatter = new FormatterHelper(); - - $this->assertEquals( - ' ' . "\n" . - ' Du texte à afficher ' . "\n" . - ' ', - $formatter->formatBlock('Du texte à afficher', 'error', true), - '::formatBlock() formats a message in a block' - ); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/ArgvInputTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/ArgvInputTest.php deleted file mode 100644 index cf63177..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/ArgvInputTest.php +++ /dev/null @@ -1,217 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Input; - -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; - -class ArgvInputTest extends \PHPUnit_Framework_TestCase -{ - public function testConstructor() - { - $_SERVER['argv'] = array('cli.php', 'foo'); - $input = new ArgvInput(); - $r = new \ReflectionObject($input); - $p = $r->getProperty('tokens'); - $p->setAccessible(true); - - $this->assertEquals(array('foo'), $p->getValue($input), '__construct() automatically get its input from the argv server variable'); - } - - public function testParser() - { - $input = new ArgvInput(array('cli.php', 'foo')); - $input->bind(new InputDefinition(array(new InputArgument('name')))); - $this->assertEquals(array('name' => 'foo'), $input->getArguments(), '->parse() parses required arguments'); - - $input->bind(new InputDefinition(array(new InputArgument('name')))); - $this->assertEquals(array('name' => 'foo'), $input->getArguments(), '->parse() is stateless'); - - $input = new ArgvInput(array('cli.php', '--foo')); - $input->bind(new InputDefinition(array(new InputOption('foo')))); - $this->assertEquals(array('foo' => true), $input->getOptions(), '->parse() parses long options without a value'); - - $input = new ArgvInput(array('cli.php', '--foo=bar')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED)))); - $this->assertEquals(array('foo' => 'bar'), $input->getOptions(), '->parse() parses long options with a required value (with a = separator)'); - - $input = new ArgvInput(array('cli.php', '--foo', 'bar')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED)))); - $this->assertEquals(array('foo' => 'bar'), $input->getOptions(), '->parse() parses long options with a required value (with a space separator)'); - - try { - $input = new ArgvInput(array('cli.php', '--foo')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED)))); - $this->fail('->parse() throws a \RuntimeException if no value is passed to an option when it is required'); - } catch (\Exception $e) { - $this->assertInstanceOf('\RuntimeException', $e, '->parse() throws a \RuntimeException if no value is passed to an option when it is required'); - $this->assertEquals('The "--foo" option requires a value.', $e->getMessage(), '->parse() throws a \RuntimeException if no value is passed to an option when it is required'); - } - - $input = new ArgvInput(array('cli.php', '-f')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f')))); - $this->assertEquals(array('foo' => true), $input->getOptions(), '->parse() parses short options without a value'); - - $input = new ArgvInput(array('cli.php', '-fbar')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED)))); - $this->assertEquals(array('foo' => 'bar'), $input->getOptions(), '->parse() parses short options with a required value (with no separator)'); - - $input = new ArgvInput(array('cli.php', '-f', 'bar')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED)))); - $this->assertEquals(array('foo' => 'bar'), $input->getOptions(), '->parse() parses short options with a required value (with a space separator)'); - - $input = new ArgvInput(array('cli.php', '-f', '-b', 'foo')); - $input->bind(new InputDefinition(array(new InputArgument('name'), new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputOption('bar', 'b')))); - $this->assertEquals(array('foo' => null, 'bar' => true), $input->getOptions(), '->parse() parses short options with an optional value which is not present'); - - try { - $input = new ArgvInput(array('cli.php', '-f')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED)))); - $this->fail('->parse() throws a \RuntimeException if no value is passed to an option when it is required'); - } catch (\Exception $e) { - $this->assertInstanceOf('\RuntimeException', $e, '->parse() throws a \RuntimeException if no value is passed to an option when it is required'); - $this->assertEquals('The "--foo" option requires a value.', $e->getMessage(), '->parse() throws a \RuntimeException if no value is passed to an option when it is required'); - } - - try { - $input = new ArgvInput(array('cli.php', '-ffoo')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_NONE)))); - $this->fail('->parse() throws a \RuntimeException if a value is passed to an option which does not take one'); - } catch (\Exception $e) { - $this->assertInstanceOf('\RuntimeException', $e, '->parse() throws a \RuntimeException if a value is passed to an option which does not take one'); - $this->assertEquals('The "-o" option does not exist.', $e->getMessage(), '->parse() throws a \RuntimeException if a value is passed to an option which does not take one'); - } - - try { - $input = new ArgvInput(array('cli.php', 'foo', 'bar')); - $input->bind(new InputDefinition()); - $this->fail('->parse() throws a \RuntimeException if too many arguments are passed'); - } catch (\Exception $e) { - $this->assertInstanceOf('\RuntimeException', $e, '->parse() throws a \RuntimeException if too many arguments are passed'); - $this->assertEquals('Too many arguments.', $e->getMessage(), '->parse() throws a \RuntimeException if too many arguments are passed'); - } - - try { - $input = new ArgvInput(array('cli.php', '--foo')); - $input->bind(new InputDefinition()); - $this->fail('->parse() throws a \RuntimeException if an unknown long option is passed'); - } catch (\Exception $e) { - $this->assertInstanceOf('\RuntimeException', $e, '->parse() throws a \RuntimeException if an unknown long option is passed'); - $this->assertEquals('The "--foo" option does not exist.', $e->getMessage(), '->parse() throws a \RuntimeException if an unknown long option is passed'); - } - - try { - $input = new ArgvInput(array('cli.php', '-f')); - $input->bind(new InputDefinition()); - $this->fail('->parse() throws a \RuntimeException if an unknown short option is passed'); - } catch (\Exception $e) { - $this->assertInstanceOf('\RuntimeException', $e, '->parse() throws a \RuntimeException if an unknown short option is passed'); - $this->assertEquals('The "-f" option does not exist.', $e->getMessage(), '->parse() throws a \RuntimeException if an unknown short option is passed'); - } - - $input = new ArgvInput(array('cli.php', '-fb')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b')))); - $this->assertEquals(array('foo' => true, 'bar' => true), $input->getOptions(), '->parse() parses short options when they are aggregated as a single one'); - - $input = new ArgvInput(array('cli.php', '-fb', 'bar')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::VALUE_REQUIRED)))); - $this->assertEquals(array('foo' => true, 'bar' => 'bar'), $input->getOptions(), '->parse() parses short options when they are aggregated as a single one and the last one has a required value'); - - $input = new ArgvInput(array('cli.php', '-fb', 'bar')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::VALUE_OPTIONAL)))); - $this->assertEquals(array('foo' => true, 'bar' => 'bar'), $input->getOptions(), '->parse() parses short options when they are aggregated as a single one and the last one has an optional value'); - - $input = new ArgvInput(array('cli.php', '-fbbar')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::VALUE_OPTIONAL)))); - $this->assertEquals(array('foo' => true, 'bar' => 'bar'), $input->getOptions(), '->parse() parses short options when they are aggregated as a single one and the last one has an optional value with no separator'); - - $input = new ArgvInput(array('cli.php', '-fbbar')); - $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputOption('bar', 'b', InputOption::VALUE_OPTIONAL)))); - $this->assertEquals(array('foo' => 'bbar', 'bar' => null), $input->getOptions(), '->parse() parses short options when they are aggregated as a single one and one of them takes a value'); - - try { - $input = new ArgvInput(array('cli.php', 'foo', 'bar', 'baz', 'bat')); - $input->bind(new InputDefinition(array(new InputArgument('name', InputArgument::IS_ARRAY)))); - $this->assertEquals(array('name' => array('foo', 'bar', 'baz', 'bat')), $input->getArguments(), '->parse() parses array arguments'); - } catch (\RuntimeException $e) { - $this->assertNotEquals('Too many arguments.', $e->getMessage(), '->parse() parses array arguments'); - } - - $input = new ArgvInput(array('cli.php', '--name=foo', '--name=bar', '--name=baz')); - $input->bind(new InputDefinition(array(new InputOption('name', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY)))); - $this->assertEquals(array('name' => array('foo', 'bar', 'baz')), $input->getOptions()); - - try { - $input = new ArgvInput(array('cli.php', '-1')); - $input->bind(new InputDefinition(array(new InputArgument('number')))); - $this->fail('->parse() throws a \RuntimeException if an unknown option is passed'); - } catch (\Exception $e) { - $this->assertInstanceOf('\RuntimeException', $e, '->parse() parses arguments with leading dashes as options without having encountered a double-dash sequence'); - $this->assertEquals('The "-1" option does not exist.', $e->getMessage(), '->parse() parses arguments with leading dashes as options without having encountered a double-dash sequence'); - } - - $input = new ArgvInput(array('cli.php', '--', '-1')); - $input->bind(new InputDefinition(array(new InputArgument('number')))); - $this->assertEquals(array('number' => '-1'), $input->getArguments(), '->parse() parses arguments with leading dashes as arguments after having encountered a double-dash sequence'); - - $input = new ArgvInput(array('cli.php', '-f', 'bar', '--', '-1')); - $input->bind(new InputDefinition(array(new InputArgument('number'), new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL)))); - $this->assertEquals(array('foo' => 'bar'), $input->getOptions(), '->parse() parses arguments with leading dashes as options before having encountered a double-dash sequence'); - $this->assertEquals(array('number' => '-1'), $input->getArguments(), '->parse() parses arguments with leading dashes as arguments after having encountered a double-dash sequence'); - - $input = new ArgvInput(array('cli.php', '-f', 'bar', '')); - $input->bind(new InputDefinition(array(new InputArgument('empty'), new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL)))); - $this->assertEquals(array('empty' => ''), $input->getArguments(), '->parse() parses empty string arguments'); - } - - public function testGetFirstArgument() - { - $input = new ArgvInput(array('cli.php', '-fbbar')); - $this->assertEquals('', $input->getFirstArgument(), '->getFirstArgument() returns the first argument from the raw input'); - - $input = new ArgvInput(array('cli.php', '-fbbar', 'foo')); - $this->assertEquals('foo', $input->getFirstArgument(), '->getFirstArgument() returns the first argument from the raw input'); - } - - public function testHasParameterOption() - { - $input = new ArgvInput(array('cli.php', '-f', 'foo')); - $this->assertTrue($input->hasParameterOption('-f'), '->hasParameterOption() returns true if the given short option is in the raw input'); - - $input = new ArgvInput(array('cli.php', '--foo', 'foo')); - $this->assertTrue($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if the given short option is in the raw input'); - - $input = new ArgvInput(array('cli.php', 'foo')); - $this->assertFalse($input->hasParameterOption('--foo'), '->hasParameterOption() returns false if the given short option is not in the raw input'); - } - - /** - * @dataProvider provideGetParameterOptionValues - */ - public function testGetParameterOptionEqualSign($argv, $key, $expected) - { - $input = new ArgvInput($argv); - $this->assertEquals($expected, $input->getParameterOption($key), '->getParameterOption() returns the expected value'); - } - - public function provideGetParameterOptionValues() - { - return array( - array(array('app/console', 'foo:bar', '-e', 'dev'), '-e', 'dev'), - array(array('app/console', 'foo:bar', '--env=dev'), '--env', 'dev'), - array(array('app/console', 'foo:bar', '-e', 'dev'), array('-e', '--env'), 'dev'), - array(array('app/console', 'foo:bar', '--env=dev'), array('-e', '--env'), 'dev'), - ); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/ArrayInputTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/ArrayInputTest.php deleted file mode 100644 index 82f477e..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/ArrayInputTest.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Input; - -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; - -class ArrayInputTest extends \PHPUnit_Framework_TestCase -{ - public function testGetFirstArgument() - { - $input = new ArrayInput(array()); - $this->assertNull($input->getFirstArgument(), '->getFirstArgument() returns null if no argument were passed'); - $input = new ArrayInput(array('name' => 'Fabien')); - $this->assertEquals('Fabien', $input->getFirstArgument(), '->getFirstArgument() returns the first passed argument'); - $input = new ArrayInput(array('--foo' => 'bar', 'name' => 'Fabien')); - $this->assertEquals('Fabien', $input->getFirstArgument(), '->getFirstArgument() returns the first passed argument'); - } - - public function testHasParameterOption() - { - $input = new ArrayInput(array('name' => 'Fabien', '--foo' => 'bar')); - $this->assertTrue($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if an option is present in the passed parameters'); - $this->assertFalse($input->hasParameterOption('--bar'), '->hasParameterOption() returns false if an option is not present in the passed parameters'); - - $input = new ArrayInput(array('--foo')); - $this->assertTrue($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if an option is present in the passed parameters'); - } - - public function testParse() - { - $input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name')))); - $this->assertEquals(array('name' => 'foo'), $input->getArguments(), '->parse() parses required arguments'); - - try { - $input = new ArrayInput(array('foo' => 'foo'), new InputDefinition(array(new InputArgument('name')))); - $this->fail('->parse() throws an \InvalidArgumentException exception if an invalid argument is passed'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->parse() throws an \InvalidArgumentException exception if an invalid argument is passed'); - $this->assertEquals('The "foo" argument does not exist.', $e->getMessage(), '->parse() throws an \InvalidArgumentException exception if an invalid argument is passed'); - } - - $input = new ArrayInput(array('--foo' => 'bar'), new InputDefinition(array(new InputOption('foo')))); - $this->assertEquals(array('foo' => 'bar'), $input->getOptions(), '->parse() parses long options'); - - $input = new ArrayInput(array('--foo' => 'bar'), new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL, '', 'default')))); - $this->assertEquals(array('foo' => 'bar'), $input->getOptions(), '->parse() parses long options with a default value'); - - $input = new ArrayInput(array('--foo' => null), new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL, '', 'default')))); - $this->assertEquals(array('foo' => 'default'), $input->getOptions(), '->parse() parses long options with a default value'); - - try { - $input = new ArrayInput(array('--foo' => null), new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED)))); - $this->fail('->parse() throws an \InvalidArgumentException exception if a required option is passed without a value'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->parse() throws an \InvalidArgumentException exception if a required option is passed without a value'); - $this->assertEquals('The "--foo" option requires a value.', $e->getMessage(), '->parse() throws an \InvalidArgumentException exception if a required option is passed without a value'); - } - - try { - $input = new ArrayInput(array('--foo' => 'foo'), new InputDefinition()); - $this->fail('->parse() throws an \InvalidArgumentException exception if an invalid option is passed'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->parse() throws an \InvalidArgumentException exception if an invalid option is passed'); - $this->assertEquals('The "--foo" option does not exist.', $e->getMessage(), '->parse() throws an \InvalidArgumentException exception if an invalid option is passed'); - } - - $input = new ArrayInput(array('-f' => 'bar'), new InputDefinition(array(new InputOption('foo', 'f')))); - $this->assertEquals(array('foo' => 'bar'), $input->getOptions(), '->parse() parses short options'); - - try { - $input = new ArrayInput(array('-o' => 'foo'), new InputDefinition()); - $this->fail('->parse() throws an \InvalidArgumentException exception if an invalid option is passed'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->parse() throws an \InvalidArgumentException exception if an invalid option is passed'); - $this->assertEquals('The "-o" option does not exist.', $e->getMessage(), '->parse() throws an \InvalidArgumentException exception if an invalid option is passed'); - } - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputArgumentTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputArgumentTest.php deleted file mode 100644 index 1b680a9..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputArgumentTest.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Input; - -use Symfony\Component\Console\Input\InputArgument; - -class InputArgumentTest extends \PHPUnit_Framework_TestCase -{ - public function testConstructor() - { - $argument = new InputArgument('foo'); - $this->assertEquals('foo', $argument->getName(), '__construct() takes a name as its first argument'); - - // mode argument - $argument = new InputArgument('foo'); - $this->assertFalse($argument->isRequired(), '__construct() gives a "InputArgument::OPTIONAL" mode by default'); - - $argument = new InputArgument('foo', null); - $this->assertFalse($argument->isRequired(), '__construct() can take "InputArgument::OPTIONAL" as its mode'); - - $argument = new InputArgument('foo', InputArgument::OPTIONAL); - $this->assertFalse($argument->isRequired(), '__construct() can take "InputArgument::OPTIONAL" as its mode'); - - $argument = new InputArgument('foo', InputArgument::REQUIRED); - $this->assertTrue($argument->isRequired(), '__construct() can take "InputArgument::REQUIRED" as its mode'); - - try { - $argument = new InputArgument('foo', 'ANOTHER_ONE'); - $this->fail('__construct() throws an Exception if the mode is not valid'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '__construct() throws an Exception if the mode is not valid'); - $this->assertEquals('Argument mode "ANOTHER_ONE" is not valid.', $e->getMessage()); - } - try { - $argument = new InputArgument('foo', -1); - $this->fail('__construct() throws an Exception if the mode is not valid'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '__construct() throws an Exception if the mode is not valid'); - $this->assertEquals('Argument mode "-1" is not valid.', $e->getMessage()); - } - } - - public function testIsArray() - { - $argument = new InputArgument('foo', InputArgument::IS_ARRAY); - $this->assertTrue($argument->isArray(), '->isArray() returns true if the argument can be an array'); - $argument = new InputArgument('foo', InputArgument::OPTIONAL | InputArgument::IS_ARRAY); - $this->assertTrue($argument->isArray(), '->isArray() returns true if the argument can be an array'); - $argument = new InputArgument('foo', InputArgument::OPTIONAL); - $this->assertFalse($argument->isArray(), '->isArray() returns false if the argument can not be an array'); - } - - public function testGetDescription() - { - $argument = new InputArgument('foo', null, 'Some description'); - $this->assertEquals('Some description', $argument->getDescription(), '->getDescription() return the message description'); - } - - public function testGetDefault() - { - $argument = new InputArgument('foo', InputArgument::OPTIONAL, '', 'default'); - $this->assertEquals('default', $argument->getDefault(), '->getDefault() return the default value'); - } - - public function testSetDefault() - { - $argument = new InputArgument('foo', InputArgument::OPTIONAL, '', 'default'); - $argument->setDefault(null); - $this->assertNull($argument->getDefault(), '->setDefault() can reset the default value by passing null'); - $argument->setDefault('another'); - $this->assertEquals('another', $argument->getDefault(), '->setDefault() changes the default value'); - - $argument = new InputArgument('foo', InputArgument::OPTIONAL | InputArgument::IS_ARRAY); - $argument->setDefault(array(1, 2)); - $this->assertEquals(array(1, 2), $argument->getDefault(), '->setDefault() changes the default value'); - - try { - $argument = new InputArgument('foo', InputArgument::REQUIRED); - $argument->setDefault('default'); - $this->fail('->setDefault() throws an Exception if you give a default value for a required argument'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->parse() throws an \InvalidArgumentException exception if an invalid option is passed'); - $this->assertEquals('Cannot set a default value except for Parameter::OPTIONAL mode.', $e->getMessage()); - } - - try { - $argument = new InputArgument('foo', InputArgument::IS_ARRAY); - $argument->setDefault('default'); - $this->fail('->setDefault() throws an Exception if you give a default value which is not an array for a IS_ARRAY option'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->setDefault() throws an Exception if you give a default value which is not an array for a IS_ARRAY option'); - $this->assertEquals('A default value for an array argument must be an array.', $e->getMessage()); - } - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputDefinitionTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputDefinitionTest.php deleted file mode 100644 index 2b339f0..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputDefinitionTest.php +++ /dev/null @@ -1,364 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Input; - -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; - -class InputDefinitionTest extends \PHPUnit_Framework_TestCase -{ - static protected $fixtures; - - protected $foo, $bar, $foo1, $foo2; - - static public function setUpBeforeClass() - { - self::$fixtures = __DIR__.'/../Fixtures/'; - } - - public function testConstructor() - { - $this->initializeArguments(); - - $definition = new InputDefinition(); - $this->assertEquals(array(), $definition->getArguments(), '__construct() creates a new InputDefinition object'); - - $definition = new InputDefinition(array($this->foo, $this->bar)); - $this->assertEquals(array('foo' => $this->foo, 'bar' => $this->bar), $definition->getArguments(), '__construct() takes an array of InputArgument objects as its first argument'); - - $this->initializeOptions(); - - $definition = new InputDefinition(); - $this->assertEquals(array(), $definition->getOptions(), '__construct() creates a new InputDefinition object'); - - $definition = new InputDefinition(array($this->foo, $this->bar)); - $this->assertEquals(array('foo' => $this->foo, 'bar' => $this->bar), $definition->getOptions(), '__construct() takes an array of InputOption objects as its first argument'); - } - - public function testSetArguments() - { - $this->initializeArguments(); - - $definition = new InputDefinition(); - $definition->setArguments(array($this->foo)); - $this->assertEquals(array('foo' => $this->foo), $definition->getArguments(), '->setArguments() sets the array of InputArgument objects'); - $definition->setArguments(array($this->bar)); - - $this->assertEquals(array('bar' => $this->bar), $definition->getArguments(), '->setArguments() clears all InputArgument objects'); - } - - public function testAddArguments() - { - $this->initializeArguments(); - - $definition = new InputDefinition(); - $definition->addArguments(array($this->foo)); - $this->assertEquals(array('foo' => $this->foo), $definition->getArguments(), '->addArguments() adds an array of InputArgument objects'); - $definition->addArguments(array($this->bar)); - $this->assertEquals(array('foo' => $this->foo, 'bar' => $this->bar), $definition->getArguments(), '->addArguments() does not clear existing InputArgument objects'); - } - - public function testAddArgument() - { - $this->initializeArguments(); - - $definition = new InputDefinition(); - $definition->addArgument($this->foo); - $this->assertEquals(array('foo' => $this->foo), $definition->getArguments(), '->addArgument() adds a InputArgument object'); - $definition->addArgument($this->bar); - $this->assertEquals(array('foo' => $this->foo, 'bar' => $this->bar), $definition->getArguments(), '->addArgument() adds a InputArgument object'); - - // arguments must have different names - try { - $definition->addArgument($this->foo1); - $this->fail('->addArgument() throws a Exception if another argument is already registered with the same name'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->addArgument() throws a Exception if another argument is already registered with the same name'); - $this->assertEquals('An argument with name "foo" already exists.', $e->getMessage()); - } - - // cannot add a parameter after an array parameter - $definition->addArgument(new InputArgument('fooarray', InputArgument::IS_ARRAY)); - try { - $definition->addArgument(new InputArgument('anotherbar')); - $this->fail('->addArgument() throws a Exception if there is an array parameter already registered'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->addArgument() throws a Exception if there is an array parameter already registered'); - $this->assertEquals('Cannot add an argument after an array argument.', $e->getMessage()); - } - - - // cannot add a required argument after an optional one - $definition = new InputDefinition(); - $definition->addArgument($this->foo); - try { - $definition->addArgument($this->foo2); - $this->fail('->addArgument() throws an exception if you try to add a required argument after an optional one'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->addArgument() throws an exception if you try to add a required argument after an optional one'); - $this->assertEquals('Cannot add a required argument after an optional one.', $e->getMessage()); - } - } - - public function testGetArgument() - { - $this->initializeArguments(); - - $definition = new InputDefinition(); - $definition->addArguments(array($this->foo)); - $this->assertEquals($this->foo, $definition->getArgument('foo'), '->getArgument() returns a InputArgument by its name'); - try { - $definition->getArgument('bar'); - $this->fail('->getArgument() throws an exception if the InputArgument name does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->getArgument() throws an exception if the InputArgument name does not exist'); - $this->assertEquals('The "bar" argument does not exist.', $e->getMessage()); - } - } - - public function testHasArgument() - { - $this->initializeArguments(); - - $definition = new InputDefinition(); - $definition->addArguments(array($this->foo)); - $this->assertTrue($definition->hasArgument('foo'), '->hasArgument() returns true if a InputArgument exists for the given name'); - $this->assertFalse($definition->hasArgument('bar'), '->hasArgument() returns false if a InputArgument exists for the given name'); - } - - public function testGetArgumentRequiredCount() - { - $this->initializeArguments(); - - $definition = new InputDefinition(); - $definition->addArgument($this->foo2); - $this->assertEquals(1, $definition->getArgumentRequiredCount(), '->getArgumentRequiredCount() returns the number of required arguments'); - $definition->addArgument($this->foo); - $this->assertEquals(1, $definition->getArgumentRequiredCount(), '->getArgumentRequiredCount() returns the number of required arguments'); - } - - public function testGetArgumentCount() - { - $this->initializeArguments(); - - $definition = new InputDefinition(); - $definition->addArgument($this->foo2); - $this->assertEquals(1, $definition->getArgumentCount(), '->getArgumentCount() returns the number of arguments'); - $definition->addArgument($this->foo); - $this->assertEquals(2, $definition->getArgumentCount(), '->getArgumentCount() returns the number of arguments'); - } - - public function testGetArgumentDefaults() - { - $definition = new InputDefinition(array( - new InputArgument('foo1', InputArgument::OPTIONAL), - new InputArgument('foo2', InputArgument::OPTIONAL, '', 'default'), - new InputArgument('foo3', InputArgument::OPTIONAL | InputArgument::IS_ARRAY), - // new InputArgument('foo4', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, '', array(1, 2)), - )); - $this->assertEquals(array('foo1' => null, 'foo2' => 'default', 'foo3' => array()), $definition->getArgumentDefaults(), '->getArgumentDefaults() return the default values for each argument'); - - $definition = new InputDefinition(array( - new InputArgument('foo4', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, '', array(1, 2)), - )); - $this->assertEquals(array('foo4' => array(1, 2)), $definition->getArgumentDefaults(), '->getArgumentDefaults() return the default values for each argument'); - } - - public function testSetOptions() - { - $this->initializeOptions(); - - $definition = new InputDefinition(array($this->foo)); - $this->assertEquals(array('foo' => $this->foo), $definition->getOptions(), '->setOptions() sets the array of InputOption objects'); - $definition->setOptions(array($this->bar)); - $this->assertEquals(array('bar' => $this->bar), $definition->getOptions(), '->setOptions() clears all InputOption objects'); - try { - $definition->getOptionForShortcut('f'); - $this->fail('->setOptions() clears all InputOption objects'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->setOptions() clears all InputOption objects'); - $this->assertEquals('The "-f" option does not exist.', $e->getMessage()); - } - } - - public function testAddOptions() - { - $this->initializeOptions(); - - $definition = new InputDefinition(array($this->foo)); - $this->assertEquals(array('foo' => $this->foo), $definition->getOptions(), '->addOptions() adds an array of InputOption objects'); - $definition->addOptions(array($this->bar)); - $this->assertEquals(array('foo' => $this->foo, 'bar' => $this->bar), $definition->getOptions(), '->addOptions() does not clear existing InputOption objects'); - } - - public function testAddOption() - { - $this->initializeOptions(); - - $definition = new InputDefinition(); - $definition->addOption($this->foo); - $this->assertEquals(array('foo' => $this->foo), $definition->getOptions(), '->addOption() adds a InputOption object'); - $definition->addOption($this->bar); - $this->assertEquals(array('foo' => $this->foo, 'bar' => $this->bar), $definition->getOptions(), '->addOption() adds a InputOption object'); - try { - $definition->addOption($this->foo2); - $this->fail('->addOption() throws a Exception if the another option is already registered with the same name'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->addOption() throws a Exception if the another option is already registered with the same name'); - $this->assertEquals('An option named "foo" already exists.', $e->getMessage()); - } - try { - $definition->addOption($this->foo1); - $this->fail('->addOption() throws a Exception if the another option is already registered with the same shortcut'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->addOption() throws a Exception if the another option is already registered with the same shortcut'); - $this->assertEquals('An option with shortcut "f" already exists.', $e->getMessage()); - } - } - - public function testGetOption() - { - $this->initializeOptions(); - - $definition = new InputDefinition(array($this->foo)); - $this->assertEquals($this->foo, $definition->getOption('foo'), '->getOption() returns a InputOption by its name'); - try { - $definition->getOption('bar'); - $this->fail('->getOption() throws an exception if the option name does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->getOption() throws an exception if the option name does not exist'); - $this->assertEquals('The "--bar" option does not exist.', $e->getMessage()); - } - } - - public function testHasOption() - { - $this->initializeOptions(); - - $definition = new InputDefinition(array($this->foo)); - $this->assertTrue($definition->hasOption('foo'), '->hasOption() returns true if a InputOption exists for the given name'); - $this->assertFalse($definition->hasOption('bar'), '->hasOption() returns false if a InputOption exists for the given name'); - } - - public function testHasShortcut() - { - $this->initializeOptions(); - - $definition = new InputDefinition(array($this->foo)); - $this->assertTrue($definition->hasShortcut('f'), '->hasShortcut() returns true if a InputOption exists for the given shortcut'); - $this->assertFalse($definition->hasShortcut('b'), '->hasShortcut() returns false if a InputOption exists for the given shortcut'); - } - - public function testGetOptionForShortcut() - { - $this->initializeOptions(); - - $definition = new InputDefinition(array($this->foo)); - $this->assertEquals($this->foo, $definition->getOptionForShortcut('f'), '->getOptionForShortcut() returns a InputOption by its shortcut'); - try { - $definition->getOptionForShortcut('l'); - $this->fail('->getOption() throws an exception if the shortcut does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->getOption() throws an exception if the shortcut does not exist'); - $this->assertEquals('The "-l" option does not exist.', $e->getMessage()); - } - } - - public function testGetOptionDefaults() - { - $definition = new InputDefinition(array( - new InputOption('foo1', null, InputOption::VALUE_NONE), - new InputOption('foo2', null, InputOption::VALUE_REQUIRED), - new InputOption('foo3', null, InputOption::VALUE_REQUIRED, '', 'default'), - new InputOption('foo4', null, InputOption::VALUE_OPTIONAL), - new InputOption('foo5', null, InputOption::VALUE_OPTIONAL, '', 'default'), - new InputOption('foo6', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY), - new InputOption('foo7', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, '', array(1, 2)), - )); - $defaults = array( - 'foo1' => null, - 'foo2' => null, - 'foo3' => 'default', - 'foo4' => null, - 'foo5' => 'default', - 'foo6' => array(), - 'foo7' => array(1, 2), - ); - $this->assertEquals($defaults, $definition->getOptionDefaults(), '->getOptionDefaults() returns the default values for all options'); - } - - public function testGetSynopsis() - { - $definition = new InputDefinition(array(new InputOption('foo'))); - $this->assertEquals('[--foo]', $definition->getSynopsis(), '->getSynopsis() returns a synopsis of arguments and options'); - $definition = new InputDefinition(array(new InputOption('foo', 'f'))); - $this->assertEquals('[-f|--foo]', $definition->getSynopsis(), '->getSynopsis() returns a synopsis of arguments and options'); - $definition = new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED))); - $this->assertEquals('[-f|--foo="..."]', $definition->getSynopsis(), '->getSynopsis() returns a synopsis of arguments and options'); - $definition = new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL))); - $this->assertEquals('[-f|--foo[="..."]]', $definition->getSynopsis(), '->getSynopsis() returns a synopsis of arguments and options'); - - $definition = new InputDefinition(array(new InputArgument('foo'))); - $this->assertEquals('[foo]', $definition->getSynopsis(), '->getSynopsis() returns a synopsis of arguments and options'); - $definition = new InputDefinition(array(new InputArgument('foo', InputArgument::REQUIRED))); - $this->assertEquals('foo', $definition->getSynopsis(), '->getSynopsis() returns a synopsis of arguments and options'); - $definition = new InputDefinition(array(new InputArgument('foo', InputArgument::IS_ARRAY))); - $this->assertEquals('[foo1] ... [fooN]', $definition->getSynopsis(), '->getSynopsis() returns a synopsis of arguments and options'); - $definition = new InputDefinition(array(new InputArgument('foo', InputArgument::REQUIRED | InputArgument::IS_ARRAY))); - $this->assertEquals('foo1 ... [fooN]', $definition->getSynopsis(), '->getSynopsis() returns a synopsis of arguments and options'); - } - - public function testAsText() - { - $definition = new InputDefinition(array( - new InputArgument('foo', InputArgument::OPTIONAL, 'The foo argument'), - new InputArgument('baz', InputArgument::OPTIONAL, 'The baz argument', true), - new InputArgument('bar', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'The bar argument', array('bar')), - new InputOption('foo', 'f', InputOption::VALUE_REQUIRED, 'The foo option'), - new InputOption('baz', null, InputOption::VALUE_OPTIONAL, 'The baz option', false), - new InputOption('bar', 'b', InputOption::VALUE_OPTIONAL, 'The bar option', 'bar'), - new InputOption('qux', '', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The qux option', array('foo', 'bar')), - new InputOption('qux2', '', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The qux2 option', array('foo' => 'bar')), - )); - $this->assertStringEqualsFile(self::$fixtures.'/definition_astext.txt', $definition->asText(), '->asText() returns a textual representation of the InputDefinition'); - } - - public function testAsXml() - { - $definition = new InputDefinition(array( - new InputArgument('foo', InputArgument::OPTIONAL, 'The foo argument'), - new InputArgument('baz', InputArgument::OPTIONAL, 'The baz argument', true), - new InputArgument('bar', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'The bar argument', array('bar')), - new InputOption('foo', 'f', InputOption::VALUE_REQUIRED, 'The foo option'), - new InputOption('baz', null, InputOption::VALUE_OPTIONAL, 'The baz option', false), - new InputOption('bar', 'b', InputOption::VALUE_OPTIONAL, 'The bar option', 'bar'), - )); - $this->assertXmlStringEqualsXmlFile(self::$fixtures.'/definition_asxml.txt', $definition->asXml(), '->asText() returns a textual representation of the InputDefinition'); - } - - protected function initializeArguments() - { - $this->foo = new InputArgument('foo'); - $this->bar = new InputArgument('bar'); - $this->foo1 = new InputArgument('foo'); - $this->foo2 = new InputArgument('foo2', InputArgument::REQUIRED); - } - - protected function initializeOptions() - { - $this->foo = new InputOption('foo', 'f'); - $this->bar = new InputOption('bar', 'b'); - $this->foo1 = new InputOption('fooBis', 'f'); - $this->foo2 = new InputOption('foo', 'p'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputOptionTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputOptionTest.php deleted file mode 100644 index b5d8b43..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputOptionTest.php +++ /dev/null @@ -1,192 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Input; - -use Symfony\Component\Console\Input\InputOption; - -class InputOptionTest extends \PHPUnit_Framework_TestCase -{ - public function testConstructor() - { - $option = new InputOption('foo'); - $this->assertEquals('foo', $option->getName(), '__construct() takes a name as its first argument'); - $option = new InputOption('--foo'); - $this->assertEquals('foo', $option->getName(), '__construct() removes the leading -- of the option name'); - - try { - $option = new InputOption('foo', 'f', InputOption::VALUE_IS_ARRAY); - $this->fail('->setDefault() throws an Exception if VALUE_IS_ARRAY option is used when an option does not accept a value'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->setDefault() throws an Exception if VALUE_IS_ARRAY option is used when an option does not accept a value'); - $this->assertEquals('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.', $e->getMessage()); - } - - // shortcut argument - $option = new InputOption('foo', 'f'); - $this->assertEquals('f', $option->getShortcut(), '__construct() can take a shortcut as its second argument'); - $option = new InputOption('foo', '-f'); - $this->assertEquals('f', $option->getShortcut(), '__construct() removes the leading - of the shortcut'); - $option = new InputOption('foo'); - $this->assertNull($option->getShortcut(), '__construct() makes the shortcut null by default'); - - // mode argument - $option = new InputOption('foo', 'f'); - $this->assertFalse($option->acceptValue(), '__construct() gives a "InputOption::VALUE_NONE" mode by default'); - $this->assertFalse($option->isValueRequired(), '__construct() gives a "InputOption::VALUE_NONE" mode by default'); - $this->assertFalse($option->isValueOptional(), '__construct() gives a "InputOption::VALUE_NONE" mode by default'); - - $option = new InputOption('foo', 'f', null); - $this->assertFalse($option->acceptValue(), '__construct() can take "InputOption::VALUE_NONE" as its mode'); - $this->assertFalse($option->isValueRequired(), '__construct() can take "InputOption::VALUE_NONE" as its mode'); - $this->assertFalse($option->isValueOptional(), '__construct() can take "InputOption::VALUE_NONE" as its mode'); - - $option = new InputOption('foo', 'f', InputOption::VALUE_NONE); - $this->assertFalse($option->acceptValue(), '__construct() can take "InputOption::VALUE_NONE" as its mode'); - $this->assertFalse($option->isValueRequired(), '__construct() can take "InputOption::VALUE_NONE" as its mode'); - $this->assertFalse($option->isValueOptional(), '__construct() can take "InputOption::VALUE_NONE" as its mode'); - - $option = new InputOption('foo', 'f', InputOption::VALUE_REQUIRED); - $this->assertTrue($option->acceptValue(), '__construct() can take "InputOption::VALUE_REQUIRED" as its mode'); - $this->assertTrue($option->isValueRequired(), '__construct() can take "InputOption::VALUE_REQUIRED" as its mode'); - $this->assertFalse($option->isValueOptional(), '__construct() can take "InputOption::VALUE_REQUIRED" as its mode'); - - $option = new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL); - $this->assertTrue($option->acceptValue(), '__construct() can take "InputOption::VALUE_OPTIONAL" as its mode'); - $this->assertFalse($option->isValueRequired(), '__construct() can take "InputOption::VALUE_OPTIONAL" as its mode'); - $this->assertTrue($option->isValueOptional(), '__construct() can take "InputOption::VALUE_OPTIONAL" as its mode'); - - try { - $option = new InputOption('foo', 'f', 'ANOTHER_ONE'); - $this->fail('__construct() throws an Exception if the mode is not valid'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '__construct() throws an Exception if the mode is not valid'); - $this->assertEquals('Option mode "ANOTHER_ONE" is not valid.', $e->getMessage()); - } - try { - $option = new InputOption('foo', 'f', -1); - $this->fail('__construct() throws an Exception if the mode is not valid'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '__construct() throws an Exception if the mode is not valid'); - $this->assertEquals('Option mode "-1" is not valid.', $e->getMessage()); - } - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testEmptyNameIsInvalid() - { - new InputOption(''); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testDoubleDashNameIsInvalid() - { - new InputOption('--'); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testSingleDashOptionIsInvalid() - { - new InputOption('foo', '-'); - } - - public function testIsArray() - { - $option = new InputOption('foo', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY); - $this->assertTrue($option->isArray(), '->isArray() returns true if the option can be an array'); - $option = new InputOption('foo', null, InputOption::VALUE_NONE); - $this->assertFalse($option->isArray(), '->isArray() returns false if the option can not be an array'); - } - - public function testGetDescription() - { - $option = new InputOption('foo', 'f', null, 'Some description'); - $this->assertEquals('Some description', $option->getDescription(), '->getDescription() returns the description message'); - } - - public function testGetDefault() - { - $option = new InputOption('foo', null, InputOption::VALUE_OPTIONAL, '', 'default'); - $this->assertEquals('default', $option->getDefault(), '->getDefault() returns the default value'); - - $option = new InputOption('foo', null, InputOption::VALUE_REQUIRED, '', 'default'); - $this->assertEquals('default', $option->getDefault(), '->getDefault() returns the default value'); - - $option = new InputOption('foo', null, InputOption::VALUE_REQUIRED); - $this->assertNull($option->getDefault(), '->getDefault() returns null if no default value is configured'); - - $option = new InputOption('foo', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY); - $this->assertEquals(array(), $option->getDefault(), '->getDefault() returns an empty array if option is an array'); - - $option = new InputOption('foo', null, InputOption::VALUE_NONE); - $this->assertFalse($option->getDefault(), '->getDefault() returns false if the option does not take a value'); - } - - public function testSetDefault() - { - $option = new InputOption('foo', null, InputOption::VALUE_REQUIRED, '', 'default'); - $option->setDefault(null); - $this->assertNull($option->getDefault(), '->setDefault() can reset the default value by passing null'); - $option->setDefault('another'); - $this->assertEquals('another', $option->getDefault(), '->setDefault() changes the default value'); - - $option = new InputOption('foo', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY); - $option->setDefault(array(1, 2)); - $this->assertEquals(array(1, 2), $option->getDefault(), '->setDefault() changes the default value'); - - $option = new InputOption('foo', 'f', InputOption::VALUE_NONE); - try { - $option->setDefault('default'); - $this->fail('->setDefault() throws an Exception if you give a default value for a VALUE_NONE option'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->setDefault() throws an Exception if you give a default value for a VALUE_NONE option'); - $this->assertEquals('Cannot set a default value when using Option::VALUE_NONE mode.', $e->getMessage()); - } - - $option = new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY); - try { - $option->setDefault('default'); - $this->fail('->setDefault() throws an Exception if you give a default value which is not an array for a VALUE_IS_ARRAY option'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, '->setDefault() throws an Exception if you give a default value which is not an array for a VALUE_IS_ARRAY option'); - $this->assertEquals('A default value for an array option must be an array.', $e->getMessage()); - } - } - - public function testEquals() - { - $option = new InputOption('foo', 'f', null, 'Some description'); - $option2 = new InputOption('foo', 'f', null, 'Alternative description'); - $this->assertTrue($option->equals($option2)); - - $option = new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL, 'Some description'); - $option2 = new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL, 'Some description', true); - $this->assertFalse($option->equals($option2)); - - $option = new InputOption('foo', 'f', null, 'Some description'); - $option2 = new InputOption('bar', 'f', null, 'Some description'); - $this->assertFalse($option->equals($option2)); - - $option = new InputOption('foo', 'f', null, 'Some description'); - $option2 = new InputOption('foo', '', null, 'Some description'); - $this->assertFalse($option->equals($option2)); - - $option = new InputOption('foo', 'f', null, 'Some description'); - $option2 = new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL, 'Some description'); - $this->assertFalse($option->equals($option2)); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputTest.php deleted file mode 100644 index 779d45d..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/InputTest.php +++ /dev/null @@ -1,117 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Input; - -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; - -class InputTest extends \PHPUnit_Framework_TestCase -{ - public function testConstructor() - { - $input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name')))); - $this->assertEquals('foo', $input->getArgument('name'), '->__construct() takes a InputDefinition as an argument'); - } - - public function testOptions() - { - $input = new ArrayInput(array('--name' => 'foo'), new InputDefinition(array(new InputOption('name')))); - $this->assertEquals('foo', $input->getOption('name'), '->getOption() returns the value for the given option'); - - $input->setOption('name', 'bar'); - $this->assertEquals('bar', $input->getOption('name'), '->setOption() sets the value for a given option'); - $this->assertEquals(array('name' => 'bar'), $input->getOptions(), '->getOptions() returns all option values'); - - $input = new ArrayInput(array('--name' => 'foo'), new InputDefinition(array(new InputOption('name'), new InputOption('bar', '', InputOption::VALUE_OPTIONAL, '', 'default')))); - $this->assertEquals('default', $input->getOption('bar'), '->getOption() returns the default value for optional options'); - $this->assertEquals(array('name' => 'foo', 'bar' => 'default'), $input->getOptions(), '->getOptions() returns all option values, even optional ones'); - - try { - $input->setOption('foo', 'bar'); - $this->fail('->setOption() throws a \InvalidArgumentException if the option does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->setOption() throws a \InvalidArgumentException if the option does not exist'); - $this->assertEquals('The "foo" option does not exist.', $e->getMessage()); - } - - try { - $input->getOption('foo'); - $this->fail('->getOption() throws a \InvalidArgumentException if the option does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->setOption() throws a \InvalidArgumentException if the option does not exist'); - $this->assertEquals('The "foo" option does not exist.', $e->getMessage()); - } - } - - public function testArguments() - { - $input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name')))); - $this->assertEquals('foo', $input->getArgument('name'), '->getArgument() returns the value for the given argument'); - - $input->setArgument('name', 'bar'); - $this->assertEquals('bar', $input->getArgument('name'), '->setArgument() sets the value for a given argument'); - $this->assertEquals(array('name' => 'bar'), $input->getArguments(), '->getArguments() returns all argument values'); - - $input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name'), new InputArgument('bar', InputArgument::OPTIONAL, '', 'default')))); - $this->assertEquals('default', $input->getArgument('bar'), '->getArgument() returns the default value for optional arguments'); - $this->assertEquals(array('name' => 'foo', 'bar' => 'default'), $input->getArguments(), '->getArguments() returns all argument values, even optional ones'); - - try { - $input->setArgument('foo', 'bar'); - $this->fail('->setArgument() throws a \InvalidArgumentException if the argument does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->setOption() throws a \InvalidArgumentException if the option does not exist'); - $this->assertEquals('The "foo" argument does not exist.', $e->getMessage()); - } - - try { - $input->getArgument('foo'); - $this->fail('->getArgument() throws a \InvalidArgumentException if the argument does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->setOption() throws a \InvalidArgumentException if the option does not exist'); - $this->assertEquals('The "foo" argument does not exist.', $e->getMessage()); - } - } - - public function testValidate() - { - $input = new ArrayInput(array()); - $input->bind(new InputDefinition(array(new InputArgument('name', InputArgument::REQUIRED)))); - - try { - $input->validate(); - $this->fail('->validate() throws a \RuntimeException if not enough arguments are given'); - } catch (\Exception $e) { - $this->assertInstanceOf('\RuntimeException', $e, '->validate() throws a \RuntimeException if not enough arguments are given'); - $this->assertEquals('Not enough arguments.', $e->getMessage()); - } - - $input = new ArrayInput(array('name' => 'foo')); - $input->bind(new InputDefinition(array(new InputArgument('name', InputArgument::REQUIRED)))); - - try { - $input->validate(); - } catch (\RuntimeException $e) { - $this->fail('->validate() does not throw a \RuntimeException if enough arguments are given'); - } - } - - public function testSetFetInteractive() - { - $input = new ArrayInput(array()); - $this->assertTrue($input->isInteractive(), '->isInteractive() returns whether the input should be interactive or not'); - $input->setInteractive(false); - $this->assertFalse($input->isInteractive(), '->setInteractive() changes the interactive flag'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/StringInputTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/StringInputTest.php deleted file mode 100644 index 031797c..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Input/StringInputTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Input; - -use Symfony\Component\Console\Input\StringInput; - -class StringInputTest extends \PHPUnit_Framework_TestCase -{ - /** - * @dataProvider getTokenizeData - */ - public function testTokenize($input, $tokens, $message) - { - $input = new StringInput($input); - $r = new \ReflectionClass('Symfony\Component\Console\Input\ArgvInput'); - $p = $r->getProperty('tokens'); - $p->setAccessible(true); - $this->assertEquals($tokens, $p->getValue($input), $message); - } - - public function getTokenizeData() - { - return array( - array('', array(), '->tokenize() parses an empty string'), - array('foo', array('foo'), '->tokenize() parses arguments'), - array(' foo bar ', array('foo', 'bar'), '->tokenize() ignores whitespaces between arguments'), - array('"quoted"', array('quoted'), '->tokenize() parses quoted arguments'), - array("'quoted'", array('quoted'), '->tokenize() parses quoted arguments'), - array('\"quoted\"', array('"quoted"'), '->tokenize() parses escaped-quoted arguments'), - array("\'quoted\'", array('\'quoted\''), '->tokenize() parses escaped-quoted arguments'), - array('-a', array('-a'), '->tokenize() parses short options'), - array('-azc', array('-azc'), '->tokenize() parses aggregated short options'), - array('-awithavalue', array('-awithavalue'), '->tokenize() parses short options with a value'), - array('-a"foo bar"', array('-afoo bar'), '->tokenize() parses short options with a value'), - array('-a"foo bar""foo bar"', array('-afoo barfoo bar'), '->tokenize() parses short options with a value'), - array('-a\'foo bar\'', array('-afoo bar'), '->tokenize() parses short options with a value'), - array('-a\'foo bar\'\'foo bar\'', array('-afoo barfoo bar'), '->tokenize() parses short options with a value'), - array('-a\'foo bar\'"foo bar"', array('-afoo barfoo bar'), '->tokenize() parses short options with a value'), - array('--long-option', array('--long-option'), '->tokenize() parses long options'), - array('--long-option=foo', array('--long-option=foo'), '->tokenize() parses long options with a value'), - array('--long-option="foo bar"', array('--long-option=foo bar'), '->tokenize() parses long options with a value'), - array('--long-option="foo bar""another"', array('--long-option=foo baranother'), '->tokenize() parses long options with a value'), - array('--long-option=\'foo bar\'', array('--long-option=foo bar'), '->tokenize() parses long options with a value'), - array("--long-option='foo bar''another'", array("--long-option=foo baranother"), '->tokenize() parses long options with a value'), - array("--long-option='foo bar'\"another\"", array("--long-option=foo baranother"), '->tokenize() parses long options with a value'), - array('foo -a -ffoo --long bar', array('foo', '-a', '-ffoo', '--long', 'bar'), '->tokenize() parses when several arguments and options'), - ); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/ConsoleOutputTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/ConsoleOutputTest.php deleted file mode 100644 index 7a3ede3..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/ConsoleOutputTest.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Output; - -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Console\Output\Output; - -class ConsoleOutputTest extends \PHPUnit_Framework_TestCase -{ - public function testConstructor() - { - $output = new ConsoleOutput(Output::VERBOSITY_QUIET, true); - $this->assertEquals(Output::VERBOSITY_QUIET, $output->getVerbosity(), '__construct() takes the verbosity as its first argument'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/NullOutputTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/NullOutputTest.php deleted file mode 100644 index 8dd5f7c..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/NullOutputTest.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Output; - -use Symfony\Component\Console\Output\NullOutput; - -class NullOutputTest extends \PHPUnit_Framework_TestCase -{ - public function testConstructor() - { - $output = new NullOutput(); - $output->write('foo'); - $this->assertTrue(true, '->write() does nothing'); // FIXME - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/OutputTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/OutputTest.php deleted file mode 100644 index aa4a204..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/OutputTest.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Output; - -use Symfony\Component\Console\Output\Output; -use Symfony\Component\Console\Formatter\OutputFormatterStyle; - -class OutputTest extends \PHPUnit_Framework_TestCase -{ - public function testConstructor() - { - $output = new TestOutput(Output::VERBOSITY_QUIET, true); - $this->assertEquals(Output::VERBOSITY_QUIET, $output->getVerbosity(), '__construct() takes the verbosity as its first argument'); - $this->assertTrue($output->isDecorated(), '__construct() takes the decorated flag as its second argument'); - } - - public function testSetIsDecorated() - { - $output = new TestOutput(); - $output->setDecorated(true); - $this->assertTrue($output->isDecorated(), 'setDecorated() sets the decorated flag'); - } - - public function testSetGetVerbosity() - { - $output = new TestOutput(); - $output->setVerbosity(Output::VERBOSITY_QUIET); - $this->assertEquals(Output::VERBOSITY_QUIET, $output->getVerbosity(), '->setVerbosity() sets the verbosity'); - } - - public function testWrite() - { - $fooStyle = new OutputFormatterStyle('yellow', 'red', array('blink')); - $output = new TestOutput(Output::VERBOSITY_QUIET); - $output->writeln('foo'); - $this->assertEquals('', $output->output, '->writeln() outputs nothing if verbosity is set to VERBOSITY_QUIET'); - - $output = new TestOutput(); - $output->writeln(array('foo', 'bar')); - $this->assertEquals("foo\nbar\n", $output->output, '->writeln() can take an array of messages to output'); - - $output = new TestOutput(); - $output->writeln('foo', Output::OUTPUT_RAW); - $this->assertEquals("foo\n", $output->output, '->writeln() outputs the raw message if OUTPUT_RAW is specified'); - - $output = new TestOutput(); - $output->writeln('foo', Output::OUTPUT_PLAIN); - $this->assertEquals("foo\n", $output->output, '->writeln() strips decoration tags if OUTPUT_PLAIN is specified'); - - $output = new TestOutput(); - $output->setDecorated(false); - $output->writeln('foo'); - $this->assertEquals("foo\n", $output->output, '->writeln() strips decoration tags if decoration is set to false'); - - $output = new TestOutput(); - $output->getFormatter()->setStyle('FOO', $fooStyle); - $output->setDecorated(true); - $output->writeln('foo'); - $this->assertEquals("\033[33;41;5mfoo\033[0m\n", $output->output, '->writeln() decorates the output'); - - try { - $output->writeln('foo', 24); - $this->fail('->writeln() throws an \InvalidArgumentException when the type does not exist'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->writeln() throws an \InvalidArgumentException when the type does not exist'); - $this->assertEquals('Unknown output type given (24)', $e->getMessage()); - } - - $output->clear(); - $output->write('foo'); - $this->assertEquals('foo', $output->output, '->write() do nothing when a style does not exist'); - - $output->clear(); - $output->writeln('foo'); - $this->assertEquals("foo\n", $output->output, '->writeln() do nothing when a style does not exist'); - } -} - -class TestOutput extends Output -{ - public $output = ''; - - public function clear() - { - $this->output = ''; - } - - protected function doWrite($message, $newline) - { - $this->output .= $message.($newline ? "\n" : ''); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/StreamOutputTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/StreamOutputTest.php deleted file mode 100644 index b151a48..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Output/StreamOutputTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Output; - -use Symfony\Component\Console\Output\Output; -use Symfony\Component\Console\Output\StreamOutput; - -class StreamOutputTest extends \PHPUnit_Framework_TestCase -{ - protected $stream; - - protected function setUp() - { - $this->stream = fopen('php://memory', 'a', false); - } - - protected function tearDown() - { - $this->stream = null; - } - - public function testConstructor() - { - try { - $output = new StreamOutput('foo'); - $this->fail('__construct() throws an \InvalidArgumentException if the first argument is not a stream'); - } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '__construct() throws an \InvalidArgumentException if the first argument is not a stream'); - $this->assertEquals('The StreamOutput class needs a stream as its first argument.', $e->getMessage()); - } - - $output = new StreamOutput($this->stream, Output::VERBOSITY_QUIET, true); - $this->assertEquals(Output::VERBOSITY_QUIET, $output->getVerbosity(), '__construct() takes the verbosity as its first argument'); - $this->assertTrue($output->isDecorated(), '__construct() takes the decorated flag as its second argument'); - } - - public function testGetStream() - { - $output = new StreamOutput($this->stream); - $this->assertEquals($this->stream, $output->getStream(), '->getStream() returns the current stream'); - } - - public function testDoWrite() - { - $output = new StreamOutput($this->stream); - $output->writeln('foo'); - rewind($output->getStream()); - $this->assertEquals('foo'.PHP_EOL, stream_get_contents($output->getStream()), '->doWrite() writes to the stream'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Tester/ApplicationTesterTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Tester/ApplicationTesterTest.php deleted file mode 100644 index 6ce30ab..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Tester/ApplicationTesterTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Tester; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Output\Output; -use Symfony\Component\Console\Tester\ApplicationTester; - -class ApplicationTesterTest extends \PHPUnit_Framework_TestCase -{ - protected $application; - protected $tester; - - protected function setUp() - { - $this->application = new Application(); - $this->application->setAutoExit(false); - $this->application->register('foo') - ->addArgument('foo') - ->setCode(function ($input, $output) { $output->writeln('foo'); }) - ; - - $this->tester = new ApplicationTester($this->application); - $this->tester->run(array('command' => 'foo', 'foo' => 'bar'), array('interactive' => false, 'decorated' => false, 'verbosity' => Output::VERBOSITY_VERBOSE)); - } - - protected function tearDown() - { - $this->application = null; - $this->tester = null; - } - - public function testRun() - { - $this->assertFalse($this->tester->getInput()->isInteractive(), '->execute() takes an interactive option'); - $this->assertFalse($this->tester->getOutput()->isDecorated(), '->execute() takes a decorated option'); - $this->assertEquals(Output::VERBOSITY_VERBOSE, $this->tester->getOutput()->getVerbosity(), '->execute() takes a verbosity option'); - } - - public function testGetInput() - { - $this->assertEquals('bar', $this->tester->getInput()->getArgument('foo'), '->getInput() returns the current input instance'); - } - - public function testGetOutput() - { - rewind($this->tester->getOutput()->getStream()); - $this->assertEquals('foo'.PHP_EOL, stream_get_contents($this->tester->getOutput()->getStream()), '->getOutput() returns the current output instance'); - } - - public function testGetDisplay() - { - $this->assertEquals('foo'.PHP_EOL, $this->tester->getDisplay(), '->getDisplay() returns the display of the last execution'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/Tester/CommandTesterTest.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/Tester/CommandTesterTest.php deleted file mode 100644 index e64d967..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/Tester/CommandTesterTest.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tests\Tester; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Output\Output; -use Symfony\Component\Console\Tester\CommandTester; - -class CommandTesterTest extends \PHPUnit_Framework_TestCase -{ - protected $application; - protected $tester; - - protected function setUp() - { - $this->command = new Command('foo'); - $this->command->addArgument('command'); - $this->command->addArgument('foo'); - $this->command->setCode(function ($input, $output) { $output->writeln('foo'); }); - - $this->tester = new CommandTester($this->command); - $this->tester->execute(array('foo' => 'bar'), array('interactive' => false, 'decorated' => false, 'verbosity' => Output::VERBOSITY_VERBOSE)); - } - - protected function tearDown() - { - $this->command = null; - $this->tester = null; - } - - public function testExecute() - { - $this->assertFalse($this->tester->getInput()->isInteractive(), '->execute() takes an interactive option'); - $this->assertFalse($this->tester->getOutput()->isDecorated(), '->execute() takes a decorated option'); - $this->assertEquals(Output::VERBOSITY_VERBOSE, $this->tester->getOutput()->getVerbosity(), '->execute() takes a verbosity option'); - } - - public function testGetInput() - { - $this->assertEquals('bar', $this->tester->getInput()->getArgument('foo'), '->getInput() returns the current input instance'); - } - - public function testGetOutput() - { - rewind($this->tester->getOutput()->getStream()); - $this->assertEquals('foo'.PHP_EOL, stream_get_contents($this->tester->getOutput()->getStream()), '->getOutput() returns the current output instance'); - } - - public function testGetDisplay() - { - $this->assertEquals('foo'.PHP_EOL, $this->tester->getDisplay(), '->getDisplay() returns the display of the last execution'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/Tests/bootstrap.php b/framework/library/Doctrine/Symfony/Component/Console/Tests/bootstrap.php deleted file mode 100644 index c486b72..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/Tests/bootstrap.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -spl_autoload_register(function ($class) { - if (0 === strpos(ltrim($class, '/'), 'Symfony\Component\Console')) { - if (file_exists($file = __DIR__.'/../'.substr(str_replace('\\', '/', $class), strlen('Symfony\Component\Console')).'.php')) { - require_once $file; - } - } -}); diff --git a/framework/library/Doctrine/Symfony/Component/Console/composer.json b/framework/library/Doctrine/Symfony/Component/Console/composer.json deleted file mode 100644 index 6de78af..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/composer.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "symfony/console", - "type": "library", - "description": "Symfony Console Component", - "keywords": [], - "homepage": "http://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "require": { - "php": ">=5.3.3" - }, - "autoload": { - "psr-0": { "Symfony\\Component\\Console": "" } - }, - "target-dir": "Symfony/Component/Console", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Console/phpunit.xml.dist b/framework/library/Doctrine/Symfony/Component/Console/phpunit.xml.dist deleted file mode 100644 index fd1c069..0000000 --- a/framework/library/Doctrine/Symfony/Component/Console/phpunit.xml.dist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - ./Tests/ - - - - - - ./ - - ./Resources - ./Tests - ./vendor - - - - diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/CHANGELOG.md b/framework/library/Doctrine/Symfony/Component/Yaml/CHANGELOG.md deleted file mode 100644 index 096cf65..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/CHANGELOG.md +++ /dev/null @@ -1,8 +0,0 @@ -CHANGELOG -========= - -2.1.0 ------ - - * Yaml::parse() does not evaluate loaded files as PHP files by default - anymore (call Yaml::enablePhpParsing() to get back the old behavior) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Dumper.php b/framework/library/Doctrine/Symfony/Component/Yaml/Dumper.php deleted file mode 100644 index 2338916..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Dumper.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -/** - * Dumper dumps PHP variables to YAML strings. - * - * @author Fabien Potencier - */ -class Dumper -{ - /** - * Dumps a PHP value to YAML. - * - * @param mixed $input The PHP value - * @param integer $inline The level where you switch to inline YAML - * @param integer $indent The level of indentation (used internally) - * - * @return string The YAML representation of the PHP value - */ - public function dump($input, $inline = 0, $indent = 0) - { - $output = ''; - $prefix = $indent ? str_repeat(' ', $indent) : ''; - - if ($inline <= 0 || !is_array($input) || empty($input)) { - $output .= $prefix.Inline::dump($input); - } else { - $isAHash = array_keys($input) !== range(0, count($input) - 1); - - foreach ($input as $key => $value) { - $willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value); - - $output .= sprintf('%s%s%s%s', - $prefix, - $isAHash ? Inline::dump($key).':' : '-', - $willBeInlined ? ' ' : "\n", - $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + 4) - ).($willBeInlined ? "\n" : ''); - } - } - - return $output; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Escaper.php b/framework/library/Doctrine/Symfony/Component/Yaml/Escaper.php deleted file mode 100644 index 81a7d5f..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Escaper.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -/** - * Escaper encapsulates escaping rules for single and double-quoted - * YAML strings. - * - * @author Matthew Lewinski - */ -class Escaper -{ - // Characters that would cause a dumped string to require double quoting. - const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9"; - - // Mapping arrays for escaping a double quoted string. The backslash is - // first to ensure proper escaping because str_replace operates iteratively - // on the input arrays. This ordering of the characters avoids the use of strtr, - // which performs more slowly. - static private $escapees = array('\\\\', '\\"', - "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", - "\x08", "\x09", "\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f", - "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", - "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f", - "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9"); - static private $escaped = array('\\"', '\\\\', - "\\0", "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\a", - "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", "\\x0e", "\\x0f", - "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17", - "\\x18", "\\x19", "\\x1a", "\\e", "\\x1c", "\\x1d", "\\x1e", "\\x1f", - "\\N", "\\_", "\\L", "\\P"); - - /** - * Determines if a PHP value would require double quoting in YAML. - * - * @param string $value A PHP value - * - * @return Boolean True if the value would require double quotes. - */ - static public function requiresDoubleQuoting($value) - { - return preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value); - } - - /** - * Escapes and surrounds a PHP value with double quotes. - * - * @param string $value A PHP value - * - * @return string The quoted, escaped string - */ - static public function escapeWithDoubleQuotes($value) - { - return sprintf('"%s"', str_replace(self::$escapees, self::$escaped, $value)); - } - - /** - * Determines if a PHP value would require single quoting in YAML. - * - * @param string $value A PHP value - * - * @return Boolean True if the value would require single quotes. - */ - static public function requiresSingleQuoting($value) - { - return preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ - ? | < > = ! % @ ` ]/x', $value); - } - - /** - * Escapes and surrounds a PHP value with single quotes. - * - * @param string $value A PHP value - * - * @return string The quoted, escaped string - */ - static public function escapeWithSingleQuotes($value) - { - return sprintf("'%s'", str_replace('\'', '\'\'', $value)); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Exception/DumpException.php b/framework/library/Doctrine/Symfony/Component/Yaml/Exception/DumpException.php deleted file mode 100644 index 53952ce..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Exception/DumpException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Exception; - -/** - * Exception class thrown when an error occurs during dumping. - * - * @author Fabien Potencier - * - * @api - */ -class DumpException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Exception/ExceptionInterface.php b/framework/library/Doctrine/Symfony/Component/Yaml/Exception/ExceptionInterface.php deleted file mode 100644 index 92e5c2e..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Exception/ExceptionInterface.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Exception; - -/** - * Exception interface for all exceptions thrown by the component. - * - * @author Fabien Potencier - * - * @api - */ -interface ExceptionInterface -{ -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Exception/ParseException.php b/framework/library/Doctrine/Symfony/Component/Yaml/Exception/ParseException.php deleted file mode 100644 index 975fe6d..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Exception/ParseException.php +++ /dev/null @@ -1,143 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Exception; - -/** - * Exception class thrown when an error occurs during parsing. - * - * @author Fabien Potencier - * - * @api - */ -class ParseException extends \RuntimeException implements ExceptionInterface -{ - private $parsedFile; - private $parsedLine; - private $snippet; - private $rawMessage; - - /** - * Constructor. - * - * @param string $message The error message - * @param integer $parsedLine The line where the error occurred - * @param integer $snippet The snippet of code near the problem - * @param string $parsedFile The file name where the error occurred - * @param Exception $previous The previous exception - */ - public function __construct($message, $parsedLine = -1, $snippet = null, $parsedFile = null, Exception $previous = null) - { - $this->parsedFile = $parsedFile; - $this->parsedLine = $parsedLine; - $this->snippet = $snippet; - $this->rawMessage = $message; - - $this->updateRepr(); - - parent::__construct($this->message, 0, $previous); - } - - /** - * Gets the snippet of code near the error. - * - * @return string The snippet of code - */ - public function getSnippet() - { - return $this->snippet; - } - - /** - * Sets the snippet of code near the error. - * - * @param string $snippet The code snippet - */ - public function setSnippet($snippet) - { - $this->snippet = $snippet; - - $this->updateRepr(); - } - - /** - * Gets the filename where the error occurred. - * - * This method returns null if a string is parsed. - * - * @return string The filename - */ - public function getParsedFile() - { - return $this->parsedFile; - } - - /** - * Sets the filename where the error occurred. - * - * @param string $parsedFile The filename - */ - public function setParsedFile($parsedFile) - { - $this->parsedFile = $parsedFile; - - $this->updateRepr(); - } - - /** - * Gets the line where the error occurred. - * - * @return integer The file line - */ - public function getParsedLine() - { - return $this->parsedLine; - } - - /** - * Sets the line where the error occurred. - * - * @param integer $parsedLine The file line - */ - public function setParsedLine($parsedLine) - { - $this->parsedLine = $parsedLine; - - $this->updateRepr(); - } - - private function updateRepr() - { - $this->message = $this->rawMessage; - - $dot = false; - if ('.' === substr($this->message, -1)) { - $this->message = substr($this->message, 0, -1); - $dot = true; - } - - if (null !== $this->parsedFile) { - $this->message .= sprintf(' in %s', json_encode($this->parsedFile)); - } - - if ($this->parsedLine >= 0) { - $this->message .= sprintf(' at line %d', $this->parsedLine); - } - - if ($this->snippet) { - $this->message .= sprintf(' (near "%s")', $this->snippet); - } - - if ($dot) { - $this->message .= '.'; - } - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Inline.php b/framework/library/Doctrine/Symfony/Component/Yaml/Inline.php deleted file mode 100644 index 8bcfcda..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Inline.php +++ /dev/null @@ -1,424 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -use Symfony\Component\Yaml\Exception\ParseException; -use Symfony\Component\Yaml\Exception\DumpException; - -/** - * Inline implements a YAML parser/dumper for the YAML inline syntax. - * - * @author Fabien Potencier - */ -class Inline -{ - const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')'; - - /** - * Converts a YAML string to a PHP array. - * - * @param string $value A YAML string - * - * @return array A PHP array representing the YAML string - */ - static public function parse($value) - { - $value = trim($value); - - if (0 == strlen($value)) { - return ''; - } - - if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) { - $mbEncoding = mb_internal_encoding(); - mb_internal_encoding('ASCII'); - } - - switch ($value[0]) { - case '[': - $result = self::parseSequence($value); - break; - case '{': - $result = self::parseMapping($value); - break; - default: - $i = 0; - $result = self::parseScalar($value, null, array('"', "'"), $i); - - // some comment can end the scalar - if (preg_replace('/\s+#.*$/A', '', substr($value, $i))) { - throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i))); - } - } - - if (isset($mbEncoding)) { - mb_internal_encoding($mbEncoding); - } - - return $result; - } - - /** - * Dumps a given PHP variable to a YAML string. - * - * @param mixed $value The PHP variable to convert - * - * @return string The YAML string representing the PHP array - * - * @throws DumpException When trying to dump PHP resource - */ - static public function dump($value) - { - switch (true) { - case is_resource($value): - throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value))); - case is_object($value): - return '!!php/object:'.serialize($value); - case is_array($value): - return self::dumpArray($value); - case null === $value: - return 'null'; - case true === $value: - return 'true'; - case false === $value: - return 'false'; - case ctype_digit($value): - return is_string($value) ? "'$value'" : (int) $value; - case is_numeric($value): - $locale = setlocale(LC_NUMERIC, 0); - if (false !== $locale) { - setlocale(LC_NUMERIC, 'C'); - } - $repr = is_string($value) ? "'$value'" : (is_infinite($value) ? str_ireplace('INF', '.Inf', strval($value)) : strval($value)); - - if (false !== $locale) { - setlocale(LC_NUMERIC, $locale); - } - - return $repr; - case Escaper::requiresDoubleQuoting($value): - return Escaper::escapeWithDoubleQuotes($value); - case Escaper::requiresSingleQuoting($value): - return Escaper::escapeWithSingleQuotes($value); - case '' == $value: - return "''"; - case preg_match(self::getTimestampRegex(), $value): - case in_array(strtolower($value), array('null', '~', 'true', 'false')): - return "'$value'"; - default: - return $value; - } - } - - /** - * Dumps a PHP array to a YAML string. - * - * @param array $value The PHP array to dump - * - * @return string The YAML string representing the PHP array - */ - static private function dumpArray($value) - { - // array - $keys = array_keys($value); - if ((1 == count($keys) && '0' == $keys[0]) - || (count($keys) > 1 && array_reduce($keys, function ($v, $w) { return (integer) $v + $w; }, 0) == count($keys) * (count($keys) - 1) / 2) - ) { - $output = array(); - foreach ($value as $val) { - $output[] = self::dump($val); - } - - return sprintf('[%s]', implode(', ', $output)); - } - - // mapping - $output = array(); - foreach ($value as $key => $val) { - $output[] = sprintf('%s: %s', self::dump($key), self::dump($val)); - } - - return sprintf('{ %s }', implode(', ', $output)); - } - - /** - * Parses a scalar to a YAML string. - * - * @param scalar $scalar - * @param string $delimiters - * @param array $stringDelimiters - * @param integer &$i - * @param Boolean $evaluate - * - * @return string A YAML string - * - * @throws ParseException When malformed inline YAML string is parsed - */ - static public function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true) - { - if (in_array($scalar[$i], $stringDelimiters)) { - // quoted scalar - $output = self::parseQuotedScalar($scalar, $i); - - if (null !== $delimiters) { - $tmp = ltrim(substr($scalar, $i), ' '); - if (!in_array($tmp[0], $delimiters)) { - throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i))); - } - } - } else { - // "normal" string - if (!$delimiters) { - $output = substr($scalar, $i); - $i += strlen($output); - - // remove comments - if (false !== $strpos = strpos($output, ' #')) { - $output = rtrim(substr($output, 0, $strpos)); - } - } elseif (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) { - $output = $match[1]; - $i += strlen($output); - } else { - throw new ParseException(sprintf('Malformed inline YAML string (%s).', $scalar)); - } - - $output = $evaluate ? self::evaluateScalar($output) : $output; - } - - return $output; - } - - /** - * Parses a quoted scalar to YAML. - * - * @param string $scalar - * @param integer &$i - * - * @return string A YAML string - * - * @throws ParseException When malformed inline YAML string is parsed - */ - static private function parseQuotedScalar($scalar, &$i) - { - // Only check the current item we're dealing with (for sequences) - $subject = substr($scalar, $i); - $items = preg_split('/[\'"]\s*(?:[,:]|[}\]]\s*,)/', $subject); - $subject = substr($subject, 0, strlen($items[0]) + 1); - - if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) { - throw new ParseException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i))); - } - - $output = substr($match[0], 1, strlen($match[0]) - 2); - - $unescaper = new Unescaper(); - if ('"' == $scalar[$i]) { - $output = $unescaper->unescapeDoubleQuotedString($output); - } else { - $output = $unescaper->unescapeSingleQuotedString($output); - } - - $i += strlen($match[0]); - - return $output; - } - - /** - * Parses a sequence to a YAML string. - * - * @param string $sequence - * @param integer &$i - * - * @return string A YAML string - * - * @throws ParseException When malformed inline YAML string is parsed - */ - static private function parseSequence($sequence, &$i = 0) - { - $output = array(); - $len = strlen($sequence); - $i += 1; - - // [foo, bar, ...] - while ($i < $len) { - switch ($sequence[$i]) { - case '[': - // nested sequence - $output[] = self::parseSequence($sequence, $i); - break; - case '{': - // nested mapping - $output[] = self::parseMapping($sequence, $i); - break; - case ']': - return $output; - case ',': - case ' ': - break; - default: - $isQuoted = in_array($sequence[$i], array('"', "'")); - $value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i); - - if (!$isQuoted && false !== strpos($value, ': ')) { - // embedded mapping? - try { - $value = self::parseMapping('{'.$value.'}'); - } catch (\InvalidArgumentException $e) { - // no, it's not - } - } - - $output[] = $value; - - --$i; - } - - ++$i; - } - - throw new ParseException(sprintf('Malformed inline YAML string %s', $sequence)); - } - - /** - * Parses a mapping to a YAML string. - * - * @param string $mapping - * @param integer &$i - * - * @return string A YAML string - * - * @throws ParseException When malformed inline YAML string is parsed - */ - static private function parseMapping($mapping, &$i = 0) - { - $output = array(); - $len = strlen($mapping); - $i += 1; - - // {foo: bar, bar:foo, ...} - while ($i < $len) { - switch ($mapping[$i]) { - case ' ': - case ',': - ++$i; - continue 2; - case '}': - return $output; - } - - // key - $key = self::parseScalar($mapping, array(':', ' '), array('"', "'"), $i, false); - - // value - $done = false; - while ($i < $len) { - switch ($mapping[$i]) { - case '[': - // nested sequence - $output[$key] = self::parseSequence($mapping, $i); - $done = true; - break; - case '{': - // nested mapping - $output[$key] = self::parseMapping($mapping, $i); - $done = true; - break; - case ':': - case ' ': - break; - default: - $output[$key] = self::parseScalar($mapping, array(',', '}'), array('"', "'"), $i); - $done = true; - --$i; - } - - ++$i; - - if ($done) { - continue 2; - } - } - } - - throw new ParseException(sprintf('Malformed inline YAML string %s', $mapping)); - } - - /** - * Evaluates scalars and replaces magic values. - * - * @param string $scalar - * - * @return string A YAML string - */ - static private function evaluateScalar($scalar) - { - $scalar = trim($scalar); - - switch (true) { - case 'null' == strtolower($scalar): - case '' == $scalar: - case '~' == $scalar: - return null; - case 0 === strpos($scalar, '!str'): - return (string) substr($scalar, 5); - case 0 === strpos($scalar, '! '): - return intval(self::parseScalar(substr($scalar, 2))); - case 0 === strpos($scalar, '!!php/object:'): - return unserialize(substr($scalar, 13)); - case ctype_digit($scalar): - $raw = $scalar; - $cast = intval($scalar); - - return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw); - case 'true' === strtolower($scalar): - return true; - case 'false' === strtolower($scalar): - return false; - case is_numeric($scalar): - return '0x' == $scalar[0].$scalar[1] ? hexdec($scalar) : floatval($scalar); - case 0 == strcasecmp($scalar, '.inf'): - case 0 == strcasecmp($scalar, '.NaN'): - return -log(0); - case 0 == strcasecmp($scalar, '-.inf'): - return log(0); - case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar): - return floatval(str_replace(',', '', $scalar)); - case preg_match(self::getTimestampRegex(), $scalar): - return strtotime($scalar); - default: - return (string) $scalar; - } - } - - /** - * Gets a regex that matches an unix timestamp - * - * @return string The regular expression - */ - static private function getTimestampRegex() - { - return <<[0-9][0-9][0-9][0-9]) - -(?P[0-9][0-9]?) - -(?P[0-9][0-9]?) - (?:(?:[Tt]|[ \t]+) - (?P[0-9][0-9]?) - :(?P[0-9][0-9]) - :(?P[0-9][0-9]) - (?:\.(?P[0-9]*))? - (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) - (?::(?P[0-9][0-9]))?))?)? - $~x -EOF; - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/LICENSE b/framework/library/Doctrine/Symfony/Component/Yaml/LICENSE deleted file mode 100644 index cdffe7a..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2012 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Parser.php b/framework/library/Doctrine/Symfony/Component/Yaml/Parser.php deleted file mode 100644 index 76d1926..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Parser.php +++ /dev/null @@ -1,609 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -use Symfony\Component\Yaml\Exception\ParseException; - -/** - * Parser parses YAML strings to convert them to PHP arrays. - * - * @author Fabien Potencier - */ -class Parser -{ - private $offset = 0; - private $lines = array(); - private $currentLineNb = -1; - private $currentLine = ''; - private $refs = array(); - - /** - * Constructor - * - * @param integer $offset The offset of YAML document (used for line numbers in error messages) - */ - public function __construct($offset = 0) - { - $this->offset = $offset; - } - - /** - * Parses a YAML string to a PHP value. - * - * @param string $value A YAML string - * - * @return mixed A PHP value - * - * @throws ParseException If the YAML is not valid - */ - public function parse($value) - { - $this->currentLineNb = -1; - $this->currentLine = ''; - $this->lines = explode("\n", $this->cleanup($value)); - - if (function_exists('mb_detect_encoding') && false === mb_detect_encoding($value, 'UTF-8', true)) { - throw new ParseException('The YAML value does not appear to be valid UTF-8.'); - } - - if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) { - $mbEncoding = mb_internal_encoding(); - mb_internal_encoding('UTF-8'); - } - - $data = array(); - while ($this->moveToNextLine()) { - if ($this->isCurrentLineEmpty()) { - continue; - } - - // tab? - if ("\t" === $this->currentLine[0]) { - throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - - $isRef = $isInPlace = $isProcessed = false; - if (preg_match('#^\-((?P\s+)(?P.+?))?\s*$#u', $this->currentLine, $values)) { - if (isset($values['value']) && preg_match('#^&(?P[^ ]+) *(?P.*)#u', $values['value'], $matches)) { - $isRef = $matches['ref']; - $values['value'] = $matches['value']; - } - - // array - if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) { - $c = $this->getRealCurrentLineNb() + 1; - $parser = new Parser($c); - $parser->refs =& $this->refs; - $data[] = $parser->parse($this->getNextEmbedBlock()); - } else { - if (isset($values['leadspaces']) - && ' ' == $values['leadspaces'] - && preg_match('#^(?P'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P.+?))?\s*$#u', $values['value'], $matches) - ) { - // this is a compact notation element, add to next block and parse - $c = $this->getRealCurrentLineNb(); - $parser = new Parser($c); - $parser->refs =& $this->refs; - - $block = $values['value']; - if (!$this->isNextLineIndented()) { - $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + 2); - } - - $data[] = $parser->parse($block); - } else { - $data[] = $this->parseValue($values['value']); - } - } - } elseif (preg_match('#^(?P'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\[\{].*?) *\:(\s+(?P.+?))?\s*$#u', $this->currentLine, $values)) { - try { - $key = Inline::parseScalar($values['key']); - } catch (ParseException $e) { - $e->setParsedLine($this->getRealCurrentLineNb() + 1); - $e->setSnippet($this->currentLine); - - throw $e; - } - - if ('<<' === $key) { - if (isset($values['value']) && 0 === strpos($values['value'], '*')) { - $isInPlace = substr($values['value'], 1); - if (!array_key_exists($isInPlace, $this->refs)) { - throw new ParseException(sprintf('Reference "%s" does not exist.', $isInPlace), $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - } else { - if (isset($values['value']) && $values['value'] !== '') { - $value = $values['value']; - } else { - $value = $this->getNextEmbedBlock(); - } - $c = $this->getRealCurrentLineNb() + 1; - $parser = new Parser($c); - $parser->refs =& $this->refs; - $parsed = $parser->parse($value); - - $merged = array(); - if (!is_array($parsed)) { - throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine); - } elseif (isset($parsed[0])) { - // Numeric array, merge individual elements - foreach (array_reverse($parsed) as $parsedItem) { - if (!is_array($parsedItem)) { - throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem); - } - $merged = array_merge($parsedItem, $merged); - } - } else { - // Associative array, merge - $merged = array_merge($merged, $parsed); - } - - $isProcessed = $merged; - } - } elseif (isset($values['value']) && preg_match('#^&(?P[^ ]+) *(?P.*)#u', $values['value'], $matches)) { - $isRef = $matches['ref']; - $values['value'] = $matches['value']; - } - - if ($isProcessed) { - // Merge keys - $data = $isProcessed; - // hash - } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) { - // if next line is less indented or equal, then it means that the current value is null - if ($this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) { - $data[$key] = null; - } else { - $c = $this->getRealCurrentLineNb() + 1; - $parser = new Parser($c); - $parser->refs =& $this->refs; - $data[$key] = $parser->parse($this->getNextEmbedBlock()); - } - } else { - if ($isInPlace) { - $data = $this->refs[$isInPlace]; - } else { - $data[$key] = $this->parseValue($values['value']); - } - } - } else { - // 1-liner followed by newline - if (2 == count($this->lines) && empty($this->lines[1])) { - try { - $value = Inline::parse($this->lines[0]); - } catch (ParseException $e) { - $e->setParsedLine($this->getRealCurrentLineNb() + 1); - $e->setSnippet($this->currentLine); - - throw $e; - } - - if (is_array($value)) { - $first = reset($value); - if (is_string($first) && 0 === strpos($first, '*')) { - $data = array(); - foreach ($value as $alias) { - $data[] = $this->refs[substr($alias, 1)]; - } - $value = $data; - } - } - - if (isset($mbEncoding)) { - mb_internal_encoding($mbEncoding); - } - - return $value; - } - - switch (preg_last_error()) { - case PREG_INTERNAL_ERROR: - $error = 'Internal PCRE error.'; - break; - case PREG_BACKTRACK_LIMIT_ERROR: - $error = 'pcre.backtrack_limit reached.'; - break; - case PREG_RECURSION_LIMIT_ERROR: - $error = 'pcre.recursion_limit reached.'; - break; - case PREG_BAD_UTF8_ERROR: - $error = 'Malformed UTF-8 data.'; - break; - case PREG_BAD_UTF8_OFFSET_ERROR: - $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point.'; - break; - default: - $error = 'Unable to parse.'; - } - - throw new ParseException($error, $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - - if ($isRef) { - $this->refs[$isRef] = end($data); - } - } - - if (isset($mbEncoding)) { - mb_internal_encoding($mbEncoding); - } - - return empty($data) ? null : $data; - } - - /** - * Returns the current line number (takes the offset into account). - * - * @return integer The current line number - */ - private function getRealCurrentLineNb() - { - return $this->currentLineNb + $this->offset; - } - - /** - * Returns the current line indentation. - * - * @return integer The current line indentation - */ - private function getCurrentLineIndentation() - { - return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' ')); - } - - /** - * Returns the next embed block of YAML. - * - * @param integer $indentation The indent level at which the block is to be read, or null for default - * - * @return string A YAML string - * - * @throws ParseException When indentation problem are detected - */ - private function getNextEmbedBlock($indentation = null) - { - $this->moveToNextLine(); - - if (null === $indentation) { - $newIndent = $this->getCurrentLineIndentation(); - - $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem($this->currentLine); - - if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) { - throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - } else { - $newIndent = $indentation; - } - - $data = array(substr($this->currentLine, $newIndent)); - - $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem($this->currentLine); - - while ($this->moveToNextLine()) { - - if ($isItUnindentedCollection && !$this->isStringUnIndentedCollectionItem($this->currentLine)) { - $this->moveToPreviousLine(); - break; - } - - if ($this->isCurrentLineEmpty()) { - if ($this->isCurrentLineBlank()) { - $data[] = substr($this->currentLine, $newIndent); - } - - continue; - } - - $indent = $this->getCurrentLineIndentation(); - - if (preg_match('#^(?P *)$#', $this->currentLine, $match)) { - // empty line - $data[] = $match['text']; - } elseif ($indent >= $newIndent) { - $data[] = substr($this->currentLine, $newIndent); - } elseif (0 == $indent) { - $this->moveToPreviousLine(); - - break; - } else { - throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - } - - return implode("\n", $data); - } - - /** - * Moves the parser to the next line. - * - * @return Boolean - */ - private function moveToNextLine() - { - if ($this->currentLineNb >= count($this->lines) - 1) { - return false; - } - - $this->currentLine = $this->lines[++$this->currentLineNb]; - - return true; - } - - /** - * Moves the parser to the previous line. - */ - private function moveToPreviousLine() - { - $this->currentLine = $this->lines[--$this->currentLineNb]; - } - - /** - * Parses a YAML value. - * - * @param string $value A YAML value - * - * @return mixed A PHP value - * - * @throws ParseException When reference does not exist - */ - private function parseValue($value) - { - if (0 === strpos($value, '*')) { - if (false !== $pos = strpos($value, '#')) { - $value = substr($value, 1, $pos - 2); - } else { - $value = substr($value, 1); - } - - if (!array_key_exists($value, $this->refs)) { - throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLine); - } - - return $this->refs[$value]; - } - - if (preg_match('/^(?P\||>)(?P\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P +#.*)?$/', $value, $matches)) { - $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : ''; - - return $this->parseFoldedScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), intval(abs($modifiers))); - } - - try { - return Inline::parse($value); - } catch (ParseException $e) { - $e->setParsedLine($this->getRealCurrentLineNb() + 1); - $e->setSnippet($this->currentLine); - - throw $e; - } - } - - /** - * Parses a folded scalar. - * - * @param string $separator The separator that was used to begin this folded scalar (| or >) - * @param string $indicator The indicator that was used to begin this folded scalar (+ or -) - * @param integer $indentation The indentation that was used to begin this folded scalar - * - * @return string The text value - */ - private function parseFoldedScalar($separator, $indicator = '', $indentation = 0) - { - $separator = '|' == $separator ? "\n" : ' '; - $text = ''; - - $notEOF = $this->moveToNextLine(); - - while ($notEOF && $this->isCurrentLineBlank()) { - $text .= "\n"; - - $notEOF = $this->moveToNextLine(); - } - - if (!$notEOF) { - return ''; - } - - if (!preg_match('#^(?P'.($indentation ? str_repeat(' ', $indentation) : ' +').')(?P.*)$#u', $this->currentLine, $matches)) { - $this->moveToPreviousLine(); - - return ''; - } - - $textIndent = $matches['indent']; - $previousIndent = 0; - - $text .= $matches['text'].$separator; - while ($this->currentLineNb + 1 < count($this->lines)) { - $this->moveToNextLine(); - - if (preg_match('#^(?P {'.strlen($textIndent).',})(?P.+)$#u', $this->currentLine, $matches)) { - if (' ' == $separator && $previousIndent != $matches['indent']) { - $text = substr($text, 0, -1)."\n"; - } - $previousIndent = $matches['indent']; - - $text .= str_repeat(' ', $diff = strlen($matches['indent']) - strlen($textIndent)).$matches['text'].($diff ? "\n" : $separator); - } elseif (preg_match('#^(?P *)$#', $this->currentLine, $matches)) { - $text .= preg_replace('#^ {1,'.strlen($textIndent).'}#', '', $matches['text'])."\n"; - } else { - $this->moveToPreviousLine(); - - break; - } - } - - if (' ' == $separator) { - // replace last separator by a newline - $text = preg_replace('/ (\n*)$/', "\n$1", $text); - } - - switch ($indicator) { - case '': - $text = preg_replace('#\n+$#s', "\n", $text); - break; - case '+': - break; - case '-': - $text = preg_replace('#\n+$#s', '', $text); - break; - } - - return $text; - } - - /** - * Returns true if the next line is indented. - * - * @return Boolean Returns true if the next line is indented, false otherwise - */ - private function isNextLineIndented() - { - $currentIndentation = $this->getCurrentLineIndentation(); - $notEOF = $this->moveToNextLine(); - - while ($notEOF && $this->isCurrentLineEmpty()) { - $notEOF = $this->moveToNextLine(); - } - - if (false === $notEOF) { - return false; - } - - $ret = false; - if ($this->getCurrentLineIndentation() <= $currentIndentation) { - $ret = true; - } - - $this->moveToPreviousLine(); - - return $ret; - } - - /** - * Returns true if the current line is blank or if it is a comment line. - * - * @return Boolean Returns true if the current line is empty or if it is a comment line, false otherwise - */ - private function isCurrentLineEmpty() - { - return $this->isCurrentLineBlank() || $this->isCurrentLineComment(); - } - - /** - * Returns true if the current line is blank. - * - * @return Boolean Returns true if the current line is blank, false otherwise - */ - private function isCurrentLineBlank() - { - return '' == trim($this->currentLine, ' '); - } - - /** - * Returns true if the current line is a comment line. - * - * @return Boolean Returns true if the current line is a comment line, false otherwise - */ - private function isCurrentLineComment() - { - //checking explicitly the first char of the trim is faster than loops or strpos - $ltrimmedLine = ltrim($this->currentLine, ' '); - - return $ltrimmedLine[0] === '#'; - } - - /** - * Cleanups a YAML string to be parsed. - * - * @param string $value The input YAML string - * - * @return string A cleaned up YAML string - */ - private function cleanup($value) - { - $value = str_replace(array("\r\n", "\r"), "\n", $value); - - if (!preg_match("#\n$#", $value)) { - $value .= "\n"; - } - - // strip YAML header - $count = 0; - $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#su', '', $value, -1, $count); - $this->offset += $count; - - // remove leading comments - $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count); - if ($count == 1) { - // items have been removed, update the offset - $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n"); - $value = $trimmedValue; - } - - // remove start of the document marker (---) - $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count); - if ($count == 1) { - // items have been removed, update the offset - $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n"); - $value = $trimmedValue; - - // remove end of the document marker (...) - $value = preg_replace('#\.\.\.\s*$#s', '', $value); - } - - return $value; - } - - /** - * Returns true if the next line starts unindented collection - * - * @return Boolean Returns true if the next line starts unindented collection, false otherwise - */ - private function isNextLineUnIndentedCollection() - { - $currentIndentation = $this->getCurrentLineIndentation(); - $notEOF = $this->moveToNextLine(); - - while ($notEOF && $this->isCurrentLineEmpty()) { - $notEOF = $this->moveToNextLine(); - } - - if (false === $notEOF) { - return false; - } - - $ret = false; - if ( - $this->getCurrentLineIndentation() == $currentIndentation - && - $this->isStringUnIndentedCollectionItem($this->currentLine) - ) { - $ret = true; - } - - $this->moveToPreviousLine(); - - return $ret; - } - - /** - * Returns true if the string is unindented collection item - * - * @return Boolean Returns true if the string is unindented collection item, false otherwise - */ - private function isStringUnIndentedCollectionItem($string) - { - return (0 === strpos($this->currentLine, '- ')); - } - -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/README.md b/framework/library/Doctrine/Symfony/Component/Yaml/README.md deleted file mode 100644 index 3441316..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/README.md +++ /dev/null @@ -1,17 +0,0 @@ -Yaml Component -============== - -YAML implements most of the YAML 1.2 specification. - - use Symfony\Component\Yaml\Yaml; - - $array = Yaml::parse($file); - - print Yaml::dump($array); - -Resources ---------- - -You can run the unit tests with the following command: - - phpunit diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/DumperTest.php b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/DumperTest.php deleted file mode 100644 index c662ead..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/DumperTest.php +++ /dev/null @@ -1,166 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Tests; - -use Symfony\Component\Yaml\Yaml; -use Symfony\Component\Yaml\Parser; -use Symfony\Component\Yaml\Dumper; - -class DumperTest extends \PHPUnit_Framework_TestCase -{ - protected $parser; - protected $dumper; - protected $path; - - protected function setUp() - { - $this->parser = new Parser(); - $this->dumper = new Dumper(); - $this->path = __DIR__.'/Fixtures'; - } - - protected function tearDown() - { - $this->parser = null; - $this->dumper = null; - $this->path = null; - } - - public function testSpecifications() - { - $files = $this->parser->parse(file_get_contents($this->path.'/index.yml')); - foreach ($files as $file) { - $yamls = file_get_contents($this->path.'/'.$file.'.yml'); - - // split YAMLs documents - foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml) { - if (!$yaml) { - continue; - } - - $test = $this->parser->parse($yaml); - if (isset($test['dump_skip']) && $test['dump_skip']) { - continue; - } elseif (isset($test['todo']) && $test['todo']) { - // TODO - } else { - $expected = eval('return '.trim($test['php']).';'); - - $this->assertEquals($expected, $this->parser->parse($this->dumper->dump($expected, 10)), $test['test']); - } - } - } - } - - public function testInlineLevel() - { - // inline level - $array = array( - '' => 'bar', - 'foo' => '#bar', - 'foo\'bar' => array(), - 'bar' => array(1, 'foo'), - 'foobar' => array( - 'foo' => 'bar', - 'bar' => array(1, 'foo'), - 'foobar' => array( - 'foo' => 'bar', - 'bar' => array(1, 'foo'), - ), - ), - ); - - $expected = <<assertEquals($expected, $this->dumper->dump($array, -10), '->dump() takes an inline level argument'); -$this->assertEquals($expected, $this->dumper->dump($array, 0), '->dump() takes an inline level argument'); - -$expected = <<assertEquals($expected, $this->dumper->dump($array, 1), '->dump() takes an inline level argument'); - - $expected = <<assertEquals($expected, $this->dumper->dump($array, 2), '->dump() takes an inline level argument'); - - $expected = <<assertEquals($expected, $this->dumper->dump($array, 3), '->dump() takes an inline level argument'); - - $expected = <<assertEquals($expected, $this->dumper->dump($array, 4), '->dump() takes an inline level argument'); - $this->assertEquals($expected, $this->dumper->dump($array, 10), '->dump() takes an inline level argument'); - } - - public function testObjectsSupport() - { - $a = array('foo' => new A(), 'bar' => 1); - - $this->assertEquals('{ foo: !!php/object:O:30:"Symfony\Component\Yaml\Tests\A":1:{s:1:"a";s:3:"foo";}, bar: 1 }', $this->dumper->dump($a), '->dump() is able to dump objects'); - } -} - -class A -{ - public $a = 'foo'; -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsAnchorAlias.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsAnchorAlias.yml deleted file mode 100644 index 5f9c942..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsAnchorAlias.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- %YAML:1.0 -test: Simple Alias Example -brief: > - If you need to refer to the same item of data twice, - you can give that item an alias. The alias is a plain - string, starting with an ampersand. The item may then - be referred to by the alias throughout your document - by using an asterisk before the name of the alias. - This is called an anchor. -yaml: | - - &showell Steve - - Clark - - Brian - - Oren - - *showell -php: | - array('Steve', 'Clark', 'Brian', 'Oren', 'Steve') - ---- -test: Alias of a Mapping -brief: > - An alias can be used on any item of data, including - sequences, mappings, and other complex data types. -yaml: | - - &hello - Meat: pork - Starch: potato - - banana - - *hello -php: | - array(array('Meat'=>'pork', 'Starch'=>'potato'), 'banana', array('Meat'=>'pork', 'Starch'=>'potato')) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsBasicTests.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsBasicTests.yml deleted file mode 100644 index 5542b0d..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsBasicTests.yml +++ /dev/null @@ -1,178 +0,0 @@ ---- %YAML:1.0 -test: Simple Sequence -brief: | - You can specify a list in YAML by placing each - member of the list on a new line with an opening - dash. These lists are called sequences. -yaml: | - - apple - - banana - - carrot -php: | - array('apple', 'banana', 'carrot') ---- -test: Nested Sequences -brief: | - You can include a sequence within another - sequence by giving the sequence an empty - dash, followed by an indented list. -yaml: | - - - - foo - - bar - - baz -php: | - array(array('foo', 'bar', 'baz')) ---- -test: Mixed Sequences -brief: | - Sequences can contain any YAML data, - including strings and other sequences. -yaml: | - - apple - - - - foo - - bar - - x123 - - banana - - carrot -php: | - array('apple', array('foo', 'bar', 'x123'), 'banana', 'carrot') ---- -test: Deeply Nested Sequences -brief: | - Sequences can be nested even deeper, with each - level of indentation representing a level of - depth. -yaml: | - - - - - - uno - - dos -php: | - array(array(array('uno', 'dos'))) ---- -test: Simple Mapping -brief: | - You can add a keyed list (also known as a dictionary or - hash) to your document by placing each member of the - list on a new line, with a colon seperating the key - from its value. In YAML, this type of list is called - a mapping. -yaml: | - foo: whatever - bar: stuff -php: | - array('foo' => 'whatever', 'bar' => 'stuff') ---- -test: Sequence in a Mapping -brief: | - A value in a mapping can be a sequence. -yaml: | - foo: whatever - bar: - - uno - - dos -php: | - array('foo' => 'whatever', 'bar' => array('uno', 'dos')) ---- -test: Nested Mappings -brief: | - A value in a mapping can be another mapping. -yaml: | - foo: whatever - bar: - fruit: apple - name: steve - sport: baseball -php: | - array( - 'foo' => 'whatever', - 'bar' => array( - 'fruit' => 'apple', - 'name' => 'steve', - 'sport' => 'baseball' - ) - ) ---- -test: Mixed Mapping -brief: | - A mapping can contain any assortment - of mappings and sequences as values. -yaml: | - foo: whatever - bar: - - - fruit: apple - name: steve - sport: baseball - - more - - - python: rocks - perl: papers - ruby: scissorses -php: | - array( - 'foo' => 'whatever', - 'bar' => array( - array( - 'fruit' => 'apple', - 'name' => 'steve', - 'sport' => 'baseball' - ), - 'more', - array( - 'python' => 'rocks', - 'perl' => 'papers', - 'ruby' => 'scissorses' - ) - ) - ) ---- -test: Mapping-in-Sequence Shortcut -todo: true -brief: | - If you are adding a mapping to a sequence, you - can place the mapping on the same line as the - dash as a shortcut. -yaml: | - - work on YAML.py: - - work on Store -php: | - array(array('work on YAML.py' => array('work on Store'))) ---- -test: Sequence-in-Mapping Shortcut -todo: true -brief: | - The dash in a sequence counts as indentation, so - you can add a sequence inside of a mapping without - needing spaces as indentation. -yaml: | - allow: - - 'localhost' - - '%.sourceforge.net' - - '%.freepan.org' -php: | - array('allow' => array('localhost', '%.sourceforge.net', '%.freepan.org')) ---- -todo: true -test: Merge key -brief: | - A merge key ('<<') can be used in a mapping to insert other mappings. If - the value associated with the merge key is a mapping, each of its key/value - pairs is inserted into the current mapping. -yaml: | - mapping: - name: Joe - job: Accountant - <<: - age: 38 -php: | - array( - 'mapping' => - array( - 'name' => 'Joe', - 'job' => 'Accountant', - 'age' => 38 - ) - ) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsBlockMapping.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsBlockMapping.yml deleted file mode 100644 index f7ca469..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsBlockMapping.yml +++ /dev/null @@ -1,51 +0,0 @@ ---- -test: One Element Mapping -brief: | - A mapping with one key/value pair -yaml: | - foo: bar -php: | - array('foo' => 'bar') ---- -test: Multi Element Mapping -brief: | - More than one key/value pair -yaml: | - red: baron - white: walls - blue: berries -php: | - array( - 'red' => 'baron', - 'white' => 'walls', - 'blue' => 'berries', - ) ---- -test: Values aligned -brief: | - Often times human editors of documents will align the values even - though YAML emitters generally don't. -yaml: | - red: baron - white: walls - blue: berries -php: | - array( - 'red' => 'baron', - 'white' => 'walls', - 'blue' => 'berries', - ) ---- -test: Colons aligned -brief: | - Spaces can come before the ': ' key/value separator. -yaml: | - red : baron - white : walls - blue : berries -php: | - array( - 'red' => 'baron', - 'white' => 'walls', - 'blue' => 'berries', - ) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsDocumentSeparator.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsDocumentSeparator.yml deleted file mode 100644 index f8501dd..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsDocumentSeparator.yml +++ /dev/null @@ -1,85 +0,0 @@ ---- %YAML:1.0 -test: Trailing Document Separator -todo: true -brief: > - You can separate YAML documents - with a string of three dashes. -yaml: | - - foo: 1 - bar: 2 - --- - more: stuff -python: | - [ - [ { 'foo': 1, 'bar': 2 } ], - { 'more': 'stuff' } - ] -ruby: | - [ { 'foo' => 1, 'bar' => 2 } ] - ---- -test: Leading Document Separator -todo: true -brief: > - You can explicity give an opening - document separator to your YAML stream. -yaml: | - --- - - foo: 1 - bar: 2 - --- - more: stuff -python: | - [ - [ {'foo': 1, 'bar': 2}], - {'more': 'stuff'} - ] -ruby: | - [ { 'foo' => 1, 'bar' => 2 } ] - ---- -test: YAML Header -todo: true -brief: > - The opening separator can contain directives - to the YAML parser, such as the version - number. -yaml: | - --- %YAML:1.0 - foo: 1 - bar: 2 -php: | - array('foo' => 1, 'bar' => 2) -documents: 1 - ---- -test: Red Herring Document Separator -brief: > - Separators included in blocks or strings - are treated as blocks or strings, as the - document separator should have no indentation - preceding it. -yaml: | - foo: | - --- -php: | - array('foo' => "---\n") - ---- -test: Multiple Document Separators in Block -brief: > - This technique allows you to embed other YAML - documents within literal blocks. -yaml: | - foo: | - --- - foo: bar - --- - yo: baz - bar: | - fooness -php: | - array( - 'foo' => "---\nfoo: bar\n---\nyo: baz\n", - 'bar' => "fooness\n" - ) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsErrorTests.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsErrorTests.yml deleted file mode 100644 index 753d829..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsErrorTests.yml +++ /dev/null @@ -1,26 +0,0 @@ ---- -test: Missing value for hash item -todo: true -brief: | - Third item in this hash doesn't have a value -yaml: | - okay: value - also okay: ~ - causes error because no value specified - last key: value okay here too -python-error: causes error because no value specified - ---- -test: Not indenting enough -brief: | - There was a bug in PyYaml where it was off by one - in the indentation check. It was allowing the YAML - below. -# This is actually valid YAML now. Someone should tell showell. -yaml: | - foo: - firstline: 1 - secondline: 2 -php: | - array('foo' => null, 'firstline' => 1, 'secondline' => 2) - diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsFlowCollections.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsFlowCollections.yml deleted file mode 100644 index 03090e4..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsFlowCollections.yml +++ /dev/null @@ -1,60 +0,0 @@ ---- -test: Simple Inline Array -brief: > - Sequences can be contained on a - single line, using the inline syntax. - Separate each entry with commas and - enclose in square brackets. -yaml: | - seq: [ a, b, c ] -php: | - array('seq' => array('a', 'b', 'c')) ---- -test: Simple Inline Hash -brief: > - Mapping can also be contained on - a single line, using the inline - syntax. Each key-value pair is - separated by a colon, with a comma - between each entry in the mapping. - Enclose with curly braces. -yaml: | - hash: { name: Steve, foo: bar } -php: | - array('hash' => array('name' => 'Steve', 'foo' => 'bar')) ---- -test: Multi-line Inline Collections -todo: true -brief: > - Both inline sequences and inline mappings - can span multiple lines, provided that you - indent the additional lines. -yaml: | - languages: [ Ruby, - Perl, - Python ] - websites: { YAML: yaml.org, - Ruby: ruby-lang.org, - Python: python.org, - Perl: use.perl.org } -php: | - array( - 'languages' => array('Ruby', 'Perl', 'Python'), - 'websites' => array( - 'YAML' => 'yaml.org', - 'Ruby' => 'ruby-lang.org', - 'Python' => 'python.org', - 'Perl' => 'use.perl.org' - ) - ) ---- -test: Commas in Values (not in the spec!) -todo: true -brief: > - List items in collections are delimited by commas, but - there must be a space after each comma. This allows you - to add numbers without quoting. -yaml: | - attendances: [ 45,123, 70,000, 17,222 ] -php: | - array('attendances' => array(45123, 70000, 17222)) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsFoldedScalars.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsFoldedScalars.yml deleted file mode 100644 index a14735a..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsFoldedScalars.yml +++ /dev/null @@ -1,176 +0,0 @@ ---- %YAML:1.0 -test: Single ending newline -brief: > - A pipe character, followed by an indented - block of text is treated as a literal - block, in which newlines are preserved - throughout the block, including the final - newline. -yaml: | - --- - this: | - Foo - Bar -php: | - array('this' => "Foo\nBar\n") ---- -test: The '+' indicator -brief: > - The '+' indicator says to keep newlines at the end of text - blocks. -yaml: | - normal: | - extra new lines not kept - - preserving: |+ - extra new lines are kept - - - dummy: value -php: | - array( - 'normal' => "extra new lines not kept\n", - 'preserving' => "extra new lines are kept\n\n\n", - 'dummy' => 'value' - ) ---- -test: Three trailing newlines in literals -brief: > - To give you more control over how space - is preserved in text blocks, YAML has - the keep '+' and chomp '-' indicators. - The keep indicator will preserve all - ending newlines, while the chomp indicator - will strip all ending newlines. -yaml: | - clipped: | - This has one newline. - - - - same as "clipped" above: "This has one newline.\n" - - stripped: |- - This has no newline. - - - - same as "stripped" above: "This has no newline." - - kept: |+ - This has four newlines. - - - - same as "kept" above: "This has four newlines.\n\n\n\n" -php: | - array( - 'clipped' => "This has one newline.\n", - 'same as "clipped" above' => "This has one newline.\n", - 'stripped' => 'This has no newline.', - 'same as "stripped" above' => 'This has no newline.', - 'kept' => "This has four newlines.\n\n\n\n", - 'same as "kept" above' => "This has four newlines.\n\n\n\n" - ) ---- -test: Extra trailing newlines with spaces -todo: true -brief: > - Normally, only a single newline is kept - from the end of a literal block, unless the - keep '+' character is used in combination - with the pipe. The following example - will preserve all ending whitespace - since the last line of both literal blocks - contains spaces which extend past the indentation - level. -yaml: | - --- - this: | - Foo - - - kept: |+ - Foo - - -php: | - array('this' => "Foo\n\n \n", - 'kept' => "Foo\n\n \n" ) - ---- -test: Folded Block in a Sequence -brief: > - A greater-then character, followed by an indented - block of text is treated as a folded block, in - which lines of text separated by a single newline - are concatenated as a single line. -yaml: | - --- - - apple - - banana - - > - can't you see - the beauty of yaml? - hmm - - dog -php: | - array( - 'apple', - 'banana', - "can't you see the beauty of yaml? hmm\n", - 'dog' - ) ---- -test: Folded Block as a Mapping Value -brief: > - Both literal and folded blocks can be - used in collections, as values in a - sequence or a mapping. -yaml: | - --- - quote: > - Mark McGwire's - year was crippled - by a knee injury. - source: espn -php: | - array( - 'quote' => "Mark McGwire's year was crippled by a knee injury.\n", - 'source' => 'espn' - ) ---- -test: Three trailing newlines in folded blocks -brief: > - The keep and chomp indicators can also - be applied to folded blocks. -yaml: | - clipped: > - This has one newline. - - - - same as "clipped" above: "This has one newline.\n" - - stripped: >- - This has no newline. - - - - same as "stripped" above: "This has no newline." - - kept: >+ - This has four newlines. - - - - same as "kept" above: "This has four newlines.\n\n\n\n" -php: | - array( - 'clipped' => "This has one newline.\n", - 'same as "clipped" above' => "This has one newline.\n", - 'stripped' => 'This has no newline.', - 'same as "stripped" above' => 'This has no newline.', - 'kept' => "This has four newlines.\n\n\n\n", - 'same as "kept" above' => "This has four newlines.\n\n\n\n" - ) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsNullsAndEmpties.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsNullsAndEmpties.yml deleted file mode 100644 index 9a5300f..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsNullsAndEmpties.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- %YAML:1.0 -test: Empty Sequence -brief: > - You can represent the empty sequence - with an empty inline sequence. -yaml: | - empty: [] -php: | - array('empty' => array()) ---- -test: Empty Mapping -brief: > - You can represent the empty mapping - with an empty inline mapping. -yaml: | - empty: {} -php: | - array('empty' => array()) ---- -test: Empty Sequence as Entire Document -yaml: | - [] -php: | - array() ---- -test: Empty Mapping as Entire Document -yaml: | - {} -php: | - array() ---- -test: Null as Document -yaml: | - ~ -php: | - null ---- -test: Empty String -brief: > - You can represent an empty string - with a pair of quotes. -yaml: | - '' -php: | - '' diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsSpecificationExamples.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsSpecificationExamples.yml deleted file mode 100644 index 6f99f75..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsSpecificationExamples.yml +++ /dev/null @@ -1,1695 +0,0 @@ ---- %YAML:1.0 -test: Sequence of scalars -spec: 2.1 -yaml: | - - Mark McGwire - - Sammy Sosa - - Ken Griffey -php: | - array('Mark McGwire', 'Sammy Sosa', 'Ken Griffey') ---- -test: Mapping of scalars to scalars -spec: 2.2 -yaml: | - hr: 65 - avg: 0.278 - rbi: 147 -php: | - array('hr' => 65, 'avg' => 0.278, 'rbi' => 147) ---- -test: Mapping of scalars to sequences -spec: 2.3 -yaml: | - american: - - Boston Red Sox - - Detroit Tigers - - New York Yankees - national: - - New York Mets - - Chicago Cubs - - Atlanta Braves -php: | - array('american' => - array( 'Boston Red Sox', 'Detroit Tigers', - 'New York Yankees' ), - 'national' => - array( 'New York Mets', 'Chicago Cubs', - 'Atlanta Braves' ) - ) ---- -test: Sequence of mappings -spec: 2.4 -yaml: | - - - name: Mark McGwire - hr: 65 - avg: 0.278 - - - name: Sammy Sosa - hr: 63 - avg: 0.288 -php: | - array( - array('name' => 'Mark McGwire', 'hr' => 65, 'avg' => 0.278), - array('name' => 'Sammy Sosa', 'hr' => 63, 'avg' => 0.288) - ) ---- -test: Legacy A5 -todo: true -spec: legacy_A5 -yaml: | - ? - - New York Yankees - - Atlanta Braves - : - - 2001-07-02 - - 2001-08-12 - - 2001-08-14 - ? - - Detroit Tigers - - Chicago Cubs - : - - 2001-07-23 -perl-busted: > - YAML.pm will be able to emulate this behavior soon. In this regard - it may be somewhat more correct than Python's native behaviour which - can only use tuples as mapping keys. PyYAML will also need to figure - out some clever way to roundtrip structured keys. -python: | - [ - { - ('New York Yankees', 'Atlanta Braves'): - [yaml.timestamp('2001-07-02'), - yaml.timestamp('2001-08-12'), - yaml.timestamp('2001-08-14')], - ('Detroit Tigers', 'Chicago Cubs'): - [yaml.timestamp('2001-07-23')] - } - ] -ruby: | - { - [ 'New York Yankees', 'Atlanta Braves' ] => - [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ], - [ 'Detroit Tigers', 'Chicago Cubs' ] => - [ Date.new( 2001, 7, 23 ) ] - } -syck: | - struct test_node seq1[] = { - { T_STR, 0, "New York Yankees" }, - { T_STR, 0, "Atlanta Braves" }, - end_node - }; - struct test_node seq2[] = { - { T_STR, 0, "2001-07-02" }, - { T_STR, 0, "2001-08-12" }, - { T_STR, 0, "2001-08-14" }, - end_node - }; - struct test_node seq3[] = { - { T_STR, 0, "Detroit Tigers" }, - { T_STR, 0, "Chicago Cubs" }, - end_node - }; - struct test_node seq4[] = { - { T_STR, 0, "2001-07-23" }, - end_node - }; - struct test_node map[] = { - { T_SEQ, 0, 0, seq1 }, - { T_SEQ, 0, 0, seq2 }, - { T_SEQ, 0, 0, seq3 }, - { T_SEQ, 0, 0, seq4 }, - end_node - }; - struct test_node stream[] = { - { T_MAP, 0, 0, map }, - end_node - }; - ---- -test: Sequence of sequences -spec: 2.5 -yaml: | - - [ name , hr , avg ] - - [ Mark McGwire , 65 , 0.278 ] - - [ Sammy Sosa , 63 , 0.288 ] -php: | - array( - array( 'name', 'hr', 'avg' ), - array( 'Mark McGwire', 65, 0.278 ), - array( 'Sammy Sosa', 63, 0.288 ) - ) ---- -test: Mapping of mappings -todo: true -spec: 2.6 -yaml: | - Mark McGwire: {hr: 65, avg: 0.278} - Sammy Sosa: { - hr: 63, - avg: 0.288 - } -php: | - array( - 'Mark McGwire' => - array( 'hr' => 65, 'avg' => 0.278 ), - 'Sammy Sosa' => - array( 'hr' => 63, 'avg' => 0.288 ) - ) ---- -test: Two documents in a stream each with a leading comment -todo: true -spec: 2.7 -yaml: | - # Ranking of 1998 home runs - --- - - Mark McGwire - - Sammy Sosa - - Ken Griffey - - # Team ranking - --- - - Chicago Cubs - - St Louis Cardinals -ruby: | - y = YAML::Stream.new - y.add( [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ] ) - y.add( [ 'Chicago Cubs', 'St Louis Cardinals' ] ) -documents: 2 - ---- -test: Play by play feed from a game -todo: true -spec: 2.8 -yaml: | - --- - time: 20:03:20 - player: Sammy Sosa - action: strike (miss) - ... - --- - time: 20:03:47 - player: Sammy Sosa - action: grand slam - ... -perl: | - [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ] -documents: 2 - ---- -test: Single document with two comments -spec: 2.9 -yaml: | - hr: # 1998 hr ranking - - Mark McGwire - - Sammy Sosa - rbi: - # 1998 rbi ranking - - Sammy Sosa - - Ken Griffey -php: | - array( - 'hr' => array( 'Mark McGwire', 'Sammy Sosa' ), - 'rbi' => array( 'Sammy Sosa', 'Ken Griffey' ) - ) ---- -test: Node for Sammy Sosa appears twice in this document -spec: 2.10 -yaml: | - --- - hr: - - Mark McGwire - # Following node labeled SS - - &SS Sammy Sosa - rbi: - - *SS # Subsequent occurance - - Ken Griffey -php: | - array( - 'hr' => - array('Mark McGwire', 'Sammy Sosa'), - 'rbi' => - array('Sammy Sosa', 'Ken Griffey') - ) ---- -test: Mapping between sequences -todo: true -spec: 2.11 -yaml: | - ? # PLAY SCHEDULE - - Detroit Tigers - - Chicago Cubs - : - - 2001-07-23 - - ? [ New York Yankees, - Atlanta Braves ] - : [ 2001-07-02, 2001-08-12, - 2001-08-14 ] -ruby: | - { - [ 'Detroit Tigers', 'Chicago Cubs' ] => [ Date.new( 2001, 7, 23 ) ], - [ 'New York Yankees', 'Atlanta Braves' ] => [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ] - } -syck: | - struct test_node seq1[] = { - { T_STR, 0, "New York Yankees" }, - { T_STR, 0, "Atlanta Braves" }, - end_node - }; - struct test_node seq2[] = { - { T_STR, 0, "2001-07-02" }, - { T_STR, 0, "2001-08-12" }, - { T_STR, 0, "2001-08-14" }, - end_node - }; - struct test_node seq3[] = { - { T_STR, 0, "Detroit Tigers" }, - { T_STR, 0, "Chicago Cubs" }, - end_node - }; - struct test_node seq4[] = { - { T_STR, 0, "2001-07-23" }, - end_node - }; - struct test_node map[] = { - { T_SEQ, 0, 0, seq3 }, - { T_SEQ, 0, 0, seq4 }, - { T_SEQ, 0, 0, seq1 }, - { T_SEQ, 0, 0, seq2 }, - end_node - }; - struct test_node stream[] = { - { T_MAP, 0, 0, map }, - end_node - }; - ---- -test: Sequence key shortcut -spec: 2.12 -yaml: | - --- - # products purchased - - item : Super Hoop - quantity: 1 - - item : Basketball - quantity: 4 - - item : Big Shoes - quantity: 1 -php: | - array ( - array ( - 'item' => 'Super Hoop', - 'quantity' => 1, - ), - array ( - 'item' => 'Basketball', - 'quantity' => 4, - ), - array ( - 'item' => 'Big Shoes', - 'quantity' => 1, - ) - ) -perl: | - [ - { item => 'Super Hoop', quantity => 1 }, - { item => 'Basketball', quantity => 4 }, - { item => 'Big Shoes', quantity => 1 } - ] - -ruby: | - [ - { 'item' => 'Super Hoop', 'quantity' => 1 }, - { 'item' => 'Basketball', 'quantity' => 4 }, - { 'item' => 'Big Shoes', 'quantity' => 1 } - ] -python: | - [ - { 'item': 'Super Hoop', 'quantity': 1 }, - { 'item': 'Basketball', 'quantity': 4 }, - { 'item': 'Big Shoes', 'quantity': 1 } - ] -syck: | - struct test_node map1[] = { - { T_STR, 0, "item" }, - { T_STR, 0, "Super Hoop" }, - { T_STR, 0, "quantity" }, - { T_STR, 0, "1" }, - end_node - }; - struct test_node map2[] = { - { T_STR, 0, "item" }, - { T_STR, 0, "Basketball" }, - { T_STR, 0, "quantity" }, - { T_STR, 0, "4" }, - end_node - }; - struct test_node map3[] = { - { T_STR, 0, "item" }, - { T_STR, 0, "Big Shoes" }, - { T_STR, 0, "quantity" }, - { T_STR, 0, "1" }, - end_node - }; - struct test_node seq[] = { - { T_MAP, 0, 0, map1 }, - { T_MAP, 0, 0, map2 }, - { T_MAP, 0, 0, map3 }, - end_node - }; - struct test_node stream[] = { - { T_SEQ, 0, 0, seq }, - end_node - }; - - ---- -test: Literal perserves newlines -todo: true -spec: 2.13 -yaml: | - # ASCII Art - --- | - \//||\/|| - // || ||_ -perl: | - "\\//||\\/||\n// || ||_\n" -ruby: | - "\\//||\\/||\n// || ||_\n" -python: | - [ - flushLeft( - """ - \//||\/|| - // || ||_ - """ - ) - ] -syck: | - struct test_node stream[] = { - { T_STR, 0, "\\//||\\/||\n// || ||_\n" }, - end_node - }; - ---- -test: Folded treats newlines as a space -todo: true -spec: 2.14 -yaml: | - --- - Mark McGwire's - year was crippled - by a knee injury. -perl: | - "Mark McGwire's year was crippled by a knee injury." -ruby: | - "Mark McGwire's year was crippled by a knee injury." -python: | - [ "Mark McGwire's year was crippled by a knee injury." ] -syck: | - struct test_node stream[] = { - { T_STR, 0, "Mark McGwire's year was crippled by a knee injury." }, - end_node - }; - ---- -test: Newlines preserved for indented and blank lines -todo: true -spec: 2.15 -yaml: | - --- > - Sammy Sosa completed another - fine season with great stats. - - 63 Home Runs - 0.288 Batting Average - - What a year! -perl: | - "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n" -ruby: | - "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n" -python: | - [ - flushLeft( - """ - Sammy Sosa completed another fine season with great stats. - - 63 Home Runs - 0.288 Batting Average - - What a year! - """ - ) - ] -syck: | - struct test_node stream[] = { - { T_STR, 0, "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n" }, - end_node - }; - - ---- -test: Indentation determines scope -spec: 2.16 -yaml: | - name: Mark McGwire - accomplishment: > - Mark set a major league - home run record in 1998. - stats: | - 65 Home Runs - 0.278 Batting Average -php: | - array( - 'name' => 'Mark McGwire', - 'accomplishment' => "Mark set a major league home run record in 1998.\n", - 'stats' => "65 Home Runs\n0.278 Batting Average\n" - ) ---- -test: Quoted scalars -todo: true -spec: 2.17 -yaml: | - unicode: "Sosa did fine.\u263A" - control: "\b1998\t1999\t2000\n" - hexesc: "\x0D\x0A is \r\n" - - single: '"Howdy!" he cried.' - quoted: ' # not a ''comment''.' - tie-fighter: '|\-*-/|' -ruby: | - { - "tie-fighter" => "|\\-*-/|", - "control"=>"\0101998\t1999\t2000\n", - "unicode"=>"Sosa did fine." + ["263A".hex ].pack('U*'), - "quoted"=>" # not a 'comment'.", - "single"=>"\"Howdy!\" he cried.", - "hexesc"=>"\r\n is \r\n" - } ---- -test: Multiline flow scalars -todo: true -spec: 2.18 -yaml: | - plain: - This unquoted scalar - spans many lines. - - quoted: "So does this - quoted scalar.\n" -ruby: | - { - 'plain' => 'This unquoted scalar spans many lines.', - 'quoted' => "So does this quoted scalar.\n" - } ---- -test: Integers -spec: 2.19 -yaml: | - canonical: 12345 - decimal: +12,345 - octal: 014 - hexadecimal: 0xC -php: | - array( - 'canonical' => 12345, - 'decimal' => 12345, - 'octal' => 014, - 'hexadecimal' => 0xC - ) ---- -# FIX: spec shows parens around -inf and NaN -test: Floating point -spec: 2.20 -yaml: | - canonical: 1.23015e+3 - exponential: 12.3015e+02 - fixed: 1,230.15 - negative infinity: -.inf - not a number: .NaN -php: | - array( - 'canonical' => 1230.15, - 'exponential' => 1230.15, - 'fixed' => 1230.15, - 'negative infinity' => log(0), - 'not a number' => -log(0), - ) ---- -test: Miscellaneous -spec: 2.21 -yaml: | - null: ~ - true: true - false: false - string: '12345' -php: | - array( - '' => null, - 1 => true, - 0 => false, - 'string' => '12345' - ) ---- -test: Timestamps -todo: true -spec: 2.22 -yaml: | - canonical: 2001-12-15T02:59:43.1Z - iso8601: 2001-12-14t21:59:43.10-05:00 - spaced: 2001-12-14 21:59:43.10 -05:00 - date: 2002-12-14 # Time is noon UTC -php: | - array( - 'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ), - 'iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), - 'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), - 'date' => Date.new( 2002, 12, 14 ) - ) ---- -test: legacy Timestamps test -todo: true -spec: legacy D4 -yaml: | - canonical: 2001-12-15T02:59:43.00Z - iso8601: 2001-02-28t21:59:43.00-05:00 - spaced: 2001-12-14 21:59:43.00 -05:00 - date: 2002-12-14 -php: | - array( - 'canonical' => Time::utc( 2001, 12, 15, 2, 59, 43, 0 ), - 'iso8601' => YAML::mktime( 2001, 2, 28, 21, 59, 43, 0, "-05:00" ), - 'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0, "-05:00" ), - 'date' => Date.new( 2002, 12, 14 ) - ) ---- -test: Various explicit families -todo: true -spec: 2.23 -yaml: | - not-date: !str 2002-04-28 - picture: !binary | - R0lGODlhDAAMAIQAAP//9/X - 17unp5WZmZgAAAOfn515eXv - Pz7Y6OjuDg4J+fn5OTk6enp - 56enmleECcgggoBADs= - - application specific tag: !!something | - The semantics of the tag - above may be different for - different documents. - -ruby-setup: | - YAML.add_private_type( "something" ) do |type, val| - "SOMETHING: #{val}" - end -ruby: | - { - 'not-date' => '2002-04-28', - 'picture' => "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236i^\020' \202\n\001\000;", - 'application specific tag' => "SOMETHING: The semantics of the tag\nabove may be different for\ndifferent documents.\n" - } ---- -test: Application specific family -todo: true -spec: 2.24 -yaml: | - # Establish a tag prefix - --- !clarkevans.com,2002/graph/^shape - # Use the prefix: shorthand for - # !clarkevans.com,2002/graph/circle - - !^circle - center: &ORIGIN {x: 73, 'y': 129} - radius: 7 - - !^line # !clarkevans.com,2002/graph/line - start: *ORIGIN - finish: { x: 89, 'y': 102 } - - !^label - start: *ORIGIN - color: 0xFFEEBB - value: Pretty vector drawing. -ruby-setup: | - YAML.add_domain_type( "clarkevans.com,2002", 'graph/shape' ) { |type, val| - if Array === val - val << "Shape Container" - val - else - raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect - end - } - one_shape_proc = Proc.new { |type, val| - scheme, domain, type = type.split( /:/, 3 ) - if val.is_a? ::Hash - val['TYPE'] = "Shape: #{type}" - val - else - raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect - end - } - YAML.add_domain_type( "clarkevans.com,2002", 'graph/circle', &one_shape_proc ) - YAML.add_domain_type( "clarkevans.com,2002", 'graph/line', &one_shape_proc ) - YAML.add_domain_type( "clarkevans.com,2002", 'graph/label', &one_shape_proc ) -ruby: | - [ - { - "radius" => 7, - "center"=> - { - "x" => 73, - "y" => 129 - }, - "TYPE" => "Shape: graph/circle" - }, { - "finish" => - { - "x" => 89, - "y" => 102 - }, - "TYPE" => "Shape: graph/line", - "start" => - { - "x" => 73, - "y" => 129 - } - }, { - "TYPE" => "Shape: graph/label", - "value" => "Pretty vector drawing.", - "start" => - { - "x" => 73, - "y" => 129 - }, - "color" => 16772795 - }, - "Shape Container" - ] -# --- -# test: Unordered set -# spec: 2.25 -# yaml: | -# # sets are represented as a -# # mapping where each key is -# # associated with the empty string -# --- !set -# ? Mark McGwire -# ? Sammy Sosa -# ? Ken Griff ---- -test: Ordered mappings -todo: true -spec: 2.26 -yaml: | - # ordered maps are represented as - # a sequence of mappings, with - # each mapping having one key - --- !omap - - Mark McGwire: 65 - - Sammy Sosa: 63 - - Ken Griffy: 58 -ruby: | - YAML::Omap[ - 'Mark McGwire', 65, - 'Sammy Sosa', 63, - 'Ken Griffy', 58 - ] ---- -test: Invoice -dump_skip: true -spec: 2.27 -yaml: | - --- !clarkevans.com,2002/^invoice - invoice: 34843 - date : 2001-01-23 - bill-to: &id001 - given : Chris - family : Dumars - address: - lines: | - 458 Walkman Dr. - Suite #292 - city : Royal Oak - state : MI - postal : 48046 - ship-to: *id001 - product: - - - sku : BL394D - quantity : 4 - description : Basketball - price : 450.00 - - - sku : BL4438H - quantity : 1 - description : Super Hoop - price : 2392.00 - tax : 251.42 - total: 4443.52 - comments: > - Late afternoon is best. - Backup contact is Nancy - Billsmer @ 338-4338. -php: | - array( - 'invoice' => 34843, 'date' => mktime(0, 0, 0, 1, 23, 2001), - 'bill-to' => - array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) ) - , 'ship-to' => - array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) ) - , 'product' => - array( - array( 'sku' => 'BL394D', 'quantity' => 4, 'description' => 'Basketball', 'price' => 450.00 ), - array( 'sku' => 'BL4438H', 'quantity' => 1, 'description' => 'Super Hoop', 'price' => 2392.00 ) - ), - 'tax' => 251.42, 'total' => 4443.52, - 'comments' => "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\n" - ) ---- -test: Log file -todo: true -spec: 2.28 -yaml: | - --- - Time: 2001-11-23 15:01:42 -05:00 - User: ed - Warning: > - This is an error message - for the log file - --- - Time: 2001-11-23 15:02:31 -05:00 - User: ed - Warning: > - A slightly different error - message. - --- - Date: 2001-11-23 15:03:17 -05:00 - User: ed - Fatal: > - Unknown variable "bar" - Stack: - - file: TopClass.py - line: 23 - code: | - x = MoreObject("345\n") - - file: MoreClass.py - line: 58 - code: |- - foo = bar -ruby: | - y = YAML::Stream.new - y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 01, 42, 00, "-05:00" ), - 'User' => 'ed', 'Warning' => "This is an error message for the log file\n" } ) - y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 02, 31, 00, "-05:00" ), - 'User' => 'ed', 'Warning' => "A slightly different error message.\n" } ) - y.add( { 'Date' => YAML::mktime( 2001, 11, 23, 15, 03, 17, 00, "-05:00" ), - 'User' => 'ed', 'Fatal' => "Unknown variable \"bar\"\n", - 'Stack' => [ - { 'file' => 'TopClass.py', 'line' => 23, 'code' => "x = MoreObject(\"345\\n\")\n" }, - { 'file' => 'MoreClass.py', 'line' => 58, 'code' => "foo = bar" } ] } ) -documents: 3 - ---- -test: Throwaway comments -yaml: | - ### These are four throwaway comment ### - - ### lines (the second line is empty). ### - this: | # Comments may trail lines. - contains three lines of text. - The third one starts with a - # character. This isn't a comment. - - # These are three throwaway comment - # lines (the first line is empty). -php: | - array( - 'this' => "contains three lines of text.\nThe third one starts with a\n# character. This isn't a comment.\n" - ) ---- -test: Document with a single value -todo: true -yaml: | - --- > - This YAML stream contains a single text value. - The next stream is a log file - a sequence of - log entries. Adding an entry to the log is a - simple matter of appending it at the end. -ruby: | - "This YAML stream contains a single text value. The next stream is a log file - a sequence of log entries. Adding an entry to the log is a simple matter of appending it at the end.\n" ---- -test: Document stream -todo: true -yaml: | - --- - at: 2001-08-12 09:25:00.00 Z - type: GET - HTTP: '1.0' - url: '/index.html' - --- - at: 2001-08-12 09:25:10.00 Z - type: GET - HTTP: '1.0' - url: '/toc.html' -ruby: | - y = YAML::Stream.new - y.add( { - 'at' => Time::utc( 2001, 8, 12, 9, 25, 00 ), - 'type' => 'GET', - 'HTTP' => '1.0', - 'url' => '/index.html' - } ) - y.add( { - 'at' => Time::utc( 2001, 8, 12, 9, 25, 10 ), - 'type' => 'GET', - 'HTTP' => '1.0', - 'url' => '/toc.html' - } ) -documents: 2 - ---- -test: Top level mapping -yaml: | - # This stream is an example of a top-level mapping. - invoice : 34843 - date : 2001-01-23 - total : 4443.52 -php: | - array( - 'invoice' => 34843, - 'date' => mktime(0, 0, 0, 1, 23, 2001), - 'total' => 4443.52 - ) ---- -test: Single-line documents -todo: true -yaml: | - # The following is a sequence of three documents. - # The first contains an empty mapping, the second - # an empty sequence, and the last an empty string. - --- {} - --- [ ] - --- '' -ruby: | - y = YAML::Stream.new - y.add( {} ) - y.add( [] ) - y.add( '' ) -documents: 3 - ---- -test: Document with pause -todo: true -yaml: | - # A communication channel based on a YAML stream. - --- - sent at: 2002-06-06 11:46:25.10 Z - payload: Whatever - # Receiver can process this as soon as the following is sent: - ... - # Even if the next message is sent long after: - --- - sent at: 2002-06-06 12:05:53.47 Z - payload: Whatever - ... -ruby: | - y = YAML::Stream.new - y.add( - { 'sent at' => YAML::mktime( 2002, 6, 6, 11, 46, 25, 0.10 ), - 'payload' => 'Whatever' } - ) - y.add( - { "payload" => "Whatever", "sent at" => YAML::mktime( 2002, 6, 6, 12, 5, 53, 0.47 ) } - ) -documents: 2 - ---- -test: Explicit typing -yaml: | - integer: 12 - also int: ! "12" - string: !str 12 -php: | - array( 'integer' => 12, 'also int' => 12, 'string' => '12' ) ---- -test: Private types -todo: true -yaml: | - # Both examples below make use of the 'x-private:ball' - # type family URI, but with different semantics. - --- - pool: !!ball - number: 8 - color: black - --- - bearing: !!ball - material: steel -ruby: | - y = YAML::Stream.new - y.add( { 'pool' => - YAML::PrivateType.new( 'ball', - { 'number' => 8, 'color' => 'black' } ) } - ) - y.add( { 'bearing' => - YAML::PrivateType.new( 'ball', - { 'material' => 'steel' } ) } - ) -documents: 2 - ---- -test: Type family under yaml.org -yaml: | - # The URI is 'tag:yaml.org,2002:str' - - !str a Unicode string -php: | - array( 'a Unicode string' ) ---- -test: Type family under perl.yaml.org -todo: true -yaml: | - # The URI is 'tag:perl.yaml.org,2002:Text::Tabs' - - !perl/Text::Tabs {} -ruby: | - [ YAML::DomainType.new( 'perl.yaml.org,2002', 'Text::Tabs', {} ) ] ---- -test: Type family under clarkevans.com -todo: true -yaml: | - # The URI is 'tag:clarkevans.com,2003-02:timesheet' - - !clarkevans.com,2003-02/timesheet {} -ruby: | - [ YAML::DomainType.new( 'clarkevans.com,2003-02', 'timesheet', {} ) ] ---- -test: URI Escaping -todo: true -yaml: | - same: - - !domain.tld,2002/type\x30 value - - !domain.tld,2002/type0 value - different: # As far as the YAML parser is concerned - - !domain.tld,2002/type%30 value - - !domain.tld,2002/type0 value -ruby-setup: | - YAML.add_domain_type( "domain.tld,2002", "type0" ) { |type, val| - "ONE: #{val}" - } - YAML.add_domain_type( "domain.tld,2002", "type%30" ) { |type, val| - "TWO: #{val}" - } -ruby: | - { 'same' => [ 'ONE: value', 'ONE: value' ], 'different' => [ 'TWO: value', 'ONE: value' ] } ---- -test: URI Prefixing -todo: true -yaml: | - # 'tag:domain.tld,2002:invoice' is some type family. - invoice: !domain.tld,2002/^invoice - # 'seq' is shorthand for 'tag:yaml.org,2002:seq'. - # This does not effect '^customer' below - # because it is does not specify a prefix. - customers: !seq - # '^customer' is shorthand for the full - # notation 'tag:domain.tld,2002:customer'. - - !^customer - given : Chris - family : Dumars -ruby-setup: | - YAML.add_domain_type( "domain.tld,2002", /(invoice|customer)/ ) { |type, val| - if val.is_a? ::Hash - scheme, domain, type = type.split( /:/, 3 ) - val['type'] = "domain #{type}" - val - else - raise YAML::Error, "Not a Hash in domain.tld/invoice: " + val.inspect - end - } -ruby: | - { "invoice"=> { "customers"=> [ { "given"=>"Chris", "type"=>"domain customer", "family"=>"Dumars" } ], "type"=>"domain invoice" } } - ---- -test: Overriding anchors -yaml: | - anchor : &A001 This scalar has an anchor. - override : &A001 > - The alias node below is a - repeated use of this value. - alias : *A001 -php: | - array( 'anchor' => 'This scalar has an anchor.', - 'override' => "The alias node below is a repeated use of this value.\n", - 'alias' => "The alias node below is a repeated use of this value.\n" ) ---- -test: Flow and block formatting -todo: true -yaml: | - empty: [] - flow: [ one, two, three # May span lines, - , four, # indentation is - five ] # mostly ignored. - block: - - First item in top sequence - - - - Subordinate sequence entry - - > - A folded sequence entry - - Sixth item in top sequence -ruby: | - { 'empty' => [], 'flow' => [ 'one', 'two', 'three', 'four', 'five' ], - 'block' => [ 'First item in top sequence', [ 'Subordinate sequence entry' ], - "A folded sequence entry\n", 'Sixth item in top sequence' ] } ---- -test: Complete mapping test -todo: true -yaml: | - empty: {} - flow: { one: 1, two: 2 } - spanning: { one: 1, - two: 2 } - block: - first : First entry - second: - key: Subordinate mapping - third: - - Subordinate sequence - - { } - - Previous mapping is empty. - - A key: value pair in a sequence. - A second: key:value pair. - - The previous entry is equal to the following one. - - - A key: value pair in a sequence. - A second: key:value pair. - !float 12 : This key is a float. - ? > - ? - : This key had to be protected. - "\a" : This key had to be escaped. - ? > - This is a - multi-line - folded key - : Whose value is - also multi-line. - ? this also works as a key - : with a value at the next line. - ? - - This key - - is a sequence - : - - With a sequence value. - ? - This: key - is a: mapping - : - with a: mapping value. -ruby: | - { 'empty' => {}, 'flow' => { 'one' => 1, 'two' => 2 }, - 'spanning' => { 'one' => 1, 'two' => 2 }, - 'block' => { 'first' => 'First entry', 'second' => - { 'key' => 'Subordinate mapping' }, 'third' => - [ 'Subordinate sequence', {}, 'Previous mapping is empty.', - { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' }, - 'The previous entry is equal to the following one.', - { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' } ], - 12.0 => 'This key is a float.', "?\n" => 'This key had to be protected.', - "\a" => 'This key had to be escaped.', - "This is a multi-line folded key\n" => "Whose value is also multi-line.", - 'this also works as a key' => 'with a value at the next line.', - [ 'This key', 'is a sequence' ] => [ 'With a sequence value.' ] } } - # Couldn't recreate map exactly, so we'll do a detailed check to be sure it's entact - obj_y['block'].keys.each { |k| - if Hash === k - v = obj_y['block'][k] - if k['This'] == 'key' and k['is a'] == 'mapping' and v['with a'] == 'mapping value.' - obj_r['block'][k] = v - end - end - } ---- -test: Literal explicit indentation -yaml: | - # Explicit indentation must - # be given in all the three - # following cases. - leading spaces: |2 - This value starts with four spaces. - - leading line break: |2 - - This value starts with a line break. - - leading comment indicator: |2 - # first line starts with a - # character. - - # Explicit indentation may - # also be given when it is - # not required. - redundant: |2 - This value is indented 2 spaces. -php: | - array( - 'leading spaces' => " This value starts with four spaces.\n", - 'leading line break' => "\nThis value starts with a line break.\n", - 'leading comment indicator' => "# first line starts with a\n# character.\n", - 'redundant' => "This value is indented 2 spaces.\n" - ) ---- -test: Chomping and keep modifiers -yaml: | - clipped: | - This has one newline. - - same as "clipped" above: "This has one newline.\n" - - stripped: |- - This has no newline. - - same as "stripped" above: "This has no newline." - - kept: |+ - This has two newlines. - - same as "kept" above: "This has two newlines.\n\n" -php: | - array( - 'clipped' => "This has one newline.\n", - 'same as "clipped" above' => "This has one newline.\n", - 'stripped' => 'This has no newline.', - 'same as "stripped" above' => 'This has no newline.', - 'kept' => "This has two newlines.\n\n", - 'same as "kept" above' => "This has two newlines.\n\n" - ) ---- -test: Literal combinations -todo: true -yaml: | - empty: | - - literal: | - The \ ' " characters may be - freely used. Leading white - space is significant. - - Line breaks are significant. - Thus this value contains one - empty line and ends with a - single line break, but does - not start with one. - - is equal to: "The \\ ' \" characters may \ - be\nfreely used. Leading white\n space \ - is significant.\n\nLine breaks are \ - significant.\nThus this value contains \ - one\nempty line and ends with a\nsingle \ - line break, but does\nnot start with one.\n" - - # Comments may follow a block - # scalar value. They must be - # less indented. - - # Modifiers may be combined in any order. - indented and chomped: |2- - This has no newline. - - also written as: |-2 - This has no newline. - - both are equal to: " This has no newline." -php: | - array( - 'empty' => '', - 'literal' => "The \\ ' \" characters may be\nfreely used. Leading white\n space " + - "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" + - "empty line and ends with a\nsingle line break, but does\nnot start with one.\n", - 'is equal to' => "The \\ ' \" characters may be\nfreely used. Leading white\n space " + - "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" + - "empty line and ends with a\nsingle line break, but does\nnot start with one.\n", - 'indented and chomped' => ' This has no newline.', - 'also written as' => ' This has no newline.', - 'both are equal to' => ' This has no newline.' - ) ---- -test: Folded combinations -todo: true -yaml: | - empty: > - - one paragraph: > - Line feeds are converted - to spaces, so this value - contains no line breaks - except for the final one. - - multiple paragraphs: >2 - - An empty line, either - at the start or in - the value: - - Is interpreted as a - line break. Thus this - value contains three - line breaks. - - indented text: > - This is a folded - paragraph followed - by a list: - * first entry - * second entry - Followed by another - folded paragraph, - another list: - - * first entry - - * second entry - - And a final folded - paragraph. - - above is equal to: | - This is a folded paragraph followed by a list: - * first entry - * second entry - Followed by another folded paragraph, another list: - - * first entry - - * second entry - - And a final folded paragraph. - - # Explicit comments may follow - # but must be less indented. -php: | - array( - 'empty' => '', - 'one paragraph' => 'Line feeds are converted to spaces, so this value'. - " contains no line breaks except for the final one.\n", - 'multiple paragraphs' => "\nAn empty line, either at the start or in the value:\n". - "Is interpreted as a line break. Thus this value contains three line breaks.\n", - 'indented text' => "This is a folded paragraph followed by a list:\n". - " * first entry\n * second entry\nFollowed by another folded paragraph, ". - "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n", - 'above is equal to' => "This is a folded paragraph followed by a list:\n". - " * first entry\n * second entry\nFollowed by another folded paragraph, ". - "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n" - ) ---- -test: Single quotes -todo: true -yaml: | - empty: '' - second: '! : \ etc. can be used freely.' - third: 'a single quote '' must be escaped.' - span: 'this contains - six spaces - - and one - line break' - is same as: "this contains six spaces\nand one line break" -php: | - array( - 'empty' => '', - 'second' => '! : \\ etc. can be used freely.', - 'third' => "a single quote ' must be escaped.", - 'span' => "this contains six spaces\nand one line break", - 'is same as' => "this contains six spaces\nand one line break" - ) ---- -test: Double quotes -todo: true -yaml: | - empty: "" - second: "! : etc. can be used freely." - third: "a \" or a \\ must be escaped." - fourth: "this value ends with an LF.\n" - span: "this contains - four \ - spaces" - is equal to: "this contains four spaces" -php: | - array( - 'empty' => '', - 'second' => '! : etc. can be used freely.', - 'third' => 'a " or a \\ must be escaped.', - 'fourth' => "this value ends with an LF.\n", - 'span' => "this contains four spaces", - 'is equal to' => "this contains four spaces" - ) ---- -test: Unquoted strings -todo: true -yaml: | - first: There is no unquoted empty string. - - second: 12 ## This is an integer. - - third: !str 12 ## This is a string. - - span: this contains - six spaces - - and one - line break - - indicators: this has no comments. - #:foo and bar# are - both text. - - flow: [ can span - lines, # comment - like - this ] - - note: { one-line keys: but multi-line values } - -php: | - array( - 'first' => 'There is no unquoted empty string.', - 'second' => 12, - 'third' => '12', - 'span' => "this contains six spaces\nand one line break", - 'indicators' => "this has no comments. #:foo and bar# are both text.", - 'flow' => [ 'can span lines', 'like this' ], - 'note' => { 'one-line keys' => 'but multi-line values' } - ) ---- -test: Spanning sequences -todo: true -yaml: | - # The following are equal seqs - # with different identities. - flow: [ one, two ] - spanning: [ one, - two ] - block: - - one - - two -php: | - array( - 'flow' => [ 'one', 'two' ], - 'spanning' => [ 'one', 'two' ], - 'block' => [ 'one', 'two' ] - ) ---- -test: Flow mappings -yaml: | - # The following are equal maps - # with different identities. - flow: { one: 1, two: 2 } - block: - one: 1 - two: 2 -php: | - array( - 'flow' => array( 'one' => 1, 'two' => 2 ), - 'block' => array( 'one' => 1, 'two' => 2 ) - ) ---- -test: Representations of 12 -todo: true -yaml: | - - 12 # An integer - # The following scalars - # are loaded to the - # string value '1' '2'. - - !str 12 - - '12' - - "12" - - "\ - 1\ - 2\ - " - # Strings containing paths and regexps can be unquoted: - - /foo/bar - - d:/foo/bar - - foo/bar - - /a.*b/ -php: | - array( 12, '12', '12', '12', '12', '/foo/bar', 'd:/foo/bar', 'foo/bar', '/a.*b/' ) ---- -test: "Null" -todo: true -yaml: | - canonical: ~ - - english: null - - # This sequence has five - # entries, two with values. - sparse: - - ~ - - 2nd entry - - Null - - 4th entry - - - - four: This mapping has five keys, - only two with values. - -php: | - array ( - 'canonical' => null, - 'english' => null, - 'sparse' => array( null, '2nd entry', null, '4th entry', null ]), - 'four' => 'This mapping has five keys, only two with values.' - ) ---- -test: Omap -todo: true -yaml: | - # Explicitly typed dictionary. - Bestiary: !omap - - aardvark: African pig-like ant eater. Ugly. - - anteater: South-American ant eater. Two species. - - anaconda: South-American constrictor snake. Scary. - # Etc. -ruby: | - { - 'Bestiary' => YAML::Omap[ - 'aardvark', 'African pig-like ant eater. Ugly.', - 'anteater', 'South-American ant eater. Two species.', - 'anaconda', 'South-American constrictor snake. Scary.' - ] - } - ---- -test: Pairs -todo: true -yaml: | - # Explicitly typed pairs. - tasks: !pairs - - meeting: with team. - - meeting: with boss. - - break: lunch. - - meeting: with client. -ruby: | - { - 'tasks' => YAML::Pairs[ - 'meeting', 'with team.', - 'meeting', 'with boss.', - 'break', 'lunch.', - 'meeting', 'with client.' - ] - } - ---- -test: Set -todo: true -yaml: | - # Explicitly typed set. - baseball players: !set - Mark McGwire: - Sammy Sosa: - Ken Griffey: -ruby: | - { - 'baseball players' => YAML::Set[ - 'Mark McGwire', nil, - 'Sammy Sosa', nil, - 'Ken Griffey', nil - ] - } - ---- -test: Boolean -yaml: | - false: used as key - logical: true - answer: false -php: | - array( - false => 'used as key', - 'logical' => true, - 'answer' => false - ) ---- -test: Integer -yaml: | - canonical: 12345 - decimal: +12,345 - octal: 014 - hexadecimal: 0xC -php: | - array( - 'canonical' => 12345, - 'decimal' => 12345, - 'octal' => 12, - 'hexadecimal' => 12 - ) ---- -test: Float -yaml: | - canonical: 1.23015e+3 - exponential: 12.3015e+02 - fixed: 1,230.15 - negative infinity: -.inf - not a number: .NaN -php: | - array( - 'canonical' => 1230.15, - 'exponential' => 1230.15, - 'fixed' => 1230.15, - 'negative infinity' => log(0), - 'not a number' => -log(0) - ) ---- -test: Timestamp -todo: true -yaml: | - canonical: 2001-12-15T02:59:43.1Z - valid iso8601: 2001-12-14t21:59:43.10-05:00 - space separated: 2001-12-14 21:59:43.10 -05:00 - date (noon UTC): 2002-12-14 -ruby: | - array( - 'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ), - 'valid iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), - 'space separated' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), - 'date (noon UTC)' => Date.new( 2002, 12, 14 ) - ) ---- -test: Binary -todo: true -yaml: | - canonical: !binary "\ - R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5\ - OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+\ - +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\ - AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=" - base64: !binary | - R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5 - OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+ - +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC - AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs= - description: > - The binary value above is a tiny arrow - encoded as a gif image. -ruby-setup: | - arrow_gif = "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236iiiccc\243\243\243\204\204\204\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371!\376\016Made with GIMP\000,\000\000\000\000\f\000\f\000\000\005, \216\2010\236\343@\024\350i\020\304\321\212\010\034\317\200M$z\357\3770\205p\270\2601f\r\e\316\001\303\001\036\020' \202\n\001\000;" -ruby: | - { - 'canonical' => arrow_gif, - 'base64' => arrow_gif, - 'description' => "The binary value above is a tiny arrow encoded as a gif image.\n" - } - ---- -test: Merge key -todo: true -yaml: | - --- - - &CENTER { x: 1, y: 2 } - - &LEFT { x: 0, y: 2 } - - &BIG { r: 10 } - - &SMALL { r: 1 } - - # All the following maps are equal: - - - # Explicit keys - x: 1 - y: 2 - r: 10 - label: center/big - - - # Merge one map - << : *CENTER - r: 10 - label: center/big - - - # Merge multiple maps - << : [ *CENTER, *BIG ] - label: center/big - - - # Override - << : [ *BIG, *LEFT, *SMALL ] - x: 1 - label: center/big - -ruby-setup: | - center = { 'x' => 1, 'y' => 2 } - left = { 'x' => 0, 'y' => 2 } - big = { 'r' => 10 } - small = { 'r' => 1 } - node1 = { 'x' => 1, 'y' => 2, 'r' => 10, 'label' => 'center/big' } - node2 = center.dup - node2.update( { 'r' => 10, 'label' => 'center/big' } ) - node3 = big.dup - node3.update( center ) - node3.update( { 'label' => 'center/big' } ) - node4 = small.dup - node4.update( left ) - node4.update( big ) - node4.update( { 'x' => 1, 'label' => 'center/big' } ) - -ruby: | - [ - center, left, big, small, node1, node2, node3, node4 - ] - ---- -test: Default key -todo: true -yaml: | - --- # Old schema - link with: - - library1.dll - - library2.dll - --- # New schema - link with: - - = : library1.dll - version: 1.2 - - = : library2.dll - version: 2.3 -ruby: | - y = YAML::Stream.new - y.add( { 'link with' => [ 'library1.dll', 'library2.dll' ] } ) - obj_h = Hash[ 'version' => 1.2 ] - obj_h.default = 'library1.dll' - obj_h2 = Hash[ 'version' => 2.3 ] - obj_h2.default = 'library2.dll' - y.add( { 'link with' => [ obj_h, obj_h2 ] } ) -documents: 2 - ---- -test: Special keys -todo: true -yaml: | - "!": These three keys - "&": had to be quoted - "=": and are normal strings. - # NOTE: the following node should NOT be serialized this way. - encoded node : - !special '!' : '!type' - !special|canonical '&' : 12 - = : value - # The proper way to serialize the above node is as follows: - node : !!type &12 value -ruby: | - { '!' => 'These three keys', '&' => 'had to be quoted', - '=' => 'and are normal strings.', - 'encoded node' => YAML::PrivateType.new( 'type', 'value' ), - 'node' => YAML::PrivateType.new( 'type', 'value' ) } diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsTypeTransfers.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsTypeTransfers.yml deleted file mode 100644 index 9972c1f..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/YtsTypeTransfers.yml +++ /dev/null @@ -1,244 +0,0 @@ ---- %YAML:1.0 -test: Strings -brief: > - Any group of characters beginning with an - alphabetic or numeric character is a string, - unless it belongs to one of the groups below - (such as an Integer or Time). -yaml: | - String -php: | - 'String' ---- -test: String characters -brief: > - A string can contain any alphabetic or - numeric character, along with many - punctuation characters, including the - period, dash, space, quotes, exclamation, and - question mark. -yaml: | - - What's Yaml? - - It's for writing data structures in plain text. - - And? - - And what? That's not good enough for you? - - No, I mean, "And what about Yaml?" - - Oh, oh yeah. Uh.. Yaml for Ruby. -php: | - array( - "What's Yaml?", - "It's for writing data structures in plain text.", - "And?", - "And what? That's not good enough for you?", - "No, I mean, \"And what about Yaml?\"", - "Oh, oh yeah. Uh.. Yaml for Ruby." - ) ---- -test: Indicators in Strings -brief: > - Be careful using indicators in strings. In particular, - the comma, colon, and pound sign must be used carefully. -yaml: | - the colon followed by space is an indicator: but is a string:right here - same for the pound sign: here we have it#in a string - the comma can, honestly, be used in most cases: [ but not in, inline collections ] -php: | - array( - 'the colon followed by space is an indicator' => 'but is a string:right here', - 'same for the pound sign' => 'here we have it#in a string', - 'the comma can, honestly, be used in most cases' => array('but not in', 'inline collections') - ) ---- -test: Forcing Strings -brief: > - Any YAML type can be forced into a string using the - explicit !str method. -yaml: | - date string: !str 2001-08-01 - number string: !str 192 -php: | - array( - 'date string' => '2001-08-01', - 'number string' => '192' - ) ---- -test: Single-quoted Strings -brief: > - You can also enclose your strings within single quotes, - which allows use of slashes, colons, and other indicators - freely. Inside single quotes, you can represent a single - quote in your string by using two single quotes next to - each other. -yaml: | - all my favorite symbols: '#:!/%.)' - a few i hate: '&(*' - why do i hate them?: 'it''s very hard to explain' - entities: '£ me' -php: | - array( - 'all my favorite symbols' => '#:!/%.)', - 'a few i hate' => '&(*', - 'why do i hate them?' => 'it\'s very hard to explain', - 'entities' => '£ me' - ) ---- -test: Double-quoted Strings -brief: > - Enclosing strings in double quotes allows you - to use escapings to represent ASCII and - Unicode characters. -yaml: | - i know where i want my line breaks: "one here\nand another here\n" -php: | - array( - 'i know where i want my line breaks' => "one here\nand another here\n" - ) ---- -test: Multi-line Quoted Strings -todo: true -brief: > - Both single- and double-quoted strings may be - carried on to new lines in your YAML document. - They must be indented a step and indentation - is interpreted as a single space. -yaml: | - i want a long string: "so i'm going to - let it go on and on to other lines - until i end it with a quote." -php: | - array('i want a long string' => "so i'm going to ". - "let it go on and on to other lines ". - "until i end it with a quote." - ) - ---- -test: Plain scalars -todo: true -brief: > - Unquoted strings may also span multiple lines, if they - are free of YAML space indicators and indented. -yaml: | - - My little toe is broken in two places; - - I'm crazy to have skied this way; - - I'm not the craziest he's seen, since there was always the German guy - who skied for 3 hours on a broken shin bone (just below the kneecap); - - Nevertheless, second place is respectable, and he doesn't - recommend going for the record; - - He's going to put my foot in plaster for a month; - - This would impair my skiing ability somewhat for the - duration, as can be imagined. -php: | - array( - "My little toe is broken in two places;", - "I'm crazy to have skied this way;", - "I'm not the craziest he's seen, since there was always ". - "the German guy who skied for 3 hours on a broken shin ". - "bone (just below the kneecap);", - "Nevertheless, second place is respectable, and he doesn't ". - "recommend going for the record;", - "He's going to put my foot in plaster for a month;", - "This would impair my skiing ability somewhat for the duration, ". - "as can be imagined." - ) ---- -test: 'Null' -brief: > - You can use the tilde '~' character for a null value. -yaml: | - name: Mr. Show - hosted by: Bob and David - date of next season: ~ -php: | - array( - 'name' => 'Mr. Show', - 'hosted by' => 'Bob and David', - 'date of next season' => null - ) ---- -test: Boolean -brief: > - You can use 'true' and 'false' for Boolean values. -yaml: | - Is Gus a Liar?: true - Do I rely on Gus for Sustenance?: false -php: | - array( - 'Is Gus a Liar?' => true, - 'Do I rely on Gus for Sustenance?' => false - ) ---- -test: Integers -dump_skip: true -brief: > - An integer is a series of numbers, optionally - starting with a positive or negative sign. Integers - may also contain commas for readability. -yaml: | - zero: 0 - simple: 12 - one-thousand: 1,000 - negative one-thousand: -1,000 -php: | - array( - 'zero' => 0, - 'simple' => 12, - 'one-thousand' => 1000, - 'negative one-thousand' => -1000 - ) ---- -test: Integers as Map Keys -brief: > - An integer can be used a dictionary key. -yaml: | - 1: one - 2: two - 3: three -php: | - array( - 1 => 'one', - 2 => 'two', - 3 => 'three' - ) ---- -test: Floats -dump_skip: true -brief: > - Floats are represented by numbers with decimals, - allowing for scientific notation, as well as - positive and negative infinity and "not a number." -yaml: | - a simple float: 2.00 - larger float: 1,000.09 - scientific notation: 1.00009e+3 -php: | - array( - 'a simple float' => 2.0, - 'larger float' => 1000.09, - 'scientific notation' => 1000.09 - ) ---- -test: Time -todo: true -brief: > - You can represent timestamps by using - ISO8601 format, or a variation which - allows spaces between the date, time and - time zone. -yaml: | - iso8601: 2001-12-14t21:59:43.10-05:00 - space seperated: 2001-12-14 21:59:43.10 -05:00 -php: | - array( - 'iso8601' => mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), - 'space seperated' => mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ) - ) ---- -test: Date -todo: true -brief: > - A date can be represented by its year, - month and day in ISO8601 order. -yaml: | - 1976-07-31 -php: | - date( 1976, 7, 31 ) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/escapedCharacters.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/escapedCharacters.yml deleted file mode 100644 index 7f17ed5..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/escapedCharacters.yml +++ /dev/null @@ -1,139 +0,0 @@ -test: outside double quotes -yaml: | - \0 \ \a \b \n -php: | - "\\0 \\ \\a \\b \\n" ---- -test: null -yaml: | - "\0" -php: | - "\x00" ---- -test: bell -yaml: | - "\a" -php: | - "\x07" ---- -test: backspace -yaml: | - "\b" -php: | - "\x08" ---- -test: horizontal tab (1) -yaml: | - "\t" -php: | - "\x09" ---- -test: horizontal tab (2) -yaml: | - "\ " -php: | - "\x09" ---- -test: line feed -yaml: | - "\n" -php: | - "\x0a" ---- -test: vertical tab -yaml: | - "\v" -php: | - "\x0b" ---- -test: form feed -yaml: | - "\f" -php: | - "\x0c" ---- -test: carriage return -yaml: | - "\r" -php: | - "\x0d" ---- -test: escape -yaml: | - "\e" -php: | - "\x1b" ---- -test: space -yaml: | - "\ " -php: | - "\x20" ---- -test: slash -yaml: | - "\/" -php: | - "\x2f" ---- -test: backslash -yaml: | - "\\" -php: | - "\\" ---- -test: Unicode next line -yaml: | - "\N" -php: | - "\xc2\x85" ---- -test: Unicode non-breaking space -yaml: | - "\_" -php: | - "\xc2\xa0" ---- -test: Unicode line separator -yaml: | - "\L" -php: | - "\xe2\x80\xa8" ---- -test: Unicode paragraph separator -yaml: | - "\P" -php: | - "\xe2\x80\xa9" ---- -test: Escaped 8-bit Unicode -yaml: | - "\x42" -php: | - "B" ---- -test: Escaped 16-bit Unicode -yaml: | - "\u20ac" -php: | - "\xe2\x82\xac" ---- -test: Escaped 32-bit Unicode -yaml: | - "\U00000043" -php: | - "C" ---- -test: Example 5.13 Escaped Characters -note: | - Currently throws an error parsing first line. Maybe Symfony Yaml doesn't support - continuation of string across multiple lines? Keeping test here but disabled. -todo: true -yaml: | - "Fun with \\ - \" \a \b \e \f \ - \n \r \t \v \0 \ - \ \_ \N \L \P \ - \x41 \u0041 \U00000041" -php: | - "Fun with \x5C\n\x22 \x07 \x08 \x1B \x0C\n\x0A \x0D \x09 \x0B \x00\n\x20 \xA0 \x85 \xe2\x80\xa8 \xe2\x80\xa9\nA A A" diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/index.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/index.yml deleted file mode 100644 index 3216a89..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/index.yml +++ /dev/null @@ -1,18 +0,0 @@ -- escapedCharacters -- sfComments -- sfCompact -- sfTests -- sfObjects -- sfMergeKey -- sfQuotes -- YtsAnchorAlias -- YtsBasicTests -- YtsBlockMapping -- YtsDocumentSeparator -- YtsErrorTests -- YtsFlowCollections -- YtsFoldedScalars -- YtsNullsAndEmpties -- YtsSpecificationExamples -- YtsTypeTransfers -- unindentedCollections diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfComments.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfComments.yml deleted file mode 100644 index 34225e1..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfComments.yml +++ /dev/null @@ -1,51 +0,0 @@ ---- %YAML:1.0 -test: Comments at the end of a line -brief: > - Comments at the end of a line -yaml: | - ex1: "foo # bar" - ex2: "foo # bar" # comment - ex3: 'foo # bar' # comment - ex4: foo # comment -php: | - array('ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo') ---- -test: Comments in the middle -brief: > - Comments in the middle -yaml: | - foo: - # some comment - # some comment - bar: foo - # some comment - # some comment -php: | - array('foo' => array('bar' => 'foo')) ---- -test: Comments on a hash line -brief: > - Comments on a hash line -yaml: | - foo: # a comment - foo: bar # a comment -php: | - array('foo' => array('foo' => 'bar')) ---- -test: 'Value starting with a #' -brief: > - 'Value starting with a #' -yaml: | - foo: '#bar' -php: | - array('foo' => '#bar') ---- -test: Document starting with a comment and a separator -brief: > - Commenting before document start is allowed -yaml: | - # document comment - --- - foo: bar # a comment -php: | - array('foo' => 'bar') diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfCompact.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfCompact.yml deleted file mode 100644 index 1339d23..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfCompact.yml +++ /dev/null @@ -1,159 +0,0 @@ ---- %YAML:1.0 -test: Compact notation -brief: | - Compact notation for sets of mappings with single element -yaml: | - --- - # products purchased - - item : Super Hoop - - item : Basketball - quantity: 1 - - item: - name: Big Shoes - nick: Biggies - quantity: 1 -php: | - array ( - array ( - 'item' => 'Super Hoop', - ), - array ( - 'item' => 'Basketball', - 'quantity' => 1, - ), - array ( - 'item' => array( - 'name' => 'Big Shoes', - 'nick' => 'Biggies' - ), - 'quantity' => 1 - ) - ) ---- -test: Compact notation combined with inline notation -brief: | - Combinations of compact and inline notation are allowed -yaml: | - --- - items: - - { item: Super Hoop, quantity: 1 } - - [ Basketball, Big Shoes ] -php: | - array ( - 'items' => array ( - array ( - 'item' => 'Super Hoop', - 'quantity' => 1, - ), - array ( - 'Basketball', - 'Big Shoes' - ) - ) - ) ---- %YAML:1.0 -test: Compact notation -brief: | - Compact notation for sets of mappings with single element -yaml: | - --- - # products purchased - - item : Super Hoop - - item : Basketball - quantity: 1 - - item: - name: Big Shoes - nick: Biggies - quantity: 1 -php: | - array ( - array ( - 'item' => 'Super Hoop', - ), - array ( - 'item' => 'Basketball', - 'quantity' => 1, - ), - array ( - 'item' => array( - 'name' => 'Big Shoes', - 'nick' => 'Biggies' - ), - 'quantity' => 1 - ) - ) ---- -test: Compact notation combined with inline notation -brief: | - Combinations of compact and inline notation are allowed -yaml: | - --- - items: - - { item: Super Hoop, quantity: 1 } - - [ Basketball, Big Shoes ] -php: | - array ( - 'items' => array ( - array ( - 'item' => 'Super Hoop', - 'quantity' => 1, - ), - array ( - 'Basketball', - 'Big Shoes' - ) - ) - ) ---- %YAML:1.0 -test: Compact notation -brief: | - Compact notation for sets of mappings with single element -yaml: | - --- - # products purchased - - item : Super Hoop - - item : Basketball - quantity: 1 - - item: - name: Big Shoes - nick: Biggies - quantity: 1 -php: | - array ( - array ( - 'item' => 'Super Hoop', - ), - array ( - 'item' => 'Basketball', - 'quantity' => 1, - ), - array ( - 'item' => array( - 'name' => 'Big Shoes', - 'nick' => 'Biggies' - ), - 'quantity' => 1 - ) - ) ---- -test: Compact notation combined with inline notation -brief: | - Combinations of compact and inline notation are allowed -yaml: | - --- - items: - - { item: Super Hoop, quantity: 1 } - - [ Basketball, Big Shoes ] -php: | - array ( - 'items' => array ( - array ( - 'item' => 'Super Hoop', - 'quantity' => 1, - ), - array ( - 'Basketball', - 'Big Shoes' - ) - ) - ) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfMergeKey.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfMergeKey.yml deleted file mode 100644 index 3eec4f8..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfMergeKey.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- %YAML:1.0 -test: Simple In Place Substitution -brief: > - If you want to reuse an entire alias, only overwriting what is different - you can use a << in place substitution. This is not part of the official - YAML spec, but a widely implemented extension. See the following URL for - details: http://yaml.org/type/merge.html -yaml: | - foo: &foo - a: Steve - b: Clark - c: Brian - bar: &bar - <<: *foo - x: Oren - foo2: &foo2 - a: Ballmer - ding: &dong [ fi, fei, fo, fam] - check: - <<: - - *foo - - *dong - isit: tested - head: - <<: [ *foo , *dong , *foo2 ] -php: | - array('foo' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian'), 'bar' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'x' => 'Oren'), 'foo2' => array('a' => 'Ballmer'), 'ding' => array('fi', 'fei', 'fo', 'fam'), 'check' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'fi', 'fei', 'fo', 'fam', 'isit' => 'tested'), 'head' => array('a' => 'Ballmer', 'b' => 'Clark', 'c' => 'Brian', 'fi', 'fei', 'fo', 'fam')) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfObjects.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfObjects.yml deleted file mode 100644 index ee124b2..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfObjects.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- %YAML:1.0 -test: Objects -brief: > - Comments at the end of a line -yaml: | - ex1: "foo # bar" - ex2: "foo # bar" # comment - ex3: 'foo # bar' # comment - ex4: foo # comment -php: | - array('ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo') diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfQuotes.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfQuotes.yml deleted file mode 100644 index 741f1be..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfQuotes.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- %YAML:1.0 -test: Some characters at the beginning of a string must be escaped -brief: > - Some characters at the beginning of a string must be escaped -yaml: | - foo: | bar -php: | - array('foo' => '| bar') ---- -test: A key can be a quoted string -brief: > - A key can be a quoted string -yaml: | - "foo1": bar - 'foo2': bar - "foo \" bar": bar - 'foo '' bar': bar - 'foo3: ': bar - "foo4: ": bar - foo5: { "foo \" bar: ": bar, 'foo '' bar: ': bar } -php: | - array( - 'foo1' => 'bar', - 'foo2' => 'bar', - 'foo " bar' => 'bar', - 'foo \' bar' => 'bar', - 'foo3: ' => 'bar', - 'foo4: ' => 'bar', - 'foo5' => array( - 'foo " bar: ' => 'bar', - 'foo \' bar: ' => 'bar', - ), - ) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfTests.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfTests.yml deleted file mode 100644 index 7a54f16..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/sfTests.yml +++ /dev/null @@ -1,135 +0,0 @@ ---- %YAML:1.0 -test: Multiple quoted string on one line -brief: > - Multiple quoted string on one line -yaml: | - stripped_title: { name: "foo bar", help: "bar foo" } -php: | - array('stripped_title' => array('name' => 'foo bar', 'help' => 'bar foo')) ---- -test: Empty sequence -yaml: | - foo: [ ] -php: | - array('foo' => array()) ---- -test: Empty value -yaml: | - foo: -php: | - array('foo' => null) ---- -test: Inline string parsing -brief: > - Inline string parsing -yaml: | - test: ['complex: string', 'another [string]'] -php: | - array('test' => array('complex: string', 'another [string]')) ---- -test: Boolean -brief: > - Boolean -yaml: | - - false - - true - - null - - ~ - - 'false' - - 'true' - - 'null' - - '~' -php: | - array( - false, - true, - null, - null, - 'false', - 'true', - 'null', - '~', - ) ---- -test: Empty lines in folded blocks -brief: > - Empty lines in folded blocks -yaml: | - foo: - bar: | - foo - - - - bar -php: | - array('foo' => array('bar' => "foo\n\n\n \nbar\n")) ---- -test: IP addresses -brief: > - IP addresses -yaml: | - foo: 10.0.0.2 -php: | - array('foo' => '10.0.0.2') ---- -test: A sequence with an embedded mapping -brief: > - A sequence with an embedded mapping -yaml: | - - foo - - bar: { bar: foo } -php: | - array('foo', array('bar' => array('bar' => 'foo'))) ---- -test: A sequence with an unordered array -brief: > - A sequence with an unordered array -yaml: | - 1: foo - 0: bar -php: | - array(1 => 'foo', 0 => 'bar') ---- -test: Octal -brief: as in spec example 2.19, octal value is converted -yaml: | - foo: 0123 -php: | - array('foo' => 83) ---- -test: Octal strings -brief: Octal notation in a string must remain a string -yaml: | - foo: "0123" -php: | - array('foo' => '0123') ---- -test: Octal strings -brief: Octal notation in a string must remain a string -yaml: | - foo: '0123' -php: | - array('foo' => '0123') ---- -test: Octal strings -brief: Octal notation in a string must remain a string -yaml: | - foo: | - 0123 -php: | - array('foo' => "0123\n") ---- -test: Document as a simple hash -brief: Document as a simple hash -yaml: | - { foo: bar } -php: | - array('foo' => 'bar') ---- -test: Document as a simple array -brief: Document as a simple array -yaml: | - [ foo, bar ] -php: | - array('foo', 'bar') diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/unindentedCollections.yml b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/unindentedCollections.yml deleted file mode 100644 index fd8ad7e..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/Fixtures/unindentedCollections.yml +++ /dev/null @@ -1,62 +0,0 @@ ---- %YAML:1.0 -test: Unindented collection -brief: > - Unindented collection -yaml: | - collection: - - item1 - - item2 - - item3 -php: | - array('collection' => array('item1', 'item2', 'item3')) ---- -test: Nested unindented collection (two levels) -brief: > - Nested unindented collection -yaml: | - collection: - key: - - a - - b - - c -php: | - array('collection' => array('key' => array('a', 'b', 'c'))) ---- -test: Nested unindented collection (three levels) -brief: > - Nested unindented collection -yaml: | - collection: - key: - subkey: - - one - - two - - three -php: | - array('collection' => array('key' => array('subkey' => array('one', 'two', 'three')))) ---- -test: Key/value after unindented collection (1) -brief: > - Key/value after unindented collection (1) -yaml: | - collection: - key: - - a - - b - - c - foo: bar -php: | - array('collection' => array('key' => array('a', 'b', 'c')), 'foo' => 'bar') ---- -test: Key/value after unindented collection (at the same level) -brief: > - Key/value after unindented collection -yaml: | - collection: - key: - - a - - b - - c - foo: bar -php: | - array('collection' => array('key' => array('a', 'b', 'c'), 'foo' => 'bar')) diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/InlineTest.php b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/InlineTest.php deleted file mode 100644 index 2684fa5..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/InlineTest.php +++ /dev/null @@ -1,211 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Tests; - -use Symfony\Component\Yaml\Yaml; -use Symfony\Component\Yaml\Inline; - -class InlineTest extends \PHPUnit_Framework_TestCase -{ - public function testParse() - { - foreach ($this->getTestsForParse() as $yaml => $value) { - $this->assertEquals($value, Inline::parse($yaml), sprintf('::parse() converts an inline YAML to a PHP structure (%s)', $yaml)); - } - } - - public function testDump() - { - $testsForDump = $this->getTestsForDump(); - - foreach ($testsForDump as $yaml => $value) { - $this->assertEquals($yaml, Inline::dump($value), sprintf('::dump() converts a PHP structure to an inline YAML (%s)', $yaml)); - } - - foreach ($this->getTestsForParse() as $yaml => $value) { - $this->assertEquals($value, Inline::parse(Inline::dump($value)), 'check consistency'); - } - - foreach ($testsForDump as $yaml => $value) { - $this->assertEquals($value, Inline::parse(Inline::dump($value)), 'check consistency'); - } - } - - public function testDumpNumericValueWithLocale() - { - $locale = setlocale(LC_NUMERIC, 0); - if (false === $locale) { - $this->markTestSkipped('Your platform does not support locales.'); - } - - $required_locales = array('fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252'); - if (false === setlocale(LC_ALL, $required_locales)) { - $this->markTestSkipped('Could not set any of required locales: ' . implode(", ", $required_locales)); - } - - $this->assertEquals('1.2', Inline::dump(1.2)); - $this->assertContains('fr', strtolower(setlocale(LC_NUMERIC, 0))); - - setlocale(LC_ALL, $locale); - } - - public function testHashStringsResemblingExponentialNumericsShouldNotBeChangedToINF() - { - $value = '686e444'; - - $this->assertSame($value, Inline::parse(Inline::dump($value))); - } - - /** - * @expectedException \Symfony\Component\Yaml\Exception\ParseException - */ - public function testParseScalarWithIncorrectlyQuotedStringShouldThrowException() - { - $value = "'don't do somthin' like that'"; - Inline::parse($value); - } - - /** - * @expectedException \Symfony\Component\Yaml\Exception\ParseException - */ - public function testParseScalarWithIncorrectlyDoubleQuotedStringShouldThrowException() - { - $value = '"don"t do somthin" like that"'; - Inline::parse($value); - } - - /** - * @expectedException \Symfony\Component\Yaml\Exception\ParseException - */ - public function testParseInvalidMappingKeyShouldThrowException() - { - $value = '{ "foo " bar": "bar" }'; - Inline::parse($value); - } - - public function testParseScalarWithCorrectlyQuotedStringShouldReturnString() - { - $value = "'don''t do somthin'' like that'"; - $expect = "don't do somthin' like that"; - - $this->assertSame($expect, Inline::parseScalar($value)); - } - - protected function getTestsForParse() - { - return array( - '' => '', - 'null' => null, - 'false' => false, - 'true' => true, - '12' => 12, - '"quoted string"' => 'quoted string', - "'quoted string'" => 'quoted string', - '12.30e+02' => 12.30e+02, - '0x4D2' => 0x4D2, - '02333' => 02333, - '.Inf' => -log(0), - '-.Inf' => log(0), - "'686e444'" => '686e444', - '686e444' => 646e444, - '123456789123456789' => '123456789123456789', - '"foo\r\nbar"' => "foo\r\nbar", - "'foo#bar'" => 'foo#bar', - "'foo # bar'" => 'foo # bar', - "'#cfcfcf'" => '#cfcfcf', - '::form_base.html.twig' => '::form_base.html.twig', - - '2007-10-30' => mktime(0, 0, 0, 10, 30, 2007), - '2007-10-30T02:59:43Z' => gmmktime(2, 59, 43, 10, 30, 2007), - '2007-10-30 02:59:43 Z' => gmmktime(2, 59, 43, 10, 30, 2007), - - '"a \\"string\\" with \'quoted strings inside\'"' => 'a "string" with \'quoted strings inside\'', - "'a \"string\" with ''quoted strings inside'''" => 'a "string" with \'quoted strings inside\'', - - // sequences - // urls are no key value mapping. see #3609. Valid yaml "key: value" mappings require a space after the colon - '[foo, http://urls.are/no/mappings, false, null, 12]' => array('foo', 'http://urls.are/no/mappings', false, null, 12), - '[ foo , bar , false , null , 12 ]' => array('foo', 'bar', false, null, 12), - '[\'foo,bar\', \'foo bar\']' => array('foo,bar', 'foo bar'), - - // mappings - '{foo:bar,bar:foo,false:false,null:null,integer:12}' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12), - '{ foo : bar, bar : foo, false : false, null : null, integer : 12 }' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12), - '{foo: \'bar\', bar: \'foo: bar\'}' => array('foo' => 'bar', 'bar' => 'foo: bar'), - '{\'foo\': \'bar\', "bar": \'foo: bar\'}' => array('foo' => 'bar', 'bar' => 'foo: bar'), - '{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}' => array('foo\'' => 'bar', "bar\"" => 'foo: bar'), - '{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}' => array('foo: ' => 'bar', "bar: " => 'foo: bar'), - - // nested sequences and mappings - '[foo, [bar, foo]]' => array('foo', array('bar', 'foo')), - '[foo, {bar: foo}]' => array('foo', array('bar' => 'foo')), - '{ foo: {bar: foo} }' => array('foo' => array('bar' => 'foo')), - '{ foo: [bar, foo] }' => array('foo' => array('bar', 'foo')), - - '[ foo, [ bar, foo ] ]' => array('foo', array('bar', 'foo')), - - '[{ foo: {bar: foo} }]' => array(array('foo' => array('bar' => 'foo'))), - - '[foo, [bar, [foo, [bar, foo]], foo]]' => array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo')), - - '[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]' => array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo'))), - - '[foo, bar: { foo: bar }]' => array('foo', '1' => array('bar' => array('foo' => 'bar'))), - '[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']' => array('foo', '@foo.baz', array('%foo%' => 'foo is %foo%', 'bar' => '%foo%',), true, '@service_container',), - ); - } - - protected function getTestsForDump() - { - return array( - 'null' => null, - 'false' => false, - 'true' => true, - '12' => 12, - "'quoted string'" => 'quoted string', - '12.30e+02' => 12.30e+02, - '1234' => 0x4D2, - '1243' => 02333, - '.Inf' => -log(0), - '-.Inf' => log(0), - "'686e444'" => '686e444', - '.Inf' => 646e444, - '"foo\r\nbar"' => "foo\r\nbar", - "'foo#bar'" => 'foo#bar', - "'foo # bar'" => 'foo # bar', - "'#cfcfcf'" => '#cfcfcf', - - "'a \"string\" with ''quoted strings inside'''" => 'a "string" with \'quoted strings inside\'', - - // sequences - '[foo, bar, false, null, 12]' => array('foo', 'bar', false, null, 12), - '[\'foo,bar\', \'foo bar\']' => array('foo,bar', 'foo bar'), - - // mappings - '{ foo: bar, bar: foo, \'false\': false, \'null\': null, integer: 12 }' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12), - '{ foo: bar, bar: \'foo: bar\' }' => array('foo' => 'bar', 'bar' => 'foo: bar'), - - // nested sequences and mappings - '[foo, [bar, foo]]' => array('foo', array('bar', 'foo')), - - '[foo, [bar, [foo, [bar, foo]], foo]]' => array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo')), - - '{ foo: { bar: foo } }' => array('foo' => array('bar' => 'foo')), - - '[foo, { bar: foo }]' => array('foo', array('bar' => 'foo')), - - '[foo, { bar: foo, foo: [foo, { bar: foo }] }, [foo, { bar: foo }]]' => array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo'))), - - '[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']' => array('foo', '@foo.baz', array('%foo%' => 'foo is %foo%', 'bar' => '%foo%',), true, '@service_container',), - ); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/ParserTest.php b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/ParserTest.php deleted file mode 100644 index 6b4e2d4..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/ParserTest.php +++ /dev/null @@ -1,168 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Tests; - -use Symfony\Component\Yaml\Yaml; -use Symfony\Component\Yaml\Parser; -use Symfony\Component\Yaml\Exception\ParseException; - -class ParserTest extends \PHPUnit_Framework_TestCase -{ - protected $parser; - - protected function setUp() - { - $this->parser = new Parser(); - } - - protected function tearDown() - { - $this->parser = null; - } - - /** - * @dataProvider getDataFormSpecifications - */ - public function testSpecifications($file, $expected, $yaml, $comment) - { - if ('escapedCharacters' == $file) { - if (!function_exists('iconv') && !function_exists('mb_convert_encoding')) { - $this->markTestSkipped('The iconv and mbstring extensions are not available.'); - } - } - - $this->assertEquals($expected, var_export($this->parser->parse($yaml), true), $comment); - } - - public function getDataFormSpecifications() - { - $parser = new Parser(); - $path = __DIR__.'/Fixtures'; - - $tests = array(); - $files = $parser->parse(file_get_contents($path.'/index.yml')); - foreach ($files as $file) { - $yamls = file_get_contents($path.'/'.$file.'.yml'); - - // split YAMLs documents - foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml) { - if (!$yaml) { - continue; - } - - $test = $parser->parse($yaml); - if (isset($test['todo']) && $test['todo']) { - // TODO - } else { - $expected = var_export(eval('return '.trim($test['php']).';'), true); - - $tests[] = array($file, $expected, $test['yaml'], $test['test']); - } - } - } - - return $tests; - } - - public function testTabsInYaml() - { - // test tabs in YAML - $yamls = array( - "foo:\n bar", - "foo:\n bar", - "foo:\n bar", - "foo:\n bar", - ); - - foreach ($yamls as $yaml) { - try { - $content = $this->parser->parse($yaml); - - $this->fail('YAML files must not contain tabs'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, 'YAML files must not contain tabs'); - $this->assertEquals('A YAML file cannot contain tabs as indentation at line 2 (near "'.strpbrk($yaml, "\t").'").', $e->getMessage(), 'YAML files must not contain tabs'); - } - } - } - - public function testEndOfTheDocumentMarker() - { - $yaml = <<assertEquals('foo', $this->parser->parse($yaml)); - } - - public function testObjectsSupport() - { - $b = array('foo' => new B(), 'bar' => 1); - $this->assertEquals($this->parser->parse(<<parse() is able to dump objects'); - } - - public function testNonUtf8Exception() - { - if (!function_exists('mb_detect_encoding') || !function_exists('iconv')) { - $this->markTestSkipped('Exceptions for non-utf8 charsets require the mb_detect_encoding() and iconv() functions.'); - - return; - } - - $yamls = array( - iconv("UTF-8", "ISO-8859-1", "foo: 'äöüß'"), - iconv("UTF-8", "ISO-8859-15", "euro: '€'"), - iconv("UTF-8", "CP1252", "cp1252: '©ÉÇáñ'") - ); - - foreach ($yamls as $yaml) { - try { - $this->parser->parse($yaml); - - $this->fail('charsets other than UTF-8 are rejected.'); - } catch (\Exception $e) { - $this->assertInstanceOf('Symfony\Component\Yaml\Exception\ParseException', $e, 'charsets other than UTF-8 are rejected.'); - } - } - } - - /** - * - * @expectedException Symfony\Component\Yaml\Exception\ParseException - * - */ - public function testUnindentedCollectionException() - { - $yaml = <<parser->parse($yaml); - } - -} - -class B -{ - public $b = 'foo'; -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/bootstrap.php b/framework/library/Doctrine/Symfony/Component/Yaml/Tests/bootstrap.php deleted file mode 100644 index 985f1f2..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Tests/bootstrap.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -spl_autoload_register(function ($class) { - if (0 === strpos(ltrim($class, '/'), 'Symfony\Component\Yaml')) { - if (file_exists($file = __DIR__.'/../'.substr(str_replace('\\', '/', $class), strlen('Symfony\Component\Yaml')).'.php')) { - require_once $file; - } - } -}); diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Unescaper.php b/framework/library/Doctrine/Symfony/Component/Yaml/Unescaper.php deleted file mode 100644 index 0061dfd..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Unescaper.php +++ /dev/null @@ -1,145 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -/** - * Unescaper encapsulates unescaping rules for single and double-quoted - * YAML strings. - * - * @author Matthew Lewinski - */ -class Unescaper -{ - // Parser and Inline assume UTF-8 encoding, so escaped Unicode characters - // must be converted to that encoding. - const ENCODING = 'UTF-8'; - - // Regex fragment that matches an escaped character in a double quoted - // string. - const REGEX_ESCAPED_CHARACTER = "\\\\([0abt\tnvfre \\\"\\/\\\\N_LP]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})"; - - /** - * Unescapes a single quoted string. - * - * @param string $value A single quoted string. - * - * @return string The unescaped string. - */ - public function unescapeSingleQuotedString($value) - { - return str_replace('\'\'', '\'', $value); - } - - /** - * Unescapes a double quoted string. - * - * @param string $value A double quoted string. - * - * @return string The unescaped string. - */ - public function unescapeDoubleQuotedString($value) - { - $self = $this; - $callback = function($match) use($self) { - return $self->unescapeCharacter($match[0]); - }; - - // evaluate the string - return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value); - } - - /** - * Unescapes a character that was found in a double-quoted string - * - * @param string $value An escaped character - * - * @return string The unescaped character - */ - public function unescapeCharacter($value) - { - switch ($value{1}) { - case '0': - return "\x0"; - case 'a': - return "\x7"; - case 'b': - return "\x8"; - case 't': - return "\t"; - case "\t": - return "\t"; - case 'n': - return "\n"; - case 'v': - return "\xb"; - case 'f': - return "\xc"; - case 'r': - return "\xd"; - case 'e': - return "\x1b"; - case ' ': - return ' '; - case '"': - return '"'; - case '/': - return '/'; - case '\\': - return '\\'; - case 'N': - // U+0085 NEXT LINE - return $this->convertEncoding("\x00\x85", self::ENCODING, 'UCS-2BE'); - case '_': - // U+00A0 NO-BREAK SPACE - return $this->convertEncoding("\x00\xA0", self::ENCODING, 'UCS-2BE'); - case 'L': - // U+2028 LINE SEPARATOR - return $this->convertEncoding("\x20\x28", self::ENCODING, 'UCS-2BE'); - case 'P': - // U+2029 PARAGRAPH SEPARATOR - return $this->convertEncoding("\x20\x29", self::ENCODING, 'UCS-2BE'); - case 'x': - $char = pack('n', hexdec(substr($value, 2, 2))); - - return $this->convertEncoding($char, self::ENCODING, 'UCS-2BE'); - case 'u': - $char = pack('n', hexdec(substr($value, 2, 4))); - - return $this->convertEncoding($char, self::ENCODING, 'UCS-2BE'); - case 'U': - $char = pack('N', hexdec(substr($value, 2, 8))); - - return $this->convertEncoding($char, self::ENCODING, 'UCS-4BE'); - } - } - - /** - * Convert a string from one encoding to another. - * - * @param string $value The string to convert - * @param string $to The input encoding - * @param string $from The output encoding - * - * @return string The string with the new encoding - * - * @throws \RuntimeException if no suitable encoding function is found (iconv or mbstring) - */ - private function convertEncoding($value, $to, $from) - { - if (function_exists('mb_convert_encoding')) { - return mb_convert_encoding($value, $to, $from); - } elseif (function_exists('iconv')) { - return iconv($from, $to, $value); - } - - throw new \RuntimeException('No suitable convert encoding function (install the iconv or mbstring extension).'); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/Yaml.php b/framework/library/Doctrine/Symfony/Component/Yaml/Yaml.php deleted file mode 100644 index 29e9413..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/Yaml.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -use Symfony\Component\Yaml\Exception\ParseException; - -/** - * Yaml offers convenience methods to load and dump YAML. - * - * @author Fabien Potencier - * - * @api - */ -class Yaml -{ - static public $enablePhpParsing = false; - - static public function enablePhpParsing() - { - self::$enablePhpParsing = true; - } - - /** - * Parses YAML into a PHP array. - * - * The parse method, when supplied with a YAML stream (string or file), - * will do its best to convert YAML in a file into a PHP array. - * - * Usage: - * - * $array = Yaml::parse('config.yml'); - * print_r($array); - * - * - * @param string $input Path to a YAML file or a string containing YAML - * - * @return array The YAML converted to a PHP array - * - * @throws ParseException If the YAML is not valid - * - * @api - */ - static public function parse($input) - { - // if input is a file, process it - $file = ''; - if (strpos($input, "\n") === false && is_file($input)) { - if (false === is_readable($input)) { - throw new ParseException(sprintf('Unable to parse "%s" as the file is not readable.', $input)); - } - - $file = $input; - if (self::$enablePhpParsing) { - ob_start(); - $retval = include($file); - $content = ob_get_clean(); - - // if an array is returned by the config file assume it's in plain php form else in YAML - $input = is_array($retval) ? $retval : $content; - - // if an array is returned by the config file assume it's in plain php form else in YAML - if (is_array($input)) { - return $input; - } - } else { - $input = file_get_contents($file); - } - } - - $yaml = new Parser(); - - try { - return $yaml->parse($input); - } catch (ParseException $e) { - if ($file) { - $e->setParsedFile($file); - } - - throw $e; - } - } - - /** - * Dumps a PHP array to a YAML string. - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. - * - * @param array $array PHP array - * @param integer $inline The level where you switch to inline YAML - * - * @return string A YAML string representing the original PHP array - * - * @api - */ - static public function dump($array, $inline = 2) - { - $yaml = new Dumper(); - - return $yaml->dump($array, $inline); - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/composer.json b/framework/library/Doctrine/Symfony/Component/Yaml/composer.json deleted file mode 100644 index c2894da..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/composer.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "symfony/yaml", - "type": "library", - "description": "Symfony Yaml Component", - "keywords": [], - "homepage": "http://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "require": { - "php": ">=5.3.3" - }, - "autoload": { - "psr-0": { "Symfony\\Component\\Yaml": "" } - }, - "target-dir": "Symfony/Component/Yaml", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - } -} diff --git a/framework/library/Doctrine/Symfony/Component/Yaml/phpunit.xml.dist b/framework/library/Doctrine/Symfony/Component/Yaml/phpunit.xml.dist deleted file mode 100644 index d025f9e..0000000 --- a/framework/library/Doctrine/Symfony/Component/Yaml/phpunit.xml.dist +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - ./Tests/ - - - - - - ./ - - ./vendor - ./Tests - - - - diff --git a/framework/library/Zend/Registry.php b/framework/library/Zend/Registry.php index e31d7ea..16edb97 100644 --- a/framework/library/Zend/Registry.php +++ b/framework/library/Zend/Registry.php @@ -172,7 +172,7 @@ class Zend_Registry extends ArrayObject * Returns TRUE if the $index is a named value in the registry, * or FALSE if $index was not found in the registry. * - * @param string $index + * @param string $index * @return boolean */ public static function isRegistered($index) @@ -201,9 +201,9 @@ class Zend_Registry extends ArrayObject * * Workaround for http://bugs.php.net/bug.php?id=40442 (ZF-960). */ - public function offsetExists($index) + public function offsetExists($index): bool { - return @array_key_exists($index, $this); + return @array_key_exists($index, $this->getArrayCopy()); } } diff --git a/framework/library/Zend/Session/Exception.php b/framework/library/Zend/Session/Exception.php index d99a6ad..b1d77fd 100644 --- a/framework/library/Zend/Session/Exception.php +++ b/framework/library/Zend/Session/Exception.php @@ -53,7 +53,7 @@ class Zend_Session_Exception extends Zend_Exception * @param string $errstr * @return void */ - static public function handleSessionStartError($errno, $errstr, $errfile, $errline, $errcontext) + static public function handleSessionStartError($errno, $errstr, $errfile, $errline, $errcontext=null) { self::$sessionStartError = $errfile . '(Line:' . $errline . '): Error #' . $errno . ' ' . $errstr; } diff --git a/framework/library/Zend/Xml/Security.php b/framework/library/Zend/Xml/Security.php index d95d4f8..9adc2f9 100644 --- a/framework/library/Zend/Xml/Security.php +++ b/framework/library/Zend/Xml/Security.php @@ -167,10 +167,10 @@ class Zend_Xml_Security public static function isPhpFpm() { $isVulnerableVersion = ( - version_compare(PHP_VERSION, '5.5.22', 'lt') + version_compare(PHP_VERSION, '5.5.22', '<') || ( - version_compare(PHP_VERSION, '5.6', 'gte') - && version_compare(PHP_VERSION, '5.6.6', 'lt') + version_compare(PHP_VERSION, '5.6', '>=') + && version_compare(PHP_VERSION, '5.6.6', '<') ) ); diff --git a/index.php b/index.php index 6315150..dc82bc9 100644 --- a/index.php +++ b/index.php @@ -3,8 +3,10 @@ $start = microtime(true); ini_set('log_errors', '1'); -if($_SERVER['HTTP_HOST'] == 'bloomsburie.dev2.cubedesigners.com') { +if ($_SERVER['HTTP_HOST'] == 'bloomsburie.dev2.cubedesigners.com') { define('APPLICATION_ENV', 'testing'); +} else if (stristr('staging.bloomsburie.com', $_SERVER['HTTP_HOST'])) { + define('APPLICATION_ENV', 'staging'); }else{ define('APPLICATION_ENV', 'production'); }