public function convertIndexDescription(Table $table, $row) { $type = null; $columns = $length = []; $name = $row['CONSTRAINT_NAME']; switch ($row['CONSTRAINT_TYPE']) { case 'P': $name = $type = Table::CONSTRAINT_PRIMARY; break; case 'U': $type = Table::CONSTRAINT_UNIQUE; break; default: return; //Not doing anything here with Oracle "Check" constraints or "Reference" constraints } $columns[] = strtolower($row['COLUMN_NAME']); $isIndex = $type === Table::INDEX_INDEX || $type === Table::INDEX_FULLTEXT; if ($isIndex) { $existing = $table->index($name); } else { $existing = $table->constraint($name); } if (!empty($existing)) { $columns = array_merge($existing['columns'], $columns); $length = array_merge($existing['length'], $length); } if ($isIndex) { $table->addIndex($name, ['type' => $type, 'columns' => $columns, 'length' => $length]); } else { $table->addConstraint($name, ['type' => $type, 'columns' => $columns, 'length' => $length]); } }
/** * {@inheritDoc} */ public function indexSql(Table $table, $name) { $data = $table->index($name); $columns = array_map([$this->_driver, 'quoteIdentifier'], $data['columns']); return sprintf('CREATE INDEX %s ON %s (%s)', $this->_driver->quoteIdentifier($name), $this->_driver->quoteIdentifier($table->name()), implode(', ', $columns)); }
/** * Generates a string representation of a schema. * * @param \Cake\Database\Schema\Table $table Table schema * @return string fields definitions */ protected function _generateSchema(Table $table) { $cols = $indexes = $constraints = []; foreach ($table->columns() as $field) { $fieldData = $table->column($field); $properties = implode(', ', $this->_values($fieldData)); $cols[] = " '{$field}' => [{$properties}],"; } foreach ($table->indexes() as $index) { $fieldData = $table->index($index); $properties = implode(', ', $this->_values($fieldData)); $indexes[] = " '{$index}' => [{$properties}],"; } foreach ($table->constraints() as $index) { $fieldData = $table->constraint($index); $properties = implode(', ', $this->_values($fieldData)); $constraints[] = " '{$index}' => [{$properties}],"; } $options = $this->_values($table->options()); $content = implode("\n", $cols) . "\n"; if (!empty($indexes)) { $content .= " '_indexes' => [\n" . implode("\n", $indexes) . "\n ],\n"; } if (!empty($constraints)) { $content .= " '_constraints' => [\n" . implode("\n", $constraints) . "\n ],\n"; } if (!empty($options)) { foreach ($options as &$option) { $option = ' ' . $option; } $content .= " '_options' => [\n" . implode(",\n", $options) . "\n ],\n"; } return "[\n{$content} ]"; }
/** * {@inheritDoc} */ public function indexSql(Table $table, $name) { $data = $table->index($name); if ($data['type'] === Table::INDEX_INDEX) { $out = 'KEY '; } if ($data['type'] === Table::INDEX_FULLTEXT) { $out = 'FULLTEXT KEY '; } $out .= $this->_driver->quoteIdentifier($name); return $this->_keySql($out, $data); }