示例#1
0
 public function execute()
 {
     $options = $this->options;
     $logger = $this->logger;
     $id = $this->getCurrentDataSourceId();
     $logger->debug("Finding schema classes...");
     $schemas = $this->findSchemasByArguments(func_get_args());
     $logger->debug("Initialize schema builder...");
     $connectionManager = ConnectionManager::getInstance();
     $conn = $connectionManager->getConnection($id);
     $driver = $connectionManager->getQueryDriver($id);
     $sqlBuilder = SqlBuilder::create($driver, array('rebuild' => $options->rebuild, 'clean' => $options->clean));
     $builder = new DatabaseBuilder($conn, $sqlBuilder, $this->logger);
     $sqls = $builder->build($schemas);
     $sqlOutput = join("\n", $sqls);
     if ($file = $this->options->file) {
         $fp = fopen($file, 'w');
         fwrite($fp, $sqlOutput);
         fclose($fp);
     }
     if ($this->options->basedata) {
         $collection = new SchemaCollection($schemas);
         $collection = $collection->evaluate();
         $seedBuilder = new SeedBuilder($this->getConfigLoader(), $this->logger);
         $seedBuilder->build($collection);
     }
     $time = time();
     $logger->info("Setting migration timestamp to {$time}");
     $metadata = new Metadata($driver, $conn);
     // update migration timestamp
     $metadata['migration'] = $time;
     $logger->info($logger->formatter->format('Done. ' . count($schemas) . " schema tables were generated into data source '{$id}'.", 'green'));
 }
示例#2
0
 public function __construct(BaseDriver $driver, PDO $connection)
 {
     $c = ServiceContainer::getInstance();
     $this->driver = $driver;
     $this->connection = $connection;
     $this->logger = $c['logger'] ?: Console::getInstance()->getLogger();
     $this->builder = SqlBuilder::create($driver);
 }
示例#3
0
 public function execute()
 {
     $options = $this->options;
     $logger = $this->logger;
     $configLoader = $this->getConfigLoader(true);
     $id = $this->getCurrentDataSourceId();
     $logger->debug('Finding schema classes...');
     $schemas = SchemaUtils::findSchemasByArguments($configLoader, func_get_args(), $this->logger);
     $logger->debug('Initialize schema builder...');
     if ($output = $this->options->output) {
         $dataSourceConfig = $configLoader->getDataSource($id);
         $driverType = $dataSourceConfig['driver'];
         switch ($driverType) {
             case 'sqlite':
                 $driver = new SQLiteDriver();
                 break;
             case 'mysql':
                 $driver = new MySQLDriver();
                 break;
             case 'pgsql':
                 $driver = new PgSQLDriver();
                 break;
             default:
                 throw new Exception("Unsupported driver type: {$driverType}");
                 break;
         }
         $sqlBuilder = SqlBuilder::create($driver, ['rebuild' => $options->rebuild, 'clean' => $options->clean]);
         $fp = fopen($output, 'w');
         foreach ($schemas as $schema) {
             $sqls = $sqlBuilder->buildTable($schema);
             fwrite($fp, implode("\n", $sqls));
             $sqls = $sqlBuilder->buildIndex($schema);
             fwrite($fp, implode("\n", $sqls));
             $sqls = $sqlBuilder->buildForeignKeys($schema);
             fwrite($fp, implode("\n", $sqls));
         }
         fclose($fp);
         $this->logger->warn('Warning: seeding is not supported when using --output option.');
     } else {
         $connectionManager = ConnectionManager::getInstance();
         $conn = $connectionManager->getConnection($id);
         $driver = $connectionManager->getQueryDriver($id);
         $sqlBuilder = SqlBuilder::create($driver, ['rebuild' => $options->rebuild, 'clean' => $options->clean]);
         $bootstrap = new Bootstrap($conn, $sqlBuilder, $this->logger);
         $bootstrap->build($schemas);
         if ($this->options->basedata) {
             $bootstrap->seed($schemas, $configLoader);
         }
         $time = time();
         $logger->info("Setting migration timestamp to {$time}");
         $metadata = new Metadata($conn, $driver);
         // update migration timestamp
         $metadata['migration'] = $time;
         $logger->info($logger->formatter->format('Done. ' . count($schemas) . " schema tables were generated into data source '{$id}'.", 'green'));
     }
 }
示例#4
0
 public function setUp()
 {
     $annnotations = $this->getAnnotations();
     $configLoader = ConfigLoader::getInstance();
     $configLoader->loadFromSymbol(true);
     $configLoader->setDefaultDataSourceId($this->getDriverType());
     $connManager = ConnectionManager::getInstance();
     $connManager->init($configLoader);
     try {
         $dbh = $connManager->getConnection($this->getDriverType());
     } catch (PDOException $e) {
         if ($this->allowConnectionFailure) {
             $this->markTestSkipped(sprintf("Can not connect to database by data source '%s' message:'%s' config:'%s'", $this->getDriverType(), $e->getMessage(), var_export($configLoader->getDataSource($this->getDriverType()), true)));
             return;
         } else {
             echo sprintf("Can not connect to database by data source '%s' message:'%s' config:'%s'", $this->getDriverType(), $e->getMessage(), var_export($configLoader->getDataSource($this->getDriverType()), true));
             throw $e;
         }
     }
     $driver = $connManager->getQueryDriver($this->getDriverType());
     $this->assertInstanceOf('SQLBuilder\\Driver\\BaseDriver', $driver, 'QueryDriver object OK');
     // Rebuild means rebuild the database for new tests
     $rebuild = true;
     $basedata = true;
     if (isset($annnotations['method']['rebuild'][0]) && $annnotations['method']['rebuild'][0] == 'false') {
         $rebuild = false;
     }
     if (isset($annnotations['method']['basedata'][0]) && $annnotations['method']['basedata'][0] == 'false') {
         $basedata = false;
     }
     if ($rebuild) {
         $builder = SqlBuilder::create($driver, array('rebuild' => true));
         $this->assertNotNull($builder);
         // $schemas = ClassUtils::schema_classes_to_objects($this->getModels());
         $schemas = ClassUtils::schema_classes_to_objects($this->getModels());
         foreach ($schemas as $schema) {
             $sqls = $builder->build($schema);
             $this->assertNotEmpty($sqls);
             foreach ($sqls as $sql) {
                 $dbh->query($sql);
             }
         }
         if ($basedata) {
             $runner = new SeedBuilder($this->config, $this->logger);
             foreach ($schemas as $schema) {
                 $runner->buildSchemaSeeds($schema);
             }
             if ($scripts = $this->config->getSeedScripts()) {
                 foreach ($scripts as $script) {
                     $runner->buildScriptSeed($script);
                 }
             }
         }
     }
 }
示例#5
0
 public function setUp()
 {
     $annnotations = $this->getAnnotations();
     $connManager = ConnectionManager::getInstance();
     $dataSourceConfig = self::createDataSourceConfig($this->driver);
     if ($dataSourceConfig) {
         $connManager->addDataSource('default', $dataSourceConfig);
     } else {
         $this->markTestSkipped("{$this->driver} database configuration is missing.");
     }
     try {
         $dbh = $connManager->getConnection('default');
     } catch (PDOException $e) {
         $this->markTestSkipped('Can not connect to database, test skipped: ' . $e->getMessage());
         return;
     }
     $driver = ConnectionManager::getInstance()->getQueryDriver('default');
     ok($driver, 'QueryDriver object OK');
     // Rebuild means rebuild the database for new tests
     $rebuild = true;
     $basedata = true;
     if (isset($annnotations['method']['rebuild'][0]) && $annnotations['method']['rebuild'][0] == 'false') {
         $rebuild = false;
     }
     if (isset($annnotations['method']['basedata'][0]) && $annnotations['method']['basedata'][0] == 'false') {
         $basedata = false;
     }
     if ($rebuild) {
         $builder = SqlBuilder::create($driver, array('rebuild' => true));
         $this->assertNotNull($builder);
         // $schemas = ClassUtils::schema_classes_to_objects($this->getModels());
         $schemas = ClassUtils::schema_classes_to_objects($this->getModels());
         foreach ($schemas as $schema) {
             $sqls = $builder->build($schema);
             $this->assertNotEmpty($sqls);
             foreach ($sqls as $sql) {
                 $dbh->query($sql);
             }
         }
         if ($basedata) {
             $runner = new SeedBuilder($this->config, $this->logger);
             foreach ($schemas as $schema) {
                 $runner->buildSchemaSeeds($schema);
             }
             if ($scripts = $this->config->getSeedScripts()) {
                 foreach ($scripts as $script) {
                     $runner->buildScriptSeed($script);
                 }
             }
         }
     }
 }
示例#6
0
 /**
  * This method initialize the metadata table if needed.
  */
 public function init()
 {
     $parser = TableParser::create($this->driver, $this->connection);
     $tables = $parser->getTables();
     // if the __meta__table is not found, we should create one to prevent error.
     // this will be needed for the compatibility of the older version lazyrecord.
     if (!in_array('__meta__', $tables)) {
         $schema = new \LazyRecord\Model\MetadataSchema();
         $builder = \LazyRecord\SqlBuilder\SqlBuilder::create($this->driver);
         $sqls = $builder->build($schema);
         foreach ($sqls as $sql) {
             $this->connection->query($sql);
         }
     }
 }
示例#7
0
 public function insertIntoDataSource($driverType, $schema)
 {
     $connManager = LazyRecord\ConnectionManager::getInstance();
     $connManager->free();
     $this->registerDataSource($driverType);
     $pdo = $connManager->getConnection($driverType);
     $this->assertInstanceOf('PDO', $pdo);
     $queryDriver = $connManager->getQueryDriver($driverType);
     $builder = SqlBuilder::create($queryDriver, array('rebuild' => true));
     $builder->build($schema);
     $sqls = $builder->build($schema);
     $this->assertNotEmpty($sqls);
     foreach ($sqls as $sql) {
         $this->assertQueryOK($pdo, $sql);
     }
     $this->assertTableExists($pdo, $schema->getTable());
 }
 public function insertIntoDataSource($schema)
 {
     $connManager = LazyRecord\ConnectionManager::getInstance();
     $configLoader = ConfigLoader::getInstance();
     $configLoader->loadFromSymbol(true);
     $connManager->init($configLoader);
     $pdo = $connManager->getConnection(self::getCurrentDriverType());
     $this->assertInstanceOf('PDO', $pdo);
     $queryDriver = $connManager->getQueryDriver(self::getCurrentDriverType());
     $builder = SqlBuilder::create($queryDriver, array('rebuild' => true));
     $builder->build($schema);
     $sqls = $builder->build($schema);
     $this->assertNotEmpty($sqls);
     foreach ($sqls as $sql) {
         $this->assertQueryOK($pdo, $sql);
     }
     $this->assertTableExists($pdo, $schema->getTable());
 }
示例#9
0
 public function setUp()
 {
     if ($this->onlyDriver !== null && $this->getDataSource() != $this->onlyDriver) {
         return $this->markTestSkipped("{$this->onlyDriver} only");
     }
     $this->prepareConnection();
     // Ensure that we use the correct default data source ID
     $this->assertEquals($this->getDataSource(), $this->config->getDefaultDataSourceId());
     $this->assertInstanceOf('SQLBuilder\\Driver\\BaseDriver', $this->queryDriver, 'QueryDriver object OK');
     // Rebuild means rebuild the database for new tests
     $annnotations = $this->getAnnotations();
     $rebuild = true;
     $basedata = true;
     if (isset($annnotations['method']['rebuild'][0]) && $annnotations['method']['rebuild'][0] == 'false') {
         $rebuild = false;
     }
     if (isset($annnotations['method']['basedata'][0]) && $annnotations['method']['basedata'][0] == 'false') {
         $basedata = false;
     }
     $schemas = ClassUtils::schema_classes_to_objects($this->getModels());
     if (false === $this->schemaHasBeenBuilt) {
         $g = new SchemaGenerator($this->config);
         $g->setForceUpdate(true);
         $g->generate($schemas);
         $this->schemaHasBeenBuilt = true;
     }
     if ($rebuild === false) {
         $tableParser = TableParser::create($this->conn, $this->queryDriver, $this->config);
         $tables = $tableParser->getTables();
         $schemas = array_filter($schemas, function ($schema) use($tables) {
             return !in_array($schema->getTable(), $tables);
         });
     }
     $this->sqlBuilder = SqlBuilder::create($this->queryDriver, array('rebuild' => $rebuild));
     $this->bootstrap = new Bootstrap($this->conn, $this->sqlBuilder, $this->logger);
     $this->bootstrap->build($schemas);
     if ($rebuild && $basedata) {
         $seeder = new SeedBuilder($this->logger);
         $seeder->build(new SchemaCollection($schemas));
         $seeder->buildConfigSeeds($this->config);
     }
 }
示例#10
0
 public function buildSchemaTable(BaseDriver $driver, PDO $conn, DeclareSchema $schema, array $options = ['rebuild' => true])
 {
     $builder = SqlBuilder::create($driver, $options);
     $this->assertNotNull($builder);
     $sqls = $builder->build($schema);
     foreach ($sqls as $sql) {
         $conn->query($sql);
     }
 }
示例#11
0
 protected function buildSchemaTable(PDO $conn, BaseDriver $driver, DeclareSchema $schema, array $options = ['rebuild' => true])
 {
     $builder = SqlBuilder::create($driver, $options);
     $sqls = array_filter(array_merge($builder->prepare(), $builder->build($schema), $builder->finalize()));
     foreach ($sqls as $sql) {
         $conn->query($sql);
     }
 }