public function toDialectString(Dialect $dialect) { $query = 'UPDATE ' . $dialect->quoteTable($this->table) . ' SET '; $sets = []; foreach ($this->fields as $var => $val) { if ($val instanceof DialectString) { $sets[] = $dialect->quoteField($var) . ' = (' . $val->toDialectString($dialect) . ')'; } elseif ($val === null) { $sets[] = $dialect->quoteField($var) . ' = ' . $dialect->literalToString(Dialect::LITERAL_NULL); } elseif (true === $val) { $sets[] = $dialect->quoteField($var) . ' = ' . $dialect->literalToString(Dialect::LITERAL_TRUE); } elseif (false === $val) { $sets[] = $dialect->quoteField($var) . ' = ' . $dialect->literalToString(Dialect::LITERAL_FALSE); } else { $sets[] = $dialect->quoteField($var) . ' = ' . $dialect->quoteValue($val); } } return $query . implode(', ', $sets) . $this->joiner->toDialectString($dialect) . parent::toDialectString($dialect); }
protected function toDialectStringSelect($query, Dialect $dialect) { $fields = []; foreach ($this->fields as $var => $val) { $fields[] = $dialect->quoteField($var); } if (!$fields) { throw new WrongStateException('what should i insert?'); } if ($this->select->getFieldsCount() != count($fields)) { throw new WrongStateException('count of select fields must be equal with count of insert fields'); } $fields = implode(', ', $fields); return $query . "({$fields}) (" . $this->select->toDialectString($dialect) . ")"; }
public static function findDifferences(Dialect $dialect, DBTable $source, DBTable $target) { $out = []; $head = 'ALTER TABLE ' . $dialect->quoteTable($target->getName()); $sourceColumns = $source->getColumns(); $targetColumns = $target->getColumns(); foreach ($sourceColumns as $name => $column) { if (isset($targetColumns[$name])) { if ($column->getType()->getId() != $targetColumns[$name]->getType()->getId()) { $targetColumn = $targetColumns[$name]; $out[] = $head . ' ALTER COLUMN ' . $dialect->quoteField($name) . ' TYPE ' . $targetColumn->getType()->toString() . ($targetColumn->getType()->hasSize() ? '(' . $targetColumn->getType()->getSize() . ($targetColumn->getType()->hasPrecision() ? ', ' . $targetColumn->getType()->getPrecision() : null) . ')' : null) . (in_array($targetColumn->getType()->getId(), array(DataType::JSON, DataType::JSONB)) ? ' USING NULL' : '') . ';'; } if ($column->getType()->isNull() != $targetColumns[$name]->getType()->isNull()) { $out[] = $head . ' ALTER COLUMN ' . $dialect->quoteField($name) . ' ' . ($targetColumns[$name]->getType()->isNull() ? 'DROP' : 'SET') . ' NOT NULL;'; } } else { $out[] = $head . ' DROP COLUMN ' . $dialect->quoteField($name) . ';'; } } foreach ($targetColumns as $name => $column) { if (!isset($sourceColumns[$name])) { $out[] = $head . ' ADD COLUMN ' . $column->toDialectString($dialect) . ';'; if ($column->hasReference()) { $out[] = 'CREATE INDEX ' . $dialect->quoteField($name . '_idx') . ' ON ' . $dialect->quoteTable($target->getName()) . '(' . $dialect->quoteField($name) . ');'; } } } return $out; }
public function toDialectString(Dialect $dialect) { $out = $dialect->quoteField($this->name) . ' ' . $this->type->toDialectString($dialect); if (null !== $this->default) { if ($this->type->getId() == DataType::BOOLEAN) { $default = $this->default ? $dialect->literalToString(Dialect::LITERAL_TRUE) : $dialect->literalToString(Dialect::LITERAL_FALSE); } else { $default = $dialect->valueToString($this->default); } $out .= ' DEFAULT ' . $default; } if ($this->reference) { $table = $this->reference->getTable()->getName(); $column = $this->reference->getName(); $out .= " REFERENCES {$dialect->quoteTable($table)}" . "({$dialect->quoteField($column)})"; if ($this->onDelete) { $out .= ' ON DELETE ' . $this->onDelete->toString(); } if ($this->onUpdate) { $out .= ' ON UPDATE ' . $this->onUpdate->toString(); } } return $out; }