public function executeJob(StatementJob $statement, array $parameters = array()) { /* @var $statement UpdateStatement */ $result = new TemporaryResult(); // TODO: multiple tables or not? $executionContext = new ExecutionContext($this->schemaManager, $statement, $parameters, $this->valueResolver); /* @var $tableSpecifier TableSpecifier */ $tableSpecifier = $statement->getTables()[0]; /* @var $tableResource Table */ $tableResource = $this->tableManager->getTable($tableSpecifier->getTable(), $tableSpecifier->getDatabase()); /* @var $tableSchema TableSchema */ $tableSchema = $tableResource->getTableSchema(); $indicies = array(); foreach ($tableSchema->getIndexIterator() as $indexId => $indexPage) { /* @var $indexPage Index */ /* @var $index Index */ $index = $tableResource->getIndex($indexPage->getName()); $indicies[] = $index; } /* @var $condition Value */ $condition = $statement->getCondition(); foreach ($tableResource as $rowId => $row) { if ($tableResource instanceof UsesBinaryDataInterface && $tableResource->usesBinaryData()) { $row = $tableResource->convertDataRowToStringRow($row); } $executionContext->setCurrentSourceRow($row); $conditionResult = $this->valueResolver->resolveValue($condition, $executionContext); if ($conditionResult) { $newRow = $row; foreach ($statement->getDataChanges() as $dataChange) { /* @var $dataChange DataChange */ $columnName = (string) $dataChange->getColumn(); $newValue = $dataChange->getValue(); $newValue = $this->valueResolver->resolveValue($newValue, $executionContext); $newRow[$columnName] = $newValue; } $row = $tableResource->convertStringRowToDataRow($row); $newRow = $tableResource->convertStringRowToDataRow($newRow); foreach ($indicies as $index) { /* @var $index Index */ $index->updateRow($row, $newRow, $rowId); } $tableResource->setRowData($rowId, $newRow); } } return $result; }
public function executeJob(StatementJob $statement, array $parameters = array()) { /* @var $statement AlterStatement */ $executionContext = new ExecutionContext($this->schemaManager, $statement, $parameters); /* @var $tableSpecifier TableSpecifier */ $tableSpecifier = $statement->getTable(); /* @var $table TableInterface */ $table = $this->tableManager->getTable($tableSpecifier->getTable(), $tableSpecifier->getDatabase()); $tableId = $this->tableManager->getTableIdByName($tableSpecifier->getTable(), $tableSpecifier->getDatabase()); /* @var $tableSchema TableSchema */ $tableSchema = $table->getTableSchema(); foreach ($statement->getDataChanges() as $dataChange) { /* @var $dataChange DataChange */ switch ($dataChange->getAttribute()) { case AlterAttributeType::ADD(): /* @var $columnDefinition ColumnDefinition */ $columnDefinition = $dataChange->getSubject(); /* @var $columnSchema ColumnSchema */ $columnSchema = $this->convertColumnDefinitionToColumnSchema($columnDefinition, $executionContext); $columnId = $tableSchema->addColumnSchema($columnSchema); /* @var $tableFactory TableFactoryInterface */ $tableFactory = $this->tableManager->getTableFactoryByTable($tableSpecifier->getTable(), $tableSpecifier->getDatabase()); $tableFactory->addColumnToTable($tableSpecifier->getDatabase(), $tableId, $columnId, $table, $columnSchema); break; case AlterAttributeType::DROP(): /* @var $columnSpecifier ColumnSpecifier */ $columnSpecifier = $dataChange->getSubject(); $columnId = $tableSchema->getColumnIndex($columnSpecifier->getColumn()); $tableSchema->removeColumn($columnId); break; case AlterAttributeType::SET_AFTER(): case AlterAttributeType::SET_FIRST(): case AlterAttributeType::MODIFY(): /* @var $columnDefinition ColumnDefinition */ $columnDefinition = $dataChange->getSubject(); /* @var $columnSchema ColumnSchema */ $columnSchema = $this->convertColumnDefinitionToColumnSchema($columnDefinition, $executionContext); $columnId = $tableSchema->getColumnIndex($columnSchema->getName()); /* @var $oldColumnSchema ColumnSchema */ $oldColumnSchema = $tableSchema->getColumn($columnId); $columnSchema->setIndex($oldColumnSchema->getIndex()); $tableSchema->writeColumn($columnId, $columnSchema); /* @var $tableFactory TableFactoryInterface */ $tableFactory = $this->tableManager->getTableFactoryByTable($tableSpecifier->getTable(), $tableSpecifier->getDatabase()); $tableFactory->modifyColumnOnTable($tableSpecifier->getDatabase(), $tableId, $columnId, $table, $columnSchema); if ($dataChange->getAttribute() === AlterAttributeType::SET_FIRST()) { $subjectColumnIndex = $tableSchema->getColumnIndex($columnDefinition->getName()); $subjectColumnSchema = $tableSchema->getColumn($subjectColumnIndex); $oldIndex = $subjectColumnSchema->getIndex(); foreach ($tableSchema->getColumnIterator() as $columnIndex => $columnPage) { if ($columnPage->getIndex() < $oldIndex) { $columnPage->setIndex($columnPage->getIndex() + 1); $tableSchema->writeColumn($columnIndex, $columnPage); } } $subjectColumnSchema->setIndex(0); $tableSchema->writeColumn($subjectColumnIndex, $subjectColumnSchema); } elseif ($dataChange->getAttribute() === AlterAttributeType::SET_AFTER()) { /* @var $afterColumn ColumnSpecifier */ $afterColumn = $dataChange->getValue(); $afterColumnIndex = $tableSchema->getColumnIndex($afterColumn->getColumn()); $afterColumnSchema = $tableSchema->getColumn($afterColumnIndex); $subjectColumnIndex = $tableSchema->getColumnIndex($columnDefinition->getName()); $subjectColumnSchema = $tableSchema->getColumn($subjectColumnIndex); if ($afterColumnSchema->getIndex() < $subjectColumnSchema->getIndex()) { foreach ($tableSchema->getColumnIterator() as $columnIndex => $columnPage) { if ($columnPage->getIndex() > $afterColumnSchema->getIndex() && $columnPage->getIndex() < $subjectColumnSchema->getIndex()) { $columnPage->setIndex($columnPage->getIndex() + 1); $tableSchema->writeColumn($columnIndex, $columnPage); } } $subjectColumnSchema->setIndex($afterColumnSchema->getIndex() + 1); $tableSchema->writeColumn($subjectColumnIndex, $subjectColumnSchema); } else { foreach ($tableSchema->getColumnIterator() as $columnIndex => $columnPage) { if ($columnPage->getIndex() > $afterColumnSchema->getIndex() && $columnPage->getIndex() < $subjectColumnSchema->getIndex()) { $columnPage->setIndex($columnPage->getIndex() - 1); $tableSchema->writeColumn($columnIndex, $columnPage); } } $subjectColumnSchema->setIndex($afterColumnSchema->getIndex()); $tableSchema->writeColumn($subjectColumnIndex, $subjectColumnSchema); $afterColumnSchema->setIndex($afterColumnSchema->getIndex() - 1); $tableSchema->writeColumn($afterColumnSchema, $afterColumnSchema); } } break; case AlterAttributeType::RENAME(): $databaseSchema = $this->schemaManager->getSchema($tableSpecifier->getDatabase()); /* @var $tablePage SchemaPage */ $tableIndex = $databaseSchema->getTableIndex($tableSpecifier->getTable()); $tablePage = $databaseSchema->getTablePage($tableIndex); $tablePage->setName($dataChange->getValue()); $databaseSchema->registerTableSchema($tablePage, $tableIndex); break; case AlterAttributeType::CHARACTER_SET(): break; case AlterAttributeType::COLLATE(): break; case AlterAttributeType::CONVERT(): break; case AlterAttributeType::DEFAULT_VALUE(): break; case AlterAttributeType::ORDER_BY_ASC(): break; case AlterAttributeType::ORDER_BY_DESC(): break; } } foreach ($this->tableManager->getTableFactories() as $tableFactory) { /* @var $tableFactory TableFactoryInterface */ if ($tableFactory instanceof InformationSchemaTableFactory) { $tableFactory->clearCache(); } } $result = new TemporaryResult(); return $result; }