blob: 4d3a9fd65ba2c1474af326c29d1711b4c42c191a [file]
<?php
/**
* File containing the ezcDbSchemaPersistentClassWriter class.
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @package DatabaseSchema
* @version //autogentag//
* @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
/**
* 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 bool $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 resource $file
* @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.
*
* @param resource $file
* @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 resource $file
* @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()\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:
}
}
}
?>