コード例 #1
0
ファイル: UpdateExecutor.php プロジェクト: addiks/phpsql
 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;
 }
コード例 #2
0
ファイル: AlterExecutor.php プロジェクト: addiks/phpsql
 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;
 }