2007-08-21 21:46:59 +00:00
< ? php
/* SVN FILE: $Id$ */
/**
* Command - line database management utility to automate programmer chores .
*
* Schema is CakePHP ' s database management utility . This helps you maintain versions of
* of your database .
*
* PHP versions 4 and 5
*
* CakePHP ( tm ) : Rapid Development Framework < http :// www . cakephp . org />
* Copyright 2005 - 2007 , Cake Software Foundation , Inc .
* 1785 E . Sahara Avenue , Suite 490 - 204
* Las Vegas , Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice .
*
* @ filesource
* @ copyright Copyright 2005 - 2007 , Cake Software Foundation , Inc .
* @ link http :// www . cakefoundation . org / projects / info / cakephp CakePHP ( tm ) Project
* @ package cake
* @ subpackage cake . cake . console . libs
* @ since CakePHP ( tm ) v 1.2 . 0.5550
* @ version $Revision $
* @ modifiedby $LastChangedBy $
* @ lastmodified $Date $
* @ license http :// www . opensource . org / licenses / mit - license . php The MIT License
*/
uses ( 'file' , 'model' . DS . 'schema' );
/**
* Schema is a command - line database management utility for automating programmer chores .
*
* @ package cake
* @ subpackage cake . cake . console . libs
*/
class SchemaShell extends Shell {
/**
* Override initialize
*
* @ access public
*/
function initialize () {
$this -> out ( 'Cake Schema Shell' );
$this -> hr ();
}
/**
* Override startup
*
* @ access public
*/
function startup () {
2007-08-21 23:22:15 +00:00
$settings = am ( array ( 'path' => CONFIGS . 'sql' ), $this -> params );
$this -> Schema =& new CakeSchema ( $settings );
}
/**
* Override main
*
* @ access public
*/
function main () {
$this -> help ();
2007-08-21 21:46:59 +00:00
}
/**
* Read and output contents od schema object
* path to read as second arg
*
* @ access public
*/
function view () {
2007-08-21 23:22:15 +00:00
$File = new File ( $this -> Schema -> path . DS . 'schema.php' );
2007-08-21 21:46:59 +00:00
if ( $File -> exists ()) {
$this -> out ( $File -> read ());
exit ();
} else {
$this -> err ( __ ( 'Schema could not be found' , true ));
exit ();
}
}
/**
* Read database and Write schema object
* accepts a connection as first arg or path to save as second arg
*
* @ access public
*/
function generate () {
$this -> out ( 'Generating Schema...' );
$content = $this -> Schema -> read ();
if ( $this -> Schema -> write ( $content )) {
$this -> out ( __ ( 'Schema file created.' , true ));
exit ();
} else {
$this -> err ( __ ( 'Schema could not be created' , true ));
exit ();
}
}
/**
* Dump Schema object to sql file
* if first arg == write , file will be written to sql file
* or it will output sql
*
* @ access public
*/
function dump () {
$write = false ;
$Schema = $this -> Schema -> load ();
2007-08-23 00:57:00 +00:00
if ( ! empty ( $this -> args [ 0 ])) {
if ( $this -> args [ 0 ] == 'true' ) {
$write = Inflector :: underscore ( $this -> Schema -> name );
} else {
$write = $this -> args [ 0 ];
}
}
2007-08-21 21:46:59 +00:00
$db =& ConnectionManager :: getDataSource ( $this -> Schema -> connection );
2007-08-23 00:57:00 +00:00
$contents = " # " . $Schema -> name . " sql generated on: " . date ( 'Y-m-d H:m:s' ) . " : " . time () . " \n \n " ;
$contents .= $db -> dropSchema ( $Schema ) . " \n \n " . $db -> createSchema ( $Schema );
if ( $write ) {
if ( strpos ( $write , '.sql' ) === false ) {
$write .= '.sql' ;
}
$File = new File ( $this -> Schema -> path . DS . $write , true );
2007-08-21 21:46:59 +00:00
if ( $File -> write ( $contents )) {
2007-09-18 04:16:04 +00:00
$this -> out ( sprintf ( __ ( 'SQL dump file created in %s' , true ), $File -> pwd ()));
2007-08-21 21:46:59 +00:00
exit ();
} else {
$this -> err ( __ ( 'SQL dump could not be created' , true ));
exit ();
}
}
$this -> out ( $contents );
return $contents ;
}
/**
* Create database from Schema object
*
* @ access public
*/
function create () {
$Schema = $this -> Schema -> load ();
2007-08-21 23:22:15 +00:00
$table = null ;
$event = array_keys ( $Schema -> tables );
if ( isset ( $this -> args [ 0 ])) {
$table = $this -> args [ 0 ];
$event = array ( $table );
}
2007-08-23 00:57:00 +00:00
$errors = array ();
2007-08-21 21:46:59 +00:00
$db =& ConnectionManager :: getDataSource ( $this -> Schema -> connection );
2007-08-21 23:22:15 +00:00
$drop = $db -> dropSchema ( $Schema , $table );
2007-08-21 21:46:59 +00:00
$this -> out ( $drop );
if ( 'y' == $this -> in ( 'Are you sure you want to drop tables and create your database?' , array ( 'y' , 'n' ), 'n' )) {
2007-08-23 00:57:00 +00:00
$create = $db -> createSchema ( $Schema , $table );
2007-08-21 21:46:59 +00:00
$this -> out ( 'Updating Database...' );
2007-08-23 00:57:00 +00:00
$contents = array_map ( 'trim' , explode ( " ; " , $drop . $create ));
foreach ( $contents as $sql ) {
if ( ! empty ( $sql )) {
if ( ! $this -> Schema -> before ( array ( 'created' => $event ))) {
return false ;
}
if ( ! $db -> _execute ( $sql )) {
$errors [] = $db -> lastError ();
}
$this -> Schema -> after ( array ( 'created' => $event , 'errors' => $errors ));
}
2007-08-21 21:46:59 +00:00
}
}
2007-08-23 00:57:00 +00:00
if ( ! empty ( $errors )) {
$this -> err ( $errors );
exit ();
}
$this -> out ( __ ( 'Database updated' , true ));
exit ();
2007-08-21 21:46:59 +00:00
}
/**
* Update database with Schema object
*
* @ access public
*/
function update () {
$this -> out ( 'Comparing Database to Schema...' );
$Old = $this -> Schema -> read ();
$Schema = $this -> Schema -> load ();
$compare = $this -> Schema -> compare ( $Old , $Schema );
2007-08-21 23:22:15 +00:00
$table = null ;
if ( isset ( $this -> args [ 0 ])) {
$table = $this -> args [ 0 ];
$compare = array ( $table => $compare [ $table ]);
}
2007-08-21 21:46:59 +00:00
$db =& ConnectionManager :: getDataSource ( $this -> Schema -> connection );
$db -> fullDebug = true ;
Configure :: write ( 'debug' , 2 );
2007-08-21 22:46:05 +00:00
2007-08-21 23:22:15 +00:00
$contents = $db -> alterSchema ( $compare , $table );
2007-08-21 21:46:59 +00:00
if ( empty ( $contents )) {
$this -> out ( __ ( 'Current database is up to date.' , true ));
exit ();
} else {
$this -> out ( $contents );
}
if ( 'y' == $this -> in ( 'Are you sure you want to update your database?' , array ( 'y' , 'n' ), 'n' )) {
$this -> out ( 'Updating Database...' );
2007-08-21 22:46:05 +00:00
if ( ! $this -> Schema -> before ( $compare )) {
return false ;
}
2007-08-21 21:46:59 +00:00
if ( $db -> _execute ( $contents )) {
2007-08-21 22:46:05 +00:00
$this -> Schema -> after ( $compare );
2007-08-21 21:46:59 +00:00
$this -> out ( __ ( 'Database updated' , true ));
exit ();
} else {
$this -> err ( __ ( 'Database could not be updated' , true ));
$this -> err ( $db -> lastError ());
exit ();
}
}
}
/**
* Displays help contents
*
2007-10-22 05:52:20 +00:00
* @ access public
2007-08-21 21:46:59 +00:00
*/
function help () {
$this -> out ( 'The Schema Shell generates a schema object from the database and updates the database from the schema.' );
$this -> hr ();
$this -> out ( " Usage: cake schema <command> <arg1> <arg2>... " );
$this -> hr ();
2007-08-21 23:22:15 +00:00
$this -> out ( 'Params:' );
$this -> out ( " \n \t -connection \n \t \t set db config. uses 'default' if none is specified " );
$this -> out ( " \n \t -path \n \t \t path to read and write schema.php. uses " . $this -> Schema -> path . " by default " );
2007-08-21 21:46:59 +00:00
$this -> out ( 'Commands:' );
$this -> out ( " \n \t schema help \n \t \t shows this help message. " );
2007-08-21 23:22:15 +00:00
$this -> out ( " \n \t schema view \n \t \t read and output contents of schema file " );
$this -> out ( " \n \t schema generate \n \t \t reads from 'connection' writes to 'path' " );
2007-08-23 00:57:00 +00:00
$this -> out ( " \n \t schema dump <filename> \n \t \t dump database sql based on schema file to filename in schema path. if filename is true, default will use the app directory name. " );
2007-08-21 23:22:15 +00:00
$this -> out ( " \n \t schema create <table> \n \t \t drop tables and create database based on schema file \n \t \t optional <table> arg for creating only one table " );
$this -> out ( " \n \t schema update <table> \n \t \t alter tables based on schema file \n \t \t optional <table> arg for altering only one table " );
2007-08-21 21:46:59 +00:00
$this -> out ( " " );
exit ();
}
}
?>