Mercurial > pub > Impl
comparison Lib/IMPL/SQL/Schema/Traits.pm @ 44:32d2350fccf9
ORM
*Minor fixes
*Working tarnsform to sql
*Fixes to the sql traits
| author | Sergey |
|---|---|
| date | Mon, 11 Jan 2010 01:42:00 +0300 |
| parents | 56cef8e3cda6 |
| children | 16ada169ca75 |
comparison
equal
deleted
inserted
replaced
| 43:009aa9ca2e48 | 44:32d2350fccf9 |
|---|---|
| 11 STATE_REMOVED => 3, | 11 STATE_REMOVED => 3, |
| 12 STATE_PENDING => 4 | 12 STATE_PENDING => 4 |
| 13 } ; | 13 } ; |
| 14 | 14 |
| 15 BEGIN { | 15 BEGIN { |
| 16 public _direct property SrcSchema => prop_none; | 16 public _direct property SrcSchema => prop_all; |
| 17 public _direct property DstSchema => prop_none; | 17 public _direct property DstSchema => prop_all; |
| 18 public _direct property PendingActions => prop_get; | 18 public _direct property PendingActions => prop_get; |
| 19 public _direct property TableInfo => prop_get; | 19 public _direct property TableInfo => prop_get; |
| 20 public _direct property Handler => prop_get; | 20 public _direct property Handler => prop_get; |
| 21 public _direct property TableMap => prop_none; | 21 public _direct property TableMap => prop_none; |
| 22 public _direct property KeepTables => prop_all; | 22 public _direct property KeepTables => prop_all; |
| 49 if (not $dstTable) { | 49 if (not $dstTable) { |
| 50 $this->DropTable($srcTable) if not $this->{$KeepTables}; | 50 $this->DropTable($srcTable) if not $this->{$KeepTables}; |
| 51 return 1; | 51 return 1; |
| 52 } | 52 } |
| 53 | 53 |
| 54 if ( not grep {$srcTable->Column($_->Name)} $dstTable->Columns ) { | 54 if ( not grep {$srcTable->Column($_->Name)} @{$dstTable->Columns} ) { |
| 55 | 55 |
| 56 $this->{$TableInfo}->{$srcTable->Name}->{'NewName'} = $dstTable->Name if $srcTable->Name ne $dstTable->Name; | 56 $this->{$TableInfo}->{$srcTable->Name}->{'NewName'} = $dstTable->Name if $srcTable->Name ne $dstTable->Name; |
| 57 | 57 |
| 58 $this->DropTable($srcTable); | 58 $this->DropTable($srcTable); |
| 59 $this->CreateTable($dstTable); | 59 $this->CreateTable($dstTable); |
| 74 $this->DropConstraint($srcConstraint); | 74 $this->DropConstraint($srcConstraint); |
| 75 } | 75 } |
| 76 } | 76 } |
| 77 | 77 |
| 78 my $i = 0; | 78 my $i = 0; |
| 79 my %dstColumns = map { $_->Name, $i++} $dstTable->Columns ; | 79 my %dstColumns = map { $_->Name, $i++} @{$dstTable->Columns} ; |
| 80 | 80 |
| 81 # сначала удаляем столбцы | 81 # сначала удаляем столбцы |
| 82 # потом добавляем недостающие и изменяем столбцы в нужном порядке | 82 # потом добавляем недостающие и изменяем столбцы в нужном порядке |
| 83 | 83 |
| 84 my @columnsToUpdate; | 84 my @columnsToUpdate; |
| 85 | 85 |
| 86 foreach my $srcColumn ($srcTable->Columns) { | 86 foreach my $srcColumn (@{$srcTable->Columns}) { |
| 87 if (defined (my $dstColumnIndex = delete $dstColumns{$srcColumn->Name})) { | 87 if (defined (my $dstColumnIndex = delete $dstColumns{$srcColumn->Name})) { |
| 88 push @columnsToUpdate, { Action => 'update', ColumnSrc => $srcColumn, ColumnDst => $dstTable->ColumnAt($dstColumnIndex), NewPosition => $dstColumnIndex}; | 88 push @columnsToUpdate, { Action => 'update', ColumnSrc => $srcColumn, ColumnDst => $dstTable->ColumnAt($dstColumnIndex), NewPosition => $dstColumnIndex}; |
| 89 } else { | 89 } else { |
| 90 $this->DropColumn($srcTable,$srcColumn); | 90 $this->DropColumn($srcTable,$srcColumn); |
| 91 } | 91 } |
| 124 sub ConstraintEquals { | 124 sub ConstraintEquals { |
| 125 my ($src,$dst) = @_; | 125 my ($src,$dst) = @_; |
| 126 | 126 |
| 127 ref $src eq ref $dst or return 0; | 127 ref $src eq ref $dst or return 0; |
| 128 | 128 |
| 129 my @dstColumns = $dst->Columns; | 129 my @dstColumns = @{$dst->Columns}; |
| 130 scalar(@{$src->Columns}) == scalar(@{$dst->Columns}) and not grep { my $column = shift @dstColumns; not $column->isSame($_) } $src->Columns or return 0; | 130 scalar(@{$src->Columns}) == scalar(@{$dst->Columns}) and not grep { my $column = shift @dstColumns; not $column->isSame($_) } @{$src->Columns} or return 0; |
| 131 | 131 |
| 132 not UNIVERSAL::isa($src,'IMPL::SQL::Schema::Constraint::ForeignKey') or ConstraintEquals($src->ReferencedPrimaryKey,$dst->ReferencedPrimaryKey) or return 0; | 132 not UNIVERSAL::isa($src,'IMPL::SQL::Schema::Constraint::ForeignKey') or ConstraintEquals($src->ReferencedPrimaryKey,$dst->ReferencedPrimaryKey) or return 0; |
| 133 | 133 |
| 134 1; | 134 1; |
| 135 } | 135 } |
| 165 } | 165 } |
| 166 | 166 |
| 167 $this->{$Handler}->DropTable($this->MapTableName($tbl->Name)); | 167 $this->{$Handler}->DropTable($this->MapTableName($tbl->Name)); |
| 168 $this->{$TableInfo}{$this->MapTableName($tbl->Name)}{'State'} = STATE_REMOVED; | 168 $this->{$TableInfo}{$this->MapTableName($tbl->Name)}{'State'} = STATE_REMOVED; |
| 169 $this->{$TableInfo}{$this->MapTableName($tbl->Name)}{'Constraints'} = {map {$_,STATE_REMOVED} keys %{$tbl->Constraints}}; | 169 $this->{$TableInfo}{$this->MapTableName($tbl->Name)}{'Constraints'} = {map {$_,STATE_REMOVED} keys %{$tbl->Constraints}}; |
| 170 $this->{$TableInfo}{$this->MapTableName($tbl->Name)}{'Columns'} = {map { $_->Name, STATE_REMOVED} $tbl->Columns}; | 170 $this->{$TableInfo}{$this->MapTableName($tbl->Name)}{'Columns'} = {map { $_->Name, STATE_REMOVED} @{$tbl->Columns}}; |
| 171 | 171 |
| 172 return 1; | 172 return 1; |
| 173 } | 173 } |
| 174 | 174 |
| 175 sub CreateTable { | 175 sub CreateTable { |
| 178 # создаем таблицу, кроме внешних ключей | 178 # создаем таблицу, кроме внешних ключей |
| 179 $this->{$Handler}->CreateTable($tbl,skip_foreign_keys => 1); | 179 $this->{$Handler}->CreateTable($tbl,skip_foreign_keys => 1); |
| 180 | 180 |
| 181 $this->{$TableInfo}->{$tbl->Name}->{'State'} = STATE_CREATED; | 181 $this->{$TableInfo}->{$tbl->Name}->{'State'} = STATE_CREATED; |
| 182 | 182 |
| 183 $this->{$TableInfo}->{$tbl->Name}->{'Columns'} = {map { $_->Name, STATE_CREATED } $tbl->Columns}; | 183 $this->{$TableInfo}->{$tbl->Name}->{'Columns'} = {map { $_->Name, STATE_CREATED } @{$tbl->Columns}}; |
| 184 $this->{$TableInfo}->{$tbl->Name}->{'Constraints'} = {map {$_->Name, STATE_CREATED} grep { not UNIVERSAL::isa($_,'IMPL::SQL::Schema::Constraint::ForeignKey') } values %{$tbl->Constraints}}; | 184 $this->{$TableInfo}->{$tbl->Name}->{'Constraints'} = {map {$_->Name, STATE_CREATED} grep { not UNIVERSAL::isa($_,'IMPL::SQL::Schema::Constraint::ForeignKey') } values %{$tbl->Constraints}}; |
| 185 | 185 |
| 186 $this->AddConstraint($_) foreach grep { UNIVERSAL::isa($_,'IMPL::SQL::Schema::Constraint::ForeignKey') } values %{$tbl->Constraints}; | 186 $this->AddConstraint($_) foreach grep { UNIVERSAL::isa($_,'IMPL::SQL::Schema::Constraint::ForeignKey') } values %{$tbl->Constraints}; |
| 187 | 187 |
| 188 return 1; | 188 return 1; |
| 240 # перед добавлением ограничения нужно убедиться в том, что созданы все необходимые столбцы и сопутствующие | 240 # перед добавлением ограничения нужно убедиться в том, что созданы все необходимые столбцы и сопутствующие |
| 241 # ограничения (например первичные ключи) | 241 # ограничения (например первичные ключи) |
| 242 | 242 |
| 243 my $pending; | 243 my $pending; |
| 244 | 244 |
| 245 $pending = grep { my $column = $_; not grep { IfUndef($this->{$TableInfo}{$constraint->Table->Name}{'Columns'}{$column->Name}, STATE_NORMAL) == $_ } (STATE_UPDATED, STATE_CREATED) } $constraint->Columns; | 245 $pending = grep { |
| 246 my $column = $_; | |
| 247 not grep { | |
| 248 IfUndef($this->{$TableInfo}{$constraint->Table->Name}{'Columns'}{$column->Name}, STATE_NORMAL) == $_ | |
| 249 } (STATE_UPDATED, STATE_CREATED) | |
| 250 } @{$constraint->Columns}; | |
| 246 | 251 |
| 247 if ($pending) { | 252 if ($pending) { |
| 248 push @{$this->{$PendingActions}},{Action => \&AddConstraint, Args => [$constraint]}; | 253 push @{$this->{$PendingActions}},{Action => \&AddConstraint, Args => [$constraint]}; |
| 249 return 2; | 254 return 2; |
| 250 } else { | 255 } else { |
