53 private static $mapping = [
54 'DATA_TYPE' =>
'type',
55 'COLUMN_NAME' =>
'name',
57 'DEFAULT' =>
'default',
58 'NULLABLE' =>
'nullable',
60 'PRECISION' =>
'precision',
62 'UNSIGNED' =>
'unsigned',
63 'IDENTITY' =>
'identity',
64 'PRIMARY' =>
'primary' 70 private static $toUnset = [
80 private $moduleName =
'';
85 private $definitionMappers;
99 array $definitionMappers,
102 $this->definitionMappers = $definitionMappers;
103 $this->handlers = $handlers;
114 $dataToLog[
'constraints'][
'foreign'][$fkName] = [
127 private function castColumnDefinition($definition, $columnName)
129 if (is_string($definition)) {
130 $definition = [
'type' => $definition];
132 $definition = $this->doColumnMapping($definition);
133 $definition[
'name'] = strtolower($columnName);
134 $definitionType = $definition[
'type'] ===
'int' ?
'integer' : $definition[
'type'];
135 $definition = $this->definitionMappers[$definitionType]->convertToDefinition($definition);
136 if (isset($definition[
'default']) && $definition[
'default'] ===
false) {
137 $definition[
'default'] =
null;
139 $definition[
'disabled'] =
false;
153 private function addPrimaryKeyIfExists(
$tableName, $columnName, $definition, $primaryKeyName)
155 if (isset($definition[
'primary']) && $definition[
'primary']) {
156 $dataToLog[
'constraints'][
'primary'][$primaryKeyName] = [
158 'name' => $primaryKeyName,
160 'columns' => [$columnName => strtolower($columnName)]
166 unset($definition[
'primary']);
179 $moduleName = $this->getModuleName();
181 if (isset($this->tables[$moduleName][strtolower($oldTableName)])) {
182 $this->tables[$moduleName][strtolower($newTableName)] =
183 $this->tables[$moduleName][strtolower($oldTableName)];
184 unset($this->tables[$moduleName][strtolower($oldTableName)]);
194 private function doColumnMapping(array $definition)
196 foreach ($definition as $key => $keyValue) {
197 if (isset(self::$mapping[$key])) {
198 $definition[self::$mapping[$key]] = $keyValue;
199 unset($definition[$key]);
202 if (in_array($key, self::$toUnset)) {
203 unset($definition[$key]);
219 public function addColumn(
$tableName, $columnName, $definition, $primaryKeyName =
'PRIMARY', $onCreate =
null)
221 $definition = $this->castColumnDefinition($definition, $columnName);
222 $definition = $this->addPrimaryKeyIfExists(
$tableName, $columnName, $definition, $primaryKeyName);
223 $definition[
'onCreate'] = $onCreate;
224 $dataToLog[
'columns'][strtolower($columnName)] = $definition;
237 if ($indexType ===
'index') {
238 $dataToLog[
'indexes'][$keyName] = [
242 $dataToLog[
'constraints'][$indexType][$keyName] = [
258 $dataToLog[
'columns'][strtolower($columnName)] = [
274 foreach ($this->handlers as
$handler) {
280 'old_column' => $oldColumnName,
281 'new_column' => $newColumnName,
293 sprintf(
'migrateDataFrom(%s)', $oldColumnName)
314 private function getModuleName()
316 return $this->moduleName;
328 if ($this->
ignore & self::IGNORE_OFF === 0) {
331 $moduleName = $this->getModuleName();
332 if (isset($this->tables[$moduleName][strtolower(
$tableName)])) {
333 $this->tables[$moduleName][strtolower(
$tableName)] = array_replace_recursive(
334 $this->tables[$moduleName][strtolower(
$tableName)],
338 $this->tables[$moduleName][strtolower(
$tableName)] = $dataToLog;
341 $this->tables[$moduleName][strtolower(
$tableName)][
'resource'] = $this->resource;
362 $dataToLog[
'constraints'][
'foreign'][$fkName] =
365 'column' => strtolower($columnName),
366 'referenceTable' => strtolower($refTableName),
367 'referenceColumn' => strtolower($refColumnName),
368 'onDelete' => $onDelete,
380 private function prepareIndexColumns(array $indexColumns)
384 foreach ($indexColumns as $key => $indexColumn) {
385 if (is_array($indexColumn)) {
386 $columnNames[strtolower($key)] = strtolower($key);
388 $columnNames[$indexColumn] = $indexColumn;
409 $indexAlhoritm =
'btree' 416 $indexType = $indexAlhoritm;
418 $dataToLog[
'indexes'][$indexName] =
420 'columns' => $this->prepareIndexColumns(
$fields),
421 'indexType' => $indexType,
425 $dataToLog[
'constraints'][$indexType][$indexName] =
426 [
'columns' => $this->prepareIndexColumns(
$fields),
'disabled' =>
false];
438 private function prepareColumns(
$tableName, array $tableColumns)
440 foreach ($tableColumns as
$name => $tableColumn) {
452 private function prepareConstraintsAndIndexes(array $foreignKeys, array $indexes,
$tableName, $engine)
455 foreach ($foreignKeys as
$name => $foreignKey) {
459 $foreignKey[
'COLUMN_NAME'],
460 $foreignKey[
'REF_TABLE_NAME'],
461 $foreignKey[
'REF_COLUMN_NAME'],
462 $foreignKey[
'ON_DELETE']
472 $engine ===
'memory' ?
'hash' :
'btree' 484 $engine = strtolower(
$table->getOption(
'type'));
485 $this->tables[$this->getModuleName()][strtolower(
$table->getName())][
'engine'] = $engine;
486 $this->prepareColumns(
$table->getName(),
$table->getColumns());
487 $this->prepareConstraintsAndIndexes(
$table->getForeignKeys(),
$table->getIndexes(),
$table->getName(), $engine);
517 if (isset($this->tables[$this->getModuleName()][strtolower(
$tableName)])) {
518 unset($this->tables[$this->getModuleName()][strtolower(
$tableName)]);
520 $this->tables[$this->getModuleName()][strtolower(
$tableName)][
'disabled'] =
true;
541 $this->moduleName = $moduleName;
551 return $this->tables;
setResource(string $resource)
setModuleName($moduleName)
__construct(array $definitionMappers, array $handlers=[])
modifyColumn($tableName, $columnName, $definition)
log($tableName, array $dataToLog)
addForeignKey( $fkName, $tableName, $columnName, $refTableName, $refColumnName, $onDelete=AdapterInterface::FK_ACTION_CASCADE)
changeColumn($tableName, $oldColumnName, $newColumnName, $definition)
const INDEX_TYPE_FULLTEXT
addColumn($tableName, $columnName, $definition, $primaryKeyName='PRIMARY', $onCreate=null)
dropIndex($tableName, $keyName, $indexType)
addIndex( $tableName, $indexName, $fields, $indexType=AdapterInterface::INDEX_TYPE_INDEX, $indexAlhoritm='btree')
dropColumn($tableName, $columnName)
dropForeignKey($tableName, $fkName)
createTable(Table $table)
renameTable($oldTableName, $newTableName)
catch(\Exception $e) $handler
if(!isset($_GET['name'])) $name