From e2a204e0dcdeff49d702c6462a01229b0cbfca06 Mon Sep 17 00:00:00 2001 From: "Jonathan.Wage" Date: Sat, 20 Oct 2007 19:14:30 +0000 Subject: [PATCH] Enhancing CLI. New commands and cleaning up. --- lib/Doctrine.php | 38 +++++++++-- lib/Doctrine/Connection.php | 14 ++++ lib/Doctrine/Manager.php | 25 +++++++ lib/Doctrine/Task/BuildAll.php | 65 +++++++++++++++++++ lib/Doctrine/Task/BuildAllLoad.php | 58 +++++++++++++++++ lib/Doctrine/Task/BuildAllReload.php | 58 +++++++++++++++++ lib/Doctrine/Task/Compile.php | 2 + lib/Doctrine/Task/CreateDb.php | 8 ++- lib/Doctrine/Task/CreateTables.php | 4 +- lib/Doctrine/Task/DropDb.php | 6 +- lib/Doctrine/Task/DumpData.php | 2 +- lib/Doctrine/Task/GenerateMigration.php | 2 +- .../Task/GenerateMigrationsFromDb.php | 2 +- .../Task/GenerateMigrationsFromModels.php | 2 +- lib/Doctrine/Task/GenerateModelsFromDb.php | 2 +- lib/Doctrine/Task/GenerateModelsFromYaml.php | 2 +- lib/Doctrine/Task/GenerateSql.php | 2 +- lib/Doctrine/Task/GenerateYamlFromDb.php | 2 +- lib/Doctrine/Task/GenerateYamlFromModels.php | 2 +- lib/Doctrine/Task/LoadData.php | 2 +- lib/Doctrine/Task/LoadDummyData.php | 2 +- lib/Doctrine/Task/Migrate.php | 2 +- lib/Doctrine/Task/RebuildDb.php | 58 +++++++++++++++++ 23 files changed, 335 insertions(+), 25 deletions(-) create mode 100644 lib/Doctrine/Task/BuildAll.php create mode 100644 lib/Doctrine/Task/BuildAllLoad.php create mode 100644 lib/Doctrine/Task/BuildAllReload.php create mode 100644 lib/Doctrine/Task/RebuildDb.php diff --git a/lib/Doctrine.php b/lib/Doctrine.php index 810890cb0..ee7c092da 100644 --- a/lib/Doctrine.php +++ b/lib/Doctrine.php @@ -734,20 +734,42 @@ final class Doctrine * @param string $specifiedConnections Array of connections you wish to create the database for * @return void */ - public static function createDatabases($specifiedConnections) + public static function createDatabases($specifiedConnections = array()) { if (!is_array($specifiedConnections)) { $specifiedConnections = (array) $specifiedConnections; } - $connections = Doctrine_Manager::getInstance()->getConnections(); + $manager = Doctrine_Manager::getInstance(); + $connections = $manager->getConnections(); foreach ($connections as $name => $connection) { if (!empty($specifiedConnections) && !in_array($name, $specifiedConnections)) { continue; } - $connection->export->createDatabase($name); + $info = $manager->parsePdoDsn($connection->getOption('dsn')); + $username = $connection->getOption('username'); + $password = $connection->getOption('password'); + + // Make connection without database specified so we can create it + $connect = $manager->openConnection(new PDO($info['scheme'] . ':host=' . $info['host'], $username, $password), 'tmp_connection', false); + + try { + // Create database + $connect->export->createDatabase($name); + + // Close the tmp connection with no database + $manager->closeConnection($connect); + + // Close original connection + $manager->closeConnection($connection); + + // Reopen original connection with newly created database + $manager->openConnection(new PDO($info['dsn'], $username, $password), $name, true); + } catch (Exception $e) { + + } } } @@ -765,14 +787,20 @@ final class Doctrine $specifiedConnections = (array) $specifiedConnections; } - $connections = Doctrine_Manager::getInstance()->getConnections(); + $manager = Doctrine_Manager::getInstance(); + + $connections = $manager->getConnections(); foreach ($connections as $name => $connection) { if (!empty($specifiedConnections) && !in_array($name, $specifiedConnections)) { continue; } - $connection->export->dropDatabase($name); + try { + $connection->export->dropDatabase($name); + } catch (Exception $e) { + + } } } diff --git a/lib/Doctrine/Connection.php b/lib/Doctrine/Connection.php index 1e33e5971..f962f5f9d 100644 --- a/lib/Doctrine/Connection.php +++ b/lib/Doctrine/Connection.php @@ -192,6 +192,20 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun $this->getAttribute(Doctrine::ATTR_LISTENER)->onOpen($this); } + /** + * getOption + * + * Retrieves option + * + * @param string $option + * @return void + */ + public function getOption($option) + { + if (isset($this->options[$option])) { + return $this->options[$option]; + } + } /** * getAttribute * retrieves a database connection attribute diff --git a/lib/Doctrine/Manager.php b/lib/Doctrine/Manager.php index 41f27132e..ac14122bc 100644 --- a/lib/Doctrine/Manager.php +++ b/lib/Doctrine/Manager.php @@ -300,6 +300,31 @@ class Doctrine_Manager extends Doctrine_Configurable implements Countable, Itera } return $this->_connections[$name]; } + + public function parsePdoDsn($dsn) + { + $parts = array(); + + $names = array('dsn', 'scheme', 'host', 'port', 'user', 'pass', 'path', 'query', 'fragment'); + + foreach ($names as $name) { + if ( ! isset($parts[$name])) { + $parts[$name] = null; + } + } + + $e = explode(':', $dsn); + $parts['scheme'] = $e[0]; + $parts['dsn'] = $dsn; + + $e = explode(';', $e[1]); + foreach ($e as $string) { + list($key, $value) = explode('=', $string); + $parts[$key] = $value; + } + + return $parts; + } /** * parseDsn * diff --git a/lib/Doctrine/Task/BuildAll.php b/lib/Doctrine/Task/BuildAll.php new file mode 100644 index 000000000..3991b423c --- /dev/null +++ b/lib/Doctrine/Task/BuildAll.php @@ -0,0 +1,65 @@ +. + */ + +/** + * Doctrine_Task_BuildAll + * + * @package Doctrine + * @subpackage Task + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision: 2761 $ + * @author Jonathan H. Wage + */ +class Doctrine_Task_BuildAll extends Doctrine_Task +{ + public $description = 'Calls generate-models-from-yaml, create-db, and create-tables', + $requiredArguments = array(), + $optionalArguments = array(); + + protected $models, + $tables; + + public function __construct($dispatcher = null) + { + parent::__construct($dispatcher); + + $this->models = new Doctrine_Task_GenerateModelsFromYaml($this->dispatcher); + $this->createDb = new Doctrine_Task_CreateDb($this->dispatcher); + $this->tables = new Doctrine_Task_CreateTables($this->dispatcher); + + $this->requiredArguments = array_merge($this->requiredArguments, $this->models->requiredArguments, $this->createDb->requiredArguments, $this->tables->requiredArguments); + $this->optionalArguments = array_merge($this->optionalArguments, $this->models->optionalArguments, $this->createDb->optionalArguments, $this->tables->optionalArguments); + } + + public function execute() + { + $this->models->setArguments($this->getArguments()); + $this->models->execute(); + + $this->createDb->setArguments($this->getArguments()); + $this->createDb->execute(); + + $this->tables->setArguments($this->getArguments()); + $this->tables->execute(); + } +} \ No newline at end of file diff --git a/lib/Doctrine/Task/BuildAllLoad.php b/lib/Doctrine/Task/BuildAllLoad.php new file mode 100644 index 000000000..efecebc84 --- /dev/null +++ b/lib/Doctrine/Task/BuildAllLoad.php @@ -0,0 +1,58 @@ +. + */ + +/** + * Doctrine_Task_BuildAllLoad + * + * @package Doctrine + * @subpackage Task + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision: 2761 $ + * @author Jonathan H. Wage + */ +class Doctrine_Task_BuildAllLoad extends Doctrine_Task +{ + public $description = 'Calls build-all, and load-data', + $requiredArguments = array(), + $optionalArguments = array(); + + public function __construct($dispatcher = null) + { + parent::__construct($dispatcher); + + $this->buildAll = new Doctrine_Task_BuildAll($this->dispatcher); + $this->loadData = new Doctrine_Task_LoadData($this->dispatcher); + + $this->requiredArguments = array_merge($this->requiredArguments, $this->buildAll->requiredArguments, $this->loadData->requiredArguments); + $this->optionalArguments = array_merge($this->optionalArguments, $this->buildAll->optionalArguments, $this->loadData->optionalArguments); + } + + public function execute() + { + $this->buildAll->setArguments($this->getArguments()); + $this->buildAll->execute(); + + $this->loadData->setArguments($this->getArguments()); + $this->loadData->execute(); + } +} \ No newline at end of file diff --git a/lib/Doctrine/Task/BuildAllReload.php b/lib/Doctrine/Task/BuildAllReload.php new file mode 100644 index 000000000..d16bacb02 --- /dev/null +++ b/lib/Doctrine/Task/BuildAllReload.php @@ -0,0 +1,58 @@ +. + */ + +/** + * Doctrine_Task_BuildAllReload + * + * @package Doctrine + * @subpackage Task + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision: 2761 $ + * @author Jonathan H. Wage + */ +class Doctrine_Task_BuildAllReload extends Doctrine_Task +{ + public $description = 'Calls rebuild-db and load-data', + $requiredArguments = array(), + $optionalArguments = array(); + + public function __construct($dispatcher = null) + { + parent::__construct($dispatcher); + + $this->rebuildDb = new Doctrine_Task_RebuildDb($this->dispatcher); + $this->loadData = new Doctrine_Task_LoadData($this->dispatcher); + + $this->requiredArguments = array_merge($this->requiredArguments, $this->rebuildDb->requiredArguments, $this->loadData->requiredArguments); + $this->optionalArguments = array_merge($this->optionalArguments, $this->rebuildDb->optionalArguments, $this->loadData->optionalArguments); + } + + public function execute() + { + $this->rebuildDb->setArguments($this->getArguments()); + $this->rebuildDb->execute(); + + $this->loadData->setArguments($this->getArguments()); + $this->loadData->execute(); + } +} \ No newline at end of file diff --git a/lib/Doctrine/Task/Compile.php b/lib/Doctrine/Task/Compile.php index bda65d882..e6c3133a2 100644 --- a/lib/Doctrine/Task/Compile.php +++ b/lib/Doctrine/Task/Compile.php @@ -40,5 +40,7 @@ class Doctrine_Task_Compile extends Doctrine_Task public function execute() { Doctrine::compile($this->getArgument('compiled_path'), $this->getArgument('drivers', array())); + + $this->notify('Compiled Doctrine successfully to: ' . $this->getArgument('compiled_path')); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/CreateDb.php b/lib/Doctrine/Task/CreateDb.php index 870ce2fee..08f557c16 100644 --- a/lib/Doctrine/Task/CreateDb.php +++ b/lib/Doctrine/Task/CreateDb.php @@ -32,11 +32,13 @@ */ class Doctrine_Task_CreateDb extends Doctrine_Task { - public $description = 'Create database for each of your connections', - $optionalArguments = array('connection' => 'Optionally specify a single connection to create the database for.'); + public $description = 'Create all databases for your connections. If the database already exists, nothing happens.', + $optionalArguments = array(); public function execute() { - Doctrine::createDatabases($this->getArgument('connection')); + Doctrine::createDatabases(); + + $this->notify('Created databases successfully'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/CreateTables.php b/lib/Doctrine/Task/CreateTables.php index 7b77644e7..511f918e0 100644 --- a/lib/Doctrine/Task/CreateTables.php +++ b/lib/Doctrine/Task/CreateTables.php @@ -32,7 +32,7 @@ */ class Doctrine_Task_CreateTables extends Doctrine_Task { - public $description = 'Create tables for all existing database connections', + public $description = 'Create tables for all existing database connections. If table exists nothing happens.', $requiredArguments = array('models_path' => 'Specify path to your models directory.'), $optionalArguments = array(); @@ -40,6 +40,6 @@ class Doctrine_Task_CreateTables extends Doctrine_Task { Doctrine::createTablesFromModels($this->getArgument('models_path')); - $this->dispatcher->notify('successfully created tables'); + $this->dispatcher->notify('Created tables successfully'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/DropDb.php b/lib/Doctrine/Task/DropDb.php index e45ae5497..f37cb8e70 100644 --- a/lib/Doctrine/Task/DropDb.php +++ b/lib/Doctrine/Task/DropDb.php @@ -34,7 +34,7 @@ class Doctrine_Task_DropDb extends Doctrine_Task { public $description = 'Drop database for all existing connections', $requiredArguments = array(), - $optionalArguments = array('connection' => 'Optionally specify a single connection to drop the database for.'); + $optionalArguments = array(); public function execute() { @@ -46,8 +46,8 @@ class Doctrine_Task_DropDb extends Doctrine_Task return; } - Doctrine::dropDatabases($this->getArgument('connection')); + Doctrine::dropDatabases(); - $this->notify('Successfully dropped all databases'); + $this->notify('Dropped databases successfully'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/DumpData.php b/lib/Doctrine/Task/DumpData.php index 902d61ef7..2c135ef20 100644 --- a/lib/Doctrine/Task/DumpData.php +++ b/lib/Doctrine/Task/DumpData.php @@ -55,6 +55,6 @@ class Doctrine_Task_DumpData extends Doctrine_Task Doctrine::dumpData($path, $individualFiles); - $this->dispatcher->notify(sprintf('successfully dumped data to %s', $path)); + $this->dispatcher->notify(sprintf('Dumped data successfully to: %s', $path)); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/GenerateMigration.php b/lib/Doctrine/Task/GenerateMigration.php index 132bc551b..1205ad7fc 100644 --- a/lib/Doctrine/Task/GenerateMigration.php +++ b/lib/Doctrine/Task/GenerateMigration.php @@ -41,6 +41,6 @@ class Doctrine_Task_GenerateMigration extends Doctrine_Task { Doctrine::generateMigrationClass($this->getArgument('class_name'), $this->getArgument('migrations_path')); - $this->dispatcher->notify(sprintf('successfully generated migration class: %s to %s', $this->getArgument('class_name'), $this->getArgument('migrations_path'))); + $this->dispatcher->notify(sprintf('Generated migration class: %s successfully to %s', $this->getArgument('class_name'), $this->getArgument('migrations_path'))); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/GenerateMigrationsFromDb.php b/lib/Doctrine/Task/GenerateMigrationsFromDb.php index c400d5dee..832b70c20 100644 --- a/lib/Doctrine/Task/GenerateMigrationsFromDb.php +++ b/lib/Doctrine/Task/GenerateMigrationsFromDb.php @@ -40,6 +40,6 @@ class Doctrine_Task_GenerateMigrationsFromDb extends Doctrine_Task { Doctrine::generateMigrationsFromDb($this->getArgument('migrations_path')); - $this->dispatcher->notify('successfully generated migration classes from databases'); + $this->dispatcher->notify('Generated migration classes successfully from database'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/GenerateMigrationsFromModels.php b/lib/Doctrine/Task/GenerateMigrationsFromModels.php index b9377452d..1e28f0a97 100644 --- a/lib/Doctrine/Task/GenerateMigrationsFromModels.php +++ b/lib/Doctrine/Task/GenerateMigrationsFromModels.php @@ -41,6 +41,6 @@ class Doctrine_Task_GenerateMigrationsFromModels extends Doctrine_Task { Doctrine::generateMigrationsFromModels($this->getArgument('migrations_path'), $this->getArgument('models_path')); - $this->dispatcher->notify('successfully generated migrations from models'); + $this->dispatcher->notify('Generated migration classes successfully from models'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/GenerateModelsFromDb.php b/lib/Doctrine/Task/GenerateModelsFromDb.php index 1e845d2ca..1524a3fe9 100644 --- a/lib/Doctrine/Task/GenerateModelsFromDb.php +++ b/lib/Doctrine/Task/GenerateModelsFromDb.php @@ -40,6 +40,6 @@ class Doctrine_Task_GenerateModelsFromDb extends Doctrine_Task { Doctrine::generateModelsFromDb($this->getArgument('models_path'), (array) $this->getArgument('connection')); - $this->dispatcher->notify('successfully generated models from databases'); + $this->dispatcher->notify('Generated models successfully from databases'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/GenerateModelsFromYaml.php b/lib/Doctrine/Task/GenerateModelsFromYaml.php index e9a1f782b..eb6aa4602 100644 --- a/lib/Doctrine/Task/GenerateModelsFromYaml.php +++ b/lib/Doctrine/Task/GenerateModelsFromYaml.php @@ -41,6 +41,6 @@ class Doctrine_Task_GenerateModelsFromYaml extends Doctrine_Task { Doctrine::generateModelsFromYaml($this->getArgument('yaml_schema_path'), $this->getArgument('models_path')); - $this->dispatcher->notify('successfully generated models from yaml'); + $this->notify('Generated models successfully from YAML schema'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/GenerateSql.php b/lib/Doctrine/Task/GenerateSql.php index 48d72e6be..3b862a631 100644 --- a/lib/Doctrine/Task/GenerateSql.php +++ b/lib/Doctrine/Task/GenerateSql.php @@ -51,6 +51,6 @@ class Doctrine_Task_GenerateSql extends Doctrine_Task file_put_contents($path, $sql); - $this->dispatcher->notify('successfully generated sql for models'); + $this->dispatcher->notify('Generated SQL successfully for models'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/GenerateYamlFromDb.php b/lib/Doctrine/Task/GenerateYamlFromDb.php index 52a2df229..846459808 100644 --- a/lib/Doctrine/Task/GenerateYamlFromDb.php +++ b/lib/Doctrine/Task/GenerateYamlFromDb.php @@ -40,6 +40,6 @@ class Doctrine_Task_GenerateYamlFromDb extends Doctrine_Task { Doctrine::generateYamlFromDb($this->getArgument('yaml_schema_path')); - $this->dispatcher->notify('successfully generated yaml schema from databases'); + $this->dispatcher->notify('Generate YAML schema successfully from database'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/GenerateYamlFromModels.php b/lib/Doctrine/Task/GenerateYamlFromModels.php index 1ca1adcfa..81f33c1a2 100644 --- a/lib/Doctrine/Task/GenerateYamlFromModels.php +++ b/lib/Doctrine/Task/GenerateYamlFromModels.php @@ -41,6 +41,6 @@ class Doctrine_Task_GenerateYamlFromModels extends Doctrine_Task { Doctrine::generateYamlFromModels($this->getArgument('yaml_schema_path'), $this->getArgument('models_path')); - $this->dispatcher->notify('successfully generated yaml schema from models'); + $this->dispatcher->notify('Generated YAML schema successfully from models'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/LoadData.php b/lib/Doctrine/Task/LoadData.php index 9fd5c836c..45d33d7b2 100644 --- a/lib/Doctrine/Task/LoadData.php +++ b/lib/Doctrine/Task/LoadData.php @@ -42,6 +42,6 @@ class Doctrine_Task_LoadData extends Doctrine_Task Doctrine::loadModels($this->getArgument('models_path')); Doctrine::loadData($this->getArgument('data_fixtures_path')); - $this->dispatcher->notify('data was successfully loaded'); + $this->dispatcher->notify('Data was successfully loaded'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/LoadDummyData.php b/lib/Doctrine/Task/LoadDummyData.php index 83603cdba..8452d40fa 100644 --- a/lib/Doctrine/Task/LoadDummyData.php +++ b/lib/Doctrine/Task/LoadDummyData.php @@ -42,6 +42,6 @@ class Doctrine_Task_LoadDummyData extends Doctrine_Task Doctrine::loadModels($this->getArgument('models_path')); Doctrine::loadDummyData($this->getArgument('append') ? true:false, $this->getArgument('num') ? $this->getArgument('num'):5); - $this->dispatcher->notify('dummy data successfully loaded'); + $this->dispatcher->notify('Dummy data was successfully loaded'); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/Migrate.php b/lib/Doctrine/Task/Migrate.php index f4a03b157..dec4b76a0 100644 --- a/lib/Doctrine/Task/Migrate.php +++ b/lib/Doctrine/Task/Migrate.php @@ -40,6 +40,6 @@ class Doctrine_Task_Migrate extends Doctrine_Task { $version = Doctrine::migrate($this->getArgument('migrations_path'), $this->getArgument('version')); - $this->dispatcher->notify('migrated to version # ' . $version); + $this->dispatcher->notify('migrated successfully to version #' . $version); } } \ No newline at end of file diff --git a/lib/Doctrine/Task/RebuildDb.php b/lib/Doctrine/Task/RebuildDb.php new file mode 100644 index 000000000..9587a75c0 --- /dev/null +++ b/lib/Doctrine/Task/RebuildDb.php @@ -0,0 +1,58 @@ +. + */ + +/** + * Doctrine_Task_RebuildDb + * + * @package Doctrine + * @subpackage Task + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision: 2761 $ + * @author Jonathan H. Wage + */ +class Doctrine_Task_RebuildDb extends Doctrine_Task +{ + public $description = 'Drops and re-creates databases', + $requiredArguments = array(), + $optionalArguments = array(); + + public function __construct($dispatcher = null) + { + parent::__construct($dispatcher); + + $this->dropDb = new Doctrine_Task_DropDb($this->dispatcher); + $this->buildAll = new Doctrine_Task_BuildAll($this->dispatcher); + + $this->requiredArguments = array_merge($this->requiredArguments, $this->dropDb->requiredArguments, $this->buildAll->requiredArguments); + $this->optionalArguments = array_merge($this->optionalArguments, $this->dropDb->optionalArguments, $this->buildAll->optionalArguments); + } + + public function execute() + { + $this->dropDb->setArguments($this->getArguments()); + $this->dropDb->execute(); + + $this->buildAll->setArguments($this->getArguments()); + $this->buildAll->execute(); + } +} \ No newline at end of file