diff options
author | Ciro Mattia Gonano <ciromattia@gmail.com> | 2013-09-11 15:56:48 +0200 |
---|---|---|
committer | Ciro Mattia Gonano <ciromattia@gmail.com> | 2013-09-11 15:57:07 +0200 |
commit | 3069eaf35e833ffe4a1c1c7829dd7e168ae27420 (patch) | |
tree | d0c2e4d934cc34ba7d4232f759923b5a257dcb21 /bin | |
parent | b833247ce597ec26159b46c8dfbea7f1e265950b (diff) |
Merge up to r3319
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/prado-cli | 4 | ||||
-rw-r--r-- | bin/prado-cli.bat | 39 | ||||
-rwxr-xr-x | bin/prado-cli.php | 883 |
3 files changed, 926 insertions, 0 deletions
diff --git a/bin/prado-cli b/bin/prado-cli new file mode 100755 index 00000000..0d504299 --- /dev/null +++ b/bin/prado-cli @@ -0,0 +1,4 @@ +#!/usr/bin/env php +<?php +//execute the command line tool +include(dirname(__FILE__).'/prado-cli.php'); diff --git a/bin/prado-cli.bat b/bin/prado-cli.bat new file mode 100644 index 00000000..38d02850 --- /dev/null +++ b/bin/prado-cli.bat @@ -0,0 +1,39 @@ +@echo off + +rem ************************************************************* +rem ** CLI for Windows based systems (based on phing.bat) +rem ************************************************************* + +rem This script will do the following: +rem - check for PHP_COMMAND env, if found, use it. +rem - if not found detect php, if found use it, otherwise err and terminate + +if "%OS%"=="Windows_NT" @setlocal + +rem %~dp0 is expanded pathname of the current script under NT +set PRADO_DIR=%~dp0 + +goto init + +:init + +if "%PHP_COMMAND%" == "" goto no_phpcommand + +IF EXIST ".\prado-cli.php" ( + %PHP_COMMAND% -d html_errors=off -d open_basedir= -q ".\prado-cli.php" %1 %2 %3 %4 %5 %6 %7 %8 %9 +) ELSE ( + %PHP_COMMAND% -d html_errors=off -d open_basedir= -q "%PRADO_DIR%\prado-cli.php" %1 %2 %3 %4 %5 %6 %7 %8 %9 +) +goto cleanup + +:no_phpcommand +rem echo ------------------------------------------------------------------------ +rem echo WARNING: Set environment var PHP_COMMAND to the location of your php.exe +rem echo executable (e.g. C:\PHP\php.exe). (assuming php.exe on PATH) +rem echo ------------------------------------------------------------------------ +set PHP_COMMAND=php.exe +goto init + +:cleanup +if "%OS%"=="Windows_NT" @endlocal +rem pause diff --git a/bin/prado-cli.php b/bin/prado-cli.php new file mode 100755 index 00000000..4fa70c08 --- /dev/null +++ b/bin/prado-cli.php @@ -0,0 +1,883 @@ +<?php + +/** + * Prado command line developer tools. + * + * @author Wei Zhuo <weizhuo[at]gmail[dot]com> + * @link http://www.pradosoft.com/ + * @copyright Copyright © 2005-2013 PradoSoft + * @license http://www.pradosoft.com/license/ + * @version $Id: prado-cli.php 3316 2013-08-20 13:51:25Z ctrlaltca $ + */ + +if(!isset($_SERVER['argv']) || php_sapi_name()!=='cli') + die('Must be run from the command line'); + +$frameworkPath = realpath(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'framework'.DIRECTORY_SEPARATOR; + +require_once($frameworkPath.'prado.php'); + +//stub application class +class PradoShellApplication extends TApplication +{ + public function run() + { + $this->initApplication(); + } +} + +restore_exception_handler(); + +//config PHP shell +if(count($_SERVER['argv']) > 1 && strtolower($_SERVER['argv'][1])==='shell') +{ + function __shell_print_var($shell,$var) + { + if(!$shell->has_semicolon) echo Prado::varDump($var); + } + include_once($frameworkPath.'/3rdParty/PhpShell/php-shell-init.php'); +} + + +//register action classes +PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineCreateProject'); +PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineCreateTests'); +PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLinePhpShell'); +PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineUnitTest'); +PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineActiveRecordGen'); +PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineActiveRecordGenAll'); + +//run it; +PradoCommandLineInterpreter::getInstance()->run($_SERVER['argv']); + +/**************** END CONFIGURATION **********************/ + +/** + * PradoCommandLineInterpreter Class + * + * Command line interface, configures the action classes and dispatches the command actions. + * + * @author Wei Zhuo <weizhuo[at]gmail[dot]com> + * @version $Id: prado-cli.php 3316 2013-08-20 13:51:25Z ctrlaltca $ + * @since 3.0.5 + */ +class PradoCommandLineInterpreter +{ + /** + * @var array command action classes + */ + protected $_actions=array(); + + /** + * @param string action class name + */ + public function addActionClass($class) + { + $this->_actions[$class] = new $class; + } + + /** + * @return PradoCommandLineInterpreter static instance + */ + public static function getInstance() + { + static $instance; + if($instance === null) + $instance = new self; + return $instance; + } + + public static function printGreeting() + { + echo "Command line tools for Prado ".Prado::getVersion().".\n"; + } + + /** + * Dispatch the command line actions. + * @param array command line arguments + */ + public function run($args) + { + if(count($args) > 1) + array_shift($args); + $valid = false; + foreach($this->_actions as $class => $action) + { + if($action->isValidAction($args)) + { + $valid |= $action->performAction($args); + break; + } + else + { + $valid = false; + } + } + if(!$valid) + $this->printHelp(); + } + + /** + * Print command line help, default action. + */ + public function printHelp() + { + PradoCommandLineInterpreter::printGreeting(); + + echo "usage: php prado-cli.php action <parameter> [optional]\n"; + echo "example: php prado-cli.php -c mysite\n\n"; + echo "actions:\n"; + foreach($this->_actions as $action) + echo $action->renderHelp(); + } +} + +/** + * Base class for command line actions. + * + * @author Wei Zhuo <weizhuo[at]gmail[dot]com> + * @version $Id: prado-cli.php 3316 2013-08-20 13:51:25Z ctrlaltca $ + * @since 3.0.5 + */ +abstract class PradoCommandLineAction +{ + /** + * Execute the action. + * @param array command line parameters + * @return boolean true if action was handled + */ + public abstract function performAction($args); + + protected function createDirectory($dir, $mask) + { + if(!is_dir($dir)) + { + mkdir($dir); + echo "creating $dir\n"; + } + if(is_dir($dir)) + chmod($dir, $mask); + } + + protected function createFile($filename, $content) + { + if(!is_file($filename)) + { + file_put_contents($filename, $content); + echo "creating $filename\n"; + } + } + + public function isValidAction($args) + { + return strtolower($args[0]) === $this->action && + count($args)-1 >= count($this->parameters); + } + + public function renderHelp() + { + $params = array(); + foreach($this->parameters as $v) + $params[] = '<'.$v.'>'; + $parameters = join($params, ' '); + $options = array(); + foreach($this->optional as $v) + $options[] = '['.$v.']'; + $optional = (strlen($parameters) ? ' ' : ''). join($options, ' '); + $description=''; + foreach(explode("\n", wordwrap($this->description,65)) as $line) + $description .= ' '.$line."\n"; + return <<<EOD + {$this->action} {$parameters}{$optional} +{$description} + +EOD; + } + + protected function initializePradoApplication($directory) + { + $app_dir = realpath($directory.'/protected/'); + if($app_dir !== false && is_dir($app_dir)) + { + if(Prado::getApplication()===null) + { + $app = new PradoShellApplication($app_dir); + $app->run(); + $dir = substr(str_replace(realpath('./'),'',$app_dir),1); + $initialized=true; + PradoCommandLineInterpreter::printGreeting(); + echo '** Loaded PRADO appplication in directory "'.$dir."\".\n"; + } + + return Prado::getApplication(); + } + else + { + PradoCommandLineInterpreter::printGreeting(); + echo '+'.str_repeat('-',77)."+\n"; + echo '** Unable to load PRADO application in directory "'.$directory."\".\n"; + echo '+'.str_repeat('-',77)."+\n"; + } + return false; + } + +} + +/** + * Create a Prado project skeleton, including directories and files. + * + * @author Wei Zhuo <weizhuo[at]gmail[dot]com> + * @version $Id: prado-cli.php 3316 2013-08-20 13:51:25Z ctrlaltca $ + * @since 3.0.5 + */ +class PradoCommandLineCreateProject extends PradoCommandLineAction +{ + protected $action = '-c'; + protected $parameters = array('directory'); + protected $optional = array(); + protected $description = 'Creates a Prado project skeleton for the given <directory>.'; + + public function performAction($args) + { + PradoCommandLineInterpreter::printGreeting(); + $this->createNewPradoProject($args[1]); + return true; + } + + /** + * Functions to create new prado project. + */ + protected function createNewPradoProject($dir) + { + if(strlen(trim($dir)) == 0) + return; + + $rootPath = realpath(dirname(trim($dir))); + + if(basename($dir)!=='.') + $basePath = $rootPath.DIRECTORY_SEPARATOR.basename($dir); + else + $basePath = $rootPath; + $appName = basename($basePath); + $assetPath = $basePath.DIRECTORY_SEPARATOR.'assets'; + $protectedPath = $basePath.DIRECTORY_SEPARATOR.'protected'; + $runtimePath = $basePath.DIRECTORY_SEPARATOR.'protected'.DIRECTORY_SEPARATOR.'runtime'; + $pagesPath = $protectedPath.DIRECTORY_SEPARATOR.'pages'; + + $indexFile = $basePath.DIRECTORY_SEPARATOR.'index.php'; + $htaccessFile = $protectedPath.DIRECTORY_SEPARATOR.'.htaccess'; + $configFile = $protectedPath.DIRECTORY_SEPARATOR.'application.xml'; + $defaultPageFile = $pagesPath.DIRECTORY_SEPARATOR.'Home.page'; + + $this->createDirectory($basePath, 0755); + $this->createDirectory($assetPath,0777); + $this->createDirectory($protectedPath,0755); + $this->createDirectory($runtimePath,0777); + $this->createDirectory($pagesPath,0755); + + $this->createFile($indexFile, $this->renderIndexFile()); + $this->createFile($configFile, $this->renderConfigFile($appName)); + $this->createFile($htaccessFile, $this->renderHtaccessFile()); + $this->createFile($defaultPageFile, $this->renderDefaultPage()); + } + + protected function renderIndexFile() + { + $framework = realpath(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'framework'.DIRECTORY_SEPARATOR.'prado.php'; +return '<?php + +$frameworkPath=\''.$framework.'\'; + +// The following directory checks may be removed if performance is required +$basePath=dirname(__FILE__); +$assetsPath=$basePath.\'/assets\'; +$runtimePath=$basePath.\'/protected/runtime\'; + +if(!is_file($frameworkPath)) + die("Unable to find prado framework path $frameworkPath."); +if(!is_writable($assetsPath)) + die("Please make sure that the directory $assetsPath is writable by Web server process."); +if(!is_writable($runtimePath)) + die("Please make sure that the directory $runtimePath is writable by Web server process."); + + +require_once($frameworkPath); + +$application=new TApplication; +$application->run(); + +?>'; + } + + protected function renderConfigFile($appName) + { + return <<<EOD +<?xml version="1.0" encoding="utf-8"?> + +<application id="$appName" mode="Debug"> + <!-- alias definitions and namespace usings + <paths> + <alias id="myalias" path="./lib" /> + <using namespace="Application.common.*" /> + </paths> + --> + + <!-- configurations for modules --> + <modules> + <!-- Remove this comment mark to enable caching + <module id="cache" class="System.Caching.TDbCache" /> + --> + + <!-- Remove this comment mark to enable PATH url format + <module id="request" class="THttpRequest" UrlFormat="Path" /> + --> + + <!-- Remove this comment mark to enable logging + <module id="log" class="System.Util.TLogRouter"> + <route class="TBrowserLogRoute" Categories="System" /> + </module> + --> + </modules> + + <!-- configuration for available services --> + <services> + <service id="page" class="TPageService" DefaultPage="Home" /> + </services> + + <!-- application parameters + <parameters> + <parameter id="param1" value="value1" /> + <parameter id="param2" value="value2" /> + </parameters> + --> +</application> +EOD; + } + + protected function renderHtaccessFile() + { + return 'deny from all'; + } + + + protected function renderDefaultPage() + { +return <<<EOD +<html> +<head> + <title>Welcome to PRADO</title> +</head> +<body> +<h1>Welcome to PRADO!</h1> +</body> +</html> +EOD; + } +} + +/** + * Creates test fixtures for a Prado application. + * + * @author Wei Zhuo <weizhuo[at]gmail[dot]com> + * @version $Id: prado-cli.php 3316 2013-08-20 13:51:25Z ctrlaltca $ + * @since 3.0.5 + */ +class PradoCommandLineCreateTests extends PradoCommandLineAction +{ + protected $action = '-t'; + protected $parameters = array('directory'); + protected $optional = array(); + protected $description = 'Create test fixtures in the given <directory>.'; + + public function performAction($args) + { + PradoCommandLineInterpreter::printGreeting(); + $this->createTestFixtures($args[1]); + return true; + } + + protected function createTestFixtures($dir) + { + if(strlen(trim($dir)) == 0) + return; + + $rootPath = realpath(dirname(trim($dir))); + $basePath = $rootPath.'/'.basename($dir); + + $tests = $basePath.'/tests'; + $unit_tests = $tests.'/unit'; + $functional_tests = $tests.'/functional'; + + $this->createDirectory($tests,0755); + $this->createDirectory($unit_tests,0755); + $this->createDirectory($functional_tests,0755); + + $unit_test_index = $tests.'/unit.php'; + $functional_test_index = $tests.'/functional.php'; + + $this->createFile($unit_test_index, $this->renderUnitTestFixture()); + $this->createFile($functional_test_index, $this->renderFunctionalTestFixture()); + } + + protected function renderUnitTestFixture() + { + $tester = realpath(dirname(dirname(__FILE__))).'/tests/test_tools/unit_tests.php'; +return '<?php + +include_once \''.$tester.'\'; + +$app_directory = "../protected"; +$test_cases = dirname(__FILE__)."/unit"; + +$tester = new PradoUnitTester($test_cases, $app_directory); +$tester->run(new HtmlReporter()); + +?>'; + } + + protected function renderFunctionalTestFixture() + { + $tester = realpath(dirname(dirname(__FILE__))).'/tests/test_tools/functional_tests.php'; +return '<?php + +include_once \''.$tester.'\'; + +$test_cases = dirname(__FILE__)."/functional"; + +$tester=new PradoFunctionalTester($test_cases); +$tester->run(new SimpleReporter()); + +?>'; + } + +} + +/** + * Creates and run a Prado application in a PHP Shell. + * + * @author Wei Zhuo <weizhuo[at]gmail[dot]com> + * @version $Id: prado-cli.php 3316 2013-08-20 13:51:25Z ctrlaltca $ + * @since 3.0.5 + */ +class PradoCommandLinePhpShell extends PradoCommandLineAction +{ + protected $action = 'shell'; + protected $parameters = array(); + protected $optional = array('directory'); + protected $description = 'Runs a PHP interactive interpreter. Initializes the Prado application in the given [directory].'; + + public function performAction($args) + { + if(count($args) > 1) + $app = $this->initializePradoApplication($args[1]); + return true; + } +} + +/** + * Runs unit test cases. + * + * @author Wei Zhuo <weizhuo[at]gmail[dot]com> + * @version $Id: prado-cli.php 3316 2013-08-20 13:51:25Z ctrlaltca $ + * @since 3.0.5 + */ +class PradoCommandLineUnitTest extends PradoCommandLineAction +{ + protected $action = 'test'; + protected $parameters = array('directory'); + protected $optional = array('testcase ...'); + protected $description = 'Runs all unit test cases in the given <directory>. Use [testcase] option to run specific test cases.'; + + protected $matches = array(); + + public function performAction($args) + { + $dir = realpath($args[1]); + if($dir !== false && is_dir($dir)) + $this->runUnitTests($dir,$args); + else + echo '** Unable to find directory "'.$args[1]."\".\n"; + return true; + } + + protected function initializeTestRunner() + { + $TEST_TOOLS = realpath(dirname(dirname(__FILE__))).'/tests/test_tools/'; + + require_once($TEST_TOOLS.'/simpletest/unit_tester.php'); + require_once($TEST_TOOLS.'/simpletest/web_tester.php'); + require_once($TEST_TOOLS.'/simpletest/mock_objects.php'); + require_once($TEST_TOOLS.'/simpletest/reporter.php'); + } + + protected function runUnitTests($dir, $args) + { + $app_dir = $this->getAppDir($dir); + if($app_dir !== false) + $this->initializePradoApplication($app_dir.'/../'); + + $this->initializeTestRunner(); + $test_dir = $this->getTestDir($dir); + if($test_dir !== false) + { + $test =$this->getUnitTestCases($test_dir,$args); + $running_dir = substr(str_replace(realpath('./'),'',$test_dir),1); + echo 'Running unit tests in directory "'.$running_dir."\":\n"; + $test->run(new TextReporter()); + } + else + { + $running_dir = substr(str_replace(realpath('./'),'',$dir),1); + echo '** Unable to find test directory "'.$running_dir.'/unit" or "'.$running_dir.'/tests/unit".'."\n"; + } + } + + protected function getAppDir($dir) + { + $app_dir = realpath($dir.'/protected'); + if($app_dir !== false && is_dir($app_dir)) + return $app_dir; + return realpath($dir.'/../protected'); + } + + protected function getTestDir($dir) + { + $test_dir = realpath($dir.'/unit'); + if($test_dir !== false && is_dir($test_dir)) + return $test_dir; + return realpath($dir.'/tests/unit/'); + } + + protected function getUnitTestCases($dir,$args) + { + $matches = null; + if(count($args) > 2) + $matches = array_slice($args,2); + $test=new GroupTest(' '); + $this->addTests($test,$dir,true,$matches); + $test->setLabel(implode(' ',$this->matches)); + return $test; + } + + protected function addTests($test,$path,$recursive=true,$match=null) + { + $dir=opendir($path); + while(($entry=readdir($dir))!==false) + { + if(is_file($path.'/'.$entry) && (preg_match('/[^\s]*test[^\s]*\.php/', strtolower($entry)))) + { + if($match==null||($match!=null && $this->hasMatch($match,$entry))) + $test->addTestFile($path.'/'.$entry); + } + if($entry!=='.' && $entry!=='..' && $entry!=='.svn' && is_dir($path.'/'.$entry) && $recursive) + $this->addTests($test,$path.'/'.$entry,$recursive,$match); + } + closedir($dir); + } + + protected function hasMatch($match,$entry) + { + $file = strtolower(substr($entry,0,strrpos($entry,'.'))); + foreach($match as $m) + { + if(strtolower($m) === $file) + { + $this->matches[] = $m; + return true; + } + } + return false; + } +} + +/** + * Create active record skeleton + * + * @author Wei Zhuo <weizhuo[at]gmail[dot]com> + * @version $Id: prado-cli.php 3316 2013-08-20 13:51:25Z ctrlaltca $ + * @since 3.1 + */ +class PradoCommandLineActiveRecordGen extends PradoCommandLineAction +{ + protected $action = 'generate'; + protected $parameters = array('table', 'output'); + protected $optional = array('directory', 'soap'); + protected $description = 'Generate Active Record skeleton for <table> to <output> file using application.xml in [directory]. May also generate [soap] properties.'; + private $_soap=false; + + public function performAction($args) + { + $app_dir = count($args) > 3 ? $this->getAppDir($args[3]) : $this->getAppDir(); + $this->_soap = count($args) > 4; + if($app_dir !== false) + { + $config = $this->getActiveRecordConfig($app_dir); + $output = $this->getOutputFile($app_dir, $args[2]); + if(is_file($output)) + echo "** File $output already exists, skiping. \n"; + else if($config !== false && $output !== false) + $this->generateActiveRecord($config, $args[1], $output); + } + return true; + } + + protected function getAppDir($dir=".") + { + if(is_dir($dir)) + return realpath($dir); + if(false !== ($app_dir = realpath($dir.'/protected/')) && is_dir($app_dir)) + return $app_dir; + echo '** Unable to find directory "'.$dir."\".\n"; + return false; + } + + protected function getXmlFile($app_dir) + { + if(false !== ($xml = realpath($app_dir.'/application.xml')) && is_file($xml)) + return $xml; + if(false !== ($xml = realpath($app_dir.'/protected/application.xml')) && is_file($xml)) + return $xml; + echo '** Unable to find application.xml in '.$app_dir."\n"; + return false; + } + + protected function getActiveRecordConfig($app_dir) + { + if(false === ($xml=$this->getXmlFile($app_dir))) + return false; + if(false !== ($app=$this->initializePradoApplication($app_dir))) + { + Prado::using('System.Data.ActiveRecord.TActiveRecordConfig'); + foreach($app->getModules() as $module) + if($module instanceof TActiveRecordConfig) + return $module; + echo '** Unable to find TActiveRecordConfig module in '.$xml."\n"; + } + return false; + } + + protected function getOutputFile($app_dir, $namespace) + { + if(is_file($namespace) && strpos($namespace, $app_dir)===0) + return $namespace; + $file = Prado::getPathOfNamespace($namespace, ".php"); + if($file !== null && false !== ($path = realpath(dirname($file))) && is_dir($path)) + { + if(strpos($path, $app_dir)===0) + return $file; + } + echo '** Output file '.$file.' must be within directory '.$app_dir."\n"; + return false; + } + + protected function generateActiveRecord($config, $tablename, $output) + { + $manager = TActiveRecordManager::getInstance(); + if($connection = $manager->getDbConnection()) { + $gateway = $manager->getRecordGateway(); + $tableInfo = $gateway->getTableInfo($manager->getDbConnection(), $tablename); + if(count($tableInfo->getColumns()) === 0) + { + echo '** Unable to find table or view "'.$tablename.'" in "'.$manager->getDbConnection()->getConnectionString()."\".\n"; + return false; + } + else + { + $properties = array(); + foreach($tableInfo->getColumns() as $field=>$column) + $properties[] = $this->generateProperty($field,$column); + } + + $classname = basename($output, '.php'); + $class = $this->generateClass($properties, $tablename, $classname); + echo " Writing class $classname to file $output\n"; + file_put_contents($output, $class); + } else { + echo '** Unable to connect to database with ConnectionID=\''.$config->getConnectionID()."'. Please check your settings in application.xml and ensure your database connection is set up first.\n"; + } + } + + protected function generateProperty($field,$column) + { + $prop = ''; + $name = '$'.$field; + $type = $column->getPHPType(); + if($this->_soap) + { + $prop .= <<<EOD + + /** + * @var $type $name + * @soapproperty + */ + +EOD; + } + $prop .= "\tpublic $name;"; + return $prop; + } + + protected function generateClass($properties, $tablename, $class) + { + $props = implode("\n", $properties); + $date = date('Y-m-d h:i:s'); +return <<<EOD +<?php +/** + * Auto generated by prado-cli.php on $date. + */ +class $class extends TActiveRecord +{ + const TABLE='$tablename'; + +$props + + public static function finder(\$className=__CLASS__) + { + return parent::finder(\$className); + } +} +?> +EOD; + } +} + +/** + * Create active record skeleton for all tables in DB and its relations + * + * @author Matthias Endres <me[at]me23[dot]de> + * @author Daniel Sampedro Bello <darthdaniel85[at]gmail[dot]com> + * @version $Id: prado-cli.php 3316 2013-08-20 13:51:25Z ctrlaltca $ + * @since 3.2 + */ +class PradoCommandLineActiveRecordGenAll extends PradoCommandLineAction { + + protected $action = 'generateAll'; + protected $parameters = array('output'); + protected $optional = array('directory', 'soap', 'overwrite', 'prefix', 'postfix'); + protected $description = "Generate Active Record skeleton for all Tables to <output> file using application.xml in [directory]. May also generate [soap] properties.\nGenerated Classes are named like the Table with optional [Prefix] and/or [Postfix]. [Overwrite] is used to overwrite existing Files."; + private $_soap = false; + private $_prefix = ''; + private $_postfix = ''; + private $_overwrite = false; + + public function performAction($args) { + $app_dir = count($args) > 2 ? $this->getAppDir($args[2]) : $this->getAppDir(); + $this->_soap = count($args) > 3 ? ($args[3] == "soap" || $args[3] == "true" ? true : false) : false; + $this->_overwrite = count($args) > 4 ? ($args[4] == "overwrite" || $args[4] == "true" ? true : false) : false; + $this->_prefix = count($args) > 5 ? $args[5] : ''; + $this->_postfix = count($args) > 6 ? $args[6] : ''; + + if ($app_dir !== false) { + $config = $this->getActiveRecordConfig($app_dir); + + $manager = TActiveRecordManager::getInstance(); + $con = $manager->getDbConnection(); + $con->Active = true; + $command = $con->createCommand("Show Tables"); + $dataReader = $command->query(); + $dataReader->bindColumn(1, $table); + $generator = new PHP_Shell_Extensions_ActiveRecord(); + $tables = array(); + while ($dataReader->read() !== false) { + $tables[] = $table; + } + $con->Active = False; + foreach ($tables as $key => $table) { + $output = $args[1] . "." . $this->_prefix . ucfirst($table) . $this->_postfix; + if ($config !== false && $output !== false) { + $generator->generate("generate " . $table . " " . $output . " " . $this->_soap . " " . $this->_overwrite); + } + } + } + return true; + } + + protected function getAppDir($dir=".") { + if (is_dir($dir)) + return realpath($dir); + if (false !== ($app_dir = realpath($dir . '/protected/')) && is_dir($app_dir)) + return $app_dir; + echo '** Unable to find directory "' . $dir . "\".\n"; + return false; + } + + protected function getXmlFile($app_dir) { + if (false !== ($xml = realpath($app_dir . '/application.xml')) && is_file($xml)) + return $xml; + if (false !== ($xml = realpath($app_dir . '/protected/application.xml')) && is_file($xml)) + return $xml; + echo '** Unable to find application.xml in ' . $app_dir . "\n"; + return false; + } + + protected function getActiveRecordConfig($app_dir) { + if (false === ($xml = $this->getXmlFile($app_dir))) + return false; + if (false !== ($app = $this->initializePradoApplication($app_dir))) { + Prado::using('System.Data.ActiveRecord.TActiveRecordConfig'); + foreach ($app->getModules() as $module) + if ($module instanceof TActiveRecordConfig) + return $module; + echo '** Unable to find TActiveRecordConfig module in ' . $xml . "\n"; + } + return false; + } + + protected function getOutputFile($app_dir, $namespace) { + if (is_file($namespace) && strpos($namespace, $app_dir) === 0) + return $namespace; + $file = Prado::getPathOfNamespace($namespace, ""); + if ($file !== null && false !== ($path = realpath(dirname($file))) && is_dir($path)) { + if (strpos($path, $app_dir) === 0) + return $file; + } + echo '** Output file ' . $file . ' must be within directory ' . $app_dir . "\n"; + return false; + } + +} + +//run PHP shell +if(class_exists('PHP_Shell_Commands', false)) +{ + class PHP_Shell_Extensions_ActiveRecord implements PHP_Shell_Extension { + public function register() + { + + $cmd = PHP_Shell_Commands::getInstance(); + if(Prado::getApplication() !== null) + { + $cmd->registerCommand('#^generate#', $this, 'generate', 'generate <table> <output> [soap]', + 'Generate Active Record skeleton for <table> to <output> file using'.PHP_EOL. + ' application.xml in [directory]. May also generate [soap] properties.'); + } + } + + public function generate($l) + { + $input = explode(" ", trim($l)); + if(count($input) > 2) + { + $app_dir = '.'; + if(Prado::getApplication()!==null) + $app_dir = dirname(Prado::getApplication()->getBasePath()); + $args = array($input[0],$input[1], $input[2],$app_dir); + if(count($input)>3) + $args = array($input[0],$input[1], $input[2],$app_dir,'soap'); + $cmd = new PradoCommandLineActiveRecordGen; + $cmd->performAction($args); + } + else + { + echo "\n Usage: generate table_name Application.pages.RecordClassName\n"; + } + } + } + + $__shell_exts = PHP_Shell_Extensions::getInstance(); + $__shell_exts->registerExtensions(array( + "active-record" => new PHP_Shell_Extensions_ActiveRecord)); /* the :set command */ + + include_once(realpath(dirname(dirname(__FILE__))).'/framework/3rdParty/PhpShell/php-shell-cmd.php'); +} |