Exemple #1
0
 /**
  * Storage processing
  * @return string
  */
 public function process()
 {
     # renamed fields, remove adds and drops
     foreach ($this->renamedFields as $key => $array) {
         if ($array->counter == 2 and isset($array->from) and isset($array->to) and isset($array->modelName)) {
             $field = $this->queue[PerfORMStorage::FIELD_ADD][$array->to . '|' . $array->modelName]->values['field'];
             unset($this->queue[PerfORMStorage::FIELD_ADD][$array->to . '|' . $array->modelName]);
             unset($this->queue[PerfORMStorage::FIELD_DROP][$array->from . '|' . $array->modelName]);
             $this->query('update [fields] set [name] = %s where [name] = %s and [table] = %s', $array->to, $array->from, $array->modelName);
             $this->query('update [tables] set [hash] = %s where [name] = %s', $field->getModel()->getHash(), $array->modelName);
             PerfORMController::getBuilder()->renameField($field, $array->from);
         }
     }
     # renamed tables, remove adds and drops
     foreach ($this->renamedTables as $key => $array) {
         if ($array->counter == 2 and isset($array->from) and isset($array->to)) {
             $model = $this->queue[PerfORMStorage::TABLE_ADD][$array->to]->values['model'];
             unset($this->queue[PerfORMStorage::TABLE_ADD][$array->to]);
             unset($this->queue[PerfORMStorage::TABLE_DROP][$array->from]);
             $this->query('update [tables] set [name] = %s where [name] = %s', $array->to, $array->from);
             $this->query('update [fields] set [table] = %s where [table] = %s', $array->to, $array->from);
             PerfORMController::getBuilder()->renameTable($model, $array->from);
             $this->query('delete from [indexes] where [table] = %s', $array->from);
             foreach ($model->getIndexes() as $index) {
                 $this->query('insert into [indexes] values( null, %s, %s, %s, %s)', $index->getName(), $index->getModel()->getTableName(), $index->getHash(), $index->isUnique());
                 PerfORMController::getBuilder()->renameIndex($index, $array->from);
             }
         }
     }
     # renamed views, remove adds and drops
     foreach ($this->renamedViews as $key => $array) {
         if ($array->counter == 2 and isset($array->from) and isset($array->to)) {
             $model = $this->queue[PerfORMStorage::VIEW_ADD][$array->to]->values['model'];
             unset($this->queue[PerfORMStorage::VIEW_ADD][$array->to]);
             unset($this->queue[PerfORMStorage::VIEW_DROP][$array->from]);
             $this->query('update [views] set [name] = %s where [name] = %s', $array->to, $array->from);
             $this->query('update [views] set [table] = %s where [table] = %s', $array->to, $array->from);
             PerfORMController::getBuilder()->renameView($model, $array->from);
         }
     }
     foreach ($this->queue as $operation => $actions) {
         foreach ($actions as $key => $action) {
             //list($field, $table)= explode('|', $key);
             switch ($operation) {
                 case PerfORMStorage::FIELD_ADD:
                     $field = $action->values['field'];
                     $builder = PerfORMController::getBuilder('fieldadd');
                     $template = $builder->getTemplate('field-add');
                     $fieldInfo = $builder->getField($field);
                     $fieldInfo->nullable = true;
                     $template->field = $fieldInfo;
                     PerfORMController::getBuilder()->addToBuffer($builder->renderTemplate($template), 'alters');
                     //PerfORMController::getConnection()->nativeQuery($sql);
                     $result = PerfORMController::getConnection()->query('select * from %n', $field->getModel()->getTableName());
                     $pk = $field->getModel()->getPrimaryKey();
                     foreach ($result as $row) {
                         if (!is_null($default = $field->getDefault($row))) {
                             PerfORMController::getBuilder()->addToBuffer(PerfORMController::getConnection()->sql('update %n set %n = %' . $field->getType() . ' where %n = %i;', $field->getModel()->getTableName(), $field->getName(), $default, $pk, $row->{$pk}), 'alters');
                         } elseif (!$field->isNullable()) {
                             throw new Exception("Unable to find default value for field '" . $field->getName() . "' (id=" . $row->{$pk} . ")");
                         }
                     }
                     if (!$field->isNullable()) {
                         $fieldInfo->nullable = false;
                         $template = $builder->getTemplate('field-change-nullable');
                         $template->field = $fieldInfo;
                         PerfORMController::getBuilder()->addToBuffer($builder->renderTemplate($template), 'alters');
                         //PerfORMController::getConnection()->nativeQuery($sql);
                     }
                     //PerfORMController::getBuilder()->addField();
                     $this->updateModelSync($action->values['field']->getModel());
                     break;
                 case PerfORMStorage::FIELD_DROP:
                     PerfORMController::getBuilder()->dropField($action->values['fieldName'], $action->values['model']);
                     $this->updateModelSync($action->values['model']);
                     break;
                 case PerfORMStorage::TABLE_ADD:
                     PerfORMController::getBuilder()->createTable($action->values['model']);
                     foreach ($action->values['model']->getIndexes() as $index) {
                         $this->addIndexToModel($index);
                     }
                     break;
                 case PerfORMStorage::TABLE_DROP:
                     PerfORMController::getBuilder()->dropTable($action->values['model']);
                     break;
                 case PerfORMStorage::VIEW_ADD:
                     PerfORMController::getBuilder()->createView($action->values['model']);
                     break;
                 case PerfORMStorage::VIEW_DROP:
                     PerfORMController::getBuilder()->dropView($action->values['model']);
                     break;
             }
             if (is_array($action->sql)) {
                 array_walk($action->sql, array($this, 'query'));
             } else {
                 $this->query($action->sql);
             }
         }
     }
     return PerfORMController::getBuilder()->getSql();
 }