protected function schemaToXML($checkSchema = self::CHECK_SCHEMA, $prefix = '', $verbose = false)
 {
     $finder = sfFinder::type('file')->name('*schema.yml')->prune('doctrine');
     $dirs = array_merge(array(sfConfig::get('sf_config_dir')), $this->configuration->getPluginSubPaths('/config'));
     $schemas = $finder->in($dirs);
     if (self::CHECK_SCHEMA === $checkSchema && !count($schemas)) {
         throw new sfCommandException('You must create a schema.yml file.');
     }
     $dbSchema = new sfPropelDatabaseSchema();
     foreach ($schemas as $schema) {
         $this->logSection('convert-xml', $schema);
         $schemaArray = sfYaml::load($schema);
         if (!is_array($schemaArray)) {
             continue;
             // No defined schema here, skipping
         }
         if (!isset($schemaArray['classes'])) {
             // Old schema syntax: we convert it
             $schemaArray = $dbSchema->convertOldToNewYaml($schemaArray);
         }
         $customSchemaFilename = str_replace(array(str_replace(DIRECTORY_SEPARATOR, '/', sfConfig::get('sf_root_dir')) . '/', 'plugins/', 'config/', '/', 'schema.yml'), array('', '', '', '_', 'schema.custom.yml'), $schema);
         $customSchemas = sfFinder::type('file')->name($customSchemaFilename)->in($dirs);
         foreach ($customSchemas as $customSchema) {
             if ($verbose) {
                 $this->logSection('schema', sprintf('  found custom schema %s', $customSchema), null, 'COMMENT');
             }
             $customSchemaArray = sfYaml::load($customSchema);
             if (!isset($customSchemaArray['classes'])) {
                 // Old schema syntax: we convert it
                 $customSchemaArray = $dbSchema->convertOldToNewYaml($customSchemaArray);
             }
             $schemaArray = sfToolkit::arrayDeepMerge($schemaArray, $customSchemaArray);
         }
         $dbSchema->loadArray($schemaArray);
         if ($verbose) {
             $this->logSection('schema', sprintf('  converting "%s" to XML', $schema), null, 'COMMENT');
         }
         $localprefix = $prefix;
         // change prefix for plugins
         foreach ($this->configuration->getPlugins() as $plugin) {
             $plugin_config = $this->configuration->getPluginConfiguration((string) $plugin);
             $plugin_root_dir = rtrim($plugin_config->getRootDir(), '/') . '/';
             // if $schema starts with $plugin_root_dir
             if (substr($schema, 0, strlen($plugin_root_dir)) === $plugin_root_dir) {
                 $localprefix = $prefix . $plugin_config->getName() . '-';
                 break;
             }
         }
         // save converted xml files in original directories
         $xml_file_name = str_replace('.yml', '.xml', basename($schema));
         $file = str_replace(basename($schema), $localprefix . $xml_file_name, $schema);
         if ($verbose) {
             $this->logSection('schema', sprintf('  putting %s', $file), null, 'COMMENT');
         }
         file_put_contents($file, $dbSchema->asXML());
     }
 }
 protected function schemaToXML($checkSchema = self::CHECK_SCHEMA, $prefix = '')
 {
     $finder = sfFinder::type('file')->name('*schema.yml');
     $dirs = array('config');
     if ($pluginDirs = glob(sfConfig::get('sf_plugins_dir') . '/*/config')) {
         $dirs = array_merge($dirs, $pluginDirs);
     }
     $schemas = $finder->in($dirs);
     if (self::CHECK_SCHEMA === $checkSchema && !count($schemas)) {
         throw new sfCommandException('You must create a schema.yml file.');
     }
     $dbSchema = new sfPropelDatabaseSchema();
     foreach ($schemas as $schema) {
         $schemaArray = sfYaml::load($schema);
         if (!is_array($schemaArray)) {
             continue;
             // No defined schema here, skipping
         }
         if (!isset($schemaArray['classes'])) {
             // Old schema syntax: we convert it
             $schemaArray = $dbSchema->convertOldToNewYaml($schemaArray);
         }
         $customSchemaFilename = str_replace(array(str_replace(DIRECTORY_SEPARATOR, '/', sfConfig::get('sf_root_dir')) . '/', 'plugins/', 'config/', '/', 'schema.yml'), array('', '', '', '_', 'schema.custom.yml'), $schema);
         $customSchemas = sfFinder::type('file')->name($customSchemaFilename)->in($dirs);
         foreach ($customSchemas as $customSchema) {
             $this->logSection('schema', sprintf('found custom schema %s', $customSchema));
             $customSchemaArray = sfYaml::load($customSchema);
             if (!isset($customSchemaArray['classes'])) {
                 // Old schema syntax: we convert it
                 $customSchemaArray = $dbSchema->convertOldToNewYaml($customSchemaArray);
             }
             $schemaArray = sfToolkit::arrayDeepMerge($schemaArray, $customSchemaArray);
         }
         $dbSchema->loadArray($schemaArray);
         $this->logSection('schema', sprintf('converting "%s" to XML', $schema));
         $localprefix = $prefix;
         // change prefix for plugins
         if (preg_match('#plugins[/\\\\]([^/\\\\]+)[/\\\\]#', $schema, $match)) {
             $localprefix = $prefix . $match[1] . '-';
         }
         // save converted xml files in original directories
         $xml_file_name = str_replace('.yml', '.xml', basename($schema));
         $file = str_replace(basename($schema), $localprefix . $xml_file_name, $schema);
         $this->logSection('schema', sprintf('putting %s', $file));
         file_put_contents($file, $dbSchema->asXML());
     }
 }
Example #3
0
function _propel_convert_xml_schema($check_schema = true, $prefix = '')
{
    $finder = pakeFinder::type('file')->name('*schema.xml');
    $schemas = array_merge($finder->in('config'), $finder->in(glob(sfConfig::get('sf_root_dir') . '/plugins/*/config')));
    if ($check_schema && !count($schemas)) {
        throw new Exception('You must create a schema.xml file.');
    }
    $db_schema = new sfPropelDatabaseSchema();
    foreach ($schemas as $schema) {
        $db_schema->loadXML($schema);
        $localprefix = $prefix;
        // change prefix for plugins
        if (preg_match('#plugins[/\\\\]([^/\\\\]+)[/\\\\]#', $schema, $match)) {
            $localprefix = $prefix . $match[1] . '-';
        }
        // save converted xml files in original directories
        $yml_file_name = str_replace('.xml', '.yml', basename($schema));
        $file = str_replace(basename($schema), $prefix . $yml_file_name, $schema);
        pake_echo_action('schema', 'putting ' . $file);
        file_put_contents($file, $db_schema->asYAML());
    }
}
 public function load($file, $package = null)
 {
     // we figure out what kind of file we are given
     $type = array_pop(explode('.', $file));
     $type2method = array('yml' => 'loadYAML', 'xml' => 'loadXML');
     if (isset($type2method[$type])) {
         $method = $type2method[$type];
     } else {
         throw new sfDoctrineSchemaException(sprintf('Unkwnown method for extension "%s"', $type));
     }
     $propelDatabaseSchema = new sfPropelDatabaseSchema();
     $propelDatabaseSchema->{$method}($file);
     $data = $propelDatabaseSchema->asArray();
     foreach ($propelDatabaseSchema->getTables() as $tb_name => $tableDesc) {
         // special table class
         // propel has only such classes (no inheritance support)
         $table = new sfDoctrineTableSchema($tb_name, $package);
         $this->tables[$tb_name] = $table;
         if (!($className = $this->getAttribute($tableDesc, 'phpName'))) {
             $className = sfInflector::camelize($tb_name);
         }
         // wild guess
         $class = new sfDoctrineClassSchema($className);
         $table->addClass($class);
         // columns
         foreach ($propelDatabaseSchema->getChildren($tableDesc) as $col_name => $columnDescription) {
             if ($col_name == 'id') {
                 // id is automatically generated in doctrine
                 continue;
             }
             $docCol = new sfDoctrineColumnSchema($col_name, $columnDescription, true);
             $class->addColumn($docCol);
         }
         $this->classes[$class->getPhpName()] = $class;
     }
 }
$t = new my_lime_test(409);
$t->diag('Classical YAML to XML conversion');
$p = new sfPropelDatabaseSchema();
$p->loadYAML(dirname(__FILE__) . '/fixtures/schema.yml');
$target = file_get_contents(dirname(__FILE__) . '/fixtures/schema.xml');
$t->is_line_by_line($p->asXML(), $target);
$t->diag('New YAML to XML conversion');
$p = new sfPropelDatabaseSchema();
$p->loadYAML(dirname(__FILE__) . '/fixtures/new_schema.yml');
$target = file_get_contents(dirname(__FILE__) . '/fixtures/schema.xml');
$t->is_line_by_line($p->asXML(), $target);
$t->diag('New YAML to Old YAML conversion');
$old_yml_target = sfYaml::load(dirname(__FILE__) . '/fixtures/schema.yml');
$p = new sfPropelDatabaseSchema();
$new_yml_transformed = $p->convertNewToOldYaml(sfYaml::load(dirname(__FILE__) . '/fixtures/new_schema.yml'));
$t->is_array_explicit($new_yml_transformed, $old_yml_target);
$t->diag('Old YAML to New YAML conversion');
$new_yml_target = sfYaml::load(dirname(__FILE__) . '/fixtures/new_schema.yml');
$p = new sfPropelDatabaseSchema();
$old_yml_transformed = $p->convertOldToNewYaml(sfYaml::load(dirname(__FILE__) . '/fixtures/schema.yml'));
$t->is_array_explicit($old_yml_transformed, $new_yml_target);
$t->todo('XML and classical YAML internal representation');
$p1 = new sfPropelDatabaseSchema();
$p1->loadXML(dirname(__FILE__) . '/fixtures/schema.xml');
$p2 = new sfPropelDatabaseSchema();
$p2->loadYAML(dirname(__FILE__) . '/fixtures/schema.yml');
//$t->is_array_explicit($p1->asArray(), $p2->asArray());
$t->todo('XML and classical YAML compared as XML');
//$t->is_line_by_line($p1->asXML(), $p2->asXML());
$t->todo('XML and classical YAML compared as YAML');
//$t->is_line_by_line($p1->asYAML(), $p2->asYAML());
<?php

/*
 * This file is part of the symfony package.
 * (c) 2004-2006 Fabien Potencier <*****@*****.**>
 * 
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
require_once dirname(__FILE__) . '/../../../bootstrap/unit.php';
$t = new lime_test(1, new lime_output_color());
$p = new sfPropelDatabaseSchema();
$p->loadYAML(dirname(__FILE__) . '/fixtures/schema.yml');
$t->like($p->asXML(), '/This &amp; That/');
 /**
  * Update plugin schema
  *
  * @param string $schema_path 
  * @param sfPropelDatabaseSchema $dbSchema 
  * @param string $prefix 
  * @author Sergey Startsev
  */
 private function updatePluginSchema($schema_path, sfPropelDatabaseSchema $dbSchema, $prefix = '')
 {
     $schema_structure_updated = $schema_structure = $this->getSchemaStructure($schema_path);
     $current_schema = $dbSchema->asArray();
     foreach ($schema_structure as $connection => $tables) {
         foreach ($tables as $table_name => $table_structure) {
             if (isset($current_schema[$connection]) && in_array($table_name, $current_schema[$connection])) {
                 $schema_structure_updated[$connection][$table_name] = $table_description;
             }
         }
     }
     if (!empty($prefix)) {
         $schema_path = dirname($schema_path) . "/{$prefix}schema.yml";
     }
     $oSchema = new sfPropelDatabaseSchema();
     $oSchema->loadArray($schema_structure_updated);
     $this->logSection('schema', sprintf('putting %s', $schema_path));
     file_put_contents($schema_path, $oSchema->asYAML());
 }
 /**
  * Getting schemas array from configs
  * 
  * @return array - Connections and tables
  * @author Sergey Startsev
  */
 private static function getSchemas()
 {
     $aPropelSchemaArray = array();
     $configuration = new ProjectConfiguration(null, new sfEventDispatcher());
     $db_schema = new sfPropelDatabaseSchema();
     $dirs = array_merge(array(sfConfig::get('sf_config_dir')), $configuration->getPluginSubPaths('/config'));
     foreach ($dirs as $k => $dir) {
         if (substr_count($dir, 'appFlower') > 0 || substr_count($dir, 'sfPropelPlugin') > 0 || substr_count($dir, 'sfProtoculousPlugin') > 0) {
             unset($dirs[$k]);
         }
     }
     $dirs = array_values($dirs);
     $schemas = sfFinder::type('file')->name('*schema.yml')->prune('doctrine')->in($dirs);
     foreach ($schemas as $schema_path) {
         $schema = DIRECTORY_SEPARATOR != '/' ? str_replace('/', DIRECTORY_SEPARATOR, $schema_path) : $schema_path;
         $aOriginalSchemaArray[$schema] = sfYaml::load($schema);
         if (!is_array($aOriginalSchemaArray[$schema])) {
             $aOriginalSchemaArray[$schema];
             continue;
             // No defined schema here, skipping
         }
         if (!isset($aOriginalSchemaArray[$schema]['classes'])) {
             // Old schema syntax: we convert it
             $aPropelSchemaArray[$schema] = $db_schema->convertOldToNewYaml($aOriginalSchemaArray[$schema]);
         }
         $customSchemaFilename = str_replace(array(str_replace(DIRECTORY_SEPARATOR, '/', sfConfig::get('sf_root_dir')) . '/', 'plugins/', 'config/', '/', 'schema.yml'), array('', '', '', '_', 'schema.custom.yml'), $schema);
         $customSchemas = sfFinder::type('file')->name($customSchemaFilename)->in($dirs);
         foreach ($customSchemas as $customSchema) {
             $aOriginalSchemaArray[$customSchema] = sfYaml::load($customSchema);
             if (!isset($aOriginalSchemaArray[$customSchema]['classes'])) {
                 // Old schema syntax: we convert it
                 $aPropelSchemaArray[$customSchema] = $db_schema->convertOldToNewYaml(${$aOriginalSchemaArray}[$customSchema]);
             }
         }
     }
     return $aPropelSchemaArray;
 }