diff Lib/IMPL/SQL/Schema/MySQL/Processor.pm @ 271:56364d0c4b4f

+IMPL::SQL::Schema::MySQL: added basic support for MySQL
author cin
date Mon, 28 Jan 2013 02:43:14 +0400
parents
children 2f06250bab5f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/IMPL/SQL/Schema/MySQL/Processor.pm	Mon Jan 28 02:43:14 2013 +0400
@@ -0,0 +1,93 @@
+package IMPL::SQL::Schema::MySQL::Processor;
+use strict;
+
+use mro;
+use IMPL::Const qw(:prop);
+use IMPL::declare {
+    require => {
+        MySQLFormatter           => 'IMPL::SQL::Schema::MySQL::Formatter',
+        AlterTableDropConstraint => '-IMPL::SQL::Schema::Traits::AlterTableDropConstraint',
+        AlterTableAddConstraint  => '-IMPL::SQL::Schema::Traits::AlterTableAddConstraint',
+        CreateTable  => '-IMPL::SQL::Schema::Traits::CreateTable',
+        Table => '-IMPL::SQL::Schema::Traits::Table',
+        ForeignKey => '-IMPL::SQL::Schema::Traits::ForeignKey',
+        
+    },
+    base  => [
+        'IMPL::SQL::Schema::Processor' => sub { $_[0] }
+    ],
+    props => [
+        formatter   => PROP_RO,
+        sqlBatch    => PROP_RO
+    ]
+};
+use IMPL::lang qw(is);
+
+sub CTOR {
+    my ( $this, $schema, %opts ) = @_;
+
+    $this->formatter( $opts{formatter} || MySQLFormatter );
+    $this->sqlBatch([]);
+}
+
+sub AddSqlBatch {
+    my $this = shift;
+    
+    push @{$this->sqlBatch}, @_;
+}
+
+sub ApplyOperation {
+    my ($this, $op, $iteration ) = @_;
+    
+    my @formatterParams;
+
+    if ( is( $op, AlterTableDropConstraint ) ) {
+        my $constraint = $this
+            ->dbSchema
+            ->GetTable($op->tableName)
+            ->GetConstraint($op->constraintName);
+            
+        push @formatterParams, ref $constraint;
+    } else {
+        push @formatterParams, $this->dbSchema;        
+    }
+    
+    if ( is( $op, CreateTable ) ) {
+        my @constraints;
+        my @fk;
+        my $table = $op->table;
+        
+        # отделяем создание внешних ключей от таблиц
+        
+        foreach my $c (@{$table->{constraints} || []}) {
+            if ( is($c,ForeignKey)) {
+                push @fk,$c;
+            } else {
+                push @constraints, $c;
+            }
+        }
+        
+        if (@fk) {
+            $op = CreateTable->new(
+                Table->new(
+                    $table->{name},
+                    $table->{columns},
+                    \@constraints,
+                    $table->{options}
+                )
+            );
+            
+            $this->AddPendingOperations(
+                map AlterTableAddConstraint->new($table->{name},$_), @fk
+            );
+        }
+    }
+    
+    $this->next::method($op,$iteration);
+    
+    $this->AddSqlBatch(
+        $this->formatter->Format($op,@formatterParams)
+    );
+}
+
+1;