public function testGetConstantName() { $xmlToAppData = new XmlToAppData(new MysqlPlatform(), "defaultpackage", null); $appData = $xmlToAppData->parseFile('fixtures/bookstore/behavior-schema.xml'); $column = $appData->getDatabase("bookstore-behavior")->getTable('table1')->getColumn('title'); $this->assertEquals('Table1Peer::TITLE', $column->getConstantName(), 'getConstantName() returns the complete constant name by default'); }
public function setUp() { // run only once to save execution time if (null == self::$database) { $xmlToAppData = new XmlToAppData(new DefaultPlatform()); $appData = $xmlToAppData->parseFile(realpath(dirname(__FILE__) . '/../../../../fixtures/bookstore/schema.xml')); self::$database = $appData->getDatabase("bookstore"); } }
public function testIsLocalColumnsRequired() { $xmlToAppData = new XmlToAppData(new MysqlPlatform(), "defaultpackage", null); $appData = $xmlToAppData->parseFile('fixtures/bookstore/schema.xml'); $fk = $appData->getDatabase("bookstore")->getTable('book')->getColumnForeignKeys('publisher_id'); $this->assertFalse($fk[0]->isLocalColumnsRequired()); $fk = $appData->getDatabase("bookstore")->getTable('review')->getColumnForeignKeys('book_id'); $this->assertTrue($fk[0]->isLocalColumnsRequired()); }
public function testAddBehavior() { $platform = new MysqlPlatform(); $config = new GeneratorConfig(); $config->setBuildProperties(array('propel.behavior.timestampable.class' => 'propel.engine.behavior.TimestampableBehavior')); $platform->setGeneratorConfig($config); $xmlToAppData = new XmlToAppData($platform, "defaultpackage", null); $appData = $xmlToAppData->parseFile('fixtures/bookstore/behavior-schema.xml'); $table = $appData->getDatabase("bookstore-behavior")->getTable('table1'); $this->assertThat($table->getBehavior('timestampable'), $this->isInstanceOf('TimestampableBehavior'), 'addBehavior() uses the behavior class defined in build.properties'); }
protected function getDatabasesFromSchema(\SplFileInfo $file) { $transformer = new \XmlToAppData(null, null, 'UTF-8'); $config = new \QuickGeneratorConfig(); if (file_exists($propelIni = $this->getContainer()->getParameter('kernel.root_dir') . '/config/propel.ini')) { foreach ($this->getProperties($propelIni) as $key => $value) { if (0 === strpos($key, 'propel.')) { $newKey = substr($key, strlen('propel.')); $j = strpos($newKey, '.'); while (false !== $j) { $newKey = substr($newKey, 0, $j) . ucfirst(substr($newKey, $j + 1)); $j = strpos($newKey, '.'); } $config->setBuildProperty($newKey, $value); } } } $transformer->setGeneratorConfig($config); return $transformer->parseFile($file->getPathName())->getDatabases(); }
/** * Gets all matching XML schema files and loads them into data models for class. * @return void */ protected function loadDataModels() { $ads = array(); // Get all matched files from schemaFilesets foreach ($this->schemaFilesets as $fs) { $ds = $fs->getDirectoryScanner($this->project); $srcDir = $fs->getDir($this->project); $dataModelFiles = $ds->getIncludedFiles(); $platform = $this->getGeneratorConfig()->getConfiguredPlatform(); // Make a transaction for each file foreach ($dataModelFiles as $dmFilename) { $this->log("Processing: " . $dmFilename); $xmlFile = new PhingFile($srcDir, $dmFilename); $dom = new DomDocument('1.0', 'UTF-8'); $dom->load($xmlFile->getAbsolutePath()); // normalize (or transform) the XML document using XSLT if ($this->xslFile) { $this->log("Transforming " . $xmlFile->getPath() . " using stylesheet " . $this->xslFile->getPath(), Project::MSG_VERBOSE); if (!class_exists('XSLTProcessor')) { $this->log("Could not perform XLST transformation. Make sure PHP has been compiled/configured to support XSLT.", Project::MSG_ERR); } else { // modify schema to include any external schema's (and remove the external-schema nodes) $this->includeExternalSchemas($dom, $srcDir); // normalize the document using normalizer stylesheet $xsl = new XsltProcessor(); $xsl->importStyleSheet(DomDocument::load($this->xslFile->getAbsolutePath())); $transformed = $xsl->transformToDoc($dom); $newXmlFilename = substr($xmlFile->getName(), 0, strrpos($xmlFile->getName(), '.')) . '-transformed.xml'; // now overwrite previous vars to point to newly transformed file $xmlFile = new PhingFile($srcDir, $newXmlFilename); $transformed->save($xmlFile->getAbsolutePath()); $this->log("\t- Using new (post-transformation) XML file: " . $xmlFile->getPath(), Project::MSG_VERBOSE); $dom = new DomDocument('1.0', 'UTF-8'); $dom->load($xmlFile->getAbsolutePath()); } } // validate the XML document using XSD schema if ($this->validate && $this->xsdFile) { $this->log("Validating XML doc (" . $xmlFile->getPath() . ") using schema file " . $this->xsdFile->getPath(), Project::MSG_VERBOSE); if (!$dom->schemaValidate($this->xsdFile->getAbsolutePath())) { throw new EngineException("XML schema file (" . $xmlFile->getPath() . ") does not validate. See warnings above for reasons validation failed (make sure error_reporting is set to show E_WARNING if you don't see any).", $this->getLocation()); } } $xmlParser = new XmlToAppData($platform, $this->getTargetPackage(), $this->dbEncoding); $ad = $xmlParser->parseFile($xmlFile->getAbsolutePath()); $ad->setName($dmFilename); // <-- Important: use the original name, not the -transformed name. $ads[] = $ad; } } if (empty($ads)) { throw new BuildException("No schema files were found (matching your schema fileset definition)."); } if (!$this->packageObjectModel) { $this->dataModels = $ads; $this->databaseNames = array(); // doesn't seem to be used anywhere $this->dataModelDbMap = array(); // Different datamodels may state the same database // names, we just want the unique names of databases. foreach ($this->dataModels as $dm) { $database = $dm->getDatabase(); $this->dataModelDbMap[$dm->getName()] = $database->getName(); $this->databaseNames[$database->getName()] = $database->getName(); // making list of *unique* dbnames. } } else { $this->joinDatamodels($ads); $this->dataModels[0]->getDatabases(); // calls doFinalInitialization() } $this->dataModelsLoaded = true; }
public function testParseFileExternalSchema() { $path = realpath(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'outerSchema.xml'); $xtad = new XmlToAppData(); $appData = $xtad->parseFile($path); $expectedAppData = <<<EOF <app-data> <database name="foo" defaultIdMethod="native" defaultPhpNamingMethod="underscore" defaultTranslateMethod="none"> <table name="bar1" phpName="Bar1" idMethod="native" skipSql="false" readOnly="false" reloadOnInsert="false" reloadOnUpdate="false" abstract="false"> <column name="id" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/> </table> <table name="bar2" phpName="Bar2" idMethod="native" skipSql="false" readOnly="false" reloadOnInsert="false" reloadOnUpdate="false" forReferenceOnly="true" abstract="false"> <column name="id" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/> </table> </database> </app-data> EOF; $this->assertEquals($expectedAppData, $appData->toString()); }
public function testUniqueTableName() { $platform = new MysqlPlatform(); $config = new GeneratorConfig(); $platform->setGeneratorConfig($config); $xmlToAppData = new XmlToAppData($platform, 'defaultpackage', null); try { $appData = $xmlToAppData->parseFile('fixtures/unique-column/table-schema.xml'); $this->fail('Parsing file with duplicate table name throws exception'); } catch (EngineException $e) { $this->assertTrue(true, 'Parsing file with duplicate table name throws exception'); } }
/** * * @param \AppData $myAppData * @param string $targetDbName */ public static function getDbFromXml(&$myAppData, $targetDbName) { $db = self::getDbConnector($targetDbName); $xmlDbFiles = self::buildTargetDbSchema($targetDbName); // Initialize XmlToAppData object $appDataObject = new \XmlToAppData(new CentreonMysqlPlatform($db), null, 'utf-8'); // Get DB File foreach ($xmlDbFiles as $dbFile) { $myAppData->joinAppDatas(array($appDataObject->parseFile($dbFile))); unset($appDataObject); $appDataObject = new \XmlToAppData(new CentreonMysqlPlatform($db), null, 'utf-8'); } unset($appDataObject); }
/** * * @param \AppData $myAppData * @param string $targetDbName */ public static function getDbFromXml(&$myAppData, $operation, $targetDbName) { // Initialize configuration $di = Di::getDefault(); $targetDb = 'db_' . $targetDbName; $db = $di->get($targetDb); $xmlDbFiles = self::getAllXmlFiles($operation, $targetDbName); // Initialize XmlToAppData object $appDataObject = new \XmlToAppData(new \Centreon\Custom\Propel\CentreonMysqlPlatform($db), null, 'utf-8'); // Get DB File foreach ($xmlDbFiles as $dbFile) { $myAppData->joinAppDatas(array($appDataObject->parseFile($dbFile))); unset($appDataObject); $appDataObject = new \XmlToAppData(new \Centreon\Custom\Propel\CentreonMysqlPlatform($db), null, 'utf-8'); } unset($appDataObject); }
public function setUp() { $xmlToAppData = new XmlToAppData(new MysqlPlatform(), "defaultpackage", null); $appData = $xmlToAppData->parseFile('fixtures/bookstore/schema.xml'); $this->database = $appData->getDatabase("bookstore"); }
protected function dropTables() { $db = Di::getDefault()->get('db_centreon'); $platform = new CentreonMysqlPlatform($db); // Get current DB State $currentDb = self::initializeCurrentSchema($platform); // Retreive target DB State $updatedAppData = new \AppData($platform); $appDataObject = new \XmlToAppData(new CentreonMysqlPlatform($db), null, 'utf-8'); $updatedAppData->joinAppDatas(array($appDataObject->parseFile(__DIR__ . '/data/empty.xml'))); unset($appDataObject); /* @todo Fatorize */ $diff = \PropelDatabaseComparator::computeDiff($currentDb, $updatedAppData->getDatabase('centreon'), false); if (false !== $diff) { $strDiff = $platform->getModifyDatabaseDDL($diff); $sqlToBeExecuted = \PropelSQLParser::parseString($strDiff); \PropelSQLParser::executeString($strDiff, $db); } }