/** * 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); }
/** * {@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(); }
/** * {@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(); }
/** * {@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(); }
/** * 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(); }