public function testGeneratesPartialIndexesSqlOnlyWhenSupportingPartialIndexes()
 {
     $where = 'test IS NULL AND test2 IS NOT NULL';
     $indexDef = new \Doctrine\DBAL\Schema\Index('name', array('test', 'test2'), false, false, array(), array('where' => $where));
     $uniqueIndex = new \Doctrine\DBAL\Schema\Index('name', array('test', 'test2'), true, false, array(), array('where' => $where));
     $expected = ' WHERE ' . $where;
     $actuals = array();
     if ($this->supportsInlineIndexDeclaration()) {
         $actuals[] = $this->_platform->getIndexDeclarationSQL('name', $indexDef);
     }
     $actuals[] = $this->_platform->getUniqueConstraintDeclarationSQL('name', $uniqueIndex);
     $actuals[] = $this->_platform->getCreateIndexSQL($indexDef, 'table');
     foreach ($actuals as $actual) {
         if ($this->_platform->supportsPartialIndexes()) {
             $this->assertStringEndsWith($expected, $actual, 'WHERE clause should be present');
         } else {
             $this->assertStringEndsNotWith($expected, $actual, 'WHERE clause should NOT be present');
         }
     }
 }
 /**
  * {@inheritdoc}
  *
  * Appends SQL Anywhere specific flags if given.
  */
 public function getCreateIndexSQL(Index $index, $table)
 {
     return parent::getCreateIndexSQL($index, $table) . $this->getAdvancedIndexOptionsSQL($index);
 }
 /**
  * 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));
 }
 /**
  * {@inheritDoc}
  */
 public function getCreateIndexSQL(Index $index, $table)
 {
     $constraint = parent::getCreateIndexSQL($index, $table);
     if ($index->isUnique() && !$index->isPrimary()) {
         $constraint = $this->_appendUniqueConstraintDefinition($constraint, $index);
     }
     return $constraint;
 }
Exemple #5
0
 /**
  * @param $tables
  * @param $backupPrefix
  *
  * @return array
  *
  * @throws \Doctrine\DBAL\DBALException
  */
 protected function backupExistingSchema($tables, $mauticTables, $backupPrefix)
 {
     $sql = [];
     $sm = $this->db->getSchemaManager();
     //backup existing tables
     $backupRestraints = $backupSequences = $backupIndexes = $backupTables = $dropSequences = $dropTables = [];
     //cycle through the first time to drop all the foreign keys
     foreach ($tables as $t) {
         if (!isset($mauticTables[$t]) && !in_array($t, $mauticTables)) {
             // Not an applicable table
             continue;
         }
         $restraints = $sm->listTableForeignKeys($t);
         if (isset($mauticTables[$t])) {
             //to be backed up
             $backupRestraints[$mauticTables[$t]] = $restraints;
             $backupTables[$t] = $mauticTables[$t];
             $backupIndexes[$t] = $sm->listTableIndexes($t);
         } else {
             //existing backup to be dropped
             $dropTables[] = $t;
         }
         foreach ($restraints as $restraint) {
             $sql[] = $this->platform->getDropForeignKeySQL($restraint, $t);
         }
     }
     //now drop all the backup tables
     foreach ($dropTables as $t) {
         $sql[] = $this->platform->getDropTableSQL($t);
     }
     //now backup tables
     foreach ($backupTables as $t => $backup) {
         //drop old indexes
         /** @var \Doctrine\DBAL\Schema\Index $oldIndex */
         foreach ($backupIndexes[$t] as $indexName => $oldIndex) {
             if ($indexName == 'primary') {
                 continue;
             }
             $oldName = $oldIndex->getName();
             $newName = $this->generateBackupName($this->dbParams['table_prefix'], $backupPrefix, $oldName);
             $newIndex = new Index($newName, $oldIndex->getColumns(), $oldIndex->isUnique(), $oldIndex->isPrimary(), $oldIndex->getFlags());
             $newIndexes[] = $newIndex;
             $sql[] = $this->platform->getDropIndexSQL($oldIndex, $t);
         }
         //rename table
         $tableDiff = new TableDiff($t);
         $tableDiff->newName = $backup;
         $queries = $this->platform->getAlterTableSQL($tableDiff);
         $sql = array_merge($sql, $queries);
         //create new index
         if (!empty($newIndexes)) {
             foreach ($newIndexes as $newIndex) {
                 $sql[] = $this->platform->getCreateIndexSQL($newIndex, $backup);
             }
             unset($newIndexes);
         }
     }
     //apply foreign keys to backup tables
     foreach ($backupRestraints as $table => $oldRestraints) {
         foreach ($oldRestraints as $or) {
             $foreignTable = $or->getForeignTableName();
             $foreignTableName = $this->generateBackupName($this->dbParams['table_prefix'], $backupPrefix, $foreignTable);
             $r = new ForeignKeyConstraint($or->getLocalColumns(), $foreignTableName, $or->getForeignColumns(), $backupPrefix . $or->getName(), $or->getOptions());
             $sql[] = $this->platform->getCreateForeignKeySQL($r, $table);
         }
     }
     return $sql;
 }
 public function testGeneratesUniqueIndexCreationSql()
 {
     $indexDef = new \Doctrine\DBAL\Schema\Index('index_name', array('test', 'test2'), true);
     $sql = $this->_platform->getCreateIndexSQL($indexDef, 'test');
     $this->assertEquals($this->getGenerateUniqueIndexSql(), $sql);
 }