Commit a8b38b58 authored by wernerm's avatar wernerm

Updated the cli compiler to allocate more memory. It was also finally tested on Win32.

parent 3b8efd07
#!/usr/bin/php #!/usr/bin/env php
<?php
chdir(dirname(__FILE__));
?>
Welcome to the interactive Doctrine Compiler 0.0.2 (Beta).
Welcome to the interactive Doctrine Compiler 0.0.1 (Beta). To see the available command-line options, run:
<?php echo $argv[0]; ?> --help
WARNING: You're on your own - this script modifies your
filesystem and has not been tested on Windows (yet).
<?php <?php
if (in_array($argv[1], array('--help', '-help', '-h', '-?'))) { if (in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?> ?>
...@@ -26,21 +30,6 @@ While the program is running: ...@@ -26,21 +30,6 @@ While the program is running:
exit; exit;
} }
if ($argc > 1) {
$doctrinePath = $argv[1];
}
$drivers = array(
'Db2',
'Firebird',
'Informix',
'Mssql',
'Mysql',
'Oracle',
'Pgsql',
'Sqlite'
);
function addIncludePath($path) { function addIncludePath($path) {
set_include_path( set_include_path(
$path . PATH_SEPARATOR . get_include_path() $path . PATH_SEPARATOR . get_include_path()
...@@ -110,20 +99,30 @@ function ask( ...@@ -110,20 +99,30 @@ function ask(
} }
} }
// Enable error reporting // Enable error reporting
if (($answer = ask("Would you like to turn on error reporting?", 'n')) == 'y') { if (($answer = ask("Would you like to turn on error reporting?", 'n')) == 'y') {
error_reporting(E_ALL); error_reporting(E_ALL);
$showErrors = true;
} else { } else {
error_reporting(0); error_reporting(0);
$showErrors = false;
} }
autoQuit($answer); autoQuit($answer);
// Process library path command line argument
if ($argc > 1) {
$doctrinePath = $argv[1];
} else {
$doctrinePath = dirname(__FILE__);
}
// Get Doctrine's library path // Get Doctrine's library path
$usablePath = false; $usablePath = false;
while (!$usablePath) { while (!$usablePath) {
if (!isset($doctrinePath)) {
$doctrinePath = dirname(__FILE__);
}
$path = ask("Please enter the path to Doctrine's lib directory:", $doctrinePath, array($doctrinePath), false); $path = ask("Please enter the path to Doctrine's lib directory:", $doctrinePath, array($doctrinePath), false);
autoQuit($path); autoQuit($path);
try { try {
...@@ -139,10 +138,58 @@ while (!$usablePath) { ...@@ -139,10 +138,58 @@ while (!$usablePath) {
} }
} }
// Process target filename command line argument
if ($argc > 2) {
$targetFile = $argv[2];
} else {
$targetFile = $path.DIRECTORY_SEPARATOR.'Doctrine.compiled.php';
}
clearstatcache();
$usableFilename = false;
while (!$usableFilename) {
$target = ask("Please enter the target filename for the 'compiled' Doctrine file that will be created:", $targetFile, array($targetFile), false);
autoQuit($target);
if (file_exists($target)) {
if (is_writable($target) && (!is_dir($target))) {
$usableFilename = true;
} else {
$msg = "The target filename '$target' cannot be used (it is not writable, or it is a directory).";
}
} else {
if (is_writable(dirname($target))) {
$usableFilename = true;
} else {
$msg = "The directory in which the target file will be created is not writable.";
}
}
if (!$usableFilename) {
showMessage($msg);
if (($answer = ask("Would you like to specify a different target filename?")) != 'y') {
quit();
}
}
}
// Define the default drivers - unfortunately, this is hard-coded for now
$drivers = array(
'Db2',
'Firebird',
'Informix',
'Mssql',
'Mysql',
'Oracle',
'Pgsql',
'Sqlite'
);
$includeDrivers = array(); $includeDrivers = array();
$excludeDrivers = array(); $excludeDrivers = array();
// Determine driver support // Determine driver support
foreach ($drivers as $driver) { foreach ($drivers as $driver) {
if (($answer = ask("Would you like to enable support for $driver?")) == 'y') { if (($answer = ask("Would you like to enable support for $driver?")) == 'y') {
$includeDrivers[] = $driver; $includeDrivers[] = $driver;
...@@ -153,19 +200,22 @@ foreach ($drivers as $driver) { ...@@ -153,19 +200,22 @@ foreach ($drivers as $driver) {
} }
// Verify driver support // Verify driver support
if (!count($includeDrivers)) { if (!count($includeDrivers)) {
showMessage("You have not selected any drivers. Normally this is not a good idea, unless you know what you're doing."); showMessage("You have not selected any drivers. Usually this is not a good idea, unless you know what you're doing.");
if (($answer = ask("Are you sure you want to compile without any drivers?")) != 'y') { if (($answer = ask("Are you sure you want to compile without any drivers?")) != 'y') {
quit(); quit();
} }
autoQuit($answer); autoQuit($answer);
} }
// 'Compile' Doctrine... // Try to prevent errors related to memory allocation
showMessage("Trying to set the PHP memory limit to 18MB...");
ini_set('memory_limit', '18M'); $requiredMemory = '32M';
if (ini_get('memory_limit') != '18M') { showMessage("Trying to set the PHP memory limit to $requiredMemory...");
showMessage("WARNING: The program could not set the PHP memory limit to 18MB. The compilation might fail."); ini_set('memory_limit', $requiredMemory);
if (ini_get('memory_limit') != $requiredMemory) {
showMessage("WARNING: The program could not set the PHP memory limit to $requiredMemory. The compilation might fail.");
if (($answer = ask("Do you still want to continue?")) != 'y') { if (($answer = ask("Do you still want to continue?")) != 'y') {
quit; quit;
} }
...@@ -173,80 +223,96 @@ if (ini_get('memory_limit') != '18M') { ...@@ -173,80 +223,96 @@ if (ini_get('memory_limit') != '18M') {
showMessage("PHP memory limit adjusted successfully."); showMessage("PHP memory limit adjusted successfully.");
} }
// Build / 'Compile' Doctrine...
$target = './Doctrine.compiled.php';
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::LEAVES_ONLY); try {
foreach ($it as $file) { $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::LEAVES_ONLY);
$e = explode('.', $file->getFileName());
// we don't want to require versioning files foreach ($it as $file) {
if (end($e) === 'php' && strpos($file->getFileName(), '.inc') === false) { $e = explode('.', $file->getFileName());
require_once $file->getPathName();
// We don't want to require versioning files, or cli files
if (end($e) === 'php' && strpos($file->getFileName(), '.inc') === false && strpos($file->getFileName(), 'cli') !== 0) {
require_once $file->getPathName();
}
} }
}
$classes = array_merge(get_declared_classes(), get_declared_interfaces()); $classes = array_merge(get_declared_classes(), get_declared_interfaces());
$ret = array(); $ret = array();
foreach ($classes as $class) { foreach ($classes as $class) {
$e = explode('_', $class); $e = explode('_', $class);
if ($e[0] !== 'Doctrine') { if ($e[0] !== 'Doctrine') {
continue; continue;
} }
// Skip excluded drivers
// Skip excluded drivers $skipClass = false;
$skipClass = false; foreach ($excludeDrivers as $excludeDriver) {
foreach ($excludeDrivers as $excludeDriver) { if (in_array($excludeDriver, $e)) {
if (in_array($excludeDriver, $e)) { $skipClass = true;
$skipClass = true; break;
break; }
}
if ($skipClass) {
echo "\nExcluding -> $class";
continue;
} }
}
if ($skipClass) {
echo "\nExcluding -> $class";
continue;
}
$refl = new ReflectionClass($class); $refl = new ReflectionClass($class);
$file = $refl->getFileName(); $file = $refl->getFileName();
echo "\nIncluding -> $file"; echo "\nIncluding -> $file";
$lines = file($file); $lines = file($file);
$start = $refl->getStartLine() - 1; $start = $refl->getStartLine() - 1;
$end = $refl->getEndLine(); $end = $refl->getEndLine();
$ret = array_merge($ret, array_slice($lines, $start, ($end - $start))); $ret = array_merge($ret, array_slice($lines, $start, ($end - $start)));
} }
if ($target == null) { // first write the 'compiled' data to a text file, so
$target = $path . DIRECTORY_SEPARATOR . 'Doctrine.compiled.php'; // that we can use php_strip_whitespace (which only works on files)
}
// first write the 'compiled' data to a text file, so $fp = @fopen($target, 'w');
// that we can use php_strip_whitespace (which only works on files)
$fp = @fopen($target, 'w');
if ($fp === false) { if ($fp === false) {
throw new Exception("Couldn't write compiled data. Failed to open $target"); throw new Exception("Couldn't write compiled data. Failed to open $target");
} }
fwrite($fp, "<?php ". implode('', $ret)); fwrite($fp, "<?php ". implode('', $ret));
fclose($fp); fclose($fp);
$stripped = php_strip_whitespace($target);
$fp = @fopen($target, 'w');
if ($fp === false) {
throw new Exception("Couldn't write compiled data. Failed to open $file");
}
fwrite($fp, $stripped);
fclose($fp);
} catch (Exception $e) {
if (!$showErrors) {
if (($answer = ask("Sorry, an error occurred during the build. Would you like to see the error?")) == 'y') {
showMessage("\n$e");
} else {
quit();
}
}
showMessage("\nBuild Aborted.");
exit;
$stripped = php_strip_whitespace($target);
$fp = @fopen($target, 'w');
if ($fp === false) {
throw new Exception("Couldn't write compiled data. Failed to open $file");
} }
fwrite($fp, $stripped);
fclose($fp);
// Say bye... // Say bye...
showMessage("\nCompilation Finished."); showMessage("\nCompilation Finished.");
showMessage("Thank you for using the interactive Doctrine Compiler. Have fun following the Doctrine :)\n"); showMessage("Thank you for using the interactive Doctrine Compiler. Have fun following the Doctrine :)\n");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment