############################################
-# PHPDocker.io PHP 7.4 / CLI and FPM image #
+# PHPDocker.io PHP 8.3 / CLI and FPM image #
############################################
FROM ubuntu:jammy AS cli
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 && \
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
chpasswd < /root/passwords
# Launch PHP
-/usr/sbin/php-fpm7.4 -O
+/usr/sbin/php-fpm8.3 -O
# 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:
</mappings>
</serverdata>
</paths>
- <paths name="bastide-resah.fluidbook.com">
+ <paths name="amadeus.cubedesigners.com">
<serverdata>
<mappings>
<mapping local="$PROJECT_DIR$" web="/" />
</mappings>
</serverdata>
</paths>
+ <paths name="staging.bloomsburie.com">
+ <serverdata>
+ <mappings>
+ <mapping deploy="/" local="$PROJECT_DIR$" web="/" />
+ </mappings>
+ </serverdata>
+ </paths>
<paths name="stats3.fluidbook.com">
<serverdata>
<mappings>
</mappings>
</serverdata>
</paths>
+ <paths name="www.bastide-resah.fr">
+ <serverdata>
+ <mappings>
+ <mapping local="$PROJECT_DIR$" web="/" />
+ </mappings>
+ </serverdata>
+ </paths>
<paths name="www.ccgm.fr">
<serverdata>
<mappings>
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
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
*/
$c.= '<h3>' . $s->legende . '</h3>';
- // 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
}
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');
Zend_Db_Table::setDefaultAdapter($db);
Zend_Db_Table_Abstract::setDefaultMetadataCache($this->getFrameworkCache());
- $this->bootstrap('syncDb');
- if ($this->getResource('syncDb')) {
- $this->bootstrap('dbViews');
- }
-
return $db;
}
return $this->getResource('formerDb');
}
- /**
- * @return Doctrine\DBAL\Connection
- */
- public function getDoctrine() {
- $this->bootstrap('doctrine');
- return $this->getResource('doctrine');
- }
-
}
<?php
-class CubeIT_View_Helper_CmsValue extends CubeIT_View_Helper_Abstract {
+class _View_Helper_CMSValue extends CubeIT_View_Helper_Abstract {
- public function cmsValue($key) {
- $v = $this->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
$markup = 'iframe';
$content = '';
$oam = self::getOAMData($src);
- if(null===$oam){
+ if (null === $oam) {
return;
}
$attributes['src'] = $oam['url'];
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;
}
}
$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);
}
<?php
-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;
- }
+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;
+ }
}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Annotations;
-
-/**
- * Annotations class
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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))
- );
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- *
- * @Annotation
- */
-final class Attribute
-{
- /**
- * @var string
- */
- public $name;
-
- /**
- * @var string
- */
- public $type;
-
- /**
- * @var boolean
- */
- public $required = false;
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- *
- * @Annotation
- */
-final class Attributes
-{
- /**
- * @var array<Doctrine\Common\Annotations\Annotation\Attribute>
- */
- public $value;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <schmittjoh@gmail.com>
- */
-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'];
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- *
- * @Annotation
- */
-final class Required
-{
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- *
- * @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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Annotations;
-
-/**
- * Description of AnnotationException
- *
- * @since 2.0
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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
- ));
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Annotations;
-
-use Doctrine\Common\Cache\Cache;
-
-/**
- * A cache aware annotation reader.
- *
- * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Annotations;
-
-use Doctrine\Common\Lexer;
-
-/**
- * Simple lexer for docblock annotations.
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-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<string>'
- )
- ),
- ),
- '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<Doctrine\Common\Annotations\Annotation\Attribute>'
- )
- ),
- ),
- );
-
- /**
- * 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<type>
- 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<type> 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<string>"
- 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());
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Annotations;
-
-
-/**
- * File cache reader for annotations.
- *
- * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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, '<?php return unserialize('.var_export(serialize($data), true).');');
- }
-
- /**
- * 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 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();
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <schmittjoh@gmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Annotations;
-
-use SplFileObject;
-
-/**
- * Parses a file for namespaces/use/class declarations.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- * @author Christian Kaps <christian.kaps@mohiva.com>
- */
-final class PhpParser
-{
- /**
- * Parses a class.
- *
- * @param \ReflectionClass $class A <code>ReflectionClass</code> 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('<?php ' . $content);
-
- $statements = $tokenizer->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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Annotations;
-
-/**
- * Interface for annotation readers.
- *
- * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <schmittjoh@gmail.com>
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Annotations;
-
-/**
- * Parses a file for namespaces/use/class declarations.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- * @author Christian Kaps <christian.kaps@mohiva.com>
- */
-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();
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-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'],
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-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:
- *
- * - <b>hits</b>
- * Number of keys that have been requested and found present.
- *
- * - <b>misses</b>
- * Number of items that have been requested and not found.
- *
- * - <b>uptime</b>
- * Time that the server is running.
- *
- * - <b>memory_usage</b>
- * Memory used by this server to store items.
- *
- * - <b>memory_available</b>
- * Memory allowed to use for storage.
- *
- * @since 2.2
- * @var array Associative array with server's statistics if available, NULL otherwise.
- */
- function getStats();
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Base class for cache provider implementations.
- *
- * @since 2.2
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-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();
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Base file cache driver.
- *
- * @since 2.3
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-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
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Filesystem cache driver.
- *
- * @since 2.3
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-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
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-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'],
- );
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-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'],
- );
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Php file cache driver.
- *
- * @since 2.3
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-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('<?php return %s;', $value);
-
- return file_put_contents($filename, $code);
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <osmanungur@gmail.com>
- */
-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
- );
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-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'],
- );
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-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'],
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <ralph.schindler@zend.com>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common;
-
-/**
- * A <tt>ClassLoader</tt> 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 <code>include_path</code>.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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 <tt>ClassLoader</tt> 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 <tt>ClassLoader</tt>, {@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 <tt>ClassLoader</tt>, 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 <tt>ClassLoader</tt> 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 <tt>ClassLoader</tt> for the class or NULL if no such <tt>ClassLoader</tt> 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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <b>ordered map</b> 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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Collections;
-
-use Doctrine\Common\Collections\Expr\Expression;
-use Doctrine\Common\Collections\Expr\CompositeExpression;
-
-/**
- * Criteria for filtering Selectable collections.
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @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;
- };
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Collections\Expr;
-
-/**
- * Comparison of a field with a value by the given operator.
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Collections\Expr;
-
-/**
- * Expression of Expressions combined by AND or OR operation.
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Collections\Expr;
-
-/**
- * Expression for the {@link Selectable} interface.
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-interface Expression
-{
- public function visit(ExpressionVisitor $visitor);
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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));
- }
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYvalue HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYvalue
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @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));
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @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);
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common;
-
-/**
- * Base exception class for package Doctrine\Common
- * @author heinrich
- *
- */
-class CommonException extends \Exception {
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- */
-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);
-}
-
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class EventManager
-{
- /**
- * Map of registered listeners.
- * <event> => <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);
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id: EventListener.php 4653 2008-07-10 17:17:58Z romanb $
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-interface EventSubscriber
-{
- /**
- * Returns an array of events this subscriber wants to listen to.
- *
- * @return array
- */
- function getSubscribedEvents();
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common;
-
-/**
- * Base class for writing simple lexers, i.e. for creating small DSLs.
- *
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @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);
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-interface NotifyPropertyChanged
-{
- /**
- * Adds a listener that wants to be notified about property changes.
- *
- * @param PropertyChangedListener $listener
- */
- function addPropertyChangedListener(PropertyChangedListener $listener);
-}
-
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabien@symfony.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Lukas Kahwe Smith <smith@pooteeweet.org>
- */
-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]);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabien@symfony.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Lukas Kahwe Smith <smith@pooteeweet.org>
- */
-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();
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <roman@code-factory.de>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <jonwage@gmail.com>
- * @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;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <roman@code-factory.de>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.de>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilehrmeblanco@hotmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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())
- ));
- }
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabien@symfony.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Lukas Kahwe Smith <smith@pooteeweet.org>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Jonathan Wage <jonwage@gmail.com>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Jonathan Wage <jonwage@gmail.com>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- */
-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();
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Persistence\Mapping\Driver;
-
-use Doctrine\Common\Persistence\Mapping\ClassMetadata;
-
-/**
- * Contract for metadata drivers.
- *
- * @since 2.2
- * @author Jonathan H. Wage <jonwage@gmail.com>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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');
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <fabien@symfony.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.phpdoctrine.org>.
- */
-
-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'.");
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Persistence\Mapping;
-
-use ReflectionClass;
-use ReflectionProperty;
-
-/**
- * PHP Runtime Reflection Service
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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));
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Persistence\Mapping;
-
-use ReflectionClass;
-use ReflectionProperty;
-
-/**
- * PHP Runtime Reflection Service
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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));
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Jonathan Wage <jonwage@gmail.com>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Jonathan Wage <jonwage@gmail.com>
- */
-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();
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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());
- }
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Persistence;
-
-/**
- * Interface for proxy classes.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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();
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common;
-
-/**
- * Contract for classes that are potential listeners of a <tt>NotifyPropertyChanged</tt>
- * 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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Reflection;
-
-/**
- * Finds a class in a PSR-0 structure.
- *
- * @author Karoly Negyesi <karoly@negyesi.net>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Reflection;
-
-/**
- * Finds a class in a PSR-0 structure.
- *
- * @author Karoly Negyesi <karoly@negyesi.net>
- */
-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;
- }
- }
- }
- }
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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'); }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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'); }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Reflection;
-
-use ReflectionException;
-use Doctrine\Common\Annotations\TokenParser;
-
-/**
- * Parses a file for namespaces/use/class declarations.
- *
- * @author Karoly Negyesi <karoly@negyesi.net>
- */
-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 . '"');
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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'); }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Johannes Schmitt <schmittjoh@gmail.com>
- */
-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, '\\');
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Giorgio Sironi <piccoloprincipeazzurro@gmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id: Inflector.php 3189 2007-11-18 20:37:44Z meus $
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kvesteri@cc.hut.fi>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- */
-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));
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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];
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Cache;
-
-/**
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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.");
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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();
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
- * @author Lukas Smith <smith@pooteeweet.org> (MDB2 library)
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id: Exception.php 4628 2008-07-04 16:32:19Z romanb $
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <jonwage@gmail.com
- */
-class ConnectionException extends DBALException
-{
- public static function commitFailedRollbackOnly()
- {
- return new self("Transaction commit failed because the transaction has been marked for rollback only.");
- }
-
- public static function noActiveTransaction()
- {
- return new self("There is no active transaction.");
- }
-
- public static function savepointsNotSupported()
- {
- return new self("Savepoints are not supported by this driver.");
- }
-
- public static function mayNotAlterNestedTransactionWithSavepointsInTransaction()
- {
- return new self("May not alter the nested transaction with savepoints behavior while a transaction is open.");
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <lstrojny@php.net>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-
-namespace Doctrine\DBAL;
-
-class DBALException extends \Exception
-{
- public static function notSupported($method)
- {
- return new self("Operation '$method' is not supported by platform.");
- }
-
- public static function invalidPlatformSpecified()
- {
- return new self(
- "Invalid 'platform' option specified, need to give an instance of ".
- "\Doctrine\DBAL\Platforms\AbstractPlatform.");
- }
-
- public static function invalidPdoInstance()
- {
- return new self(
- "The 'pdo' option was used in DriverManager::getConnection() but no ".
- "instance of PDO was given."
- );
- }
-
- public static function driverRequired()
- {
- return new self("The options 'driver' or 'driverClass' are mandatory if no PDO ".
- "instance is given to DriverManager::getConnection().");
- }
-
- public static function unknownDriver($unknownDriverName, array $knownDrivers)
- {
- return new self("The given 'driver' ".$unknownDriverName." is unknown, ".
- "Doctrine currently supports only the following drivers: ".implode(", ", $knownDrivers));
- }
-
- public static function driverExceptionDuringQuery(\Exception $driverEx, $sql, array $params = array())
- {
- $msg = "An exception occurred while executing '".$sql."'";
- if ($params) {
- $msg .= " with params " . self::formatParameters($params);
- }
- $msg .= ":\n\n".$driverEx->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.');
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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();
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Driver\DrizzlePDOMySql;
-
-/**
- * @author Kim Hemsø Rasmussen <kimhemsoe@gmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Driver\DrizzlePDOMySql;
-
-/**
- * Drizzle driver using PDO MySql.
- *
- * @author Kim Hemsø Rasmussen <kimhemsoe@gmail.com>
- */
-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'];
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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(),
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-namespace Doctrine\DBAL\Driver\IBMDB2;
-
-use Doctrine\DBAL\Driver,
- Doctrine\DBAL\Connection;
-
-/**
- * IBM DB2 Driver
- *
- * @since 2.0
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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'];
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-namespace Doctrine\DBAL\Driver\IBMDB2;
-
-class DB2Exception extends \Exception
-{
-
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Driver\Mysqli;
-
-use Doctrine\DBAL\Driver as DriverInterface;
-
-/**
- * @author Kim Hemsø Rasmussen <kimhemsoe@gmail.com>
- */
-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'];
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Driver\Mysqli;
-
-use Doctrine\DBAL\Driver\Connection as Connection;
-
-/**
- * @author Kim Hemsø Rasmussen <kimhemsoe@gmail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-namespace Doctrine\DBAL\Driver\Mysqli;
-
-/**
- * @author Kim Hemsø Rasmussen <kimhemsoe@gmail.com>
- */
-class MysqliException extends \Exception
-{}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Driver\Mysqli;
-
-use Doctrine\DBAL\Driver\Statement;
-use PDO;
-
-/**
- * @author Kim Hemsø Rasmussen <kimhemsoe@gmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Driver\OCI8;
-
-use Doctrine\DBAL\Platforms;
-
-/**
- * A Doctrine DBAL driver for the Oracle OCI8 PHP extensions.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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'];
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-namespace Doctrine\DBAL\Driver\OCI8;
-
-class OCI8Exception extends \Exception
-{
- static public function fromErrorInfo($error)
- {
- return new self($error['message'], $error['code']);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- */
-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<num>)
- *
- * 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);
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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'];
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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();
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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'];
- }
-}
+++ /dev/null
-<?php
-
-namespace Doctrine\DBAL\Driver\PDOPgSql;
-
-use Doctrine\DBAL\Platforms;
-
-/**
- * Driver that connects through pdo_pgsql.
- *
- * @since 2.0
- */
-class Driver implements \Doctrine\DBAL\Driver
-{
- /**
- * Attempts to connect to the database and returns a driver connection on success.
- *
- * @return \Doctrine\DBAL\Driver\Connection
- */
- 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 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'];
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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'];
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id: Interface.php 3882 2008-02-22 18:11:35Z jwage $
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Driver;
-
-use PDO;
-
-/**
- * Interface for the reading part of a prepare statement only.
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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'];
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Driver\SQLSrv;
-
-/**
- * Last Id Data Container
- *
- * @since 2.3
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-class LastInsertId
-{
- private $id;
-
- public function setId($id)
- {
- $this->id = $id;
- }
-
- public function getId()
- {
- return $this->id;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Driver\SQLSrv;
-
-/**
- * SQL Server implementation for the Connection interface.
- *
- * @since 2.3
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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));
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Driver\SQLSrv;
-
-use PDO;
-use IteratorAggregate;
-use Doctrine\DBAL\Driver\Statement;
-
-/**
- * SQL Server Statement
- *
- * @since 2.3
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Driver;
-
-use \PDO;
-
-/**
- * Statement interface.
- * Drivers must implement this interface.
- *
- * This resembles (a subset of) the PDOStatement interface.
- *
- * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
- * @author Roman Borschel <roman@code-factory.org>
- * @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();
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL;
-
-use Doctrine\Common\EventManager;
-
-/**
- * Factory for creating Doctrine\DBAL\Connection instances.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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:
- *
- * <b>user (string)</b>:
- * The username to use when connecting.
- *
- * <b>password (string)</b>:
- * The password to use when connecting.
- *
- * <b>driverOptions (array)</b>:
- * Any additional driver-specific options for the driver. These are just passed
- * through to the driver.
- *
- * <b>pdo</b>:
- * You can pass an existing PDO instance through this parameter. The PDO
- * instance will be wrapped in a Doctrine\DBAL\Connection.
- *
- * <b>wrapperClass</b>:
- * You may specify a custom wrapper class through the 'wrapperClass'
- * parameter but this class MUST inherit from Doctrine\DBAL\Connection.
- *
- * <b>driverClass</b>:
- * 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']);
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- */
-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();
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- * @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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <jsorgalla@googlemail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <jsorgalla@googlemail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <jsorgalla@googlemail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <jsorgalla@googlemail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <jsorgalla@googlemail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <jsorgalla@googlemail.com>
- */
-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();
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <jsorgalla@googlemail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <jsorgalla@googlemail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <jsorgalla@googlemail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <jsorgalla@googlemail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <jsorgalla@googlemail.com>
- */
-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();
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL;
-
-/**
- * Container for all DBAL events.
- *
- * This class cannot be instantiated.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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';
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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)
- {
- }
-}
-
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class LockMode
-{
- const NONE = 0;
- const OPTIMISTIC = 1;
- const PESSIMISTIC_READ = 2;
- const PESSIMISTIC_WRITE = 4;
-
- final private function __construct() { }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Logging;
-
-/**
- * Includes executed SQLs in a Debug Stack
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @version $Revision$
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
- }
-}
-
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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()
- {
-
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Logging;
-
-/**
- * Chains multiple SQLLogger
- *
- *
- * @link www.doctrine-project.org
- * @since 2.2
- * @author Christophe Coevoet <stof@notk.org>
- */
-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();
- }
- }
-}
-
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Logging;
-
-/**
- * Interface for SQL loggers.
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @version $Revision$
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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();
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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:
- * <code>
- * $q = new Doctrine_Query();
- * $e = $q->expr;
- * $q->select('*')->from('table')
- * ->where($e->eq('id', $e->not('null'));
- * </code>
- *
- * @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<string> $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__);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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';
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kimhemsoe@gmail.com>
- */
-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';
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- */
-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',
- );
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-namespace Doctrine\DBAL\Platforms\Keywords;
-
-/**
- * Drizzle Keywordlist
- *
- * @author Kim Hemsø Rasmussen <kimhemsoe@gmail.com>
- */
-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',
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- */
-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();
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- * @author David Coallier <davidc@php.net>
- */
-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',
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- * @author David Coallier <davidc@php.net>
- */
-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',
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- * @author David Coallier <davidc@php.net>
- */
-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',
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- * @author Marcelo Santos Araujo <msaraujo@php.net>
- */
-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'
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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())
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- */
-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'
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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';
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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';
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Platforms;
-
-use Doctrine\DBAL\Schema\TableDiff,
- Doctrine\DBAL\Schema\Table;
-
-/**
- * PostgreSqlPlatform.
- *
- * @since 2.0
- * @author Roman Borschel <roman@code-factory.org>
- * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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';
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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)';
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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';
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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'] . "'";
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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);
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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 <tt>Statement</tt> 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();
- }
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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 <tt>ExpressionBuilder</tt>.
- *
- * @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 <left expr> = <right expr>. 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 <left expr> <> <right expr>. 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 <left expr> < <right expr>. 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 <left expr> <= <right expr>. 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 <left expr> > <right expr>. 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 <left expr> >= <right expr>. 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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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 <tt>QueryBuilder</tt>.
- *
- * @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:
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u')
- * ->from('users', 'u')
- * ->where($qb->expr()->eq('u.id', 1));
- * </code>
- *
- * 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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u')
- * echo $qb->getSQL(); // SELECT u FROM User u
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u')
- * ->from('users', 'u')
- * ->where('u.id = :user_id')
- * ->setParameter(':user_id', 1);
- * </code>
- *
- * @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.
- *
- * <code>
- * $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
- * ));
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u.id', 'p.id')
- * ->from('users', 'u')
- * ->leftJoin('u', 'phonenumbers', 'p', 'u.id = p.user_id');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u.id')
- * ->addSelect('p.id')
- * ->from('users', 'u')
- * ->leftJoin('u', 'phonenumbers', 'u.id = p.user_id');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->delete('users', 'u')
- * ->where('u.id = :user_id');
- * ->setParameter(':user_id', 1);
- * </code>
- *
- * @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
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->update('users', 'u')
- * ->set('u.password', md5('password'))
- * ->where('u.id = ?');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u.id')
- * ->from('users', 'u')
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u.name')
- * ->from('users', 'u')
- * ->join('u', 'phonenumbers', 'p', 'p.is_primary = 1');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u.name')
- * ->from('users', 'u')
- * ->innerJoin('u', 'phonenumbers', 'p', 'p.is_primary = 1');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u.name')
- * ->from('users', 'u')
- * ->leftJoin('u', 'phonenumbers', 'p', 'p.is_primary = 1');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u.name')
- * ->from('users', 'u')
- * ->rightJoin('u', 'phonenumbers', 'p', 'p.is_primary = 1');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->update('users', 'u')
- * ->set('u.password', md5('password'))
- * ->where('u.id = ?');
- * </code>
- *
- * @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.
- *
- * <code>
- * $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);
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u')
- * ->from('users', 'u')
- * ->where('u.username LIKE ?')
- * ->andWhere('u.is_active = 1');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u.name')
- * ->from('users', 'u')
- * ->where('u.id = 1')
- * ->orWhere('u.id = 2');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u.name')
- * ->from('users', 'u')
- * ->groupBy('u.id');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $conn->createQueryBuilder()
- * ->select('u.name')
- * ->from('users', 'u')
- * ->groupBy('u.lastLogin');
- * ->addGroupBy('u.createdAt')
- * </code>
- *
- * @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:
- * <code>
- * $value = 2;
- * $q->eq( 'id', $q->bindValue( $value ) );
- * $stmt = $q->executeQuery(); // executed with 'id = 2'
- * </code>
- *
- * @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:
- * <code>
- * $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))
- * </code>
- *
- * @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 "?";
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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) . ".");
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- */
-class SQLParserUtils
-{
- const POSITIONAL_TOKEN = '\?';
- const NAMED_TOKEN = '(?<!:):[a-zA-Z_][a-zA-Z0-9_]*';
-
- // Quote characters within string literals can be preceded by a backslash.
- const ESCAPED_SINGLE_QUOTED_TEXT = "'(?:[^'\\\\]|\\\\'|\\\\\\\\)*'";
- const ESCAPED_DOUBLE_QUOTED_TEXT = '"(?:[^"\\\\]|\\\\"|\\\\\\\\)*"';
-
- /**
- * Get an array of the placeholders in an sql statements as keys and their positions in the query string.
- *
- * Returns an integer => 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);
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id: $
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <lars@strojny.net>
- */
-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));
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kvesteri@cc.hut.fi>
- * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
- * @author Roman Borschel <roman@code-factory.org>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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.
- *
- * <code>
- * $result = $sm->tryMethod('dropView', 'view_name');
- * </code>
- *
- * @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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Schema;
-
-/**
- * Represent the change of a column
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @version $Revision$
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-interface Constraint
-{
- public function getName();
-
- public function getQuotedName(AbstractPlatform $platform);
-
- public function getColumns();
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Schema;
-
-/**
- * Schema manager for the Drizzle RDBMS.
- *
- * @author Kim Hemsø Rasmussen <kimhemsoe@gmail.com>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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)]);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Schema;
-
-/**
- * Schema manager for the MySql RDBMS.
- *
- * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
- * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
- * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.phpdoctrine.org>.
- */
-
-namespace Doctrine\DBAL\Schema;
-
-/**
- * Oracle Schema Manager
- *
- * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
- * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
- * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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);
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Schema;
-
-/**
- * PostgreSQL Schema Manager
- *
- * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
- * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
- * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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);
- }
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.phpdoctrine.org>.
- */
-
-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 <kvesteri@cc.hut.fi>
- * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
- * @author Juozas Kaziukenas <juozas@juokaz.com>
- * @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]";
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Schema;
-
-/**
- * Configuration for a Schema
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-
-namespace Doctrine\DBAL\Schema;
-
-class SchemaException extends \Doctrine\DBAL\DBALException
-{
- const TABLE_DOESNT_EXIST = 10;
- const TABLE_ALREADY_EXISTS = 20;
- const COLUMN_DOESNT_EXIST = 30;
- const COLUMN_ALREADY_EXISTS = 40;
- const INDEX_DOESNT_EXIST = 50;
- const INDEX_ALREADY_EXISTS = 60;
- const SEQUENCE_DOENST_EXIST = 70;
- const SEQUENCE_ALREADY_EXISTS = 80;
- const INDEX_INVALID_NAME = 90;
- const FOREIGNKEY_DOESNT_EXIST = 100;
-
- /**
- * @param string $tableName
- * @return SchemaException
- */
- static public function tableDoesNotExist($tableName)
- {
- return new self("There is no table with name '".$tableName."' in the schema.", self::TABLE_DOESNT_EXIST);
- }
-
- /**
- * @param string $indexName
- * @return SchemaException
- */
- static public function indexNameInvalid($indexName)
- {
- return new self("Invalid index-name $indexName given, has to be [a-zA-Z0-9_]", self::INDEX_INVALID_NAME);
- }
-
- /**
- * @param string $indexName
- * @return SchemaException
- */
- static public function indexDoesNotExist($indexName, $table)
- {
- return new self("Index '$indexName' does not exist on table '$table'.", self::INDEX_DOESNT_EXIST);
- }
-
- /**
- * @param string $indexName
- * @return SchemaException
- */
- static public function indexAlreadyExists($indexName, $table)
- {
- return new self("An index with name '$indexName' was already defined on table '$table'.", self::INDEX_ALREADY_EXISTS);
- }
-
- /**
- * @param string $columnName
- * @return SchemaException
- */
- static public function columnDoesNotExist($columnName, $table)
- {
- return new self("There is no column with name '$columnName' on table '$table'.", self::COLUMN_DOESNT_EXIST);
- }
-
- /**
- *
- * @param string $tableName
- * @return SchemaException
- */
- static public function tableAlreadyExists($tableName)
- {
- return new self("The table with name '".$tableName."' already exists.", self::TABLE_ALREADY_EXISTS);
- }
-
- /**
- *
- * @param string $tableName
- * @param string $columnName
- * @return SchemaException
- */
- static public function columnAlreadyExists($tableName, $columnName)
- {
- return new self(
- "The column '".$columnName."' on table '".$tableName."' already exists.", self::COLUMN_ALREADY_EXISTS
- );
- }
-
- /**
- * @param string $sequenceName
- * @return SchemaException
- */
- static public function sequenceAlreadyExists($sequenceName)
- {
- return new self("The sequence '".$sequenceName."' already exists.", self::SEQUENCE_ALREADY_EXISTS);
- }
-
- /**
- * @param string $sequenceName
- * @return SchemaException
- */
- static public function sequenceDoesNotExist($sequenceName)
- {
- return new self("There exists no sequence with the name '".$sequenceName."'.", self::SEQUENCE_DOENST_EXIST);
- }
-
- /**
- * @param string $fkName
- * @return SchemaException
- */
- static public function foreignKeyDoesNotExist($fkName, $table)
- {
- return new self("There exists no foreign key with the name '$fkName' on table '$table'.", self::FOREIGNKEY_DOESNT_EXIST);
- }
-
- static public function namedForeignKeyRequired(Table $localTable, ForeignKeyConstraint $foreignKey)
- {
- return new self(
- "The performed schema operation on ".$localTable->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
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Schema;
-
-/**
- * SqliteSchemaManager
- *
- * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
- * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
- * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @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']);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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);
- }
- }
-
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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();
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-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 <kontakt@beberlei.de>
- */
-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());
- }
-}
-
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 = '<<TABLE CELLSPACING="0" BORDER="1" ALIGN="LEFT">';
-
- // The title
- $label .= '<TR><TD BORDER="1" COLSPAN="3" ALIGN="CENTER" BGCOLOR="#fcaf3e"><FONT COLOR="#2e3436" FACE="Helvetica" POINT-SIZE="12">' . $table->getName() . '</FONT></TD></TR>';
-
- // The attributes block
- foreach( $table->getColumns() as $column ) {
- $columnLabel = $column->getName();
-
- $label .= '<TR>';
- $label .= '<TD BORDER="0" ALIGN="LEFT" BGCOLOR="#eeeeec">';
- $label .= '<FONT COLOR="#2e3436" FACE="Helvetica" POINT-SIZE="12">' . $columnLabel . '</FONT>';
- $label .= '</TD><TD BORDER="0" ALIGN="LEFT" BGCOLOR="#eeeeec"><FONT COLOR="#2e3436" FACE="Helvetica" POINT-SIZE="10">' . strtolower($column->getType()) . '</FONT></TD>';
- $label .= '<TD BORDER="0" ALIGN="RIGHT" BGCOLOR="#eeeeec" PORT="col'.$column->getName().'">';
- if ($table->hasPrimaryKey() && in_array($column->getName(), $table->getPrimaryKey()->getColumns())) {
- $label .= "\xe2\x9c\xb7";
- }
- $label .= '</TD></TR>';
- }
-
- // End the table
- $label .= '</TABLE>>';
-
- 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 . "}");
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @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)
- {
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Sharding;
-
-use Doctrine\DBAL\Sharding\ShardChoser\ShardChoser;
-
-/**
- * Shard Manager for the Connection Pooling Shard Strategy
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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)";
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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)
- {
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-class MultiTenantShardChoser implements ShardChoser
-{
- public function pickShard($distributionValue, PoolingShardConnection $conn)
- {
- return $distributionValue;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-interface ShardChoser
-{
- /**
- * Pick a shard for the given distribution value
- *
- * @param string $distributionValue
- * @param PoolingShardConnection $conn
- * @return int
- */
- function pickShard($distributionValue, PoolingShardConnection $conn);
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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'.");
- }
-}
-
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @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 <tt>Statement</tt> for the given SQL and <tt>Connection</tt>.
- *
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-Import SQL file(s) directly to Database.
-EOT
- );
- }
-
- /**
- * @see Console\Command\Command
- */
- protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
- {
- $conn = $this->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 '<info>%s</info>' does not exist.", $fileName)
- );
- } else if ( ! is_readable($fileName)) {
- throw new \InvalidArgumentException(
- sprintf("SQL file '<info>%s</info>' does not have read permissions.", $fileName)
- );
- }
-
- $output->write(sprintf("Processing file '<info>%s</info>'... ", $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();
- }
- }
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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(<<<EOT
-Checks if the current database contains tables and columns
-with names that are identifiers in this dialect or in other SQL dialects.
-
-By default SQLite, MySQL, PostgreSQL, MsSQL and Oracle
-keywords are checked:
-
- <info>%command.full_name%</info>
-
-If you want to check against specific dialects you can
-pass them to the command:
-
- <info>%command.full_name% mysql pgsql</info>
-
-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 <comment>' . implode(", ", $keywordLists) . "</comment>...", 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 <error>' . count($violations) . '</error> reserved keyword violations in your database schema:', true);
- foreach ($violations as $violation) {
- $output->write(' - ' . $violation, true);
- }
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-Executes arbitrary SQL directly from the command line.
-EOT
- );
- }
-
- /**
- * @see Console\Command\Command
- */
- protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
- {
- $conn = $this->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);
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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';
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-/**
- * 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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Types;
-
-use Doctrine\DBAL\Platforms\AbstractPlatform;
-
-/**
- * Represents a GUID/UUID datatype (both are actually synomys) in the database.
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @since 2.3
- */
-class GuidType extends StringType
-{
- public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
- {
- return $platform->getGuidTypeDeclarationSQL($fieldDeclaration);
- }
-
- public function getName()
- {
- return Type::GUID;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\DBAL\Types;
-
-use Doctrine\DBAL\Platforms\AbstractPlatform;
-
-/**
- * Type that maps an SQL INT to a PHP integer.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <schmittjoh@gmail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <schmittjoh@gmail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * $Id$
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
- */
-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 <tt>AbstractQuery</tt>.
- *
- * @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();
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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'];
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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:
- *
- * <code>
- * $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)));
- * </code>
- *
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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.');
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class EntityRepository implements ObjectRepository, Selectable
-{
- /**
- * @var string
- */
- protected $_entityName;
-
- /**
- * @var EntityManager
- */
- protected $_em;
-
- /**
- * @var \Doctrine\ORM\Mapping\ClassMetadata
- */
- protected $_class;
-
- /**
- * Initializes a new <tt>EntityRepository</tt>.
- *
- * @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));
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <roman@code-factory.de>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <jonwage@gmail.com>
- * @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;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.de>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.de>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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;
- }
- */
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-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 <df@rebuy.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.de>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Event;
-
-use Doctrine\Common\EventArgs,
- Doctrine\ORM\EntityManager;
-
-/**
- * Class that holds event arguments for a preInsert/preUpdate event.
- *
- * @author Guilherme Blanco <guilehrmeblanco@hotmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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())
- ));
- }
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM;
-
-/**
- * Container for all ORM events.
- *
- * This class cannot be instantiated.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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';
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Id;
-
-use Serializable, Doctrine\ORM\EntityManager;
-
-/**
- * Represents an ID generator that uses a database sequence.
- *
- * @since 2.0
- * @author Roman Borschel <roman@code-factory.org>
- */
-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'];
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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++;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <m.de.keizer@markei.nl>
- */
-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);
- }
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kvesteri@cc.hut.fi>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Guilherme Blanco <guilhermeblanoc@hotmail.com>
- */
-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 <tt>AbstractHydrator</tt>.
- *
- * @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)
- {
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Guilherme Blanco <guilhermeblanoc@hotmail.com>
- */
-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];
- }
-}
+++ /dev/null
-<?php
-
-namespace Doctrine\ORM\Internal\Hydration;
-
-class HydrationException extends \Doctrine\ORM\ORMException
-{
- public static function nonUniqueResult()
- {
- return new self("The result returned by the query was not unique.");
- }
-
- public static function parentObjectOfRelationNotFound($alias, $parentAlias)
- {
- return new self("The parent object of entity result with alias '$alias' was not found."
- . " The parent alias is '$parentAlias'.");
- }
-
- public static function emptyDiscriminatorValue($dqlAlias)
- {
- return new self("The DQL alias '" . $dqlAlias . "' contains an entity ".
- "of an inheritance hierachy with an empty discriminator value. This means " .
- "that the database contains inconsistent data with an empty " .
- "discriminator value in a table row."
- );
- }
-
- /**
- * @since 2.3
- * @param string $entityName
- * @param string $discrColumnName
- * @param string $dqlAlias
- * @return HydrationException
- */
- public static function missingDiscriminatorColumn($entityName, $discrColumnName, $dqlAlias)
- {
- return new self(sprintf(
- 'The discriminator column "%s" is missing for "%s" using the DQL alias "%s".',
- $discrColumnName, $entityName, $dqlAlias
- ));
- }
-
- /**
- * @since 2.3
- * @param string $entityName
- * @param string $discrColumnName
- * @param string $dqlAlias
- * @return HydrationException
- */
- public static function missingDiscriminatorMetaMappingColumn($entityName, $discrColumnName, $dqlAlias)
- {
- return new self(sprintf(
- 'The meta mapping for the discriminator column "%s" is missing for "%s" using the DQL alias "%s".',
- $discrColumnName, $entityName, $dqlAlias
- ));
- }
-}
\ No newline at end of file
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Guilherme Blanco <guilhermeblanoc@hotmail.com>
- *
- * @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();
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-interface Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * This annotation is used to override association mapping of property for an entity relationship.
- *
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- * @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;
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * This annotation is used to override association mappings of relationship properties.
- *
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- * @since 2.3
- *
- * @Annotation
- * @Target("CLASS")
- */
-final class AssociationOverrides implements Annotation
-{
-
- /**
- * Mapping overrides of relationship properties
- *
- * @var array<\Doctrine\ORM\Mapping\AssociationOverride>
- */
- public $value;
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * This annotation is used to override the mapping of a entity property.
- *
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- * @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;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * This annotation is used to override the mapping of a entity property.
- *
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- * @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;
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- */
-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();
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("CLASS")
- */
-final class ChangeTrackingPolicy implements Annotation
-{
- /** @var string */
- public $value;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * {@inheritDoc}
- *
- * @todo remove or rename ClassMetadataInfo to ClassMetadata
- */
-class ClassMetadata extends ClassMetadataInfo
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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
- // <table>_<column>_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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <tt>ClassMetadata</tt> 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.
- *
- * <b>IMPORTANT NOTE:</b>
- *
- * 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 <roman@code-factory.org>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @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
- * <tt>Class Table Inheritance</tt>.
- */
- const INHERITANCE_TYPE_JOINED = 2;
-
- /**
- * SINGLE_TABLE means the class will be persisted according to the rules of
- * <tt>Single Table Inheritance</tt>.
- */
- const INHERITANCE_TYPE_SINGLE_TABLE = 3;
-
- /**
- * TABLE_PER_CLASS means the class will be persisted according to the rules
- * of <tt>Concrete Table Inheritance</tt>.
- */
- 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 <tt>NotifyPropertyChanged</tt> 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:
- * <code>
- * array(
- * 'class' => 'ClassName',
- * )
- * </code>
- *
- * @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:
- * <pre>
- * array(
- * 'name' => <query name>,
- * 'query' => <sql query>,
- * 'resultClass' => <class of the result>,
- * 'resultSetMapping' => <name of a SqlResultSetMapping>
- * )
- * </pre>
- */
- public $namedNativeQueries = array();
-
- /**
- * READ-ONLY: The mappings of the results of native SQL queries.
- *
- * A native result mapping definition has the following structure:
- * <pre>
- * array(
- * 'name' => <result name>,
- * 'entities' => array(<entity result mapping>),
- * 'columns' => array(<column result mapping>)
- * )
- * </pre>
- */
- 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:
- *
- * - <b>fieldName</b> (string)
- * The name of the field in the Entity.
- *
- * - <b>type</b> (string)
- * The type name of the mapped field. Can be one of Doctrine's mapping types
- * or a custom mapping type.
- *
- * - <b>columnName</b> (string, optional)
- * The column name. Optional. Defaults to the field name.
- *
- * - <b>length</b> (integer, optional)
- * The database length of the column. Optional. Default value taken from
- * the type.
- *
- * - <b>id</b> (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.
- *
- * - <b>nullable</b> (boolean, optional)
- * Whether the column is nullable. Defaults to FALSE.
- *
- * - <b>columnDefinition</b> (string, optional, schema-only)
- * The SQL fragment that is used when generating the DDL for the column.
- *
- * - <b>precision</b> (integer, optional, schema-only)
- * The precision of a decimal column. Only valid if the column type is decimal.
- *
- * - <b>scale</b> (integer, optional, schema-only)
- * The scale of a decimal column. Only valid if the column type is decimal.
- *
- [* - <b>'unique'] (string, optional, schema-only)</b>
- * 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.
- *
- * <b>This does only apply to the JOINED and SINGLE_TABLE inheritance mapping strategies
- * where a discriminator column is used.</b>
- *
- * @var mixed
- * @see discriminatorColumn
- */
- public $discriminatorValue;
-
- /**
- * READ-ONLY: The discriminator map of all mapped classes in the hierarchy.
- *
- * <b>This does only apply to the JOINED and SINGLE_TABLE inheritance mapping strategies
- * where a discriminator column is used.</b>
- *
- * @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 => <tableName>
- * schema => <schemaName>
- * 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:
- *
- * - <b>fieldName</b> (string)
- * The name of the field in the entity the association is mapped to.
- *
- * - <b>targetEntity</b> (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.
- *
- * - <b>mappedBy</b> (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.
- *
- * - <b>inversedBy</b> (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.
- *
- * - <b>cascade</b> (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).
- *
- * - <b>orderBy</b> (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')
- *
- * - <b>fetch</b> (integer, optional)
- * The fetching strategy to use for the association, usually defaults to FETCH_LAZY.
- * Possible values are: ClassMetadata::FETCH_EAGER, ClassMetadata::FETCH_LAZY.
- *
- * - <b>joinTable</b> (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.
- *
- * - <b>indexBy</b> (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:
- * <pre>
- * array(
- * 'name' => <join table name>,
- * 'joinColumns' => array(<join column mapping from join table to source table>),
- * 'inverseJoinColumns' => array(<join column mapping from join table to target table>)
- * )
- * </pre>
- *
- *
- * @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:
- * <code>
- * array(
- * 'sequenceName' => 'name',
- * 'allocationSize' => 20,
- * 'initialValue' => 1
- * )
- * </code>
- *
- * @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 => <tableName> (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:
- * <code>
- * array(
- * 'sequenceName' => 'name',
- * 'allocationSize' => 20,
- * 'initialValue' => 1
- * 'quoted' => 1
- * )
- * </code>
- *
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- * @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;
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("PROPERTY")
- */
-final class CustomIdGenerator implements Annotation
-{
- /** @var string */
- public $class;
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * The default NamingStrategy
- *
- *
- * @link www.doctrine-project.org
- * @since 2.3
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-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()));
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- */
-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
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("CLASS")
- */
-final class DiscriminatorMap implements Annotation
-{
- /** @var array<string> */
- public $value;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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';
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <fabien@symfony.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <fabien@symfony.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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 <entity...> 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) {
- //<entity-result/>
- 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;
- }
-
- //<column-result/>
- 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 <discriminator-column...>
- 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 <discriminator-map...>
- 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 <change-tracking-policy...>
- if (isset($xmlRoot['change-tracking-policy'])) {
- $metadata->setChangeTrackingPolicy(constant('Doctrine\ORM\Mapping\ClassMetadata::CHANGETRACKING_'
- . strtoupper((string)$xmlRoot['change-tracking-policy'])));
- }
-
- // Evaluate <indexes...>
- 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 <unique-constraints..>
- 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 <field ...> 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 <id ...> 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 <one-to-one ...> 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 <one-to-many ...> 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("<index-by /> is not a valid tag");
- }
-
- $metadata->mapOneToMany($mapping);
- }
- }
-
- // Evaluate <many-to-one ...> 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 <many-to-many ...> 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("<index-by /> 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 <lifecycle-callbacks...>
- 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");
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan H. Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("ALL")
- * @todo check available targets
- */
-final class ElementCollection implements Annotation
-{
- /** @var string */
- public $tableName;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("CLASS")
- */
-final class Entity implements Annotation
-{
- /** @var string */
- public $repositoryClass;
- /** @var boolean */
- public $readOnly = false;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- * @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;
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- * @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;
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("PROPERTY")
- */
-final class GeneratedValue implements Annotation
-{
- /** @var string */
- public $strategy = 'AUTO';
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("CLASS")
- */
-final class HasLifecycleCallbacks implements Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("PROPERTY")
- */
-final class Id implements Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("ANNOTATION")
- */
-final class Index implements Annotation
-{
- /** @var string */
- public $name;
- /** @var array<string> */
- public $columns;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("CLASS")
- */
-final class InheritanceType implements Annotation
-{
- /** @var string */
- public $value;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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)
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("PROPERTY")
- */
-final class JoinColumns implements Annotation
-{
- /** @var array<\Doctrine\ORM\Mapping\JoinColumn> */
- public $value;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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();
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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<string> */
- public $cascade;
- /** @var string */
- public $fetch = 'LAZY';
- /** @var boolean */
- public $orphanRemoval = false;
- /** @var string */
- public $indexBy;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("PROPERTY")
- */
-final class ManyToOne implements Annotation
-{
- /** @var string */
- public $targetEntity;
- /** @var array<string> */
- public $cascade;
- /** @var string */
- public $fetch = 'LAZY';
- /** @var string */
- public $inversedBy;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("CLASS")
- */
-final class MappedSuperclass implements Annotation
-{
- /** @var string */
- public $repositoryClass;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.phpdoctrine.org>.
- */
-
-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
- ));
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- * @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();
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- * @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;
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("CLASS")
- */
-final class NamedQueries implements Annotation
-{
- /** @var array<\Doctrine\ORM\Mapping\NamedQuery> */
- public $value;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("ANNOTATION")
- */
-final class NamedQuery implements Annotation
-{
- /** @var string */
- public $name;
- /** @var string */
- public $query;
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("PROPERTY")
- */
-final class OneToMany implements Annotation
-{
- /** @var string */
- public $mappedBy;
- /** @var string */
- public $targetEntity;
- /** @var array<string> */
- public $cascade;
- /** @var string */
- public $fetch = 'LAZY';
- /** @var boolean */
- public $orphanRemoval = false;
- /** @var string */
- public $indexBy;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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<string> */
- public $cascade;
- /** @var string */
- public $fetch = 'LAZY';
- /** @var boolean */
- public $orphanRemoval = false;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("PROPERTY")
- */
-final class OrderBy implements Annotation
-{
- /** @var array<string> */
- public $value;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("METHOD")
- */
-final class PostLoad implements Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("METHOD")
- */
-final class PostPersist implements Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("METHOD")
- */
-final class PostRemove implements Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("METHOD")
- */
-final class PostUpdate implements Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("METHOD")
- */
-final class PreFlush implements Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("METHOD")
- */
-final class PrePersist implements Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("METHOD")
- */
-final class PreRemove implements Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("METHOD")
- */
-final class PreUpdate implements Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- */
-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
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- * @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();
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- * @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();
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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();
-}
+++ /dev/null
-<?php
-
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("ANNOTATION")
- */
-final class UniqueConstraint implements Annotation
-{
- /** @var string */
- public $name;
- /** @var array<string> */
- public $columns;
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Mapping;
-
-/**
- * @Annotation
- * @Target("PROPERTY")
- */
-final class Version implements Annotation
-{
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM;
-
-/**
- * Represents a native SQL query.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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.');
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM;
-
-/**
- * Exception thrown when an ORM query unexpectedly returns more than one result.
- *
- * @author robo
- * @since 2.0
- */
-class NonUniqueResultException extends UnexpectedResultException
-{
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM;
-
-use Exception;
-
-/**
- * Base exception class for all ORM exceptions.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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.");
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM;
-
-/**
- * Contains exception messages for all invalid lifecycle state exceptions inside UnitOfWork
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kvesteri@cc.hut.fi>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Giorgio Sironi <piccoloprincipeazzurro@gmail.com>
- * @author Stefano Rodriguez <stefano.rodriguez@fubles.com>
- * @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));
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Persisters;
-
-use Doctrine\ORM\EntityManager,
- Doctrine\ORM\PersistentCollection;
-
-/**
- * Base class for all collection persisters.
- *
- * @since 2.0
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Giorgio Sironi <piccoloprincipeazzurro@gmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Alexander <iam.asm89@gmail.com>
- * @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 <tt>BasicEntityPersister</tt> 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
- * <columnName> => <value> pairs, grouped by table name.
- *
- * Example:
- * <code>
- * array(
- * 'foo_table' => array('column1' => 'value1', 'column2' => 'value2', ...),
- * 'bar_table' => array('columnX' => 'valueX', 'columnY' => 'valueY', ...),
- * ...
- * )
- * </code>
- *
- * @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"
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-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
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <tt>Class Table Inheritance</tt> strategy.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Alexander <iam.asm89@gmail.com>
- * @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);
- }
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Persisters;
-
-use Doctrine\ORM\Mapping\ClassMetadata,
- Doctrine\ORM\PersistentCollection,
- Doctrine\ORM\UnitOfWork;
-
-/**
- * Persister for many-to-many collections.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Alexander <iam.asm89@gmail.com>
- * @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 . ")" : "";
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Persisters;
-
-use Doctrine\ORM\PersistentCollection,
- Doctrine\ORM\UnitOfWork;
-
-/**
- * Persister for one-to-many collections.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Alexander <iam.asm89@gmail.com>
- * @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));
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Alexander <iam.asm89@gmail.com>
- * @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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @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 '?';
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-
-namespace Doctrine\ORM\Persisters;
-
-class UnionSubclassPersister extends BasicEntityPersister
-{
-
-}
\ No newline at end of file
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class PessimisticLockException extends ORMException
-{
- public static function lockFailed()
- {
- return new self("The pessimistic lock failed.");
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Proxy;
-
-/**
- * Special Autoloader for Proxy classes because them not being PSR-0 compatible.
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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;
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Proxy;
-
-use Doctrine\Common\Persistence\Proxy as BaseProxy;
-
-/**
- * Interface for proxy classes.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @since 2.0
- */
-interface Proxy extends BaseProxy {}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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
- ));
- }
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @author Giorgio Sironi <piccoloprincipeazzurro@gmail.com>
- * @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 <tt>ProxyFactory</tt> class that is
- * connected to the given <tt>EntityManager</tt>.
- *
- * @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(
- '<namespace>',
- '<proxyClassName>', '<className>',
- '<methods>', '<sleepImpl>', '<cloneImpl>'
- );
-
- $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 =
-'<?php
-
-namespace <namespace>;
-
-/**
- * THIS CLASS WAS GENERATED BY THE DOCTRINE ORM. DO NOT EDIT THIS FILE.
- */
-class <proxyClassName> extends \<className> 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__;
- }
-
- <methods>
-
- public function __sleep()
- {
- <sleepImpl>
- }
-
- 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);
- }
- <cloneImpl>
- }
-}';
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * Description of AggregateExpression
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * ArithmeticExpression ::= SimpleArithmeticExpression | "(" Subselect ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * ArithmeticFactor ::= [("+" | "-")] ArithmeticPrimary
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * ArithmeticTerm ::= ArithmeticFactor {("*" | "/") ArithmeticFactor}*
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class ArithmeticTerm extends Node
-{
- public $arithmeticFactors;
-
- public function __construct(array $arithmeticFactors)
- {
- $this->arithmeticFactors = $arithmeticFactors;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkArithmeticTerm($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * Description of BetweenExpression
- *
-
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * CoalesceExpression ::= "COALESCE" "(" ScalarExpression {"," ScalarExpression}* ")"
- *
- * @since 2.1
- *
- * @link www.doctrine-project.org
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class CoalesceExpression extends Node
-{
- public $scalarExpressions = array();
-
-
- public function __construct(array $scalarExpressions)
- {
- $this->scalarExpressions = $scalarExpressions;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkCoalesceExpression($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * CollectionMemberExpression ::= EntityExpression ["NOT"] "MEMBER" ["OF"] CollectionValuedPathExpression
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * ConditionalExpression ::= ConditionalTerm {"OR" ConditionalTerm}*
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class ConditionalExpression extends Node
-{
- public $conditionalTerms = array();
-
- public function __construct(array $conditionalTerms)
- {
- $this->conditionalTerms = $conditionalTerms;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkConditionalExpression($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * ConditionalFactor ::= ["NOT"] ConditionalPrimary
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class ConditionalFactor extends Node
-{
- public $not = false;
- public $conditionalPrimary;
-
- public function __construct($conditionalPrimary)
- {
- $this->conditionalPrimary = $conditionalPrimary;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkConditionalFactor($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * ConditionalPrimary ::= SimpleConditionalExpression | "(" ConditionalExpression ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * ConditionalTerm ::= ConditionalFactor {"AND" ConditionalFactor}*
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class ConditionalTerm extends Node
-{
- public $conditionalFactors = array();
-
- public function __construct(array $conditionalFactors)
- {
- $this->conditionalFactors = $conditionalFactors;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkConditionalTerm($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * DeleteClause ::= "DELETE" ["FROM"] AbstractSchemaName [["AS"] AliasIdentificationVariable]
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class DeleteClause extends Node
-{
- public $abstractSchemaName;
- public $aliasIdentificationVariable;
-
- public function __construct($abstractSchemaName)
- {
- $this->abstractSchemaName = $abstractSchemaName;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkDeleteClause($this);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * DeleteStatement = DeleteClause [WhereClause]
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class DeleteStatement extends Node
-{
- public $deleteClause;
- public $whereClause;
-
- public function __construct($deleteClause)
- {
- $this->deleteClause = $deleteClause;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkDeleteStatement($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * EmptyCollectionComparisonExpression ::= CollectionValuedPathExpression "IS" ["NOT"] "EMPTY"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class EmptyCollectionComparisonExpression extends Node
-{
- public $expression;
- public $not;
-
- public function __construct($expression)
- {
- $this->expression = $expression;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkEmptyCollectionComparisonExpression($this);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * ExistsExpression ::= ["NOT"] "EXISTS" "(" Subselect ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class ExistsExpression extends Node
-{
- public $not;
- public $subselect;
-
- public function __construct($subselect)
- {
- $this->subselect = $subselect;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkExistsExpression($this);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * FromClause ::= "FROM" IdentificationVariableDeclaration {"," IdentificationVariableDeclaration}
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class FromClause extends Node
-{
- public $identificationVariableDeclarations = array();
-
- public function __construct(array $identificationVariableDeclarations)
- {
- $this->identificationVariableDeclarations = $identificationVariableDeclarations;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkFromClause($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST\Functions;
-
-use Doctrine\ORM\Query\Lexer;
-
-/**
- * "ABS" "(" SimpleArithmeticExpression ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <fabio.bat.silva@gmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST\Functions;
-
-use Doctrine\ORM\Query\Lexer;
-
-/**
- * "CURRENT_DATE"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST\Functions;
-
-use Doctrine\ORM\Query\Lexer;
-
-/**
- * "CURRENT_TIME"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST\Functions;
-
-use Doctrine\ORM\Query\Lexer;
-
-/**
- * "CURRENT_TIMESTAMP"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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.'
- );
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST\Functions;
-
-use Doctrine\ORM\Query\Lexer;
-
-/**
- * "IDENTITY" "(" SingleValuedAssociationPathExpression ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.2
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST\Functions;
-
-use Doctrine\ORM\Query\Lexer;
-
-/**
- * "LENGTH" "(" StringPrimary ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST\Functions;
-
-use Doctrine\ORM\Query\Lexer;
-
-/**
- * "LOWER" "(" StringPrimary ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST\Functions;
-
-use Doctrine\ORM\Query\Lexer;
-
-/**
- * "SIZE" "(" CollectionValuedPathExpression ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST\Functions;
-
-use Doctrine\ORM\Query\Lexer;
-
-/**
- * "SQRT" "(" SimpleArithmeticExpression ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST\Functions;
-
-use Doctrine\ORM\Query\Lexer;
-
-/**
- * "UPPER" "(" StringPrimary ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * GeneralCaseExpression ::= "CASE" WhenClause {WhenClause}* "ELSE" ScalarExpression "END"
- *
- * @since 2.2
- *
- * @link www.doctrine-project.org
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * Description of GroupByClause
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class GroupByClause extends Node
-{
- public $groupByItems = array();
-
- public function __construct(array $groupByItems)
- {
- $this->groupByItems = $groupByItems;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkGroupByClause($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * Description of HavingClause
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class HavingClause extends Node
-{
- public $conditionalExpression;
-
- public function __construct($conditionalExpression)
- {
- $this->conditionalExpression = $conditionalExpression;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkHavingClause($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * IdentificationVariableDeclaration ::= RangeVariableDeclaration [IndexBy] {JoinVariableDeclaration}*
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * InExpression ::= StateFieldPathExpression ["NOT"] "IN" "(" (Literal {"," Literal}* | Subselect) ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * IndexBy ::= "INDEX" "BY" SimpleStateFieldPathExpression
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class IndexBy extends Node
-{
- public $simpleStateFieldPathExpression = null;
-
- public function __construct($simpleStateFieldPathExpression)
- {
- $this->simpleStateFieldPathExpression = $simpleStateFieldPathExpression;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkIndexBy($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * Description of InputParameter
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * JoinAssociationDeclaration ::= JoinAssociationPathExpression ["AS"] AliasIdentificationVariable
- *
- * @link www.doctrine-project.org
- * @since 2.3
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * JoinAssociationPathExpression ::= IdentificationVariable "." (SingleValuedAssociationField | CollectionValuedAssociationField)
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <iam.asm89@gmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * LikeExpression ::= StringExpression ["NOT"] "LIKE" string ["ESCAPE" char]
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * Abstract class of an AST node
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * NullComparisonExpression ::= (SingleValuedPathExpression | InputParameter) "IS" ["NOT"] "NULL"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class NullComparisonExpression extends Node
-{
- public $not;
- public $expression;
-
- public function __construct($expression)
- {
- $this->expression = $expression;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkNullComparisonExpression($this);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * NullIfExpression ::= "NULLIF" "(" ScalarExpression "," ScalarExpression ")"
- *
- * @since 2.1
- *
- * @link www.doctrine-project.org
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * OrderByClause ::= "ORDER" "BY" OrderByItem {"," OrderByItem}*
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class OrderByClause extends Node
-{
- public $orderByItems = array();
-
- public function __construct(array $orderByItems)
- {
- $this->orderByItems = $orderByItems;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkOrderByClause($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * OrderByItem ::= (ResultVariable | StateFieldPathExpression) ["ASC" | "DESC"]
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * QuantifiedExpression ::= ("ALL" | "ANY" | "SOME") "(" Subselect ")"
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * RangeVariableDeclaration ::= AbstractSchemaName ["AS"] AliasIdentificationVariable
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * SelectClause = "SELECT" ["DISTINCT"] SelectExpression {"," SelectExpression}
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * SelectExpression ::= IdentificationVariable ["." "*"] | StateFieldPathExpression |
- * (AggregateExpression | "(" Subselect ")") [["AS"] ["HIDDEN"] FieldAliasIdentificationVariable]
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * SelectStatement = SelectClause FromClause [WhereClause] [GroupByClause] [HavingClause] [OrderByClause]
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * SimpleArithmeticExpression ::= ArithmeticTerm {("+" | "-") ArithmeticTerm}*
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class SimpleArithmeticExpression extends Node
-{
- public $arithmeticTerms = array();
-
- public function __construct(array $arithmeticTerms)
- {
- $this->arithmeticTerms = $arithmeticTerms;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkSimpleArithmeticExpression($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * SimpleCaseExpression ::= "CASE" CaseOperand SimpleWhenClause {SimpleWhenClause}* "ELSE" ScalarExpression "END"
- *
- * @since 2.2
- *
- * @link www.doctrine-project.org
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * SimpleSelectClause ::= "SELECT" ["DISTINCT"] SimpleSelectExpression
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * SimpleSelectExpression ::= StateFieldPathExpression | IdentificationVariable
- * | (AggregateExpression [["AS"] FieldAliasIdentificationVariable])
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class SimpleSelectExpression extends Node
-{
- public $expression;
- public $fieldIdentificationVariable;
-
- public function __construct($expression)
- {
- $this->expression = $expression;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkSimpleSelectExpression($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * SimpleWhenClause ::= "WHEN" ScalarExpression "THEN" ScalarExpression
- *
- * @since 2.2
- *
- * @link www.doctrine-project.org
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * Subselect ::= SimpleSelectClause SubselectFromClause [WhereClause] [GroupByClause] [HavingClause] [OrderByClause]
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * SubselectFromClause ::= "FROM" SubselectIdentificationVariableDeclaration {"," SubselectIdentificationVariableDeclaration}*
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class SubselectFromClause extends Node
-{
- public $identificationVariableDeclarations = array();
-
- public function __construct(array $identificationVariableDeclarations)
- {
- $this->identificationVariableDeclarations = $identificationVariableDeclarations;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkSubselectFromClause($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * UpdateClause ::= "UPDATE" AbstractSchemaName [["AS"] AliasIdentificationVariable] "SET" UpdateItem {"," UpdateItem}*
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * UpdateStatement = UpdateClause [WhereClause]
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class UpdateStatement extends Node
-{
- public $updateClause;
- public $whereClause;
-
- public function __construct($updateClause)
- {
- $this->updateClause = $updateClause;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkUpdateStatement($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * WhenClause ::= "WHEN" ConditionalExpression "THEN" ScalarExpression
- *
- * @since 2.2
- *
- * @link www.doctrine-project.org
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\AST;
-
-/**
- * WhereClause ::= "WHERE" ConditionalExpression
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class WhereClause extends Node
-{
- public $conditionalExpression;
-
- public function __construct($conditionalExpression)
- {
- $this->conditionalExpression = $conditionalExpression;
- }
-
- public function dispatch($sqlWalker)
- {
- return $sqlWalker->walkWhereClause($this);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Exec;
-
-use Doctrine\DBAL\Connection;
-use Doctrine\DBAL\Cache\QueryCacheProfile;
-
-/**
- * Base class for SQL statement executors.
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @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 <tt>MultiTableDeleteExecutor</tt>.
- *
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @since 2.0
- */
-class MultiTableUpdateExecutor extends AbstractSqlExecutor
-{
- private $_createTempTableSql;
- private $_dropTempTableSql;
- private $_insertSql;
- private $_sqlParameters = array();
- private $_numParametersInUpdateClause = 0;
-
- /**
- * Initializes a new <tt>MultiTableUpdateExecutor</tt>.
- *
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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 <left expr> = <right expr>. 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 <left expr> <> <right expr>. 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 <left expr> < <right expr>. 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 <left expr> <= <right expr>. 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 <left expr> > <right expr>. 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 <left expr> >= <right expr>. 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 <left expr> * <right expr>. 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 <left expr> - <right expr>. 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 <left expr> + <right expr>. 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 <left expr> / <right expr>. 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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for building DQL and parts
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Abstract base Expr class for building DQL parts
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for DQL comparison expressions
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for building DQL and parts
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for DQL from
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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 : '');
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for generating DQL functions
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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) . ')';
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for building DQL Group By parts
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class GroupBy extends Base
-{
- /**
- * @var string
- */
- protected $preSeparator = '';
-
- /**
- * @var string
- */
- protected $postSeparator = '';
-
- /**
- * @return array
- */
- public function getParts()
- {
- return $this->parts;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for DQL from
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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 : '');
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for generating DQL functions
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class Literal extends Base
-{
- /**
- * @var string
- */
- protected $preSeparator = '';
-
- /**
- * @var string
- */
- protected $postSeparator = '';
-
- /**
- * @return array
- */
- public function getParts()
- {
- return $this->parts;
- }
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for DQL math statements
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for building DQL Order By parts
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for building DQL OR clauses
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query\Expr;
-
-/**
- * Expression class for building DQL select statements
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <iam.asm89@gmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query;
-
-use Doctrine\ORM\Configuration,
- Doctrine\ORM\EntityManager;
-
-/**
- * Collection class for all the query filters.
- *
- * @author Alexander <iam.asm89@gmail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query;
-
-/**
- * Scans a DQL query for tokens.
- *
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Janne Vanhala <jpvanhal@cc.hut.fi>
- * @author Roman Borschel <roman@code-factory.org>
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query;
-
-/**
- * Define a Query Parameter
- *
- * @link www.doctrine-project.org
- * @since 2.3
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHARNTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Janne Vanhala <jpvanhal@cc.hut.fi>
- */
-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 <tt>IdentificationVariable</tt> 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 <tt>PartialObjectExpression</tt> 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 <tt>ResultVariable</tt> 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 <tt>PathExpression</tt> 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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query;
-
-/**
- * Encapsulates the resulting components from a DQL query parsing process that
- * can be serialized.
- *
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Janne Vanhala <jpvanhal@cc.hut.fi>
- * @author Roman Borschel <roman@code-factory.org>
- * @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 <tt>ParserResult</tt> class.
- * The new instance is initialized with an empty <tt>ResultSetMapping</tt>.
- */
- 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];
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query;
-
-/**
- * A parse tree printer for Doctrine Query Language parser.
- *
- * @author Janne Vanhala <jpvanhal@cc.hut.fi>
- * @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";
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query;
-
-use Doctrine\ORM\Query\AST\PathExpression;
-
-/**
- * Description of QueryException
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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 :<name> or ?<num> 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.");
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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.
- *
- * <b>Users should use the public methods.</b>
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <mcridgway@gmail.com>
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Alexander <iam.asm89@gmail.com>
- * @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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Query;
-
-/**
- * Interface for walkers of DQL ASTs (abstract syntax trees).
- *
- * @author Roman Borschel <roman@code-factory.org>
- * @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);
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @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) {}
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <roman@code-factory.org>
- * @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)
- {}
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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 <tt>QueryBuilder</tt> that uses the given <tt>EntityManager</tt>.
- *
- * @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:
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u')
- * ->where($qb->expr()->eq('u.id', 1));
- * </code>
- *
- * 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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u')
- * echo $qb->getDql(); // SELECT u FROM User u
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u');
- * $q = $qb->getQuery();
- * $results = $q->execute();
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u');
- *
- * echo $qb->getRootAlias(); // u
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u');
- *
- * $qb->getRootAliases(); // array('u')
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u');
- *
- * $qb->getRootEntities(); // array('User')
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u')
- * ->where('u.id = :user_id')
- * ->setParameter('user_id', 1);
- * </code>
- *
- * @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.
- *
- * <code>
- * $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)
- )));
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u', 'p')
- * ->from('User', 'u')
- * ->leftJoin('u.Phonenumbers', 'p');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->distinct()
- * ->from('User', 'u');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->addSelect('p')
- * ->from('User', 'u')
- * ->leftJoin('u.Phonenumbers', 'p');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->delete('User', 'u')
- * ->where('u.id = :user_id');
- * ->setParameter('user_id', 1);
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->update('User', 'u')
- * ->set('u.password', md5('password'))
- * ->where('u.id = ?');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u')
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u')
- * ->join('u.Phonenumbers', 'p', Expr\Join::WITH, 'p.is_primary = 1');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u')
- * ->leftJoin('u.Phonenumbers', 'p', Expr\Join::WITH, 'p.is_primary = 1');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->update('User', 'u')
- * ->set('u.password', md5('password'))
- * ->where('u.id = ?');
- * </code>
- *
- * @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.
- *
- * <code>
- * $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);
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u')
- * ->where('u.username LIKE ?')
- * ->andWhere('u.is_active = 1');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u')
- * ->where('u.id = 1')
- * ->orWhere('u.id = 2');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u')
- * ->groupBy('u.id');
- * </code>
- *
- * @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.
- *
- * <code>
- * $qb = $em->createQueryBuilder()
- * ->select('u')
- * ->from('User', 'u')
- * ->groupBy('u.lastLogin');
- * ->addGroupBy('u.createdAt')
- * </code>
- *
- * @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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-The <info>%command.name%</info> 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:
-
-<info>%command.name%</info>
-
-Alternatively, if you want to flush the cache provider using this command:
-
-<info>%command.name% --flush</info>
-
-Finally, be aware that if <info>--flush</info> 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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-The <info>%command.name%</info> 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:
-
-<info>%command.name%</info>
-
-Alternatively, if you want to flush the cache provider using this command:
-
-<info>%command.name% --flush</info>
-
-Finally, be aware that if <info>--flush</info> 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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-The <info>%command.name%</info> 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:
-
-<info>%command.name%</info>
-
-Alternatively, if you want to flush the cache provider using this command:
-
-<info>%command.name% --flush</info>
-
-Finally, be aware that if <info>--flush</info> 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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-Converts Doctrine 1.X schema into a Doctrine 2.X schema.
-EOT
- );
- }
-
- /**
- * @see Console\Command\Command
- */
- protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
- {
- $em = $this->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 '<info>%s</info>' does not exist.", $dirName)
- );
- } else if ( ! is_readable($dirName)) {
- throw new \InvalidArgumentException(
- sprintf("Doctrine 1.X schema directory '<info>%s</info>' does not have read permissions.", $dirName)
- );
- }
- }
-
- if ( ! file_exists($destPath)) {
- throw new \InvalidArgumentException(
- sprintf("Doctrine 2.X mapping destination directory '<info>%s</info>' does not exist.", $destPath)
- );
- } else if ( ! is_writable($destPath)) {
- throw new \InvalidArgumentException(
- sprintf("Doctrine 2.X mapping destination directory '<info>%s</info>' 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 "<info>%s</info>"', $class->name) . PHP_EOL);
- }
-
- $exporter->setMetadata($metadata);
- $exporter->export();
-
- $output->write(PHP_EOL . sprintf(
- 'Converting Doctrine 1.X schema to "<info>%s</info>" mapping type in "<info>%s</info>"', $toType, $destPath
- ));
- } else {
- $output->write('No Metadata Classes to process.' . PHP_EOL);
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-Convert mapping information between supported formats.
-
-This is an execute <info>one-time</info> command. It should not be necessary for
-you to call this method multiple times, escpecially when using the <comment>--from-database</comment>
-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.
-
-<comment>Hint:</comment> 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 '<info>%s</info>' does not exist.", $input->getArgument('dest-path'))
- );
- } else if ( ! is_writable($destPath)) {
- throw new \InvalidArgumentException(
- sprintf("Mapping destination directory '<info>%s</info>' 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 "<info>%s</info>"', $class->name) . PHP_EOL);
- }
-
- $exporter->setMetadata($metadata);
- $exporter->export();
-
- $output->write(PHP_EOL . sprintf(
- 'Exporting "<info>%s</info>" mapping information to "<info>%s</info>"' . 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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-Verify that Doctrine is properly configured for a production environment.
-EOT
- );
- }
-
- /**
- * @see Console\Command\Command
- */
- protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
- {
- $em = $this->getHelper('em')->getEntityManager();
-
- $error = false;
- try {
- $em->getConfiguration()->ensureProductionSettings();
-
- if ($input->getOption('complete') !== null) {
- $em->getConnection()->connect();
- }
- } catch (\Exception $e) {
- $error = true;
- $output->writeln('<error>' . $e->getMessage() . '</error>');
- }
-
- if ($error === false) {
- $output->write('<info>Environment is correctly configured for production.</info>' . PHP_EOL);
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-Generate entity classes and method stubs from your mapping information.
-
-If you use the <comment>--update-entities</comment> or <comment>--regenerate-entities</comment> 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.
-
-<error>Important:</error> 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 '<info>%s</info>' does not exist.", $input->getArgument('dest-path'))
- );
- } else if ( ! is_writable($destPath)) {
- throw new \InvalidArgumentException(
- sprintf("Entities destination directory '<info>%s</info>' 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 "<info>%s</info>"', $metadata->name) . PHP_EOL
- );
- }
-
- // Generating Entities
- $entityGenerator->generate($metadatas, $destPath);
-
- // Outputting information message
- $output->write(PHP_EOL . sprintf('Entity classes generated to "<info>%s</INFO>"', $destPath) . PHP_EOL);
- } else {
- $output->write('No Metadata Classes to process.' . PHP_EOL);
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-Generates proxy classes for entity classes.
-EOT
- );
- }
-
- /**
- * @see Console\Command\Command
- */
- protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
- {
- $em = $this->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 '<info>%s</info>' does not exist.", $em->getConfiguration()->getProxyDir())
- );
- } else if ( ! is_writable($destPath)) {
- throw new \InvalidArgumentException(
- sprintf("Proxies destination directory '<info>%s</info>' does not have write permissions.", $destPath)
- );
- }
-
- if ( count($metadatas)) {
- foreach ($metadatas as $metadata) {
- $output->write(
- sprintf('Processing entity "<info>%s</info>"', $metadata->name) . PHP_EOL
- );
- }
-
- // Generating Proxies
- $em->getProxyFactory()->generateProxyClasses($metadatas, $destPath);
-
- // Outputting information message
- $output->write(PHP_EOL . sprintf('Proxy classes generated to "<info>%s</INFO>"', $destPath) . PHP_EOL);
- } else {
- $output->write('No Metadata Classes to process.' . PHP_EOL);
- }
-
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-Generate repository classes from your mapping information.
-EOT
- );
- }
-
- /**
- * @see Console\Command\Command
- */
- protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
- {
- $em = $this->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 '<info>%s</info>' does not exist.", $input->getArgument('dest-path'))
- );
- } else if ( ! is_writable($destPath)) {
- throw new \InvalidArgumentException(
- sprintf("Entities destination directory '<info>%s</info>' 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 "<info>%s</info>"', $metadata->customRepositoryClassName) . PHP_EOL
- );
-
- $generator->writeEntityRepositoryClass($metadata->customRepositoryClassName, $destPath);
-
- $numRepositories++;
- }
- }
-
- if ($numRepositories) {
- // Outputting information message
- $output->write(PHP_EOL . sprintf('Repository classes generated to "<info>%s</INFO>"', $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);
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-class InfoCommand extends Command
-{
- protected function configure()
- {
- $this
- ->setName('orm:info')
- ->setDescription('Show basic information about all mapped entities')
- ->setHelp(<<<EOT
-The <info>%command.name%</info> 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 <info>%d</info> mapped entities:", count($entityClassNames)));
-
- foreach ($entityClassNames as $entityClassName) {
- try {
- $entityManager->getClassMetadata($entityClassName);
- $output->writeln(sprintf("<info>[OK]</info> %s", $entityClassName));
- } catch (MappingException $e) {
- $output->writeln("<error>[FAIL]</error> ".$entityClassName);
- $output->writeln(sprintf("<comment>%s</comment>", $e->getMessage()));
- $output->writeln('');
- }
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-Executes arbitrary DQL directly from the command line.
-EOT
- );
- }
-
- /**
- * @see Console\Command\Command
- */
- protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
- {
- $em = $this->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'));
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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);
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-Processes the schema and either create it directly on EntityManager Storage Connection or generate the SQL output.
-EOT
- );
- }
-
- protected function executeSchemaCommand(InputInterface $input, OutputInterface $output, SchemaTool $schemaTool, array $metadatas)
- {
- if ($input->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);
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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(<<<EOT
-Processes the schema and either drop the database schema of EntityManager Storage Connection or generate the SQL output.
-Beware that the complete database is dropped by this command, even tables that are not relevant to your metadata model.
-EOT
- );
- }
-
- protected function executeSchemaCommand(InputInterface $input, OutputInterface $output, SchemaTool $schemaTool, array $metadatas)
- {
- $isFullDatabaseDrop = ($input->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);
- }
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Ryan Weaver <ryan@thatsquality.com>
- */
-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(<<<EOT
-The <info>%command.name%</info> 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:
-
-<info>%command.name% --dump-sql</info>
-
-Alternatively, you can execute the generated queries:
-
-<info>%command.name% --force</info>
-
-Finally, be aware that if the <info>--complete</info> 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! "<info>%s</info>" queries were executed', count($sqls)));
- } else {
- $output->writeln('<comment>ATTENTION</comment>: 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 <info>"%s"</info> queries to update the database.', count($sqls)));
- $output->writeln('Please run the operation by passing one of the following options:');
-
- $output->writeln(sprintf(' <info>%s --force</info> to execute the command', $this->getName()));
- $output->writeln(sprintf(' <info>%s --dump-sql</info> to dump the SQL statements to the screen', $this->getName()));
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class ValidateSchemaCommand extends Console\Command\Command
-{
- /**
- * @see Console\Command\Command
- */
- protected function configure()
- {
- $this
- ->setName('orm:validate-schema')
- ->setDescription('Validate the mapping files.')
- ->setHelp(<<<EOT
-'Validate that the mapping files are correct and in sync with the database.'
-EOT
- );
- }
-
- /**
- * @see Console\Command\Command
- */
- protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
- {
- $em = $this->getHelper('em')->getEntityManager();
-
- $validator = new \Doctrine\ORM\Tools\SchemaValidator($em);
- $errors = $validator->validateMapping();
-
- $exit = 0;
- if ($errors) {
- foreach ($errors as $className => $errorMessages) {
- $output->write("<error>[Mapping] FAIL - The entity-class '" . $className . "' mapping is invalid:</error>\n");
- foreach ($errorMessages as $errorMessage) {
- $output->write('* ' . $errorMessage . "\n");
- }
- $output->write("\n");
- }
- $exit += 1;
- } else {
- $output->write('<info>[Mapping] OK - The mapping files are correct.</info>' . "\n");
- }
-
- if (!$validator->schemaInSyncWithMetadata()) {
- $output->write('<error>[Database] FAIL - The database schema is not in sync with the current mapping file.</error>' . "\n");
- $exit += 2;
- } else {
- $output->write('<info>[Database] OK - The database schema is in sync with the mapping files.</info>' . "\n");
- }
-
- return $exit;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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()
- ));
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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';
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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());
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class DisconnectedClassMetadataFactory extends ClassMetadataFactory
-{
- public function getReflectionService()
- {
- return new \Doctrine\Common\Persistence\Mapping\StaticReflectionService;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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 =
-'<?php
-
-<namespace>
-
-use Doctrine\ORM\Mapping as ORM;
-
-<entityAnnotation>
-<entityClassName>
-{
-<entityBody>
-}
-';
-
- /**
- * @var string
- */
- private static $getMethodTemplate =
-'/**
- * <description>
- *
- * @return <variableType>
- */
-public function <methodName>()
-{
-<spaces>return $this-><fieldName>;
-}';
-
- /**
- * @var string
- */
- private static $setMethodTemplate =
-'/**
- * <description>
- *
- * @param <variableType>$<variableName>
- * @return <entity>
- */
-public function <methodName>(<methodTypeHint>$<variableName><variableDefault>)
-{
-<spaces>$this-><fieldName> = $<variableName>;
-
-<spaces>return $this;
-}';
-
- /**
- * @var string
- */
- private static $addMethodTemplate =
-'/**
- * <description>
- *
- * @param <variableType>$<variableName>
- * @return <entity>
- */
-public function <methodName>(<methodTypeHint>$<variableName>)
-{
-<spaces>$this-><fieldName>[] = $<variableName>;
-
-<spaces>return $this;
-}';
-
- /**
- * @var string
- */
- private static $removeMethodTemplate =
-'/**
- * <description>
- *
- * @param <variableType>$<variableName>
- */
-public function <methodName>(<methodTypeHint>$<variableName>)
-{
-<spaces>$this-><fieldName>->removeElement($<variableName>);
-}';
-
- /**
- * @var string
- */
- private static $lifecycleCallbackMethodTemplate =
-'/**
- * @<name>
- */
-public function <methodName>()
-{
-<spaces>// Add your code here
-}';
-
- /**
- * @var string
- */
- private static $constructorMethodTemplate =
-'/**
- * Constructor
- */
-public function __construct()
-{
-<spaces><collections>
-}
-';
-
- 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(
- '<namespace>',
- '<entityAnnotation>',
- '<entityClassName>',
- '<entityBody>'
- );
-
- $replacements = array(
- $this->generateEntityNamespace($metadata),
- $this->generateEntityDocBlock($metadata),
- $this->generateEntityClassName($metadata),
- $this->generateEntityBody($metadata)
- );
-
- $code = str_replace($placeHolders, $replacements, self::$classTemplate);
- return str_replace('<spaces>', $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('<spaces>', $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("<collections>", 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(
- '<description>' => ucfirst($type) . ' ' . $fieldName,
- '<methodTypeHint>' => $methodTypeHint,
- '<variableType>' => $variableType,
- '<variableName>' => Inflector::camelize($fieldName),
- '<methodName>' => $methodName,
- '<fieldName>' => $fieldName,
- '<variableDefault>' => ($defaultValue !== null ) ? (' = '.$defaultValue) : '',
- '<entity>' => $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(
- '<name>' => $this->annotationsPrefix . ucfirst($name),
- '<methodName>' => $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];
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Tools;
-
-/**
- * Class to generate entity repository classes
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class EntityRepositoryGenerator
-{
- protected static $_template =
-'<?php
-
-namespace <namespace>;
-
-use Doctrine\ORM\EntityRepository;
-
-/**
- * <className>
- *
- * This class was generated by the Doctrine ORM. Add your own custom
- * repository methods below.
- */
-class <className> extends EntityRepository
-{
-}
-';
-
- public function generateEntityRepositoryClass($fullClassName)
- {
- $namespace = substr($fullClassName, 0, strrpos($fullClassName, '\\'));
- $className = substr($fullClassName, strrpos($fullClassName, '\\') + 1, strlen($fullClassName));
-
- $variables = array(
- '<namespace>' => $namespace,
- '<className>' => $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);
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <jonwage@gmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <jonwage@gmail.com>
- */
-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;
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <jonwage@gmail.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <jonwage@gmail.com>
- */
-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[] = '<?php';
- $lines[] = null;
- $lines[] = 'use Doctrine\ORM\Mapping\ClassMetadataInfo;';
- $lines[] = null;
-
- if ($metadata->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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <jonwage@gmail.com>
- */
-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 version=\"1.0\" encoding=\"utf-8\"?><doctrine-mapping ".
- "xmlns=\"http://doctrine-project.org/schemas/orm/doctrine-mapping\" " .
- "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ".
- "xsi:schemaLocation=\"http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd\" />");
-
- /*$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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <jonwage@gmail.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-
-namespace Doctrine\ORM\Tools\Export;
-
-use Doctrine\ORM\ORMException;
-
-class ExportException extends ORMException
-{
- public static function invalidExporterDriverType($type)
- {
- return new self("The specified export driver '$type' does not exist");
- }
-
- public static function invalidMappingDriverType($type)
- {
- return new self("The mapping driver '$type' does not exist");
- }
-
- public static function attemptOverwriteExistingFile($file)
- {
- return new self("Attempting to overwrite an existing file '".$file."'.");
- }
-}
\ No newline at end of file
+++ /dev/null
-<?php
-/**
- * Doctrine ORM
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to kontakt@beberlei.de so I can send you a copy immediately.
- */
-
-namespace Doctrine\ORM\Tools\Pagination;
-
-use Doctrine\ORM\Query\SqlWalker,
- Doctrine\ORM\Query\AST\SelectStatement;
-
-/**
- * Wrap the query in order to accurately count the root objects
- *
- * Given a DQL like `SELECT u FROM User u` it will generate an SQL query like:
- * SELECT COUNT(*) (SELECT DISTINCT <id> FROM (<original SQL>))
- *
- * 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 <s.marechal@jejik.com>
- */
-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
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * Doctrine ORM
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to kontakt@beberlei.de so I can send you a copy immediately.
- */
-
-namespace Doctrine\ORM\Tools\Pagination;
-
-use 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 COUNT statement
- *
- * @category DoctrineExtensions
- * @package DoctrineExtensions\Paginate
- * @author David Abdemoulaie <dave@hobodave.com>
- * @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;
- }
-}
-
+++ /dev/null
-<?php
-/**
- * Doctrine ORM
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to kontakt@beberlei.de so I can send you a copy immediately.
- */
-
-namespace Doctrine\ORM\Tools\Pagination;
-
-use Doctrine\ORM\Query\SqlWalker;
-use Doctrine\ORM\Query\AST\SelectStatement;
-use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
-
-/**
- * Wrap the query in order to select root entity IDs for pagination
- *
- * Given a DQL like `SELECT u FROM User u` it will generate an SQL query like:
- * SELECT DISTINCT <id> FROM (<original SQL>) 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 <s.marechal@jejik.com>
- */
-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)
- );
- }
- }
-}
+++ /dev/null
-<?php
-
-/**
- * Doctrine ORM
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE. This license can also be viewed
- * at http://hobodave.com/license.txt
- *
- * @category DoctrineExtensions
- * @package DoctrineExtensions\Paginate
- * @author David Abdemoulaie <dave@hobodave.com>
- * @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 <dave@hobodave.com>
- * @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;
- }
-
-}
-
-
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <pablodip@gmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @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;
- }
-}
-
+++ /dev/null
-<?php
-/**
- * Doctrine ORM
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE. This license can also be viewed
- * at http://hobodave.com/license.txt
- *
- * @category DoctrineExtensions
- * @package DoctrineExtensions\Paginate
- * @author David Abdemoulaie <dave@hobodave.com>
- * @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 <dave@hobodave.com>
- * @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
- ))
- ))
- );
- }
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @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;
- }
- }
-}
-
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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
- * <tt>ClassMetadata</tt> class descriptors.
- *
- *
- * @link www.doctrine-project.org
- * @since 2.0
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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);
- }
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
-*/
-
-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 <kontakt@beberlei.de>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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';
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Tools;
-
-use Doctrine\ORM\ORMException;
-
-/**
- * Tools related Exceptions
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-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'!");
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Roman Borschel <roman@code-factory.org>
- */
-class TransactionRequiredException extends ORMException
-{
- static public function transactionRequired()
- {
- return new self('An open transaction is required for this operation.');
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM;
-
-/**
- * Exception for a unexpected query result.
- *
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- * @since 2.3
- */
-class UnexpectedResultException extends ORMException
-{
-
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @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)]);
- }
-}
+++ /dev/null
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-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 <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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(),
- '',
- '<comment>Usage:</comment>',
- sprintf(" [options] command [arguments]\n"),
- '<comment>Options:</comment>',
- );
-
- foreach ($this->getDefinition()->getOptions() as $option) {
- $messages[] = sprintf(' %-29s %s %s',
- '<info>--'.$option->getName().'</info>',
- $option->getShortcut() ? '<info>-'.$option->getShortcut().'</info>' : ' ',
- $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('<info>%s</info> version <comment>%s</comment>', $this->getName(), $this->getVersion());
- }
-
- return '<info>Console Tool</info>';
- }
-
- /**
- * 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("<comment>Available commands for the \"%s\" namespace:</comment>", $namespace);
- } else {
- $messages[] = '<comment>Available commands:</comment>';
- }
-
- // add commands by namespace
- foreach ($this->sortCommands($commands) as $space => $commands) {
- if (!$namespace && '_global' !== $space) {
- $messages[] = '<comment>'.$space.'</comment>';
- }
-
- foreach ($commands as $name => $command) {
- $messages[] = sprintf(" <info>%-${width}s</info> %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('<error>'.$message.'</error>');
- }
- $output->writeln("");
- $output->writeln("");
-
- if (OutputInterface::VERBOSITY_VERBOSE === $output->getVerbosity()) {
- $output->writeln('<comment>Exception trace:</comment>');
-
- // 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 <info>%s:%s</info>', $class, $type, $function, $file, $line));
- }
-
- $output->writeln("");
- $output->writeln("");
- }
- } while ($e = $e->getPrevious());
-
- if (null !== $this->runningCommand) {
- $output->writeln(sprintf('<info>%s</info>', 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);
- }
-}
+++ /dev/null
-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)
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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(
- '<comment>Usage:</comment>',
- ' '.$this->getSynopsis(),
- '',
- );
-
- if ($this->getAliases()) {
- $messages[] = '<comment>Aliases:</comment> <info>'.implode(', ', $this->getAliases()).'</info>';
- }
-
- $messages[] = $this->getNativeDefinition()->asText();
-
- if ($help = $this->getProcessedHelp()) {
- $messages[] = '<comment>Help:</comment>';
- $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));
- }
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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(<<<EOF
-The <info>%command.name%</info> command displays help for a given command:
-
- <info>php %command.full_name% list</info>
-
-You can also output the help as XML by using the <comment>--xml</comment> option:
-
- <info>php %command.full_name% --xml list</info>
-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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-class ListCommand extends Command
-{
- /**
- * {@inheritdoc}
- */
- protected function configure()
- {
- $this
- ->setName('list')
- ->setDefinition($this->createDefinition())
- ->setDescription('Lists commands')
- ->setHelp(<<<EOF
-The <info>%command.name%</info> command lists all commands:
-
- <info>php %command.full_name%</info>
-
-You can also display the commands for a specific namespace:
-
- <info>php %command.full_name% test</info>
-
-You can also output the information as XML by using the <comment>--xml</comment> option:
-
- <info>php %command.full_name% --xml</info>
-
-It's also possible to get raw list of commands (useful for embedding command runner):
-
- <info>php %command.full_name% --raw</info>
-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'),
- ));
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <ever.zet@gmail.com>
- *
- * @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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <ever.zet@gmail.com>
- *
- * @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);
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <ever.zet@gmail.com>
- *
- * @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);
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <ever.zet@gmail.com>
- *
- * @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);
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <contact@jfsimon.fr>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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';
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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> %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</%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';
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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();
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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);
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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[] = '<comment>Arguments:</comment>';
- foreach ($this->getArguments() as $argument) {
- if (null !== $argument->getDefault() && (!is_array($argument->getDefault()) || count($argument->getDefault()))) {
- $default = sprintf('<comment> (default: %s)</comment>', $this->formatDefaultValue($argument->getDefault()));
- } else {
- $default = '';
- }
-
- $description = str_replace("\n", "\n".str_pad('', $max + 2, ' '), $argument->getDescription());
-
- $text[] = sprintf(" <info>%-${max}s</info> %s%s", $argument->getName(), $description, $default);
- }
-
- $text[] = '';
- }
-
- if ($this->getOptions()) {
- $text[] = '<comment>Options:</comment>';
-
- foreach ($this->getOptions() as $option) {
- if ($option->acceptValue() && null !== $option->getDefault() && (!is_array($option->getDefault()) || count($option->getDefault()))) {
- $default = sprintf('<comment> (default: %s)</comment>', $this->formatDefaultValue($option->getDefault()));
- } else {
- $default = '';
- }
-
- $multiple = $option->isArray() ? '<comment> (multiple values allowed)</comment>' : '';
- $description = str_replace("\n", "\n".str_pad('', $max + 2, ' '), $option->getDescription());
-
- $optionMax = $max - strlen($option->getName()) - 2;
- $text[] = sprintf(" <info>%s</info> %-${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));
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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);
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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()
- ;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @api
- */
-class StringInput extends ArgvInput
-{
- const REGEX_STRING = '([^ ]+?)(?: |(?<!\\\\)"|(?<!\\\\)\'|$)';
- const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')';
-
- /**
- * Constructor.
- *
- * @param string $input An array of parameters from the CLI (in the argv format)
- * @param InputDefinition $definition A InputDefinition instance
- *
- * @api
- */
- public function __construct($input, InputDefinition $definition = null)
- {
- parent::__construct(array(), $definition);
-
- $this->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;
- }
-}
+++ /dev/null
-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.
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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'));
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <darek.krk@gmail.com>
- */
-interface ConsoleOutputInterface extends OutputInterface
-{
- /**
- * @return OutputInterface
- */
- public function getErrorOutput();
-
- public function setErrorOutput(OutputInterface $error);
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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)
- {
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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);
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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();
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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
- }
-}
+++ /dev/null
-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 <info>%s</info>', $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)
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- * @author Martin Hasoň <martin.hason@gmail.com>
- */
-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(<<<EOF
-<info>Running with process isolation, you should consider this:</info>
- * 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('<error>The command terminated with an error status (%s)</error>', $ret));
- }
- }
- }
-
- /**
- * Returns the shell header.
- *
- * @return string The header string
- */
- protected function getHeader()
- {
- return <<<EOF
-
-Welcome to the <info>{$this->application->getName()}</info> shell (<comment>{$this->application->getVersion()}</comment>).
-
-At the prompt, type <comment>help</comment> for some help,
-or <comment>list</comment> to get a list of available commands.
-
-To exit the shell, type <comment>^D</comment>.
-
-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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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('<info>foo</info> version <comment>bar</comment>', $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)),
- );
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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');
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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('/<command/', $commandTester->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('/<command/', $commandTester->getDisplay(), '->execute() returns an XML help text if --xml is passed');
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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('/<command id="list" name="list">/', $commandTester->getDisplay(), '->execute() returns a list of available commands in XML if --xml is passed');
-
- $commandTester->execute(array('command' => $command->getName(), '--raw' => true));
- $output = <<<EOF
-help Displays help for a command
-list Lists commands
-
-EOF;
- $this->assertEquals(str_replace("\n", PHP_EOL, $output), $commandTester->getDisplay(), 'boo');
- }
-}
+++ /dev/null
-<?php
-
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class Foo1Command extends Command
-{
- public $input;
- public $output;
-
- protected function configure()
- {
- $this
- ->setName('foo:bar1')
- ->setDescription('The foo:bar1 command')
- ->setAliases(array('afoobar1'))
- ;
- }
-
- protected function execute(InputInterface $input, OutputInterface $output)
- {
- $this->input = $input;
- $this->output = $output;
- }
-}
+++ /dev/null
-<?php
-
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class Foo2Command extends Command
-{
- protected function configure()
- {
- $this
- ->setName('foo1:bar')
- ->setDescription('The foo1:bar command')
- ->setAliases(array('afoobar2'))
- ;
- }
-
- protected function execute(InputInterface $input, OutputInterface $output)
- {
- }
-}
+++ /dev/null
-<?php
-
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class Foo3Command extends Command
-{
- protected function configure()
- {
- $this
- ->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);
- }
- }
-}
+++ /dev/null
-<?php
-
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class FooCommand extends Command
-{
- public $input;
- public $output;
-
- protected function configure()
- {
- $this
- ->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');
- }
-}
+++ /dev/null
-<?php
-
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class TestCommand extends Command
-{
- protected function configure()
- {
- $this
- ->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');
- }
-}
+++ /dev/null
-<info>Console Tool</info>
-
-<comment>Usage:</comment>
- [options] command [arguments]
-
-<comment>Options:</comment>
- <info>--help</info> <info>-h</info> Display this help message.
- <info>--quiet</info> <info>-q</info> Do not output any message.
- <info>--verbose</info> <info>-v</info> Increase verbosity of messages.
- <info>--version</info> <info>-V</info> Display this application version.
- <info>--ansi</info> Force ANSI output.
- <info>--no-ansi</info> Disable ANSI output.
- <info>--no-interaction</info> <info>-n</info> Do not ask any interactive question.
-
-<comment>Available commands:</comment>
- <info>afoobar </info> The foo:bar command
- <info>help </info> Displays help for a command
- <info>list </info> Lists commands
-<comment>foo</comment>
- <info>foo:bar </info> The foo:bar command
\ No newline at end of file
+++ /dev/null
-<info>Console Tool</info>
-
-<comment>Usage:</comment>
- [options] command [arguments]
-
-<comment>Options:</comment>
- <info>--help</info> <info>-h</info> Display this help message.
- <info>--quiet</info> <info>-q</info> Do not output any message.
- <info>--verbose</info> <info>-v</info> Increase verbosity of messages.
- <info>--version</info> <info>-V</info> Display this application version.
- <info>--ansi</info> Force ANSI output.
- <info>--no-ansi</info> Disable ANSI output.
- <info>--no-interaction</info> <info>-n</info> Do not ask any interactive question.
-
-<comment>Available commands for the "foo" namespace:</comment>
- <info>foo:bar </info> The foo:bar command
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<symfony>
- <commands>
- <command id="help" name="help">
- <usage>help [--xml] [command_name]</usage>
- <description>Displays help for a command</description>
- <help>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></help>
- <aliases />
- <arguments>
- <argument name="command_name" is_required="0" is_array="0">
- <description>The command name</description>
- <defaults>
- <default>help</default>
- </defaults>
- </argument>
- </arguments>
- <options>
- <option name="--xml" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
- <description>To output help as XML</description>
- </option>
- </options>
-</command>
- <command id="list" name="list">
- <usage>list [--xml] [--raw] [namespace]</usage>
- <description>Lists commands</description>
- <help>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></help>
- <aliases/>
- <arguments>
- <argument name="namespace" is_required="0" is_array="0">
- <description>The namespace name</description>
- <defaults/>
- </argument>
- </arguments>
- <options>
- <option name="--xml" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
- <description>To output help as XML</description>
- </option>
- <option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
- <description>To output raw command list</description>
- </option>
- </options>
-</command>
- <command id="foo:bar" name="foo:bar">
- <usage>foo:bar</usage>
- <description>The foo:bar command</description>
- <help/>
- <aliases>
- <alias>afoobar</alias>
- </aliases>
- <arguments/>
- <options/>
-</command>
- </commands>
- <namespaces>
- <namespace id="_global">
- <command>help</command>
- <command>list</command>
- </namespace>
- <namespace id="foo">
- <command>foo:bar</command>
- </namespace>
- </namespaces>
-</symfony>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<symfony>
- <commands namespace="foo">
- <command id="foo:bar" name="foo:bar">
- <usage>foo:bar</usage>
- <description>The foo:bar command</description>
- <help/>
- <aliases>
- <alias>afoobar</alias>
- </aliases>
- <arguments/>
- <options/>
-</command>
- </commands>
-</symfony>
+++ /dev/null
-<info>Console Tool</info>
-
-<comment>Usage:</comment>
- [options] command [arguments]
-
-<comment>Options:</comment>
- <info>--help</info> <info>-h</info> Display this help message.
- <info>--quiet</info> <info>-q</info> Do not output any message.
- <info>--verbose</info> <info>-v</info> Increase verbosity of messages.
- <info>--version</info> <info>-V</info> Display this application version.
- <info>--ansi</info> Force ANSI output.
- <info>--no-ansi</info> Disable ANSI output.
- <info>--no-interaction</info> <info>-n</info> Do not ask any interactive question.
\ No newline at end of file
+++ /dev/null
-
-
-
- [InvalidArgumentException]
- Command "foo" is not defined.
-
-
-
+++ /dev/null
-
-
-
- [InvalidArgumentException]
- The "--foo" option does not exist.
-
-
-
-list [--xml] [--raw] [namespace]
-
-
+++ /dev/null
-
-
-
- [Exception]
- Second exception
-
-
-
-
-
-
- [Exception]
- First exception
-
-
-
-foo3:bar
-
-
+++ /dev/null
-
-
-
- [InvalidArgumentException]
- Command "foo" is not define
- d.
-
-
-
+++ /dev/null
-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
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-Console Tool
+++ /dev/null
-<comment>Usage:</comment>
- namespace:name
-
-<comment>Aliases:</comment> <info>name</info>
-<comment>Arguments:</comment>
- <info>command </info> The command to execute
-
-<comment>Options:</comment>
- <info>--help</info> (-h) Display this help message.
- <info>--quiet</info> (-q) Do not output any message.
- <info>--verbose</info> (-v) Increase verbosity of messages.
- <info>--version</info> (-V) Display this application version.
- <info>--ansi</info> Force ANSI output.
- <info>--no-ansi</info> Disable ANSI output.
- <info>--no-interaction</info> (-n) Do not ask any interactive question.
-
-<comment>Help:</comment>
- help
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<command id="namespace:name" name="namespace:name">
- <usage>namespace:name</usage>
- <description>description</description>
- <help>help</help>
- <aliases>
- <alias>name</alias>
- </aliases>
- <arguments>
- <argument name="command" is_required="1" is_array="0">
- <description>The command to execute</description>
- <defaults/>
- </argument>
- </arguments>
- <options>
- <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
- <description>Display this help message.</description>
- </option>
- <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
- <description>Do not output any message.</description>
- </option>
- <option name="--verbose" shortcut="-v" accept_value="0" is_value_required="0" is_multiple="0">
- <description>Increase verbosity of messages.</description>
- </option>
- <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
- <description>Display this application version.</description>
- </option>
- <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
- <description>Force ANSI output.</description>
- </option>
- <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
- <description>Disable ANSI output.</description>
- </option>
- <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
- <description>Do not ask any interactive question.</description>
- </option>
- </options>
-</command>
+++ /dev/null
-<comment>Arguments:</comment>
- <info>foo </info> The foo argument
- <info>baz </info> The baz argument<comment> (default: true)</comment>
- <info>bar </info> The bar argument<comment> (default: array('bar'))</comment>
-
-<comment>Options:</comment>
- <info>--foo</info> (-f) The foo option
- <info>--baz</info> The baz option<comment> (default: false)</comment>
- <info>--bar</info> (-b) The bar option<comment> (default: 'bar')</comment>
- <info>--qux</info> The qux option<comment> (default: array('foo', 'bar'))</comment><comment> (multiple values allowed)</comment>
- <info>--qux2</info> The qux2 option<comment> (default: array ( 'foo' => 'bar',))</comment><comment> (multiple values allowed)</comment>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<definition>
- <arguments>
- <argument name="foo" is_required="0" is_array="0">
- <description>The foo argument</description>
- <defaults/>
- </argument>
- <argument name="baz" is_required="0" is_array="0">
- <description>The baz argument</description>
- <defaults>
- <default>true</default>
- </defaults>
- </argument>
- <argument name="bar" is_required="0" is_array="1">
- <description>The bar argument</description>
- <defaults>
- <default>bar</default>
- </defaults>
- </argument>
- </arguments>
- <options>
- <option name="--foo" shortcut="-f" accept_value="1" is_value_required="1" is_multiple="0">
- <description>The foo option</description>
- <defaults/>
- </option>
- <option name="--baz" shortcut="" accept_value="1" is_value_required="0" is_multiple="0">
- <description>The baz option</description>
- <defaults>
- <default>false</default>
- </defaults>
- </option>
- <option name="--bar" shortcut="-b" accept_value="1" is_value_required="0" is_multiple="0">
- <description>The bar option</description>
- <defaults>
- <default>bar</default>
- </defaults>
- </option>
- </options>
-</definition>
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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'));
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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'));
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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('<error>some error</error>')
- );
- $this->assertEquals(
- "\033[32msome info\033[0m",
- $formatter->format('<info>some info</info>')
- );
- $this->assertEquals(
- "\033[33msome comment\033[0m",
- $formatter->format('<comment>some comment</comment>')
- );
- $this->assertEquals(
- "\033[30;46msome question\033[0m",
- $formatter->format('<question>some question</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('<error>some <info>some info</info> error</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('<error>error<info>info<comment>comment</info>error</error>')
- );
- }
-
- 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('<test>some custom msg</test>'));
- }
-
- 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('<info>some custom msg</info>'));
- }
-
- public function testInlineStyle()
- {
- $formatter = new OutputFormatter(true);
-
- $this->assertEquals("\033[34;41msome text\033[0m", $formatter->format('<fg=blue;bg=red>some text</>'));
- $this->assertEquals("\033[34;41msome text\033[0m", $formatter->format('<fg=blue;bg=red>some text</fg=blue;bg=red>'));
- }
-
- 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('<error>some error</error>')
- );
- $this->assertEquals(
- "some info", $formatter->format('<info>some info</info>')
- );
- $this->assertEquals(
- "some comment", $formatter->format('<comment>some comment</comment>')
- );
- $this->assertEquals(
- "some question", $formatter->format('<question>some question</question>')
- );
-
- $formatter->setDecorated(true);
-
- $this->assertEquals(
- "\033[37;41msome error\033[0m", $formatter->format('<error>some error</error>')
- );
- $this->assertEquals(
- "\033[32msome info\033[0m", $formatter->format('<info>some info</info>')
- );
- $this->assertEquals(
- "\033[33msome comment\033[0m", $formatter->format('<comment>some comment</comment>')
- );
- $this->assertEquals(
- "\033[30;46msome question\033[0m", $formatter->format('<question>some question</question>')
- );
- }
-
- public function testContentWithLineBreaks()
- {
- $formatter = new OutputFormatter(true);
-
- $this->assertEquals(<<<EOF
-\033[32m
-some text\033[0m
-EOF
- , $formatter->format(<<<EOF
-<info>
-some text</info>
-EOF
- ));
-
- $this->assertEquals(<<<EOF
-\033[32msome text
-\033[0m
-EOF
- , $formatter->format(<<<EOF
-<info>some text
-</info>
-EOF
- ));
-
- $this->assertEquals(<<<EOF
-\033[32m
-some text
-\033[0m
-EOF
- , $formatter->format(<<<EOF
-<info>
-some text
-</info>
-EOF
- ));
-
- $this->assertEquals(<<<EOF
-\033[32m
-some text
-more text
-\033[0m
-EOF
- , $formatter->format(<<<EOF
-<info>
-some text
-more text
-</info>
-EOF
- ));
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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));
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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(
- '<info>[cli]</info> 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(
- '<error> Some text to display </error>',
- $formatter->formatBlock('Some text to display', 'error'),
- '::formatBlock() formats a message in a block'
- );
-
- $this->assertEquals(
- '<error> Some text to display </error>' . "\n" .
- '<error> foo bar </error>',
- $formatter->formatBlock(array('Some text to display', 'foo bar'), 'error'),
- '::formatBlock() formats a message in a block'
- );
-
- $this->assertEquals(
- '<error> </error>' . "\n" .
- '<error> Some text to display </error>' . "\n" .
- '<error> </error>',
- $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(
- '<error> </error>' . "\n" .
- '<error> Du texte à afficher </error>' . "\n" .
- '<error> </error>',
- $formatter->formatBlock('Du texte à afficher', 'error', true),
- '::formatBlock() formats a message in a block'
- );
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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'),
- );
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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');
- }
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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());
- }
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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');
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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));
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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');
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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'),
- );
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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');
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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('<info>foo</info>', Output::OUTPUT_RAW);
- $this->assertEquals("<info>foo</info>\n", $output->output, '->writeln() outputs the raw message if OUTPUT_RAW is specified');
-
- $output = new TestOutput();
- $output->writeln('<info>foo</info>', 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('<info>foo</info>');
- $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>foo</foo>');
- $this->assertEquals("\033[33;41;5mfoo\033[0m\n", $output->output, '->writeln() decorates the output');
-
- try {
- $output->writeln('<foo>foo</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('<bar>foo</bar>');
- $this->assertEquals('<bar>foo</bar>', $output->output, '->write() do nothing when a style does not exist');
-
- $output->clear();
- $output->writeln('<bar>foo</bar>');
- $this->assertEquals("<bar>foo</bar>\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" : '');
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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');
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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');
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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');
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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;
- }
- }
-});
+++ /dev/null
-{
- "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"
- }
- }
-}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-
-<phpunit backupGlobals="false"
- backupStaticAttributes="false"
- colors="true"
- convertErrorsToExceptions="true"
- convertNoticesToExceptions="true"
- convertWarningsToExceptions="true"
- processIsolation="false"
- stopOnFailure="false"
- syntaxCheck="false"
- bootstrap="Tests/bootstrap.php"
->
- <testsuites>
- <testsuite name="Symfony Console Component Test Suite">
- <directory>./Tests/</directory>
- </testsuite>
- </testsuites>
-
- <filter>
- <whitelist>
- <directory>./</directory>
- <exclude>
- <directory>./Resources</directory>
- <directory>./Tests</directory>
- <directory>./vendor</directory>
- </exclude>
- </whitelist>
- </filter>
-</phpunit>
+++ /dev/null
-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)
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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;
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <matthew@lewinski.org>
- */
-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));
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @api
- */
-class DumpException extends \RuntimeException implements ExceptionInterface
-{
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @api
- */
-interface ExceptionInterface
-{
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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 .= '.';
- }
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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 <<<EOF
- ~^
- (?P<year>[0-9][0-9][0-9][0-9])
- -(?P<month>[0-9][0-9]?)
- -(?P<day>[0-9][0-9]?)
- (?:(?:[Tt]|[ \t]+)
- (?P<hour>[0-9][0-9]?)
- :(?P<minute>[0-9][0-9])
- :(?P<second>[0-9][0-9])
- (?:\.(?P<fraction>[0-9]*))?
- (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
- (?::(?P<tz_minute>[0-9][0-9]))?))?)?
- $~x
-EOF;
- }
-}
+++ /dev/null
-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.
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- */
-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<leadspaces>\s+)(?P<value>.+?))?\s*$#u', $this->currentLine, $values)) {
- if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#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<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P<value>.+?))?\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<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\[\{].*?) *\:(\s+(?P<value>.+?))?\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<ref>[^ ]+) *(?P<value>.*)#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<text> *)$#', $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<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?$/', $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<indent>'.($indentation ? str_repeat(' ', $indentation) : ' +').')(?P<text>.*)$#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<indent> {'.strlen($textIndent).',})(?P<text>.+)$#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<text> *)$#', $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, '- '));
- }
-
-}
+++ /dev/null
-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
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 = <<<EOF
-{ '': bar, foo: '#bar', 'foo''bar': { }, bar: [1, foo], foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } } }
-EOF;
-$this->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 = <<<EOF
-'': bar
-foo: '#bar'
-'foo''bar': { }
-bar: [1, foo]
-foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } }
-
-EOF;
- $this->assertEquals($expected, $this->dumper->dump($array, 1), '->dump() takes an inline level argument');
-
- $expected = <<<EOF
-'': bar
-foo: '#bar'
-'foo''bar': { }
-bar:
- - 1
- - foo
-foobar:
- foo: bar
- bar: [1, foo]
- foobar: { foo: bar, bar: [1, foo] }
-
-EOF;
- $this->assertEquals($expected, $this->dumper->dump($array, 2), '->dump() takes an inline level argument');
-
- $expected = <<<EOF
-'': bar
-foo: '#bar'
-'foo''bar': { }
-bar:
- - 1
- - foo
-foobar:
- foo: bar
- bar:
- - 1
- - foo
- foobar:
- foo: bar
- bar: [1, foo]
-
-EOF;
- $this->assertEquals($expected, $this->dumper->dump($array, 3), '->dump() takes an inline level argument');
-
- $expected = <<<EOF
-'': bar
-foo: '#bar'
-'foo''bar': { }
-bar:
- - 1
- - foo
-foobar:
- foo: bar
- bar:
- - 1
- - foo
- foobar:
- foo: bar
- bar:
- - 1
- - foo
-
-EOF;
- $this->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';
-}
+++ /dev/null
---- %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'))
+++ /dev/null
---- %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
- )
- )
+++ /dev/null
----
-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',
- )
+++ /dev/null
---- %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"
- )
+++ /dev/null
----
-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)
-
+++ /dev/null
----
-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))
+++ /dev/null
---- %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"
- )
+++ /dev/null
---- %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: |
- ''
+++ /dev/null
---- %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' ) }
+++ /dev/null
---- %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 )
+++ /dev/null
-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"
+++ /dev/null
-- escapedCharacters
-- sfComments
-- sfCompact
-- sfTests
-- sfObjects
-- sfMergeKey
-- sfQuotes
-- YtsAnchorAlias
-- YtsBasicTests
-- YtsBlockMapping
-- YtsDocumentSeparator
-- YtsErrorTests
-- YtsFlowCollections
-- YtsFoldedScalars
-- YtsNullsAndEmpties
-- YtsSpecificationExamples
-- YtsTypeTransfers
-- unindentedCollections
+++ /dev/null
---- %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')
+++ /dev/null
---- %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'
- )
- )
- )
+++ /dev/null
---- %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'))
+++ /dev/null
---- %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')
+++ /dev/null
---- %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',
- ),
- )
+++ /dev/null
---- %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')
+++ /dev/null
---- %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'))
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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',),
- );
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 = <<<EOF
---- %YAML:1.0
-foo
-...
-EOF;
-
- $this->assertEquals('foo', $this->parser->parse($yaml));
- }
-
- public function testObjectsSupport()
- {
- $b = array('foo' => new B(), 'bar' => 1);
- $this->assertEquals($this->parser->parse(<<<EOF
-foo: !!php/object:O:30:"Symfony\Component\Yaml\Tests\B":1:{s:1:"b";s:3:"foo";}
-bar: 1
-EOF
- ), $b, '->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 = <<<EOF
-
-collection:
--item1
--item2
--item3
-
-EOF;
-
- $this->parser->parse($yaml);
- }
-
-}
-
-class B
-{
- public $b = 'foo';
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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;
- }
- }
-});
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <matthew@lewinski.org>
- */
-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).');
- }
-}
+++ /dev/null
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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 <fabien@symfony.com>
- *
- * @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:
- * <code>
- * $array = Yaml::parse('config.yml');
- * print_r($array);
- * </code>
- *
- * @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);
- }
-}
+++ /dev/null
-{
- "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"
- }
- }
-}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-
-<phpunit backupGlobals="false"
- backupStaticAttributes="false"
- colors="true"
- convertErrorsToExceptions="true"
- convertNoticesToExceptions="true"
- convertWarningsToExceptions="true"
- processIsolation="false"
- stopOnFailure="false"
- syntaxCheck="false"
- bootstrap="Tests/bootstrap.php"
->
- <testsuites>
- <testsuite name="Symfony Yaml Component Test Suite">
- <directory>./Tests/</directory>
- </testsuite>
- </testsuites>
-
- <filter>
- <whitelist>
- <directory>./</directory>
- <exclude>
- <directory>./vendor</directory>
- <directory>./Tests</directory>
- </exclude>
- </whitelist>
- </filter>
-</phpunit>
* 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)
*
* 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());
}
}
* @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;
}
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', '<')
)
);
$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');
}