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(); }
public function getDatabase() { if (null === $this->database) { $xtad = new XmlToAppData($this->getPlatform()); $xtad->setGeneratorConfig($this->getConfig()); $this->database = $xtad->parseString($this->schema)->getDatabase(); } return $this->database; }
public function testSetPackageOverridesNamespaceAutoPackage() { $schema = <<<EOF <database name="DB" namespace="NS1"> <table name="table" namespace="NS2" package="foo"> <column name="id" primaryKey="true" /> <column name="title1" type="VARCHAR" /> </table> </database> EOF; $config = new GeneratorConfig(); $config->setBuildProperties(array('propel.namespace.autoPackage' => 'true')); $xmlToAppData = new XmlToAppData(new DefaultPlatform()); $xmlToAppData->setGeneratorConfig($config); $table = $xmlToAppData->parseString($schema)->getDatabase('DB')->getTable('table'); $this->assertEquals('foo', $table->getPackage()); }
/** * Gets all matching XML schema files and loads them into data models for class. * @return void */ protected function loadDataModels() { $ads = array(); $totalNbTables = 0; $this->log('Loading XML schema files...'); // Get all matched files from schemaFilesets foreach ($this->schemaFilesets as $fs) { $ds = $fs->getDirectoryScanner($this->project); $srcDir = $fs->getDir($this->project); $dataModelFiles = $ds->getIncludedFiles(); sort($dataModelFiles); $defaultPlatform = $this->getGeneratorConfig()->getConfiguredPlatform(); // Make a transaction for each file foreach ($dataModelFiles as $dmFilename) { $this->log("Processing: " . $dmFilename, Project::MSG_VERBOSE); $xmlFile = new PhingFile($srcDir, $dmFilename); $dom = new DomDocument('1.0', 'UTF-8'); $dom->load($xmlFile->getAbsolutePath()); // modify schema to include any external schemas (and remove the external-schema nodes) $this->includeExternalSchemas($dom, $srcDir); // normalize (or transform) the XML document using XSLT if ($this->getGeneratorConfig()->getBuildProperty('schemaTransform') && $this->xslFile) { $this->log("Transforming " . $dmFilename . " 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 { // normalize the document using normalizer stylesheet $xslDom = new DomDocument('1.0', 'UTF-8'); $xslDom->load($this->xslFile->getAbsolutePath()); $xsl = new XsltProcessor(); $xsl->importStyleSheet($xslDom); $dom = $xsl->transformToDoc($dom); } } // validate the XML document using XSD schema if ($this->validate && $this->xsdFile) { $this->log(" Validating XML using schema " . $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($defaultPlatform, $this->getTargetPackage(), $this->dbEncoding); $xmlParser->setGeneratorConfig($this->getGeneratorConfig()); $ad = $xmlParser->parseString($dom->saveXML(), $xmlFile->getAbsolutePath()); $nbTables = $ad->getDatabase(null, false)->countTables(); $totalNbTables += $nbTables; $this->log(sprintf(' %d tables processed successfully', $nbTables), Project::MSG_VERBOSE); $ad->setName($dmFilename); $ads[] = $ad; } $this->log(sprintf('%d tables found in %d schema files.', $totalNbTables, count($dataModelFiles))); } if (empty($ads)) { throw new BuildException("No schema files were found (matching your schema fileset definition)."); } foreach ($ads as $ad) { // map schema filename with database name $this->dataModelDbMap[$ad->getName()] = $ad->getDatabase(null, false)->getName(); } if (count($ads) > 1 && $this->packageObjectModel) { $ad = $this->joinDataModels($ads); $this->dataModels = array($ad); } else { $this->dataModels = $ads; } foreach ($this->dataModels as &$ad) { $ad->doFinalInitialization(); } if ($this->validate) { foreach ($this->dataModels as $dataModel) { $validator = new PropelSchemaValidator($dataModel); if (!$validator->validate()) { throw new EngineException(sprintf("The database schema contains errors:\n - %s", join("\n - ", $validator->getErrors()))); } } } $this->dataModelsLoaded = true; }
protected function getModels($databaseManager, $verbose = false) { Phing::startup(); // required to locate behavior classes... $schemas = sfFinder::type('file')->name('*schema.xml')->follow_link()->in(sfConfig::get('sf_config_dir')); if (!$schemas) { throw new sfCommandException('You must create a schema.yml or schema.xml file.'); } $ads = array(); foreach ($schemas as $schema) { if ($verbose) { $this->logSection('schema', sprintf(' Parsing schema "%s"', $schema), null, 'COMMENT'); } $dom = new DomDocument('1.0', 'UTF-8'); $dom->load($schema); //$this->includeExternalSchemas($dom, sfConfig::get('sf_config_dir')); $xmlParser = new XmlToAppData(new DefaultPlatform(), ''); $generatorConfig = $this->getGeneratorConfig(); $generatorConfig->setBuildConnections($this->getConnections($databaseManager)); $xmlParser->setGeneratorConfig($generatorConfig); $ad = $xmlParser->parseString($dom->saveXML(), $schema); $ads[] = $ad; $nbTables = $ad->getDatabase(null, false)->countTables(); if ($verbose) { $this->logSection('schema', sprintf(' %d tables processed successfully', $nbTables), null, 'COMMENT'); } } if (count($ads) > 1) { $ad = array_shift($ads); $ad->joinAppDatas($ads); //$ad = $this->joinDataModels($ads); //$this->dataModels = array($ad); } else { $ad = $ads[0]; } $ad->doFinalInitialization(); return $ad; }
public function getDatabase() { if (null === $this->database) { $xtad = new XmlToAppData($this->getPlatform()); if (null !== $this->config) { $xtad->setGeneratorConfig($this->config); } $appData = $xtad->parseString($this->schema); $this->database = $appData->getDatabase(); // does final initialization } return $this->database; }