/**
  * Gets the PostgreSQL Column Comment Defininition for a column object.
  *
  * @param Column $column Column
  * @param string $tableName Table name
  * @return string
  */
 protected function getColumnCommentSqlDefinition(Column $column, $tableName)
 {
     // passing 'null' is to remove column comment
     $comment = strcasecmp($column->getComment(), 'NULL') !== 0 ? $this->getConnection()->quote($column->getComment()) : 'NULL';
     return sprintf('COMMENT ON COLUMN %s.%s IS %s;', $tableName, $column->getName(), $comment);
 }
示例#2
0
 /**
  * {@inheritdoc}
  */
 public function changeColumn($tableName, $columnName, Column $newColumn)
 {
     $this->startCommandTimer();
     $this->writeCommand('changeColumn', array($tableName, $columnName, $newColumn->getType()));
     $columns = $this->getColumns($tableName);
     $changeDefault = $newColumn->getDefault() !== $columns[$columnName]->getDefault() || $newColumn->getType() !== $columns[$columnName]->getType();
     if ($columnName !== $newColumn->getName()) {
         $this->renameColumn($tableName, $columnName, $newColumn->getName());
     }
     if ($changeDefault) {
         $this->dropDefaultConstraint($tableName, $newColumn->getName());
     }
     $this->execute(sprintf('ALTER TABLE %s ALTER COLUMN %s %s', $this->quoteTableName($tableName), $this->quoteColumnName($newColumn->getName()), $this->getColumnSqlDefinition($newColumn, false)));
     // change column comment if needed
     if ($newColumn->getComment()) {
         $sql = $this->getColumnCommentSqlDefinition($newColumn, $tableName);
         $this->execute($sql);
     }
     if ($changeDefault) {
         $this->changeDefault($tableName, $newColumn);
     }
     $this->endCommandTimer();
 }
示例#3
0
 /**
  * {@inheritdoc}
  */
 public function changeColumn($tableName, $columnName, Column $newColumn)
 {
     $this->startCommandTimer();
     $this->writeCommand('changeColumn', array($tableName, $columnName, $newColumn->getType()));
     $after = $newColumn->getAfter() ? ' AFTER ' . $this->quoteColumnName($newColumn->getAfter()) : '';
     $this->execute(sprintf('ALTER TABLE %s CHANGE %s %s %s%s', $this->quoteTableName($tableName), $this->quoteColumnName($columnName), $this->quoteColumnName($newColumn->getName()), $this->getColumnSqlDefinition($newColumn), $after));
     $this->endCommandTimer();
 }
 /**
  * {@inheritdoc}
  */
 public function addColumn(Table $table, Column $column)
 {
     $this->startCommandTimer();
     $this->writeCommand('addColumn', array($table->getName(), $column->getName(), $column->getType()));
     $sql = sprintf('ALTER TABLE %s ADD %s %s', $this->quoteTableName($table->getName()), $this->quoteColumnName($column->getName()), $this->getColumnSqlDefinition($column));
     $this->execute($sql);
     $this->endCommandTimer();
 }
示例#5
0
 /**
  * {@inheritdoc}
  */
 public function changeColumn($tableName, $columnName, Column $newColumn)
 {
     // TODO: DRY this up....
     $this->startCommandTimer();
     $this->writeCommand('changeColumn', array($tableName, $columnName, $newColumn->getType()));
     $tmpTableName = 'tmp_' . $tableName;
     $rows = $this->fetchAll('select * from sqlite_master where `type` = \'table\'');
     $sql = '';
     foreach ($rows as $table) {
         if ($table['tbl_name'] == $tableName) {
             $sql = $table['sql'];
         }
     }
     $columns = $this->fetchAll(sprintf('pragma table_info(%s)', $this->quoteTableName($tableName)));
     $selectColumns = array();
     $writeColumns = array();
     foreach ($columns as $column) {
         $selectName = $column['name'];
         $writeName = $selectName == $columnName ? $newColumn->getName() : $selectName;
         $selectColumns[] = $this->quoteColumnName($selectName);
         $writeColumns[] = $this->quoteColumnName($writeName);
     }
     if (!in_array($this->quoteColumnName($columnName), $selectColumns)) {
         throw new \InvalidArgumentException(sprintf('The specified column doesn\'t exist: ' . $columnName));
     }
     $this->execute(sprintf('ALTER TABLE %s RENAME TO %s', $tableName, $tmpTableName));
     $val = end($columns);
     $replacement = $val['name'] === $columnName ? "%s %s" : "%s %s,";
     $sql = preg_replace(sprintf("/%s[^,]*[^\\)]/", $this->quoteColumnName($columnName)), sprintf($replacement, $this->quoteColumnName($newColumn->getName()), $this->getColumnSqlDefinition($newColumn)), $sql);
     $this->execute($sql);
     $sql = sprintf('INSERT INTO %s(%s) SELECT %s FROM %s', $tableName, implode(', ', $writeColumns), implode(', ', $selectColumns), $tmpTableName);
     $this->execute($sql);
     $this->execute(sprintf('DROP TABLE %s', $this->quoteTableName($tmpTableName)));
     $this->endCommandTimer();
 }
示例#6
0
 /**
  * Gets the SQLite Column Definition for a Column object.
  *
  * @param Column $column Column
  * @return string
  */
 protected function getColumnSqlDefinition(Column $column)
 {
     $sqlType = $this->getSqlType($column->getType());
     $def = '';
     $def .= strtoupper($sqlType['name']);
     if ($column->getPrecision() && $column->getScale()) {
         $def .= '(' . $column->getPrecision() . ',' . $column->getScale() . ')';
     }
     $limitable = in_array(strtoupper($sqlType['name']), $this->definitionsWithLimits);
     if (($column->getLimit() || isset($sqlType['limit'])) && $limitable) {
         $def .= '(' . ($column->getLimit() ? $column->getLimit() : $sqlType['limit']) . ')';
     }
     if (($values = $column->getValues()) && is_array($values)) {
         $def .= " CHECK({$column->getName()} IN ('" . implode("', '", $values) . "'))";
     }
     $default = $column->getDefault();
     $def .= $column->isNull() || is_null($default) ? ' NULL' : ' NOT NULL';
     $def .= $this->getDefaultValueDefinition($default);
     $def .= $column->isIdentity() ? ' PRIMARY KEY AUTOINCREMENT' : '';
     if ($column->getUpdate()) {
         $def .= ' ON UPDATE ' . $column->getUpdate();
     }
     $def .= $this->getCommentDefinition($column);
     return $def;
 }
 /**
  * Gets the column name.
  *
  * @return string
  */
 public function getName()
 {
     return $this->column->getName();
 }