if (($res = YAMLDDLParser::loadAllDDLFiles($ddlDir, $allCurrentDDL)) != 0) { exit($res); } $mapTargetTableNames = MyConnectionFactory::getMapTargetTableNames($connectionName, $connectionParamsByName, $allCurrentDDL); unset($allCurrentDDL, $res); if (!empty($mapTargetTableNames)) { if (!empty($allowedTableNames)) { $allowedTableNames = array_intersect($allowedTableNames, $mapTargetTableNames); } else { $allowedTableNames = $mapTargetTableNames; } } // Load the DDL from the database, filtering out all non-allowed tables. $db = MyConnectionFactory::getConnection($connectionName); $dialect = $db->getDialect(); $loader = new ConnectionDDLLoader(); $databaseDDL = $loader->loadDDL($db, false, $databaseAllowedTableNames); $db->close(); // Load the current DDL from the DDL files. $currentDDL = new DDL(array()); if (($res = YAMLDDLParser::loadAllDDLFiles($ddlDir, $currentDDL, $allowedTableNames, $dbmap)) != 0) { exit($res); } // If we have map-target tables, remove all foreign keys from the current DDL which // reference tables which are not map targets (because those tables should not exist // in this database). if (!empty($mapTargetTableNames)) { $anyDeleted = false; for ($i = 0, $n = count($currentDDL->topLevelEntities); $i < $n; $i++) { if ($currentDDL->topLevelEntities[$i] instanceof DDLForeignKey && !in_array($currentDDL->topLevelEntities[$i]->foreignTableName, $mapTargetTableNames)) { unset($currentDDL->topLevelEntities[$i]);
case 3: $dbDatabase = $arg; $argState++; break; case 4: $allowedTableNames[] = $arg; break; // remain in this state } } if ($argState != 4) { usage(); exit(1); } switch ($dialect) { case 'mysql': $db = new MySQLiConnection($dbServer, $dbUsername, $dbPassword, $dbDatabase); break; case 'pgsql': $db = new PostgreSQLConnection($dbServer, $dbUsername, $dbPassword, $dbDatabase); break; default: fprintf(STDERR, "Unsupported dialect: %s\n", $dialect); } $loader = new ConnectionDDLLoader(); $ddl = $loader->loadDDL($db, $generateInserts, $allowedTableNames); ///print_r($ddl); $db->close(); $serializer = new YAMLDDLSerializer(); echo $serializer->serialize($ddl); exit(0);
function getTableDDL($tableName, $_ddlDir = null) { global $ddlFromDB, $dbClass, $dbHost, $dbUser, $dbPassword, $dbDatabase, $ddlDir; $ddl = new DDL(); if ($ddlFromDB) { // Load DDL from database. if (!class_exists($dbClass, false)) { include dirname(dirname(__FILE__)) . '/phpdaogen/' . $dbClass . '.class.php'; } $db = new $dbClass($dbHost, $dbUser, $dbPassword, $dbDatabase); $loader = new ConnectionDDLLoader(); $tmpddl = $loader->loadDDL($db, false, array($tableName)); $db->close(); mergeDDLForTable($ddl, $tmpddl, $tableName); unset($tmpddl); } else { // Load DDL from DDL file(s). if ($_ddlDir === null) { $_ddlDir = $ddlDir; } if (($dp = @opendir($_ddlDir)) !== false) { while (($fn = readdir($dp)) !== false) { if ($fn == '.' || $fn == '..') { continue; } $fn = $_ddlDir . '/' . $fn; if (is_dir($fn)) { if (($tmpddl = getTableDDL($tableName, $fn)) !== false) { mergeDDLForTable($ddl, $tmpddl, $tableName); unset($tmpddl); } continue; } if (is_file($fn) && strtolower(substr($fn, -9)) == '.ddl.yaml' || strtolower(substr($fn, -8)) == '.ddl.yml') { try { $parser = new YAMLDDLParser(); if (($tmpddl = $parser->parseFromYAML(file_get_contents($fn))) !== false) { mergeDDLForTable($ddl, $tmpddl, $tableName); unset($tmpddl); } unset($tmpddl); continue; } catch (Exception $ex) { fprintf(STDERR, "%s\n%s\n", $ex->getMessage(), $ex->getTrace()); if ($exitval == 0) { $exitval = 2; } } } } closedir($dp); } } return $ddl; }
} //echo "includeDirnameCount=$includeDirnameCount\n"; //echo "includeClassPathPrefix=$includeClassPathPrefix\n"; if ($haveDB) { switch ($dialect) { case 'mysql': $db = new MySQLiConnection($dbServer, $dbUsername, $dbPassword, $dbDatabase); break; case 'pgsql': $db = new PostgreSQLConnection($dbServer, $dbUsername, $dbPassword, $dbDatabase); break; default: fprintf(STDERR, "Unsupported dialect: %s\n", $dialect); exit(1); } $loader = new ConnectionDDLLoader(); $ddl = $loader->loadDDL($db, false, $allowedTableNames); $db->close(); unset($db); } else { // Load new DDL from DDL file(s). $aggregateDDL = new DDL(); $res = YAMLDDLParser::loadAllDDLFiles($ddlDir, $aggregateDDL, $allowedTableNames); if ($res != 0) { exit($res); } $ddl = $aggregateDDL; unset($aggregateDDL); } ///print_r($ddl); $generator = new DAOClassGenerator();