Mercurial > pub > Impl
comparison lib/IMPL/SQL/Schema/MySQL/Processor.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
| author | cin |
|---|---|
| date | Fri, 04 Sep 2015 19:40:23 +0300 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 406:f23fcb19d3c1 | 407:c6e90e02dd17 |
|---|---|
| 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 DropTable => '-IMPL::SQL::Schema::Traits::DropTable', | |
| 12 PrimitiveDropTable => '-IMPL::SQL::Schema::MySQL::Processor::PrimitiveDropTable', | |
| 13 CreateTable => '-IMPL::SQL::Schema::Traits::CreateTable', | |
| 14 Table => '-IMPL::SQL::Schema::Traits::Table', | |
| 15 ForeignKey => '-IMPL::SQL::Schema::Traits::ForeignKey', | |
| 16 | |
| 17 }, | |
| 18 base => [ | |
| 19 'IMPL::SQL::Schema::Processor' => sub { $_[0] } | |
| 20 ], | |
| 21 props => [ | |
| 22 formatter => PROP_RO, | |
| 23 sqlBatch => PROP_RO | |
| 24 ] | |
| 25 }; | |
| 26 use IMPL::lang qw(is); | |
| 27 | |
| 28 sub CTOR { | |
| 29 my ( $this, $schema, %opts ) = @_; | |
| 30 | |
| 31 $this->formatter( $opts{formatter} || MySQLFormatter ); | |
| 32 $this->sqlBatch([]); | |
| 33 } | |
| 34 | |
| 35 sub AddSqlBatch { | |
| 36 my $this = shift; | |
| 37 | |
| 38 push @{$this->sqlBatch}, @_; | |
| 39 } | |
| 40 | |
| 41 sub ApplyOperation { | |
| 42 my ($this, $op, $iteration ) = @_; | |
| 43 | |
| 44 my @formatterParams; | |
| 45 | |
| 46 if ( is( $op, AlterTableDropConstraint ) ) { | |
| 47 my $constraint = $this | |
| 48 ->dbSchema | |
| 49 ->GetTable($op->tableName) | |
| 50 ->GetConstraint($op->constraintName); | |
| 51 | |
| 52 push @formatterParams, ref $constraint; | |
| 53 } else { | |
| 54 push @formatterParams, $this->dbSchema; | |
| 55 } | |
| 56 | |
| 57 if ( is( $op, CreateTable ) ) { | |
| 58 my @constraints; | |
| 59 my @fk; | |
| 60 my $table = $op->table; | |
| 61 | |
| 62 # отделяем создание внешних ключей от таблиц | |
| 63 | |
| 64 foreach my $c (@{$table->{constraints} || []}) { | |
| 65 if ( is($c,ForeignKey)) { | |
| 66 push @fk,$c; | |
| 67 } else { | |
| 68 push @constraints, $c; | |
| 69 } | |
| 70 } | |
| 71 | |
| 72 if (@fk) { | |
| 73 $op = CreateTable->new( | |
| 74 Table->new( | |
| 75 $table->{name}, | |
| 76 $table->{columns}, | |
| 77 \@constraints, | |
| 78 $table->{options} | |
| 79 ) | |
| 80 ); | |
| 81 | |
| 82 $this->AddPendingOperations( | |
| 83 map AlterTableAddConstraint->new($table->{name},$_), @fk | |
| 84 ); | |
| 85 } | |
| 86 } | |
| 87 | |
| 88 if (is($op, DropTable)) { | |
| 89 my $table = $this->dbSchema->GetTable($op->tableName); | |
| 90 | |
| 91 if(my $pk = $table->primaryKey) { | |
| 92 $this->ApplyOperation($_,$iteration) | |
| 93 foreach | |
| 94 map | |
| 95 AlterTableDropConstraint->new($_->table->name,$_->name), | |
| 96 values %{$pk->connectedFK || {}}; | |
| 97 } | |
| 98 } | |
| 99 | |
| 100 $this->next::method($op,$iteration); | |
| 101 | |
| 102 $this->AddSqlBatch( | |
| 103 $this->formatter->Format($op,@formatterParams) | |
| 104 ); | |
| 105 } | |
| 106 | |
| 107 package IMPL::SQL::Schema::MySQL::Processor::PrimitiveDropTable; | |
| 108 use IMPL::Const qw(:prop); | |
| 109 use IMPL::declare { | |
| 110 require => { | |
| 111 ArgException => '-IMPL::InvalidArgumentException' | |
| 112 }, | |
| 113 base => [ | |
| 114 'IMPL::Object' => undef | |
| 115 ], | |
| 116 props => [ | |
| 117 tableName => PROP_RO, | |
| 118 ] | |
| 119 }; | |
| 120 | |
| 121 sub CTOR { | |
| 122 my ($this,$tableName) = @_; | |
| 123 | |
| 124 $this->tableName($tableName) or die ArgException->new("tableName is required"); | |
| 125 } | |
| 126 | |
| 127 sub CanApply { | |
| 128 my ($this,$schema) = @_; | |
| 129 | |
| 130 my $table = $schema->GetTable( $this->tableName ) | |
| 131 or return 0; | |
| 132 | |
| 133 my $pk = $table->primaryKey | |
| 134 or return 1; | |
| 135 | |
| 136 my $canDrop = keys(%{$pk->connectedFK || {}}) ? 0 : 1; | |
| 137 | |
| 138 warn "Can drop ", $this->tableName | |
| 139 if $canDrop; | |
| 140 | |
| 141 return $canDrop; | |
| 142 } | |
| 143 | |
| 144 sub Apply { | |
| 145 my ($this,$schema) = @_; | |
| 146 | |
| 147 $schema->RemoveTable($this->tableName); | |
| 148 } | |
| 149 | |
| 150 1; |
