. * * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. * */ /* * 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. * */ pake_desc('create classes for current model'); pake_task('propel-build-model', 'project_exists'); pake_desc('create sql for current model'); pake_task('propel-build-sql', 'project_exists'); pake_desc('create schema.xml from existing database'); pake_task('propel-build-schema', 'project_exists'); //pake_desc('create schema.xml from schema.yml'); //pake_task('propel-convert-yml-schema', 'project_exists'); //pake_desc('create schema.yml from schema.xml'); //pake_task('propel-convert-xml-schema', 'project_exists'); //pake_desc('load data from fixtures directory'); //pake_task('propel-load-data', 'project_exists'); pake_desc('dump data to fixtures directory'); pake_task('propel-dump-data', 'project_exists'); pake_desc('create database for current model'); pake_task('propel-build-db', 'project_exists'); pake_desc('insert sql for current model'); pake_task('propel-insert-sql', 'project_exists'); //pake_desc('generate propel model and sql and initialize database'); //pake_task('propel-build-all', 'project_exists'); //pake_desc('generate propel model and sql and initialize database, and load data'); //pake_task('propel-build-all-load', 'propel-build-all'); /** * Function run_propel_convert_yml_schema * access public */ function run_propel_convert_yml_schema($task, $args) { _propel_convert_yml_schema(true); } function run_propel_convert_xml_schema($task, $args) { _propel_convert_xml_schema(true); } function _propel_convert_yml_schema($check_schema = true, $prefix = '') { $finder = pakeFinder::type('file')->name('*schema.yml'); $dirs = array('config'); if ($pluginDirs = glob(sfConfig::get('sf_root_dir').'/plugins/*/config')) { $dirs = array_merge($dirs, $pluginDirs); } $schemas = $finder->in($dirs); if ($check_schema && !count($schemas)) { throw new Exception('You must create a schema.yml file.'); } $db_schema = new sfPropelDatabaseSchema(); foreach ($schemas as $schema) { $db_schema->loadYAML($schema); pake_echo_action('schema', 'converting "'.$schema.'"'.' to XML'); $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); pake_echo_action('schema', 'putting '.$file); file_put_contents($file, $db_schema->asXML()); } } 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()); } } function _propel_copy_xml_schema_from_plugins($prefix = '') { $schemas = pakeFinder::type('file')->name('*schema.xml')->in(glob(sfConfig::get('sf_root_dir').'/plugins/*/config')); foreach ($schemas as $schema) { // reset local prefix $localprefix = ''; // change prefix for plugins if (preg_match('#plugins[/\\\\]([^/\\\\]+)[/\\\\]#', $schema, $match)) { // if the plugin name is not in the schema filename, add it if (!strstr(basename($schema), $match[1])) { $localprefix = $match[1].'-'; } } // if the prefix is not in the schema filename, add it if (!strstr(basename($schema), $prefix)) { $localprefix = $prefix.$localprefix; } pake_copy($schema, 'config'.DIRECTORY_SEPARATOR.$localprefix.basename($schema)); if ('' === $localprefix) { pake_remove($schema, ''); } } } function run_propel_build_all($task, $args) { run_propel_build_model($task, $args); run_propel_build_sql($task, $args); run_propel_insert_sql($task, $args); } function run_propel_build_all_load($task, $args) { run_propel_build_all($task, $args); run_propel_load_data($task, $args); } function run_propel_build_model($task, $args) { if ( isset ( $args[0] ) ) { $propelIniFile = $args[0] . '.ini'; if ( ! file_exists ( 'config' . PATH_SEP . $propelIniFile ) ) { $path = explode ( '/', $args[0] ); if ( count($path) > 2 ) throw new Exception('the propel.ini must be in your config directory.'); if ( count($path) == 1 ) $path[1] = 'propel'; $propelIniFile = 'plugins' .PATH_SEP . $path[0] . PATH_SEP . 'config' . PATH_SEP . $path[1] . '.ini'; pake_echo_action('propel.ini', "using the file : $propelIniFile "); _call_phing($task, 'om', false, $path[1] . '.ini' , PATH_PLUGINS . $path[0] . PATH_SEP ); return; } } _call_phing($task, 'om'); } function run_propel_build_sql($task, $args) { if ( isset ( $args[1] ) ) { $propelIniFile = $args[1] . '.ini'; $alternateDir = ''; if ( ! file_exists ( 'config' . PATH_SEP . $propelIniFile ) ) { $path = explode ( '/', $args[1] ); if ( count($path) > 2 ) throw new Exception('the propel.ini must be in your config directory.'); if ( count($path) == 1 ) $path[1] = 'propel'; $propelIniFile = 'plugins' .PATH_SEP . $path[0] . PATH_SEP . 'config' . PATH_SEP . $path[1] . '.ini'; if ( ! file_exists($propelIniFile) ) throw new Exception("the propel.ini must be in your config directory. ($propelIniFile)"); pake_echo_action('propel.ini', "using the file : $propelIniFile "); $alternateDir = PATH_PLUGINS . $path[0] . PATH_SEP; //_call_phing($task, 'om', false, $path[1] . '.ini' , PATH_PLUGINS . $path[0] . PATH_SEP ); //return; } } switch ( $args [0]) { case 'mysql' : if ( $alternateDir != '' ) _call_phing($task, 'sql', false, 'propel.mysql.ini', $alternateDir ); else _call_phing($task, 'sql', true, 'propel.mysql.ini' ); break; case 'mssql' : _call_phing($task, 'sql', true, 'propel.mssql.ini' ); break; case 'oracle' : _call_phing($task, 'sql', true, 'propel.oracle.ini' ); break; case 'pgsql' : _call_phing($task, 'sql', true, 'propel.pgsql.ini' ); break; default : throw new Exception('specify database Adapter, valid values are: mysql, mssql, oracle, pgsql.'); } } function run_propel_build_db($task, $args) { switch ( $args [0]) { case 'mysql' : _call_phing($task, 'create-db', true, 'propel.mysql.ini' ); break; case 'mssql' : _call_phing($task, 'create-db', true, 'propel.mssql.ini' ); break; case 'oracle' : _call_phing($task, 'create-db', true, 'propel.oracle.ini' ); break; case 'pgsql' : _call_phing($task, 'create-db', true, 'propel.pgsql.ini' ); break; default : throw new Exception('specify database Adapter, valid values are: mysql, mssql, oracle, pgsql.'); } } function run_propel_insert_sql($task, $args) { switch ( $args [0]) { case 'mysql' : //_call_phing($task, 'insert-sql', true, 'propel.mysql.ini' ); $filename = 'config/propel.mysql.ini'; $fd = fopen ($filename, "r"); $contents = fread ($fd,filesize ($filename)); fclose ($fd); $delimiter = "\n"; $splitcontents = explode($delimiter, $contents); foreach ($splitcontents as $key => $line) if ( strpos ( $line, 'database.url' ) > 0 ) { $param = explode ( '/', $line ); $database = $param [ count( $param) -1 ]; pake_echo_action('propel-insert-sql', "using the database : $database "); } //exec ( 'mysqldump --add-drop-table --compatible=mysql40 --compact --default-character-set=utf8 --no-create-info --complete-insert --extended-insert=false > data/mysql/insert.sql ' . $database ); exec ( 'mysqldump --password=atopml2005 --compatible=mysql40 --compact --default-character-set=utf8 --no-create-info --complete-insert=false --extended-insert=true > data/mysql/insert.sql ' . $database ); break; case 'mssql' : _call_phing($task, 'insert-sql', true, 'propel.mssql.ini' ); break; case 'oracle' : _call_phing($task, 'insert-sql', true, 'propel.oracle.ini' ); break; case 'pgsql' : _call_phing($task, 'insert-sql', true, 'propel.pgsql.ini' ); break; default : throw new Exception('specify database Adapter, valid values are: mysql, mssql, oracle, pgsql.'); } } function run_propel_build_schema($task, $args) { $propelIniFile = 'propel.ini'; if ( isset ( $args[0] ) ) { $propelIniFile = $args[0] . '.ini'; if ( ! file_exists ( 'config' . PATH_SEP . $propelIniFile ) ) { $path = explode ( '/', $args[0] ); if ( count($path) > 2 ) throw new Exception('the propel.ini must be in your config directory.'); if ( count($path) == 1 ) $path[1] = 'propel'; $propelIniFile = 'plugins' .PATH_SEP . $path[0] . PATH_SEP . 'config' . PATH_SEP . $path[1] . '.ini'; pake_echo_action('propel.ini', "using the file : $propelIniFile "); _call_phing($task, 'creole', false, $path[1] . '.ini' , PATH_PLUGINS . $path[0] . PATH_SEP ); // fix database name if (file_exists(PATH_PLUGINS . $path[0] . PATH_SEP . 'config/schema.xml')) { $schema = file_get_contents(PATH_PLUGINS . $path[0] . PATH_SEP . 'config/schema.xml'); $schema = preg_replace('/initialize(); pake_echo_action('propel', sprintf('dumping data to "%s"', $filename)); $data = new sfPropelData(); $data->dumpData($filename); } /** * Loads yml data from fixtures directory and inserts into database. * * example symfony load-data frontend * example symfony load-data frontend dev fixtures append * * @todo replace delete argument with flag -d * * @param object $task * @param array $args */ function run_propel_load_data($task, $args) { if (!count($args)) { throw new Exception('You must provide the app.'); } $app = $args[0]; if (!is_dir(sfConfig::get('sf_app_dir').DIRECTORY_SEPARATOR.$app)) { throw new Exception('The app "'.$app.'" does not exist.'); } if (count($args) > 1 && $args[count($args) - 1] == 'append') { array_pop($args); $delete = false; } else { $delete = true; } $env = empty($args[1]) ? 'dev' : $args[1]; // define constants define('SF_ROOT_DIR', sfConfig::get('sf_root_dir')); define('SF_APP', $app); define('SF_ENVIRONMENT', $env); define('SF_DEBUG', true); // get configuration require_once SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php'; if (count($args) == 1) { if (!$pluginDirs = glob(sfConfig::get('sf_root_dir').'/plugins/*/data')) { $pluginDirs = array(); } $fixtures_dirs = pakeFinder::type('dir')->name('fixtures')->in(array_merge($pluginDirs, array(sfConfig::get('sf_data_dir')))); } else { $fixtures_dirs = array_slice($args, 1); } $databaseManager = new sfDatabaseManager(); $databaseManager->initialize(); $data = new sfPropelData(); $data->setDeleteCurrentData($delete); foreach ($fixtures_dirs as $fixtures_dir) { if (!is_readable($fixtures_dir)) { continue; } pake_echo_action('propel', sprintf('load data from "%s"', $fixtures_dir)); $data->loadData($fixtures_dir); } } function _call_phing($task, $task_name, $check_schema = true, $propelIni = 'propel.ini' , $propelDirectory = '' ) { $schemas = pakeFinder::type('file')->name('*schema.xml')->relative()->follow_link()->in('config'); if ($check_schema && !$schemas) { throw new Exception('You must create a schema.yml or schema.xml file.'); } // call phing targets pake_import('Phing', false); // if (false === strpos('propel-generator', get_include_path())) // { // set_include_path( PATH_THIRDPARTY . 'propel-generator/classes' . PATH_SEPARATOR. get_include_path()); // } // set_include_path(sfConfig::get('sf_root_dir').PATH_SEPARATOR.get_include_path()); if ( $propelDirectory == '' ) $options = array( 'project.dir' => PATH_CORE . 'config', 'build.properties' => $propelIni, 'propel.output.dir' => PATH_CORE , ); else $options = array( 'project.dir' => $propelDirectory . 'config', 'build.properties' => $propelIni, 'propel.output.dir' => $propelDirectory , ); pakePhingTask::call_phing($task, array($task_name), PATH_THIRDPARTY . 'propel-generator/build.xml', $options); chdir( PATH_CORE ); }