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

Reply via email to