Mercurial > pub > Impl
comparison 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 |
comparison
equal
deleted
inserted
replaced
270:3f59fd828d5f | 271:56364d0c4b4f |
---|---|
1 package IMPL::SQL::Schema::MySQL::Processor; | |
2 use strict; | |
3 | |
4 use mro; | |
5 use IMPL::Const qw(:prop); | |
6 use IMPL::declare { | |
7 require => { | |
8 MySQLFormatter => 'IMPL::SQL::Schema::MySQL::Formatter', | |
9 AlterTableDropConstraint => '-IMPL::SQL::Schema::Traits::AlterTableDropConstraint', | |
10 AlterTableAddConstraint => '-IMPL::SQL::Schema::Traits::AlterTableAddConstraint', | |
11 CreateTable => '-IMPL::SQL::Schema::Traits::CreateTable', | |
12 Table => '-IMPL::SQL::Schema::Traits::Table', | |
13 ForeignKey => '-IMPL::SQL::Schema::Traits::ForeignKey', | |
14 | |
15 }, | |
16 base => [ | |
17 'IMPL::SQL::Schema::Processor' => sub { $_[0] } | |
18 ], | |
19 props => [ | |
20 formatter => PROP_RO, | |
21 sqlBatch => PROP_RO | |
22 ] | |
23 }; | |
24 use IMPL::lang qw(is); | |
25 | |
26 sub CTOR { | |
27 my ( $this, $schema, %opts ) = @_; | |
28 | |
29 $this->formatter( $opts{formatter} || MySQLFormatter ); | |
30 $this->sqlBatch([]); | |
31 } | |
32 | |
33 sub AddSqlBatch { | |
34 my $this = shift; | |
35 | |
36 push @{$this->sqlBatch}, @_; | |
37 } | |
38 | |
39 sub ApplyOperation { | |
40 my ($this, $op, $iteration ) = @_; | |
41 | |
42 my @formatterParams; | |
43 | |
44 if ( is( $op, AlterTableDropConstraint ) ) { | |
45 my $constraint = $this | |
46 ->dbSchema | |
47 ->GetTable($op->tableName) | |
48 ->GetConstraint($op->constraintName); | |
49 | |
50 push @formatterParams, ref $constraint; | |
51 } else { | |
52 push @formatterParams, $this->dbSchema; | |
53 } | |
54 | |
55 if ( is( $op, CreateTable ) ) { | |
56 my @constraints; | |
57 my @fk; | |
58 my $table = $op->table; | |
59 | |
60 # отделяем создание внешних ключей от таблиц | |
61 | |
62 foreach my $c (@{$table->{constraints} || []}) { | |
63 if ( is($c,ForeignKey)) { | |
64 push @fk,$c; | |
65 } else { | |
66 push @constraints, $c; | |
67 } | |
68 } | |
69 | |
70 if (@fk) { | |
71 $op = CreateTable->new( | |
72 Table->new( | |
73 $table->{name}, | |
74 $table->{columns}, | |
75 \@constraints, | |
76 $table->{options} | |
77 ) | |
78 ); | |
79 | |
80 $this->AddPendingOperations( | |
81 map AlterTableAddConstraint->new($table->{name},$_), @fk | |
82 ); | |
83 } | |
84 } | |
85 | |
86 $this->next::method($op,$iteration); | |
87 | |
88 $this->AddSqlBatch( | |
89 $this->formatter->Format($op,@formatterParams) | |
90 ); | |
91 } | |
92 | |
93 1; |