Author: Derick Rethans Date: 2006-04-10 11:21:34 +0200 (Mon, 10 Apr 2006) New Revision: 2533
Log: - Added a common SQL writer from which the other database writers can inherit. - Added the MySQL diff writer and test cases. - Updated older test cases because of changed interfaces. Added: trunk/DatabaseSchema/src/handlers/common_sql_writer.php trunk/DatabaseSchema/tests/mysql_diff_test.php Removed: trunk/DatabaseSchema/src/handlers/sql.php Modified: trunk/DatabaseSchema/src/db_schema_autoload.php trunk/DatabaseSchema/src/handlers/mysql/writer.php trunk/DatabaseSchema/src/interfaces/db_diff_writer.php trunk/DatabaseSchema/src/interfaces/db_reader.php trunk/DatabaseSchema/src/interfaces/db_writer.php trunk/DatabaseSchema/src/interfaces/file_diff_reader.php trunk/DatabaseSchema/src/interfaces/file_diff_writer.php trunk/DatabaseSchema/src/interfaces/file_reader.php trunk/DatabaseSchema/src/interfaces/file_writer.php trunk/DatabaseSchema/src/interfaces/schema_diff_reader.php trunk/DatabaseSchema/src/interfaces/schema_diff_writer.php trunk/DatabaseSchema/src/interfaces/schema_reader.php trunk/DatabaseSchema/src/interfaces/schema_writer.php trunk/DatabaseSchema/src/schema_diff.php trunk/DatabaseSchema/tests/suite.php trunk/DatabaseSchema/tests/testfiles/schema-handler-implementations.php Modified: trunk/DatabaseSchema/src/db_schema_autoload.php =================================================================== --- trunk/DatabaseSchema/src/db_schema_autoload.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/db_schema_autoload.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -33,6 +33,7 @@ 'ezcDbSchemaDiffFileReader' => 'DatabaseSchema/interfaces/file_diff_reader.php', 'ezcDbSchemaDiffFileWriter' => 'DatabaseSchema/interfaces/file_diff_writer.php', + 'ezcDbSchemaCommonSqlWriter' => 'DatabaseSchema/handlers/common_sql_writer.php', 'ezcDbSchemaPhpArrayReader' => 'DatabaseSchema/handlers/php_array/reader.php', 'ezcDbSchemaPhpArrayWriter' => 'DatabaseSchema/handlers/php_array/writer.php', 'ezcDbSchemaXmlReader' => 'DatabaseSchema/handlers/xml/reader.php', @@ -61,7 +62,6 @@ 'ezcDbSchemaHandler' => 'DatabaseSchema/handler.php', 'ezcDbSchemaHandlerDataTransfer' => 'DatabaseSchema/handlers/data_transfer.php', 'ezcDbSchemaHandlerXml' => 'DatabaseSchema/handlers/xml.php', - 'ezcDbSchemaHandlerSql' => 'DatabaseSchema/handlers/sql.php', 'ezcDbSchemaHandlerPgsql' => 'DatabaseSchema/handlers/pgsql.php', 'ezcDbSchemaHandlerMysql' => 'DatabaseSchema/handlers/mysql.php', 'ezcDbSchemaHandlerOracle' => 'DatabaseSchema/handlers/oracle.php', Copied: trunk/DatabaseSchema/src/handlers/common_sql_writer.php (from rev 2526, trunk/DatabaseSchema/src/handlers/sql.php) =================================================================== --- trunk/DatabaseSchema/src/handlers/sql.php 2006-04-08 16:38:36 UTC (rev 2526) +++ trunk/DatabaseSchema/src/handlers/common_sql_writer.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -0,0 +1,205 @@ +<?php +/** + * File containing the ezcDbSchemaHandlerSql class. + * + * @package DatabaseSchema + * @version //autogentag// + * @copyright Copyright (C) 2005, 2006 eZ systems as. All rights reserved. + * @license http://ez.no/licenses/new_bsd New BSD License + */ + +/** + * Incapsulates common functionality for DBMS schema handlers + * (MySQL, Oracle, etc). + * + * @package DatabaseSchema + */ +abstract class ezcDbSchemaCommonSqlWriter +{ + /** + * Dump specified schema as an array of SQL queries. + * + * @return array The queries. + */ + protected function generateSchemaAsSql() + { + foreach ( $this->schema as $tableName => $tableDefinition ) + { + $this->generateDropTableSql( $tableName ); + $this->generateCreateTableSql( $tableName, $tableDefinition ); + } + } + + /** + * Generate SQL queries for table creation. + */ + private function generateCreateTableSql( $tableName, ezcDbSchemaTable $tableDefinition ) + { + $sql = ''; + + $sql .= "CREATE TABLE $tableName (\n"; + + // dump fields + $fieldsSQL = array(); + + foreach ( $tableDefinition->fields as $fieldName => $fieldDefinition ) + { + $fieldsSQL[] = "\t" . $this->generateFieldSql( $fieldName, $fieldDefinition ); + } + + $sql .= join( ",\n", $fieldsSQL ); + + $sql .= "\n)"; + + $this->queries[] = $sql; + + // dump indexes + foreach ( $tableDefinition->indexes as $indexName => $indexDefinition) + { + $fieldsSQL[] = $this->generateAddIndexSql( $tableName, $indexName, $indexDefinition ); + } + + } + + protected function generateDefault( $type, $value ) + { + switch ( $type ) + { + case 'boolean': + return $value ? 'true' : 'false'; + + case 'integer': + return (int) $value; + + case 'float': + case 'decimal': + return (float) $value; + + case 'timestamp': + return (int) $value; + + default: + return "'$value'"; + } + } + +/******************************/ + /** + * Represents given delta (difference) between two database schemas + * as an array of SQL queries. + * + * If The queries are then run on the first schema the schema will become + * equal to the second one. + * So this is the way schema synchronizations is done. + * + * @return array(string) The set of queries to make schema #1 equal to schema #2. + */ + protected function generateDiffSchemaAsSql() + { + foreach ( $this->diffSchema->changedTables as $tableName => $tableDiff ) + { + foreach ( $tableDiff->removedIndexes as $indexName => $isRemoved ) + { + if ( $isRemoved ) + { + $this->generateDropIndexSql( $tableName, $indexName ); + } + } + + foreach ( $tableDiff->changedIndexes as $indexName => $indexDefinition ) + { + $this->generateDropIndexSql( $tableName, $indexName ); + } + + foreach ( $tableDiff->removedFields as $fieldName => $isRemoved ) + { + if ( $isRemoved ) + { + $this->generateDropFieldSql( $tableName, $fieldName ); + } + } + + foreach ( $tableDiff->changedFields as $fieldName => $fieldDefinition ) + { + $this->generateChangeFieldSql( $tableName, $fieldName, $fieldDefinition ); + } + + foreach ( $tableDiff->addedFields as $fieldName => $fieldDefinition ) + { + $this->generateAddFieldSql( $tableName, $fieldName, $fieldDefinition ); + } + + foreach ( $tableDiff->changedIndexes as $indexName => $indexDefinition ) + { + $this->generateAddIndexSql( $tableName, $indexName, $indexDefinition ); + } + + foreach ( $tableDiff->addedIndexes as $indexName => $indexDefinition ) + { + $this->generateAddIndexSql( $tableName, $indexName, $indexDefinition ); + } + } + + foreach ( $this->diffSchema->newTables as $tableName => $tableDef ) + { + $this->generateCreateTableSql( $tableName, $tableDef ); + } + + foreach ( $this->diffSchema->removedTables as $tableName => $dummy ) + { + $this->generateDropTableSql( $tableName ); + } + } + + /** + * Generate table dropping SQL query. + * + * @return string The query. + */ + protected abstract function generateDropTableSql( $tableName ); + + /** + * Generate SQL fragment for a table field. + * + * @return string The query. + */ + protected abstract function generateFieldSql( $fieldName, ezcDbSchemaField $fieldDefinition ); + + /** + * Generate SQL query for adding a table field. + * + * @return string The query. + */ + protected abstract function generateAddFieldSql( $tableName, $fieldName, ezcDbSchemaField $fieldDefinition ); + + /** + * Generate SQL query for changing a table field. + * + * @return string The query. + */ + protected abstract function generateChangeFieldSql( $tableName, $fieldName, ezcDbSchemaField $fieldDefinition ); + + /** + * Generate SQL query for dropping a table field. + * + * @return string The query. + */ + protected abstract function generateDropFieldSql( $tableName, $fieldName ); + + + /** + * Generate index creation SQL query. + * + * @return string The query. + */ + protected abstract function generateAddIndexSql( $tableName, $indexName, ezcDbSchemaIndex $indexDefinition ); + + + /** + * Generate drop index SQL query. + * + * @return string The query. + */ + protected abstract function generateDropIndexSql( $tableName, $indexName ); +} +?> Modified: trunk/DatabaseSchema/src/handlers/mysql/writer.php =================================================================== --- trunk/DatabaseSchema/src/handlers/mysql/writer.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/handlers/mysql/writer.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -13,9 +13,9 @@ * * @package DatabaseSchema */ -class ezcDbSchemaMysqlWriter implements ezcDbSchemaDbWriter +class ezcDbSchemaMysqlWriter extends ezcDbSchemaCommonSqlWriter implements ezcDbSchemaDbWriter, ezcDbSchemaDiffDbWriter { - static private $typeMap = array( + private $typeMap = array( 'integer' => 'bigint', 'boolean' => 'boolean', 'float' => 'double', @@ -39,15 +39,7 @@ */ public function saveToDb( ezcDbHandler $db, ezcDbSchema $dbSchema ) { - $this->schema = $dbSchema->getSchema(); - $data = $dbSchema->getData(); - - // reset queries - $this->queries = array(); - $this->context = array(); - - $this->generateSchemaAsSql(); - foreach ( $this->queries as $query ) + foreach ( $this->convertToDDL( $dbSchema ) as $query ) { $db->query( $query ); } @@ -71,52 +63,48 @@ } /** - * Dump specified schema as an array of SQL queries. - * - * @return array The queries. */ - private function generateSchemaAsSql() + public function getDiffWriterType() { - foreach ( $this->schema as $tableName => $tableDefinition ) - { - $this->generateCreateTableSql( $tableName, $tableDefinition ); - } + return ezcDbSchema::DATABASE; } /** - * Generate SQL queries for table creation. + * Save schema to an .php file */ - private function generateCreateTableSql( $tableName, ezcDbSchemaTable $tableDefinition ) + public function applyDiffToDb( ezcDbHandler $db, ezcDbSchemaDiff $dbSchemaDiff ) { - $sql = ''; - - $this->queries[] = "DROP TABLE IF EXISTS $tableName"; - - $sql .= "CREATE TABLE $tableName (\n"; - - // dump fields - $fieldsSQL = array(); - - foreach ( $tableDefinition->fields as $fieldName => $fieldDefinition ) + $db->query( "BEGIN" ); + foreach ( $this->convertDiffToDDL( $dbSchemaDiff ) as $query ) { - $fieldsSQL[] = "\t" . $this->generateFieldSql( $fieldName, $fieldDefinition ); + $db->query( $query ); } + $db->query( "COMMIT" ); + } - $sql .= join( ",\n", $fieldsSQL ); + /** + * Get schema as database specific DDL + * + * @returns array + */ + public function convertDiffToDDL( ezcDbSchemaDiff $dbSchemaDiff ) + { + $this->diffSchema = $dbSchemaDiff; - $sql .= "\n)"; + // reset queries + $this->queries = array(); + $this->context = array(); - $this->queries[] = $sql; + $this->generateDiffSchemaAsSql(); + return $this->queries; + } - // dump indexes - foreach ( $tableDefinition->indexes as $indexName => $indexDefinition) - { - $fieldsSQL[] = $this->generateAddIndexSql( $tableName, $indexName, $indexDefinition ); - } - + protected function generateDropTableSql( $tableName ) + { + $this->queries[] = "DROP TABLE IF EXISTS $tableName"; } - static function convertFromGenericType( ezcDbSchemaField $fieldDefinition ) + protected function convertFromGenericType( ezcDbSchemaField $fieldDefinition ) { $typeAddition = ''; if ( in_array( $fieldDefinition->type, array( 'numeric', 'text' ) ) ) @@ -131,24 +119,39 @@ $typeAddition = "(255)"; } - $type = self::$typeMap[$fieldDefinition->type]; + $type = $this->typeMap[$fieldDefinition->type]; return "$type$typeAddition"; } + protected function generateAddFieldSql( $tableName, $fieldName, ezcDbSchemaField $fieldDefinition ) + { + $this->queries[] = "ALTER TABLE $tableName ADD " . $this->generateFieldSql( $fieldName, $fieldDefinition ); + } + + protected function generateChangeFieldSql( $tableName, $fieldName, ezcDbSchemaField $fieldDefinition ) + { + $this->queries[] = "ALTER TABLE $tableName CHANGE $fieldName " . $this->generateFieldSql( $fieldName, $fieldDefinition ); + } + + protected function generateDropFieldSql( $tableName, $fieldName ) + { + $this->queries[] = "ALTER TABLE $tableName DROP $fieldName"; + } + /** * Dumps field schema as part of a DDL query. * @param string $fieldName Field name. * @param array $fieldSchema Field schema. * @return string Field schema in SQL. */ - private function generateFieldSql( $fieldName, ezcDbSchemaField $fieldDefinition ) + protected function generateFieldSql( $fieldName, ezcDbSchemaField $fieldDefinition ) { $sqlDefinition = $fieldName . ' '; $defList = array(); - $type = self::convertFromGenericType( $fieldDefinition ); + $type = $this->convertFromGenericType( $fieldDefinition ); $defList[] = $type; if ( $fieldDefinition->notNull ) @@ -173,6 +176,11 @@ return $sqlDefinition; } + protected function generateDropIndexSql( $tableName, $indexName ) + { + $this->queries[] = "ALTER TABLE $tableName DROP INDEX `$indexName`"; + } + /** * Generate index creation SQL query. * @@ -185,7 +193,7 @@ if ( $indexDefinition->primary ) { - if ( $this->context['skip_primary'] ) + if ( isset( $this->context['skip_primary'] ) && $this->context['skip_primary'] ) { return; } @@ -203,9 +211,12 @@ $sql .= " ( "; $indexFieldSql = array(); - foreach ( $indexDefinition->indexFields as $indexFieldName => $IndexFieldDefinition ) + foreach ( $indexDefinition->indexFields as $indexFieldName => $dummy ) { - if ( in_array( $this->schema[$tableName]->fields[$indexFieldName]->type, array( 'blob', 'clob' ) ) ) + if ( isset( $this->schema[$tableName] ) && + isset( $this->schema[$tableName]->fields[$indexFieldName] ) && + isset( $this->schema[$tableName]->fields[$indexFieldName]->type ) && + in_array( $this->schema[$tableName]->fields[$indexFieldName]->type, array( 'blob', 'clob' ) ) ) { $indexFieldSql[] = "{$indexFieldName}(250)"; } @@ -218,27 +229,5 @@ $this->queries[] = $sql; } - - private function generateDefault( $type, $value ) - { - switch ( $type ) - { - case 'boolean': - return $value ? 'true' : 'false'; - - case 'integer': - return (int) $value; - - case 'float': - case 'decimal': - return (float) $value; - - case 'timestamp': - return (int) $value; - - default: - return "'$value'"; - } - } } ?> Deleted: trunk/DatabaseSchema/src/handlers/sql.php =================================================================== --- trunk/DatabaseSchema/src/handlers/sql.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/handlers/sql.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -1,165 +0,0 @@ -<?php -/** - * File containing the ezcDbSchemaHandlerSql class. - * - * @package DatabaseSchema - * @version //autogentag// - * @copyright Copyright (C) 2005, 2006 eZ systems as. All rights reserved. - * @license http://ez.no/licenses/new_bsd New BSD License - */ - -/** - * Incapsulates common functionality for DBMS schema handlers - * (MySQL, Oracle, etc). - * - * @package DatabaseSchema - */ -abstract class ezcDbSchemaHandlerSql extends ezcDbSchemaHandler -{ - public abstract function getDbmsName(); - - /** - * Represents given delta (difference) between two database schemas - * as an array of SQL queries. - * - * If The queries are then run on the first schema the schema will become - * equal to the second one. - * So this is the way schema synchronizations is done. - * - * @return array(string) The set of queries to make schema #1 equal to schema #2. - */ - protected function generateDeltaSQL( $differences, $params = array() ) - { - $params = array_merge( array( 'schema' => true, - 'data' => false, - 'allow_multi_insert' => false, - 'diff_friendly' => false ), - $params ); - $sql = array(); - - /* Loop over all 'table_changes' */ - if ( isset( $differences['table_changes'] ) ) - { - foreach ( $differences['table_changes'] as $table => $table_diff ) - { - if ( isset ( $table_diff['added_fields'] ) ) - { - foreach ( $table_diff['added_fields'] as $field_name => $added_field ) - $sql[]= $this->generateAddFieldSql( $table, $field_name, $added_field, $params ); - } - - if ( isset ( $table_diff['changed_fields'] ) ) - { - foreach ( $table_diff['changed_fields'] as $field_name => $changed_field ) - { - $changed_field_def =/*&*/ $changed_field['field-def']; - $diffPrams = array_merge( $params, array( 'different-options' => $changed_field['different-options'] ) ); - $sql[] = $this->generateAlterFieldSql( $table, $field_name, $changed_field_def, $diffPrams ); - unset( $diffPrams ); - } - } - if ( isset ( $table_diff['removed_fields'] ) ) - { - foreach ( $table_diff['removed_fields'] as $field_name => $removed_field) - $sql[] = $this->generateDropFieldSql( $table, $field_name, $params ); - } - - if ( isset ( $table_diff['removed_indexes'] ) ) - { - foreach ( $table_diff['removed_indexes'] as $index_name => $removed_index) - $sql[] = $this->generateDropIndexSql( $table, $index_name, $removed_index, $params ); - } - if ( isset ( $table_diff['added_indexes'] ) ) - { - foreach ( $table_diff['added_indexes'] as $index_name => $added_index) - $sql[] = $this->generateAddIndexSql( $table, $index_name, $added_index, $params ); - } - - if ( isset ( $table_diff['changed_indexes'] ) ) - { - foreach ( $table_diff['changed_indexes'] as $index_name => $changed_index ) - { - $sql[] = $this->generateDropIndexSql( $table, $index_name, $changed_index, $params ); - $sql[] = $this->generateAddIndexSql( $table, $index_name, $changed_index, $params ); - } - } - } - } - if ( isset( $differences['new_tables'] ) ) - { - foreach ( $differences['new_tables'] as $table => $table_def ) - $sql = array_merge( $sql, $this->generateCreateTableSql( $table, $table_def, $params ) ); - } - if ( isset( $differences['removed_tables'] ) ) - { - foreach ( $differences['removed_tables'] as $table => $table_def ) - $sql[] = $this->generateDropTableSql( $table, $params ); - } - - return $sql; - } - - /** - * Generate SQL queries for table creation. - * - * @return array(string) Array of queries needed to create the table - * (along with its indexes, etc). - */ - protected abstract function generateCreateTableSql( $tableName, $tableSchema, $params = array() ); - - /** - * Generate table dropping SQL query. - * - * @return string The query. - */ - protected abstract function generateDropTableSql( $tableName, $params = array() ); - - - /** - * Generate SQL query for adding a table field. - * - * @return string The query. - */ - protected abstract function generateAddFieldSql( $tableName, $fieldName, $fieldSchema, $params = array() ); - - /** - * Generate SQL query for altering table field schema. - * - * @return string The query. - */ - protected abstract function generateAlterFieldSql( $tableName, $fieldName, $fieldSchema, $diffParams = array() ); - - /** - * Generate SQL query for dropping a table field. - * - * @return string The query. - */ - protected abstract function generateDropFieldSql( $tableName, $fieldName, $params = array() ); - - - /** - * Generate index creation SQL query. - * - * @return string The query. - */ - protected abstract function generateAddIndexSql( $tableName, $indexName, $indexSchema, $params = array(), $isEmbedded = false ); - - - /** - * Generate drop index SQL query. - * - * @return string The query. - */ - protected abstract function generateDropIndexSql( $tableName, $indexName, $indexSchema, $params = array() ); - - - /* TODO: - * create sequence - * drop sequence - * - * create trigger - * drop trigger - */ -} - -?> \ No newline at end of file Modified: trunk/DatabaseSchema/src/interfaces/db_diff_writer.php =================================================================== --- trunk/DatabaseSchema/src/interfaces/db_diff_writer.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/interfaces/db_diff_writer.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -13,8 +13,9 @@ * @package DatabaseSchema * @version //autogen// */ -interface ezcDbSchemaDbDiffWriter extends ezcDbSchemaDiffWriter +interface ezcDbSchemaDiffDbWriter extends ezcDbSchemaDiffWriter { - public function saveDiffToDb( ezcDbHandler $db, ezcDbSchemaDiff $schemaDiff ); + public function applyDiffToDb( ezcDbHandler $db, ezcDbSchemaDiff $schemaDiff ); + public function convertDiffToDDL( ezcDbSchemaDiff $schemaDiff ); } ?> Modified: trunk/DatabaseSchema/src/interfaces/db_reader.php =================================================================== --- trunk/DatabaseSchema/src/interfaces/db_reader.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/interfaces/db_reader.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -15,7 +15,6 @@ */ interface ezcDbSchemaDbReader extends ezcDbSchemaReader { - public function getReaderType(); public function loadFromDb( ezcDbHandler $db ); } ?> Modified: trunk/DatabaseSchema/src/interfaces/db_writer.php =================================================================== --- trunk/DatabaseSchema/src/interfaces/db_writer.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/interfaces/db_writer.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -15,7 +15,7 @@ */ interface ezcDbSchemaDbWriter extends ezcDbSchemaWriter { - public function getWriterType(); public function saveToDb( ezcDbHandler $db, ezcDbSchema $schema ); + public function convertToDDL( ezcDbSchema $dbSchema ); } ?> Modified: trunk/DatabaseSchema/src/interfaces/file_diff_reader.php =================================================================== --- trunk/DatabaseSchema/src/interfaces/file_diff_reader.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/interfaces/file_diff_reader.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -15,7 +15,6 @@ */ interface ezcDbSchemaDiffFileReader extends ezcDbSchemaDiffReader { - public function getDiffReaderType(); public function loadDiffFromFile( $file ); } ?> Modified: trunk/DatabaseSchema/src/interfaces/file_diff_writer.php =================================================================== --- trunk/DatabaseSchema/src/interfaces/file_diff_writer.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/interfaces/file_diff_writer.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -15,7 +15,6 @@ */ interface ezcDbSchemaDiffFileWriter extends ezcDbSchemaDiffWriter { - public function getDiffWriterType(); public function saveDiffToFile( $file, ezcDbSchemaDiff $schemaDiff ); } ?> Modified: trunk/DatabaseSchema/src/interfaces/file_reader.php =================================================================== --- trunk/DatabaseSchema/src/interfaces/file_reader.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/interfaces/file_reader.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -15,7 +15,6 @@ */ interface ezcDbSchemaFileReader extends ezcDbSchemaReader { - public function getReaderType(); public function loadFromFile( $file ); } ?> Modified: trunk/DatabaseSchema/src/interfaces/file_writer.php =================================================================== --- trunk/DatabaseSchema/src/interfaces/file_writer.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/interfaces/file_writer.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -15,7 +15,6 @@ */ interface ezcDbSchemaFileWriter extends ezcDbSchemaWriter { - public function getWriterType(); public function saveToFile( $file, ezcDbSchema $schema ); } ?> Modified: trunk/DatabaseSchema/src/interfaces/schema_diff_reader.php =================================================================== --- trunk/DatabaseSchema/src/interfaces/schema_diff_reader.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/interfaces/schema_diff_reader.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -15,5 +15,6 @@ */ interface ezcDbSchemaDiffReader { + public function getDiffReaderType(); } ?> Modified: trunk/DatabaseSchema/src/interfaces/schema_diff_writer.php =================================================================== --- trunk/DatabaseSchema/src/interfaces/schema_diff_writer.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/interfaces/schema_diff_writer.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -15,5 +15,6 @@ */ interface ezcDbSchemaDiffWriter { + public function getDiffWriterType(); } ?> Modified: trunk/DatabaseSchema/src/interfaces/schema_reader.php =================================================================== --- trunk/DatabaseSchema/src/interfaces/schema_reader.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/interfaces/schema_reader.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -15,5 +15,6 @@ */ interface ezcDbSchemaReader { + public function getReaderType(); } ?> Modified: trunk/DatabaseSchema/src/interfaces/schema_writer.php =================================================================== --- trunk/DatabaseSchema/src/interfaces/schema_writer.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/interfaces/schema_writer.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -15,5 +15,6 @@ */ interface ezcDbSchemaWriter { + public function getWriterType(); } ?> Modified: trunk/DatabaseSchema/src/schema_diff.php =================================================================== --- trunk/DatabaseSchema/src/schema_diff.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/src/schema_diff.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -96,7 +96,7 @@ $className = ezcDbSchemaHandlerManager::getDiffWriterByFormat( $db->getName() ); $writer = new $className(); self::checkSchemaDiffWriter( $writer, self::DATABASE ); - $writer->applyToDb( $db, $this ); + $writer->applyDiffToDb( $db, $this ); } public function convertToDDL( ezcDbHandler $db ) @@ -104,7 +104,7 @@ $className = ezcDbSchemaHandlerManager::getDiffWriterByFormat( $db->getName() ); $writer = new $className(); self::checkSchemaDiffWriter( $writer, self::DATABASE ); - return $writer->convertToDDL( $this ); + return $writer->convertDiffToDDL( $this ); } } Added: trunk/DatabaseSchema/tests/mysql_diff_test.php =================================================================== --- trunk/DatabaseSchema/tests/mysql_diff_test.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/tests/mysql_diff_test.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -0,0 +1,155 @@ +<?php +/** + * @copyright Copyright (C) 2005, 2006 eZ systems as. All rights reserved. + * @license http://ez.no/licenses/new_bsd New BSD License + * @version //autogentag// + * @filesource + * @package DatabaseSchema + * @subpackage Tests + */ + +/** + * @package DatabaseSchema + * @subpackage Tests + */ +class ezcDatabaseSchemaMySqlDiffTest extends ezcTestCase +{ + private function resetDb() + { + $tables = $this->db->query( "SHOW TABLES" )->fetchAll(); + array_walk( $tables, create_function( '&$item,$key', '$item = $item[0];' ) ); + + foreach ( $tables as $tableName ) + { + $this->db->query( "DROP TABLE $tableName" ); + } + } + + public function setUp() + { + $this->testFilesDir = dirname( __FILE__ ) . '/testfiles/'; + $this->tempDir = $this->createTempDir( 'ezcDatabaseMySqlTest' ); + $this->db = ezcDbInstance::get(); + $this->resetDb(); + } + + public function tearDown() + { + $this->removeTempDir(); + } + + private static function getSchema1() + { + return new ezcDbSchema( array( + 'bugdb' => new ezcDbSchemaTable( + array ( + 'integerfield1' => new ezcDbSchemaField( 'integer' ), + ) + ), + 'bugdb_deleted' => new ezcDbSchemaTable( + array ( + 'integerfield1' => new ezcDbSchemaField( 'integer' ), + ) + ), + 'bugdb_change' => new ezcDbSchemaTable( + array ( + 'integerfield1' => new ezcDbSchemaField( 'integer' ), + 'integerfield3' => new ezcDbSchemaField( 'integer' ), + ), + array ( + 'primary' => new ezcDbSchemaIndex( + array( + 'integerfield1' => new ezcDbSchemaIndexField() + ), + true + ), + 'tertiary' => new ezcDbSchemaIndex( + array( + 'integerfield3' => new ezcDbSchemaIndexField() + ), + false, + true + ) + ) + ), + ) ); + } + + private static function getSchema2() + { + return new ezcDbSchema( array( + 'bugdb' => new ezcDbSchemaTable( + array ( + 'integerfield1' => new ezcDbSchemaField( 'integer' ), + ) + ), + 'bugdb_added' => new ezcDbSchemaTable( + array ( + 'integerfield1' => new ezcDbSchemaField( 'integer' ), + ) + ), + 'bugdb_change' => new ezcDbSchemaTable( + array ( + 'integerfield2' => new ezcDbSchemaField( 'integer', 0, true ), + 'integerfield3' => new ezcDbSchemaField( 'text', 64 ), + ), + array ( + 'secondary' => new ezcDbSchemaIndex( + array( + 'integerfield3' => new ezcDbSchemaIndexField() + ), + false, + true + ), + 'primary' => new ezcDbSchemaIndex( + array( + 'integerfield2' => new ezcDbSchemaIndexField() + ), + true + ) + ) + ), + ) ); + } + + private static function getSchemaDiff() + { + return ezcDbSchemaComparator::compareSchemas( self::getSchema1(), self::getSchema2() ); + } + + public function testWrite1() + { + $schema = self::getSchemaDiff(); + $ddl = $schema->convertToDDL( $this->db ); + + $expected = array ( + 0 => 'ALTER TABLE bugdb_change DROP INDEX `tertiary`', + 1 => 'ALTER TABLE bugdb_change DROP INDEX `primary`', + 2 => 'ALTER TABLE bugdb_change DROP integerfield1', + 3 => 'ALTER TABLE bugdb_change CHANGE integerfield3 integerfield3 varchar(64)', + 4 => 'ALTER TABLE bugdb_change ADD integerfield2 bigint NOT NULL', + 5 => 'ALTER TABLE bugdb_change ADD PRIMARY KEY ( integerfield2 )', + 6 => 'ALTER TABLE bugdb_change ADD UNIQUE secondary ( integerfield3 )', + 7 => "CREATE TABLE bugdb_added (\n\tintegerfield1 bigint\n)", + 8 => 'DROP TABLE IF EXISTS bugdb_deleted', + ); + self::assertEquals( $expected, $ddl ); + } + + public function testApply1() + { + $schema1 = self::getSchema1(); + $schema1->writeToDb( $this->db ); + $schemaDiff = self::getSchemaDiff(); + $schemaDiff->applyToDb( $this->db ); + $schemaInDb = ezcDbSchema::createFromDb( $this->db ); + $this->resetDb(); + self::assertEquals( self::getSchema2(), $schemaInDb ); + } + + public static function suite() + { + return new ezcTestSuite( 'ezcDatabaseSchemaMysqlDiffTest' ); + } +} +?> Property changes on: trunk/DatabaseSchema/tests/mysql_diff_test.php ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/DatabaseSchema/tests/suite.php =================================================================== --- trunk/DatabaseSchema/tests/suite.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/tests/suite.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -15,6 +15,7 @@ require_once 'xml_test.php'; require_once 'xml_diff_test.php'; require_once 'mysql_test.php'; +require_once 'mysql_diff_test.php'; require_once 'validator_test.php'; require_once 'comparator_test.php'; @@ -38,6 +39,7 @@ $this->addTest( ezcDatabaseSchemaXmlTest::suite() ); $this->addTest( ezcDatabaseSchemaXmlDiffTest::suite() ); $this->addTest( ezcDatabaseSchemaMysqlTest::suite() ); + $this->addTest( ezcDatabaseSchemaMysqlDiffTest::suite() ); } public static function suite() Modified: trunk/DatabaseSchema/tests/testfiles/schema-handler-implementations.php =================================================================== --- trunk/DatabaseSchema/tests/testfiles/schema-handler-implementations.php 2006-04-09 11:47:32 UTC (rev 2532) +++ trunk/DatabaseSchema/tests/testfiles/schema-handler-implementations.php 2006-04-10 09:21:34 UTC (rev 2533) @@ -1,14 +1,30 @@ <?php class TestSchemaReaderImplementation implements ezcDbSchemaReader { + public function getReaderType() + { + return ezcDbSchema::FILE; + } } class TestSchemaWriterImplementation implements ezcDbSchemaWriter { + public function getWriterType() + { + return ezcDbSchema::FILE; + } } class TestSchemaDiffReaderImplementation implements ezcDbSchemaDiffReader { + public function getDiffReaderType() + { + return ezcDbSchema::FILE; + } } class TestSchemaDiffWriterImplementation implements ezcDbSchemaDiffWriter { + public function getDiffWriterType() + { + return ezcDbSchema::FILE; + } } ?> -- svn-components mailing list svn-components@lists.ez.no http://lists.ez.no/mailman/listinfo/svn-components