/** * */ public function parse(Database $database, Task $task = null) { $stmt = $this->dbh->query("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME <> 'dtproperties'"); // First load the tables (important that this happen before filling out details of tables) $tables = array(); while ($row = $stmt->fetch(PDO::FETCH_NUM)) { $name = $row[0]; if ($name == $this->getMigrationTable()) { continue; } $table = new Table($name); $table->setIdMethod($database->getDefaultIdMethod()); $database->addTable($table); $tables[] = $table; } // Now populate only columns. foreach ($tables as $table) { $this->addColumns($table); } // Now add indexes and constraints. foreach ($tables as $table) { $this->addForeignKeys($table); $this->addIndexes($table); $this->addPrimaryKey($table); } return count($tables); }
public function testGetSequenceNameCustom() { $table = new Table('foo'); $table->setIdMethod(IDMethod::NATIVE); $idMethodParameter = new IdMethodParameter(); $idMethodParameter->setValue('foo_sequence'); $table->addIdMethodParameter($idMethodParameter); $table->setIdMethod(IDMethod::NATIVE); $expected = 'foo_sequence'; $this->assertEquals($expected, $this->getPlatform()->getSequenceName($table)); }
/** * */ public function parse(Database $database, Task $task = null) { $stmt = $this->dbh->query("SELECT name FROM sqlite_master WHERE type='table' UNION ALL SELECT name FROM sqlite_temp_master WHERE type='table' ORDER BY name;"); // First load the tables (important that this happen before filling out details of tables) $tables = array(); while ($row = $stmt->fetch(PDO::FETCH_NUM)) { $name = $row[0]; if ($name == $this->getMigrationTable()) { continue; } $table = new Table($name); $table->setIdMethod($database->getDefaultIdMethod()); $database->addTable($table); $tables[] = $table; } // Now populate only columns. foreach ($tables as $table) { $this->addColumns($table); } // Now add indexes and constraints. foreach ($tables as $table) { $this->addIndexes($table); } return count($tables); }
/** * Searches for tables in the database. Maybe we want to search also the views. * @param Database $database The Database model class to add tables to. * @return int */ public function parse(Database $database, Task $task = null) { $tables = array(); $stmt = $this->dbh->query("SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE'"); $seqPattern = $this->getGeneratorConfig()->getBuildProperty('oracleAutoincrementSequencePattern'); if ($task) { $task->log("Reverse Engineering Table Structures", Project::MSG_VERBOSE); } // First load the tables (important that this happen before filling out details of tables) while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { if (strpos($row['OBJECT_NAME'], '$') !== false) { // this is an Oracle internal table or materialized view - prune continue; } if (strtoupper($row['OBJECT_NAME']) == strtoupper($this->getMigrationTable())) { continue; } $table = new Table($row['OBJECT_NAME']); $table->setIdMethod($database->getDefaultIdMethod()); if ($task) { $task->log("Adding table '" . $table->getName() . "'", Project::MSG_VERBOSE); } $database->addTable($table); // Add columns, primary keys and indexes. $this->addColumns($table); $this->addPrimaryKey($table); $this->addIndexes($table); $pkColumns = $table->getPrimaryKey(); if (count($pkColumns) == 1 && $seqPattern) { $seqName = str_replace('${table}', $tableName, $seqPattern); $seqName = strtoupper($seqName); $stmt2 = $this->dbh->query("SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME = '" . $seqName . "'"); $hasSeq = $stmt2->fetch(PDO::FETCH_ASSOC); if ($hasSeq) { $pkColumns[0]->setAutoIncrement(true); $idMethodParameter = new IdMethodParameter(); $idMethodParameter->setValue($seqName); $table->addIdMethodParameter($idMethodParameter); } } $tables[] = $table; } if ($task) { $task->log("Reverse Engineering Foreign Keys", Project::MSG_VERBOSE); } foreach ($tables as $table) { if ($task) { $task->log("Adding foreign keys for table '" . $table->getName() . "'", Project::MSG_VERBOSE); } $this->addForeignKeys($table); } return count($tables); }
/** * */ public function parse(Database $database, Task $task = null) { $this->addVendorInfo = $this->getGeneratorConfig()->getBuildProperty('addVendorInfo'); $stmt = $this->dbh->query("SHOW FULL TABLES"); // First load the tables (important that this happen before filling out details of tables) $tables = array(); if ($task) { $task->log("Reverse Engineering Tables", Project::MSG_VERBOSE); } while ($row = $stmt->fetch(PDO::FETCH_NUM)) { $name = $row[0]; $type = $row[1]; if ($name == $this->getMigrationTable() || $type != "BASE TABLE") { continue; } if ($task) { $task->log(" Adding table '" . $name . "'", Project::MSG_VERBOSE); } $table = new Table($name); $table->setIdMethod($database->getDefaultIdMethod()); $database->addTable($table); $tables[] = $table; } // Now populate only columns. if ($task) { $task->log("Reverse Engineering Columns", Project::MSG_VERBOSE); } foreach ($tables as $table) { if ($task) { $task->log(" Adding columns for table '" . $table->getName() . "'", Project::MSG_VERBOSE); } $this->addColumns($table); } // Now add indices and constraints. if ($task) { $task->log("Reverse Engineering Indices And Constraints", Project::MSG_VERBOSE); } foreach ($tables as $table) { if ($task) { $task->log(" Adding indices and constraints for table '" . $table->getName() . "'", Project::MSG_VERBOSE); } $this->addForeignKeys($table); $this->addIndexes($table); $this->addPrimaryKey($table); if ($this->addVendorInfo) { $this->addTableVendorInfo($table); } } return count($tables); }
/** * */ public function parse(Database $database, Task $task = null) { $stmt = $this->dbh->query("SELECT version() as ver"); $nativeVersion = $stmt->fetchColumn(); if (!$nativeVersion) { throw new EngineException("Failed to get database version"); } $arrVersion = sscanf($nativeVersion, '%*s %d.%d'); $version = sprintf("%d.%d", $arrVersion[0], $arrVersion[1]); // Clean up $stmt = null; $stmt = $this->dbh->query("SELECT c.oid,\n c.relname, n.nspname\n FROM pg_class c join pg_namespace n on (c.relnamespace=n.oid)\n WHERE c.relkind = 'r'\n AND n.nspname NOT IN ('information_schema','pg_catalog')\n AND n.nspname NOT LIKE 'pg_temp%'\n AND n.nspname NOT LIKE 'pg_toast%'\n ORDER BY relname"); $tableWraps = array(); // First load the tables (important that this happen before filling out details of tables) if ($task) { $task->log("Reverse Engineering Tables", Project::MSG_VERBOSE); } while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $name = $row['relname']; $namespacename = $row['nspname']; if ($name == $this->getMigrationTable()) { continue; } if ($task) { $task->log(" Adding table '" . $name . "' in schema '" . $namespacename . "'", Project::MSG_VERBOSE); } $oid = $row['oid']; $table = new Table($name); if ($namespacename != 'public') { $table->setSchema($namespacename); } $table->setIdMethod($database->getDefaultIdMethod()); $database->addTable($table); // Create a wrapper to hold these tables and their associated OID $wrap = new stdClass(); $wrap->table = $table; $wrap->oid = $oid; $tableWraps[] = $wrap; } // Now populate only columns. if ($task) { $task->log("Reverse Engineering Columns", Project::MSG_VERBOSE); } foreach ($tableWraps as $wrap) { if ($task) { $task->log(" Adding columns for table '" . $wrap->table->getName() . "'", Project::MSG_VERBOSE); } $this->addColumns($wrap->table, $wrap->oid, $version); } // Now add indexes and constraints. if ($task) { $task->log("Reverse Engineering Indices And Constraints", Project::MSG_VERBOSE); } foreach ($tableWraps as $wrap) { if ($task) { $task->log(" Adding indices and constraints for table '" . $wrap->table->getName() . "'", Project::MSG_VERBOSE); } $this->addForeignKeys($wrap->table, $wrap->oid, $version); $this->addIndexes($wrap->table, $wrap->oid, $version); $this->addPrimaryKey($wrap->table, $wrap->oid, $version); } // TODO - Handle Sequences ... return count($tableWraps); }
public function testGetDropTableWithSequenceDDL() { $table = new Table('foo'); $idMethodParameter = new IdMethodParameter(); $idMethodParameter->setValue('foo_sequence'); $table->addIdMethodParameter($idMethodParameter); $table->setIdMethod(IDMethod::NATIVE); $expected = "\nDROP TABLE foo CASCADE CONSTRAINTS;\n\nDROP SEQUENCE foo_sequence;\n"; $this->assertEquals($expected, $this->getPlatform()->getDropTableDDL($table)); }
public function testGetColumnDDLAutoIncrement() { $database = new Database(); $database->setPlatform($this->getPlatform()); $table = new Table('foo_table'); $table->setIdMethod(IDMethod::NATIVE); $database->addTable($table); $column = new Column('foo'); $column->getDomain()->copy($this->getPlatform()->getDomainForType(PropelTypes::BIGINT)); $column->setAutoIncrement(true); $table->addColumn($column); $expected = '"foo" bigserial'; $this->assertEquals($expected, $this->getPlatform()->getColumnDDL($column)); }