public function run($options = array()) { Yentu::greet(); $db = DatabaseManipulator::create(); DatabaseItem::setDriver($db); ChangeReverser::setDriver($db); $previousMigration = ''; if (isset($options['default-schema'])) { $this->schemaCondition = "default_schema = ?"; $this->schemaConditionData[] = $options['default-schema']; } if (empty($options)) { $session = $db->getLastSession(); $operations = $db->query("SELECT id, method, arguments, migration, default_schema FROM yentu_history WHERE {$this->schemaCondition} session = ? ORDER BY id DESC", $this->schemaConditionData + [$session]); } else { $operations = []; foreach ($options['stand_alones'] as $set) { $operations += $this->getOperations($db, $set); } } foreach ($operations as $operation) { if ($previousMigration !== $operation['migration']) { ClearIce::output("Rolling back '{$operation['migration']}' migration" . ($operation['default_schema'] != '' ? " on `{$operation['default_schema']}` schema." : ".") . "\n"); $previousMigration = $operation['migration']; } ChangeReverser::call($operation['method'], json_decode($operation['arguments'], true)); $db->query('DELETE FROM yentu_history WHERE id = ?', array($operation['id'])); } }
private function countOperations($migrationFile) { if ($this->dryDriver === null) { $this->dryDriver = clone $this->driver; $this->dryDriver->setDryRun(true); } ClearIce::pushOutputLevel(ClearIce::OUTPUT_LEVEL_0); DatabaseItem::setDriver($this->dryDriver); require "{$migrationFile}"; DatabaseItem::purge(); DatabaseItem::setDriver($this->driver); ClearIce::popOutputLevel(); $this->driver->setExpectedOperations($this->dryDriver->resetOperations()); }