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");
     }
 }
Example #3
0
 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());
    }
Example #8
0
 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');
     }
 }
Example #9
0
 /**
  * 
  * @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);
 }
Example #10
0
 /**
  * 
  * @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");
 }
Example #12
0
 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);
     }
 }