Exemple #1
0
 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);
 }
Exemple #2
0
 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) . ")";
 }
Exemple #3
0
 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;
 }
Exemple #4
0
 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;
 }