Mercurial > pub > Impl
comparison Lib/Schema/DB.pm @ 0:03e58a454b20
Создан репозитарий
author | Sergey |
---|---|
date | Tue, 14 Jul 2009 12:54:37 +0400 |
parents | |
children | 16ada169ca75 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:03e58a454b20 |
---|---|
1 use strict; | |
2 package Schema::DB; | |
3 use Common; | |
4 use Schema::DB::Table; | |
5 | |
6 our @ISA = qw(Object); | |
7 | |
8 BEGIN { | |
9 DeclareProperty Version => ACCESS_READ; | |
10 DeclareProperty Name => ACCESS_READ; | |
11 DeclareProperty Tables => ACCESS_READ; | |
12 } | |
13 | |
14 sub AddTable { | |
15 my ($this,$table) = @_; | |
16 | |
17 if (UNIVERSAL::isa($table,'Schema::DB::Table')) { | |
18 $table->Schema == $this or die new Exception('The specified table must belong to the database'); | |
19 not exists $this->{$Tables}->{$table->Name} or die new Exception('a table with the same name already exists in the database'); | |
20 } elsif (UNIVERSAL::isa($table,'HASH')) { | |
21 not exists $this->{$Tables}->{$table->{'Name'}} or die new Exception('a table with the same name already exists in the database'); | |
22 $table->{'Schema'} = $this; | |
23 $table = new Schema::DB::Table(%{$table}); | |
24 } else { | |
25 die new Exception('Either a table object or a hash with table parameters is required'); | |
26 } | |
27 | |
28 $this->{$Tables}{$table->Name} = $table; | |
29 } | |
30 | |
31 sub RemoveTable { | |
32 my ($this,$table) = @_; | |
33 | |
34 my $tn = UNIVERSAL::isa($table,'Schema::DB::Table') ? $table->Name : $table; | |
35 $table = delete $this->{$Tables}{$tn} or die new Exception('The table doesn\'t exists',$tn); | |
36 | |
37 # drop foreign keys | |
38 map { $_->Table->RemoveConstraint($_) } values %{$table->PrimaryKey->ConnectedFK} if $table->PrimaryKey; | |
39 | |
40 # drop table contents | |
41 $table->Dispose(); | |
42 | |
43 return 1; | |
44 } | |
45 | |
46 sub Dispose { | |
47 my ($this) = @_; | |
48 | |
49 $_->Dispose foreach values %{$this->{$Tables}}; | |
50 | |
51 delete $this->{$Tables}; | |
52 | |
53 $this->SUPER::Dispose; | |
54 } | |
55 | |
56 | |
57 1; |