Author: Tobias Schlitt Date: 2007-05-07 08:53:11 +0200 (Mon, 07 May 2007) New Revision: 5082
Log: - Added missung class ezcDbSchemaPersistentClassWriter. Added: trunk/DatabaseSchema/src/handlers/persistent/class_writer.php Added: trunk/DatabaseSchema/src/handlers/persistent/class_writer.php =================================================================== --- trunk/DatabaseSchema/src/handlers/persistent/class_writer.php 2007-05-07 06:51:42 UTC (rev 5081) +++ trunk/DatabaseSchema/src/handlers/persistent/class_writer.php 2007-05-07 06:53:11 UTC (rev 5082) @@ -0,0 +1,271 @@ +<?php +/** + * File containing the ezcDbSchemaPersistentClassWriter class. + * + * @package DatabaseSchema + * @version //autogentag// + * @copyright Copyright (C) 2005-2007 eZ systems as. All rights reserved. + * @license http://ez.no/licenses/new_bsd New BSD License + */ + +/** + * This handler creates PHP classes to be used with PersistentObject from a + * DatabaseSchema. + * + * @package DatabaseSchema + * @version //autogentag// + */ +class ezcDbSchemaPersistentClassWriter implements ezcDbSchemaFileWriter +{ + + /** + * If files should be overwritten. + * + * @var boolean + */ + private $overwrite; + + /** + * Class prefix. + * + * @var string + */ + private $prefix; + + /** + * Creates a new writer instance + * + * @param boolean $overwrite Overwrite existsing files? + * @param string $classPrefix Prefix for class names. + * @return void + */ + public function __construct( $overwrite = false, $classPrefix = null ) + { + $this->overwrite = $overwrite; + $this->prefix = ( $classPrefix === null ) ? "" : $classPrefix; + } + + /** + * Returns what type of schema writer this class implements. + * This method always returns ezcDbSchema::FILE + * + * @return int The type of this schema writer. + */ + public function getWriterType() + { + return ezcDbSchema::FILE; + } + + /** + * Writes the schema definition in $dbSchema to files located in $dir. + * This method dumps the given schema to PersistentObject definitions, which + * will be located in the given directory. + * + * @param string $dir The directory to store definitions in. + * @param ezcDbSchema $dbSchema The schema object to create defs for. + * + * @throws ezcBaseFileNotFoundException If the given directory could not be + * found. + * @throws ezcBaseFilePermissionException If the given directory is not + * writable. + */ + public function saveToFile( $dir, ezcDbSchema $dbSchema ) + { + if ( !is_dir( $dir ) ) + { + throw new ezcBaseFileNotFoundException( $dir, 'directory' ); + } + + if ( !is_writable( $dir ) ) + { + throw new ezcBaseFilePermissionException( $dir, ezcBaseFileException::WRITE ); + } + + $schema = $dbSchema->getSchema(); + + foreach ( $schema as $tableName => $table ) + { + $this->writeClass( $dir, $tableName, $table ); + } + } + + /** + * Writes the list of attributes. + * + * @param array $fields + * @return void + */ + private function writeAttributes( $file, $fields ) + { + foreach ( $fields as $fieldName => $field ) + { + fwrite( $file, " /**\n" ); + fwrite( $file, " * $fieldName\n" ); + fwrite( $file, " *\n" ); + fwrite( $file, " * @var {$this->translateType($field->type)}\n" ); + fwrite( $file, " */\n" ); + fwrite( $file, " private \$$fieldName;\n" ); + } + } + + /** + * Writes the setState() method for the class. + * + * @return void + */ + private function writeSetState( $file ) + { + fwrite( $file, " /**\n" ); + fwrite( $file, " * Set the PersistentObject state.\n" ); + fwrite( $file, " *\n" ); + fwrite( $file, " * @param array(string=>mixed) \$state The state to set.\n" ); + fwrite( $file, " * @return void\n" ); + fwrite( $file, " */\n" ); + fwrite( $file, " public function setState( array \$state )\n" ); + fwrite( $file, " {\n" ); + fwrite( $file, " foreach ( \$state as \$attribute => \$value )\n" ); + fwrite( $file, " {\n" ); + fwrite( $file, " \$this->\$attribute = \$value;\n" ); + fwrite( $file, " }\n" ); + fwrite( $file, " }\n" ); + } + + /** + * Writes the getState() method for the class. + * + * @param array $fields The table fields. + * @return void + */ + private function writeGetState( $file, $fields ) + { + fwrite( $file, " /**\n" ); + fwrite( $file, " * Get the PersistentObject state.\n" ); + fwrite( $file, " *\n" ); + fwrite( $file, " * @return array(string=>mixed) The state of the object.\n" ); + fwrite( $file, " */\n" ); + fwrite( $file, " public function getState( array \$state )\n" ); + fwrite( $file, " {\n" ); + fwrite( $file, " return array(\n" ); + foreach ( $fields as $fieldName => $field ) + { + fwrite( $file, " '$fieldName' => \$this->$fieldName,\n" ); + } + fwrite( $file, " );\n" ); + fwrite( $file, " }\n" ); + } + + /** + * Writes a PHP class. + * This method writes a PHP class from a table definition. + * + * @param string $dir The directory to write the defititions to. + * @param string $tableName Name of the database table. + * @param ezcDbSchemaTable $table The table definition. + */ + private function writeClass( $dir, $tableName, ezcDbSchemaTable $table ) + { + $file = $this->openFile( $dir, $tableName ); + + fwrite( $file, "/**\n" ); + fwrite( $file, " * Data class $tableName.\n" ); + fwrite( $file, " * Class to be used with eZ Components PersistentObject.\n" ); + fwrite( $file, " */\n" ); + fwrite( $file, "class {$this->prefix}$tableName\n" ); + fwrite( $file, "{\n" ); + + // attributes + $this->writeAttributes( $file, $table->fields ); + fwrite( $file, "\n" ); + + // methods + $this->writeSetState( $file ); + fwrite( $file, "\n" ); + $this->writeGetState( $file, $table->fields ); + + fwrite( $file, "}\n" ); + $this->closeFile( $file ); + } + + /** + * Open a file for writing a PersistentObject definition to. + * This method opens a file for writing a PersistentObject definition to + * and writes the basic PHP open tag to it. + * + * @param string $dir The diretory to open the file in. + * @param string $name The table name. + * @return resource(file) The file resource used for writing. + * + * @throws ezcBaseFileIoException + * if the file to write to already exists. + * @throws ezcBaseFilePermissionException + * if the file could not be opened for writing. + */ + private function openFile( $dir, $name ) + { + $filename = $dir . DIRECTORY_SEPARATOR . strtolower( $this->prefix ) . strtolower( $name ) . '.php'; + // We do not want to overwrite files + if ( file_exists( $filename ) && ( $this->overwrite === false || is_writable( $filename ) === false ) ) + { + throw new ezcBaseFileIoException( $filename, ezcBaseFileException::WRITE, "File already exists or is not writeable. Use --overwrite to ignore existance." ); + } + $file = @fopen( $filename, 'w' ); + if ( $file === false ) + { + throw new ezcBaseFilePermissionException( $file, ezcBaseFileException::WRITE ); + } + fwrite( $file, "<?php\n" ); + fwrite( $file, "// Autogenerated class file\n" ); + fwrite( $file, "\n" ); + return $file; + } + + /** + * Close a file where a PersistentObject definition has been written to. + * This method closes a file after writing a PersistentObject definition to + * it and writes the PHP closing tag to it. + * + * @param resource(file) $file The file resource to close. + * @return void + */ + private function closeFile( $file ) + { + fwrite( $file, "?>\n" ); + fclose( $file ); + } + + /** + * Translates eZ DatabaseSchema data types to eZ PersistentObject types. + * This method receives a type string from a ezcDbSchemaField object and + * returns the corresponding type value from PersistentObject. + * + * @todo Why does PersistentObject not support "boolean" types? + * + * @see ezcPersistentObjectProperty::TYPE_INT + * @see ezcPersistentObjectProperty::TYPE_FLOAT + * @see ezcPersistentObjectProperty::TYPE_STRING + * + * @param string $dbType The DatabaseSchema type string. + * @return int The ezcPersistentObjectProperty::TYPE_* value. + */ + private function translateType( $dbType ) + { + switch ( $dbType ) + { + case 'integer': + case 'timestamp': + return 'int'; + case 'float': + case 'decimal': + return 'float'; + case 'text': + case 'blob': + case 'clob': + return 'string'; + case 'time': + case 'date': + return 'mixed'; + default: + } + } +} +?> Property changes on: trunk/DatabaseSchema/src/handlers/persistent/class_writer.php ___________________________________________________________________ Name: svn:eol-style + native -- svn-components mailing list [email protected] http://lists.ez.no/mailman/listinfo/svn-components
