1
0
mirror of synced 2024-12-15 23:56:02 +03:00
doctrine2/website/plugins/sfDoctrinePlugin/data/tasks/sfPakeDoctrine.php

898 lines
25 KiB
PHP
Raw Normal View History

2007-09-13 01:56:14 +04:00
<?php
/*
* This file is part of the sfDoctrine package.
* (c) 2006-2007 Olivier Verdier <Olivier.Verdier@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/**
* @package symfony.plugins
* @subpackage sfDoctrine
* @author Olivier Verdier <Olivier.Verdier@gmail.com>
* @author Nathanael D. Noblet <nathanael@gnat.ca>
* @version SVN: $Id: sfPakeDoctrine.php 4878 2007-08-17 17:45:54Z Jonathan.Wage $
*/
pake_desc('converts propel schema.*ml into doctrine schema');
pake_task('doctrine-import', 'project_exists');
pake_desc('exports doctrine schemas to sql');
pake_task('doctrine-build-sql', 'project_exists');
pake_desc('insert sql for doctrine schemas in to database');
pake_task('doctrine-insert-sql', 'project_exists');
pake_desc('build Doctrine classes');
pake_task('doctrine-build-model', 'project_exists');
pake_desc('Creates Doctrine CRUD Module');
pake_task('doctrine-generate-crud', 'app_exists');
pake_desc('initialize a new doctrine admin module');
pake_task('doctrine-init-admin', 'app_exists');
pake_desc('dump data to yaml fixtures file');
pake_task('doctrine-dump-data', 'project_exists');
pake_desc('load data from yaml fixtures file');
pake_task('doctrine-load-data', 'project_exists');
pake_desc('load doctrine nested set data from nested set fixtures file');
pake_task('doctrine-load-nested-set', 'project_exists');
pake_desc('doctrine build all - generate model and initialize database, drops current database if exists');
pake_task('doctrine-build-all', 'project_exists');
pake_desc('doctrine build all load - generate model, initialize database, and load data from fixtures. Drops current database if exists');
pake_task('doctrine-build-all-load', 'project_exists');
pake_desc('doctrine build schema - build schema from an existing database');
pake_task('doctrine-build-schema', 'project_exists');
pake_desc('doctrine drop all - drop all database tables');
pake_task('doctrine-drop-all-tables', 'project_exists');
pake_desc('doctrine build database - initialize database, drop current database if exists');
pake_task('doctrine-build-db', 'project_exists');
pake_desc('doctrine drop database - drops database');
pake_task('doctrine-drop-db', 'project_exists');
function run_doctrine_drop_all_tables($task, $args)
{
if (!count($args))
{
throw new Exception('You must provide the app.');
}
$app = $args[0];
$env = empty($args[1]) ? 'dev' : $args[1];
_load_application_environment($app, $env);
$sf_root_dir = sfConfig::get('sf_root_dir');
$declared = get_declared_classes();
$directory = sfConfig::get('sf_lib_dir').DIRECTORY_SEPARATOR.'model'.DIRECTORY_SEPARATOR.'doctrine'.DIRECTORY_SEPARATOR;
if ($directory !== null)
{
foreach ((array) $directory as $dir)
{
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir),
RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($it as $file)
{
$e = explode('.', $file->getFileName());
if (end($e) === 'php' && strpos($file->getFileName(), '.inc') === false)
{
require_once $file->getPathName();
}
}
}
$declared = array_diff(get_declared_classes(), $declared);
}
$parent = new ReflectionClass('Doctrine_Record');
$sql = array();
$fks = array();
// we iterate trhough the diff of previously declared classes
// and currently declared classes
foreach ($declared as $name)
{
$class = new ReflectionClass($name);
$conn = Doctrine_Manager::getInstance()->getConnectionForComponent($name);
// check if class is an instance of Doctrine_Record and not abstract
// class must have method setTableDefinition (to avoid non-Record subclasses like symfony's sfDoctrineRecord)
if ($class->isSubclassOf($parent) && ! $class->isAbstract() && method_exists($class->getName(), 'setTableDefinition'))
{
$record = new $name();
$table = $record->getTable();
try {
pake_echo_action('doctrine', "dropping table '".$table->getTableName()."'");
$table->getConnection()->export->dropTable($table->getTableName());
} catch(Exception $e) {
continue;
}
}
}
}
function run_doctrine_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];
_load_application_environment($app, $env);
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);
}
$data = new sfDoctrineData();
$data->setDeleteCurrentData($delete);
foreach ($fixtures_dirs as $fixtures_dir)
{
if (!is_readable($fixtures_dir))
{
continue;
}
pake_echo_action('doctrine', sprintf('load data from "%s"', $fixtures_dir));
$data->loadData($fixtures_dir);
}
}
function run_doctrine_import($task, $args)
{
$type = 'xml';
if (isset($args[0]))
$type = $args[0];
$schemas = _doctrine_load('propel', $type, false);
$doctrineSchemasDir = sfConfig::get('sf_config_dir').DIRECTORY_SEPARATOR.'doctrine'.DIRECTORY_SEPARATOR;
pake_mkdirs($doctrineSchemasDir);
foreach($schemas as $schema)
{
$doctrineYml = $schema->asDoctrineYml();
$classes = $schema->getClasses();
$class = array_pop($classes);
$package = $class->getTable()->getPackage();
$filePath = $package.'.yml';
pake_echo_action('writing', $filePath);
file_put_contents($doctrineSchemasDir.$filePath, $doctrineYml['source']);
}
}
function run_doctrine_export($task, $args)
{
$schemas = _doctrine_load('doctrine', 'yml', false);
$configDir = sfConfig::get('sf_config_dir').DIRECTORY_SEPARATOR;
foreach($schemas as $schema)
{
$propelXml = $schema->asPropelXml();
// we do some tidying before echoing the xml
$source = preg_replace(array('#</database#', '#<(/?)table#', '#<column#', '#<(/?)foreign-key#', '#<reference#'), array("\n</database", "\n<\\1table", "\n <column", "\n <\\1foreign-key", "\n <reference",), $propelXml['source']);
$filePath = $propelXml['name'].'-schema.xml';
pake_echo_action('writing', $filePath);
file_put_contents($configDir.$filePath, $source);
}
}
function run_doctrine_insert_sql($task, $args)
{
if (!count($args))
{
throw new Exception('You must provide the app.');
}
$app = $args[0];
$env = empty($args[1]) ? 'dev' : $args[1];
_load_application_environment($app, $env);
$sf_root_dir = sfConfig::get('sf_root_dir');
$directories = sfFinder::type('dir')->maxdepth(0)->ignore_version_control()->in(sfConfig::get('sf_model_lib_dir').'/doctrine');
Doctrine::exportSchema($directories);
pake_echo_action('doctrine', 'sql was inserted successfully');
return;
}
function run_doctrine_build_sql($task,$args)
{
if(count($args) < 1)
{
throw new Exception('You must provide your app name.');
}
$sf_root_dir = sfConfig::get('sf_root_dir');
define('SF_APP', $args[0]);
$connection = isset($args[1])?$args[1]:'all';
simpleAutoloader::registerCallable(array('Doctrine','autoload'));
sfConfig::set('sf_app_module_dir',$sf_root_dir.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR);
$doctrineSchemaPathScheme = DIRECTORY_SEPARATOR.'model'.DIRECTORY_SEPARATOR.'doctrine'.DIRECTORY_SEPARATOR;
$doctrineModelDir = sfConfig::get('sf_lib_dir').$doctrineSchemaPathScheme;
$generatedDir = $doctrineModelDir.'generated'.DIRECTORY_SEPARATOR;
$tmp_dir = $sf_root_dir.DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.md5(uniqid(rand(), true));
$db_connections = sfYaml::load($sf_root_dir.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'databases.yml');
if(!isset($db_connections[$connection]))
{
throw new sfException('Unable to find connection: '.$connection);
}
$connection = current($db_connections[$connection]);
$db = new sfDoctrineDatabase();
$db->initialize($connection['param']);
$directories = sfFinder::type('dir')->maxdepth(0)->ignore_version_control()->in(sfConfig::get('sf_model_lib_dir').'/doctrine');
foreach ($directories AS $directory)
{
$basename = basename($directory);
$name = $basename == 'generated' ? 'doctrine':'doctrine-'.$basename;
pake_echo_action("Building SQL", $name);
$sql = implode(";\n\n",Doctrine::exportSql($directory)).";\n";
$sql = str_replace(array(" (",") ",","),array("(\n ",")\n",",\n"),$sql);
if (!is_dir($sf_root_dir.DIRECTORY_SEPARATOR.'data'.DIRECTORY_SEPARATOR.'sql'))
{
mkdir($sf_root_dir.DIRECTORY_SEPARATOR.'data'.DIRECTORY_SEPARATOR.'sql');
}
$fd = fopen($sf_root_dir.DIRECTORY_SEPARATOR.'data'.DIRECTORY_SEPARATOR.'sql'.DIRECTORY_SEPARATOR.$name.'.model.sql','w+');
fwrite($fd,$sql);
fclose($fd);
}
return;
}
function run_doctrine_build_model($task, $args)
{
$schemas = _doctrine_load('doctrine', 'yml', true);
$doctrineSchemaPathScheme = DIRECTORY_SEPARATOR.'model'.DIRECTORY_SEPARATOR.'doctrine'.DIRECTORY_SEPARATOR;
$doctrineModelDir = sfConfig::get('sf_lib_dir').$doctrineSchemaPathScheme;
$generatedDir = $doctrineModelDir.'generated'.DIRECTORY_SEPARATOR;
pake_mkdirs($generatedDir);
foreach($schemas as $db_schema)
{
foreach ($db_schema->getClasses() as $class)
{
foreach ($class->asPHP() as $cd)
{
$path = $doctrineModelDir;
$package = $class->getTable()->getPackage();
if ($package)
{
if (isset($cd['plugin']))
{
$path = sfConfig::get('sf_plugins_dir').DIRECTORY_SEPARATOR.$package.DIRECTORY_SEPARATOR.'lib'.$doctrineSchemaPathScheme;
}
else
{
$path.= $package.DIRECTORY_SEPARATOR;
}
}
if (isset($cd['overwrite']))
{
$path .= 'generated'.DIRECTORY_SEPARATOR;
}
pake_mkdirs($path);
$filePath = $cd['className'].'.class.php';
// we overwrite only the base classes
if (isset($cd['overwrite']) || !file_exists($path.$filePath))
{
pake_echo_action('writing', $filePath);
file_put_contents($path.$filePath, $cd['source']);
}
}
}
}
}
function run_doctrine_build_all($task, $args)
{
run_doctrine_drop_db($task, $args);
run_doctrine_build_db($task, $args);
run_doctrine_build_model($task, $args);
//run_doctrine_insert_sql($task, $args);
}
function run_doctrine_build_all_load($task, $args)
{
run_doctrine_build_all($task, $args);
run_doctrine_load_data($task, $args);
}
function run_doctrine_build_schema($task, $args)
{
// This will build schema from an existing database
throw new Exception('Not implemented.');
}
function run_doctrine_drop_db($task, $args)
{
if (!count($args))
{
throw new Exception('You must provide the app.');
}
$app = $args[0];
$env = empty($args[1]) ? 'dev' : $args[1];
_load_application_environment($app, $env);
$databases = sfYaml::load(sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'databases.yml');
$connectionBlockKey = $env;
if(!isset($databases[$connectionBlockKey]))
{
$connectionBlockKey = 'all';
}
$connections = $databases[$connectionBlockKey];
$manager = Doctrine_Manager::getInstance();
foreach ($connections AS $name => $info)
{
$dsnInfo = $manager->parseDsn($info['param']['dsn']);
$connection = $manager->getConnection($name);
try {
echo "Drop database '".$dsnInfo['database']."' are you sure Y/N ?";
$confirmation = strtolower(trim(fgets(STDIN)));
if ($confirmation!='y') {
pake_echo_action("cancelled");
exit(1);
}
pake_echo_action('doctrine', "dropping database '".$dsnInfo['database']."'");
$connection->export->dropDatabase($dsnInfo['database']);
} catch (Exception $e) {
pake_echo_action('doctrine', "could not drop database '".$dsnInfo['database']."'");
}
}
}
function run_doctrine_build_db($task, $args)
{
$connectionName = isset($args[0]) ? $args[0]:'all';
simpleAutoloader::registerCallable(array('Doctrine','autoload'));
$databases = sfYaml::load(sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'databases.yml');
if(!isset($databases[$connectionName]))
{
$connectionName = 'all';
}
$connections = $databases[$connectionName];
foreach($connections AS $name => $connection)
{
$dsn = $connection['param']['dsn'];
$info = Doctrine_Manager::getInstance()->parseDsn($dsn);
$dsn = $info['scheme'].':host='.$info['host'];
$user = $info['user'];
$password = $info['pass'];
$connection = Doctrine_Manager::getInstance()->openConnection(new PDO($dsn, $user, $password), $name.'2');
pake_echo_action('doctrine', "creating database '".$info['database']."'");
try {
$connection->export->createDatabase($info['database']);
} catch(Exception $e) {
pake_echo_action('doctrine', "could not create database '".$info['database']."'");
}
}
}
// FIXME: has to be rewritten to avoid code duplication
function run_doctrine_generate_crud($task,$args)
{
if (count($args) < 2)
{
throw new Exception('You must provide your module name.');
}
if (count($args) < 3)
{
throw new Exception('You must provide your model class name.');
}
$app = $args[0];
$module = $args[1];
$model_class = $args[2];
$theme = isset($args[3]) ? $args[3] : 'crud';
// function variables
$doctrineModelDir = sfConfig::get('sf_lib_dir').DIRECTORY_SEPARATOR.'model'.DIRECTORY_SEPARATOR.'doctrine'.DIRECTORY_SEPARATOR;
$sf_root_dir = sfConfig::get('sf_root_dir');
$sf_symfony_lib_dir = sfConfig::get('sf_symfony_lib_dir');
$pluginDir = realpath(dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'..');
$doctrineLibDir =$pluginDir.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.'doctrine'.DIRECTORY_SEPARATOR.'Doctrine'.DIRECTORY_SEPARATOR;
$tmp_dir = $sf_root_dir.DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.md5(uniqid(rand(), true));
sfConfig::set('sf_module_cache_dir', $tmp_dir);
sfConfig::set('sf_app_dir', $tmp_dir);
// add classes to autoload function
pake_echo_action('PluginDir', $pluginDir);
simpleAutoloader::registerCallable(array('Doctrine','autoload'));
// generate module
$generator_manager = new sfGeneratorManager();
$generator_manager->initialize();
$generator_manager->generate('sfDoctrineAdminGenerator', array('model_class' => $model_class, 'moduleName' => $module, 'theme' => $theme));
$moduleDir = $sf_root_dir.'/'.sfConfig::get('sf_apps_dir_name').'/'.$app.'/'.sfConfig::get('sf_app_module_dir_name').'/'.$module;
// copy our generated module
$finder = pakeFinder::type('any');
pake_mirror($finder, $tmp_dir.'/auto'.ucfirst($module), $moduleDir);
// change module name
pake_replace_tokens($moduleDir.'/actions/actions.class.php', getcwd(), '', '', array('auto'.ucfirst($module) => $module));
try
{
$author_name = $task->get_property('author', 'symfony');
}
catch (pakeException $e)
{
$author_name = 'Your name here';
}
$constants = array(
'PROJECT_NAME' => $task->get_property('name', 'symfony'),
'APP_NAME' => $app,
'MODULE_NAME' => $module,
'MODEL_CLASS' => $model_class,
'AUTHOR_NAME' => $author_name,
);
// customize php files
$finder = pakeFinder::type('file')->name('*.php');
pake_replace_tokens($finder, $moduleDir, '##', '##', $constants);
// delete temp files
$finder = pakeFinder::type('any');
pake_remove($finder, $tmp_dir);
// for some reason the above does not remove the tmp dir as it should.
// delete temp dir
@rmdir($tmp_dir);
// delete cache/tmp
@rmdir(sfConfig::get('sf_cache_dir').'tmp');
}
// FIXME: has to be rewritten to avoid code duplication
function run_doctrine_init_admin($task, $args)
{
if (count($args) < 2)
{
throw new Exception('You must provide your module name.');
}
if (count($args) < 3)
{
throw new Exception('You must provide your model class name.');
}
$app = $args[0];
$module = $args[1];
$model_class = $args[2];
$theme = isset($args[3]) ? $args[3] : 'default';
try
{
$author_name = $task->get_property('author', 'symfony');
}
catch (pakeException $e)
{
$author_name = 'Your name here';
}
$constants = array(
'PROJECT_NAME' => $task->get_property('name', 'symfony'),
'APP_NAME' => $app,
'MODULE_NAME' => $module,
'MODEL_CLASS' => $model_class,
'AUTHOR_NAME' => $author_name,
'THEME' => $theme,
);
$moduleDir = sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.sfConfig::get('sf_apps_dir_name').DIRECTORY_SEPARATOR.$app.DIRECTORY_SEPARATOR.sfConfig::get('sf_app_module_dir_name').DIRECTORY_SEPARATOR.$module;
// create module structure
$finder = pakeFinder::type('any')->ignore_version_control()->discard('.sf');
$dirs = sfLoader::getGeneratorSkeletonDirs('sfDoctrineAdmin', $theme);
foreach($dirs as $dir)
{
echo $dir;
if(is_dir($dir))
{
pake_mirror($finder, $dir, $moduleDir);
break;
}
}
// customize php and yml files
$finder = pakeFinder::type('file')->name('*.php', '*.yml');
pake_replace_tokens($finder, $moduleDir, '##', '##', $constants);
}
/**
* run_doctrine_load_nested_set
*
* @param mixed $task
* @param mixed $args
* @access public
* @return void
*/
function run_doctrine_load_nested_set($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 (!isset($args[1]))
{
throw new Exception('You must provide a filename.');
}
$filename = $args[1];
$env = empty($args[2]) ? 'dev' : $args[2];
_load_application_environment($app, $env);
$model = sfInflector::classify($args[1]);
$ymlName = sfInflector::tableize($args[1]);
$ymlPath = sfConfig::get('sf_data_dir').'/'.$ymlName.'.yml';
pake_echo_action('doctrine', 'loading nested set data for '.$model);
pake_echo_action('doctrine', 'loading '.$ymlPath);
$nestedSetData = sfYaml::load($ymlPath);
_doctrine_load_nested_set_data($model, $nestedSetData);
}
/**
* run_doctrine_dump_data
*
* @param mixed $task
* @param mixed $args
* @access public
* @return void
*/
function run_doctrine_dump_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 (!isset($args[1]))
{
throw new Exception('You must provide a filename.');
}
$filename = $args[1];
$env = empty($args[2]) ? 'dev' : $args[2];
_load_application_environment($app, $env);
if (!sfToolkit::isPathAbsolute($filename))
{
$dir = sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.'fixtures';
pake_mkdirs($dir);
$filename = $dir.DIRECTORY_SEPARATOR.$filename;
}
pake_echo_action('doctrine', sprintf('dumping data to "%s"', $filename));
$data = new sfDoctrineData();
$data->dumpData($filename);
}
/**
* _doctrine_load_nested_set_data
*
* @param mixed $model
* @param mixed $nestedSetData
* @param mixed $parent
* @access protected
* @return void
*/
function _doctrine_load_nested_set_data($model, $nestedSetData, $parent = null)
{
$manager = Doctrine_Manager::getInstance();
foreach($nestedSetData AS $name => $data)
{
$children = array();
$setters = array();
if( array_key_exists('children', $data) )
{
$children = $data['children'];
unset($data['children']);
}
if( array_key_exists('setters', $data) )
{
$setters = $data['setters'];
unset($data['setters']);
}
$record = new $model();
if( is_array($setters) AND !empty($setters) )
{
foreach($setters AS $key => $value)
{
$record->set($key, $value);
}
}
if( !$parent )
{
$manager->getTable($model)->getTree()->createRoot($record);
} else {
$parent->getNode()->addChild($record);
}
pake_echo_action('doctrine', 'loading '.str_repeat(' ', $record->getNode()->getLevel()).$name);
if( is_array($children) AND !empty($children) )
{
_doctrine_load_nested_set_data($model, $children, $record);
}
}
}
function _findPropelSchemas($type)
{
$preGlob = '*schema';
$root = 'config';
$extension = '.'.$type;
$schemas = pakeFinder::type('file')->name($preGlob.$extension)->in($root);
$schemasToLoad = array();
foreach ($schemas as $schema)
{
// we store the name of the file as "package"
$schemasToLoad[$schema] = basename($schema, $extension);
}
return $schemasToLoad;
}
function _findDoctrineSchemas()
{
$schemasToLoad = array();
// first we try with a connection mapping config file
$connectionMappingPath = 'config/schemas.yml';
if (file_exists($connectionMappingPath))
{
$connectionMapping = sfYaml::load($connectionMappingPath);
foreach ($connectionMapping as $connection => $schemas)
{
foreach ($schemas as $schema)
{
$components = explode('/', $schema);
$name = array_pop($components);
$schemaPath = 'config/doctrine/'.$name.'.yml';
if (!empty($components))
{
$packageName = $components[0];
$schemaPath = sfConfig::get('sf_plugins_dir').DIRECTORY_SEPARATOR.$packageName.DIRECTORY_SEPARATOR.$schemaPath;
}
else
$packageName = null;
if (file_exists($schemaPath))
{
$schemasToLoad[$schemaPath] = $packageName;
}
}
}
}
else // otherwise we load all the schemas in the doctrine directories
{
$preGlob = '*';
$root = 'config'.DIRECTORY_SEPARATOR.'doctrine';
$schemas = pakeFinder::type('file')->name($preGlob.'.yml')->in($root);
if(count($schemas))
$schemas = array_combine($schemas, array_fill(0, count($schemas), null));
// adding the plugin schemas
$pluginSchemas = array();
$pluginSchemas = pakeFinder::type('file')->name($preGlob.'.yml')->in(glob('plugins/*/'.$root));
$schemasToLoad = array();
foreach ($pluginSchemas as $pluginSchema)
{
// we get the plugin name from the path file; not very elegant...
$pluginName = basename(substr(dirname($pluginSchema), 0, -strlen($root)));
$schemasToLoad[$pluginSchema] = $pluginName;
}
$schemasToLoad = array_merge($schemas, $schemasToLoad);
}
return $schemasToLoad;
}
function _doctrine_load($mode, $type, $aggregate)
{
$schemasToLoad = array();
if ($mode == 'doctrine')
{
$schemasToLoad = _findDoctrineSchemas();
}
elseif ($mode == 'propel')
{
$schemasToLoad = _findPropelSchemas($type);
}
if (!count($schemasToLoad))
{
throw new Exception('No schemas were found');
}
$dbSchemas = array();
// schema loader class
$schemaClass = 'sfDoctrineSchema'.ucfirst($mode).'Loader';
$db_schema = new $schemaClass();
$db_schemas = array();
foreach ($schemasToLoad as $schema => $package)
{
if (!$aggregate)
{
$db_schema = new $schemaClass();
}
$relativeSchema = substr($schema, strlen(sfConfig::get('sf_root_dir'))+1);
pake_echo_action('loading', 'Class descriptions from "'.$schema.'"');
$db_schema->load($schema, $package);
if (!$aggregate)
{
$db_schema->process();
$db_schemas[] = $db_schema;
}
}
if ($aggregate)
{
$db_schema->process();
$db_schemas = array($db_schema);
}
return $db_schemas;
}
function _load_application_environment($app, $env)
{
// 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';
sfContext::getInstance();
}