blob: b087903766d7cf485cdd1d9c679431c8a4b710d8 [file] [log] [blame]
<?php
/**
* File containing the ezcDbSchemaXmlReader 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//
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
/**
* Handler that reads database definitions and database difference definitions from a file in an XML format.
*
* @package DatabaseSchema
* @version //autogentag//
*/
class ezcDbSchemaXmlReader implements ezcDbSchemaFileReader, ezcDbSchemaDiffFileReader
{
/**
* Returns what type of reader writer this class implements.
*
* This method always returns ezcDbSchema::FILE
*
* @return int
*/
public function getReaderType()
{
return ezcDbSchema::FILE;
}
/**
* Returns what type of schema difference reader this class implements.
*
* This method always returns ezcDbSchema::FILE
*
* @return int
*/
public function getDiffReaderType()
{
return ezcDbSchema::FILE;
}
/**
* Extracts information about a table field from the XML element $field
*
* @param SimpleXMLElement $field
*
* @return ezcDbSchemaField or an inherited class
*/
private function parseField( SimpleXMLElement $field )
{
return ezcDbSchema::createNewField(
(string) $field->type,
isset( $field->length ) ? (string) $field->length : false,
isset( $field->notnull ) ? ((string) $field->notnull == 'true' || (string) $field->notnull == '1' ? true : false ) : false,
isset( $field->default ) ? (string) $field->default : null,
isset( $field->autoincrement ) ? ((string) $field->autoincrement == 'true' || (string) $field->autoincrement == '1' ? true : false ) : false,
isset( $field->unsigned ) ? ((string) $field->unsigned == 'true' || (string) $field->unsigned == '1' ? true : false ) : false
);
}
/**
* Extracts information about an index from the XML element $index
*
* @param SimpleXMLElement $index
*
* @return ezcDbSchemaIndex or an inherited class
*/
private function parseIndex( SimpleXMLElement $index )
{
$indexFields = array();
foreach ( $index->field as $indexField )
{
$indexFieldName = (string) $indexField->name;
$indexFields[$indexFieldName] = ezcDbSchema::createNewIndexField(
isset( $indexField->sorting ) ? (string) $indexField->sorting : null
);
}
return ezcDbSchema::createNewIndex(
$indexFields,
isset( $index->primary ) ? (string) $index->primary : false,
isset( $index->unique ) ? (string) $index->unique : false
);
}
/**
* Extracts information about a table from the XML element $table
*
* @param SimpleXMLElement $table
*
* @return ezcDbSchemaTable or an inherited class
*/
private function parseTable( SimpleXMLElement $table )
{
$fields = array();
$indexes = array();
foreach ( $table->declaration->field as $field )
{
$fieldName = (string) $field->name;
$fields[$fieldName] = $this->parseField( $field );
}
foreach ( $table->declaration->index as $index )
{
$indexName = (string) $index->name;
$indexes[$indexName] = $this->parseIndex( $index );
}
return ezcDbSchema::createNewTable( $fields, $indexes );
}
/**
* Extracts information about changes to a table from the XML element $table
*
* @param SimpleXMLElement $table
*
* @return ezcDbSchemaTableDiff
*/
private function parseChangedTable( SimpleXMLElement $table )
{
$addedFields = array();
foreach ( $table->{'added-fields'}->field as $field )
{
$fieldName = (string) $field->name;
$addedFields[$fieldName] = $this->parseField( $field );
}
$changedFields = array();
foreach ( $table->{'changed-fields'}->field as $field )
{
$fieldName = (string) $field->name;
$changedFields[$fieldName] = $this->parseField( $field );
}
$removedFields = array();
foreach ( $table->{'removed-fields'}->field as $field )
{
$fieldName = (string) $field->name;
if ( (string) $field->removed == 'true' )
{
$removedFields[$fieldName] = true;
}
}
$addedIndexes = array();
foreach ( $table->{'added-indexes'}->index as $index )
{
$indexName = (string) $index->name;
$addedIndexes[$indexName] = $this->parseIndex( $index );
}
$changedIndexes = array();
foreach ( $table->{'changed-indexes'}->index as $index )
{
$indexName = (string) $index->name;
$changedIndexes[$indexName] = $this->parseIndex( $index );
}
$removedIndexes = array();
foreach ( $table->{'removed-indexes'}->index as $index )
{
$indexName = (string) $index->name;
if ( (string) $index->removed == 'true' )
{
$removedIndexes[$indexName] = true;
}
}
return new ezcDbSchemaTableDiff(
$addedFields, $changedFields, $removedFields, $addedIndexes,
$changedIndexes, $removedIndexes
);
}
/**
* Returns the schema definition in $xml as an ezcDbSchema
*
* @param SimpleXMLElement $xml
*
* @return ezcDbSchema
*/
private function parseXml( SimpleXMLElement $xml )
{
$schema = array();
foreach ( $xml->table as $table )
{
$tableName = (string) $table->name;
$schema[$tableName] = $this->parseTable( $table );
}
return new ezcDbSchema( $schema );
}
/**
* Returns the schema differences definition in $xml as an ezcDbSchemaDiff
*
* @param SimpleXMLElement $xml
*
* @return ezcDbSchemaDiff
*/
private function parseDiffXml( SimpleXMLElement $xml )
{
$newTables = array();
foreach ( $xml->{'new-tables'}->table as $table )
{
$tableName = (string) $table->name;
$newTables[$tableName] = $this->parseTable( $table );
}
$changedTables = array();
foreach ( $xml->{'changed-tables'}->table as $table )
{
$tableName = (string) $table->name;
$changedTables[$tableName] = $this->parseChangedTable( $table );
}
$removedTables = array();
foreach ( $xml->{'removed-tables'}->table as $table )
{
$tableName = (string) $table->name;
if ( (string) $table->removed == 'true' )
{
$removedTables[$tableName] = true;
}
}
return new ezcDbSchemaDiff( $newTables, $changedTables, $removedTables );
}
/**
* Opens the XML file $file for parsing
*
* @param string $file
* @throws ezcBaseFileNotFoundException if the file $file could not be
* found.
* @throws ezcDbSchemaInvalidSchemaException if the XML in the $file is
* corrupted or when the file could not be opened.
* @return SimpleXML
*/
private function openXmlFile( $file )
{
if ( !file_exists( $file ) )
{
throw new ezcBaseFileNotFoundException( $file, 'schema' );
}
$xml = @simplexml_load_file( $file );
if ( !$xml )
{
throw new ezcDbSchemaInvalidSchemaException( "The schema file '{$file}' is not valid XML." );
}
return $xml;
}
/**
* Returns the database schema stored in the XML file $file
*
* @throws ezcBaseFileNotFoundException if the file $file could not be
* found.
* @throws ezcDbSchemaInvalidSchemaException if the XML in the $file is
* corrupt or when the file could not be opened.
*
* @param string $file
* @return ezcDbSchema
*/
public function loadFromFile( $file )
{
$xml = $this->openXmlFile( $file );
return $this->parseXml( $xml );
}
/**
* Returns the database differences stored in the XML file $file
*
* @throws ezcBaseFileNotFoundException if the file $file could not be
* found.
* @throws ezcDbSchemaInvalidSchemaException if the XML in the $file is
* corrupt or when the file could not be opened.
*
* @param string $file
* @return ezcDbSchemaDiff
*/
public function loadDiffFromFile( $file )
{
$xml = $this->openXmlFile( $file );
return $this->parseDiffXml( $xml );
}
}
?>