Mercurial > pub > Impl
comparison Lib/IMPL/SQL/Schema.pm @ 278:4ddb27ff4a0b
core refactoring
author | cin |
---|---|
date | Mon, 04 Feb 2013 02:10:37 +0400 |
parents | 5c82eec23bb6 |
children |
comparison
equal
deleted
inserted
replaced
277:6585464c4664 | 278:4ddb27ff4a0b |
---|---|
1 use strict; | 1 use strict; |
2 package IMPL::SQL::Schema; | 2 package IMPL::SQL::Schema; |
3 use mro; | |
3 | 4 |
4 use IMPL::lang qw(is :declare); | 5 use IMPL::lang qw(is); |
5 | 6 use IMPL::Const qw(:prop); |
6 use parent qw( | 7 use Scalar::Util qw(reftype); |
7 IMPL::Object | 8 use IMPL::declare { |
8 IMPL::Object::Disposable | 9 require => { |
9 IMPL::Object::Autofill | 10 Table => 'IMPL::SQL::Schema::Table' |
10 IMPL::Object::Clonable | 11 }, |
11 ); | 12 base => [ |
12 | 13 'IMPL::Object' => undef, |
13 use IMPL::Class::Property::Direct; | 14 'IMPL::Object::Disposable' => undef, |
14 | 15 'IMPL::Object::Autofill' => '@_', |
15 require IMPL::SQL::Schema::Table; | 16 'IMPL::Object::Clonable' => undef, |
16 | 17 ], |
17 __PACKAGE__->PassThroughArgs; | 18 props => [ |
18 | 19 version => PROP_RO | PROP_DIRECT, |
19 BEGIN { | 20 name => PROP_RO | PROP_DIRECT, |
20 public _direct property version => PROP_GET; | 21 _tables => PROP_RO | PROP_DIRECT |
21 public _direct property name => PROP_GET; | 22 ] |
22 private _direct property tables => PROP_GET; | 23 }; |
23 } | |
24 | 24 |
25 sub AddTable { | 25 sub AddTable { |
26 my ($this,$table) = @_; | 26 my ($this,$table) = @_; |
27 | 27 |
28 if (UNIVERSAL::isa($table,'IMPL::SQL::Schema::Table')) { | 28 if (is($table,Table)) { |
29 | 29 |
30 $table->Schema == $this or die new IMPL::InvalidOperationException('The specified table must belong to the database'); | 30 $table->schema == $this or die new IMPL::InvalidOperationException('The specified table must belong to the database'); |
31 not exists $this->{$tables}->{$table->name} or die new IMPL::InvalidOperationException('a table with the same name already exists in the database'); | 31 not exists $this->{$_tables}->{$table->name} or die new IMPL::InvalidOperationException('a table with the same name already exists in the database'); |
32 | 32 |
33 } elsif (UNIVERSAL::isa($table,'HASH')) { | 33 } elsif (reftype($table) eq 'HASH') { |
34 | 34 |
35 not exists $this->{$tables}->{$table->{'name'}} or die new IMPL::InvalidOperationException('a table with the same name already exists in the database'); | 35 not exists $this->{$_tables}->{$table->{'name'}} or die new IMPL::InvalidOperationException('a table with the same name already exists in the database'); |
36 $table = { %$table }; | 36 $table = { %$table }; |
37 $table->{'schema'} = $this; | 37 $table->{'schema'} = $this; |
38 $table = new IMPL::SQL::Schema::Table(%{$table}); | 38 $table = Table->new(%{$table}); |
39 } else { | 39 } else { |
40 die new IMPL::InvalidArgumentException('Either a table object or a hash with table parameters is required'); | 40 die new IMPL::InvalidArgumentException('Either a table object or a hash with table parameters is required'); |
41 } | 41 } |
42 | 42 |
43 $this->{$tables}{$table->name} = $table; | 43 $this->{$_tables}{$table->name} = $table; |
44 } | 44 } |
45 | 45 |
46 sub RemoveTable { | 46 sub RemoveTable { |
47 my ($this,$table) = @_; | 47 my ($this,$table) = @_; |
48 | 48 |
49 my $tn = UNIVERSAL::isa($table,'IMPL::SQL::Schema::Table') ? $table->name : $table; | 49 my $tn = is($table,Table) ? $table->name : $table; |
50 | 50 |
51 $table = delete $this->{$tables}{$tn} or die new IMPL::InvalidArgumentException('The table doesn\'t exists',$tn); | 51 $table = delete $this->{$_tables}{$tn} or die new IMPL::InvalidArgumentException('The table doesn\'t exists',$tn); |
52 | 52 |
53 # drop foreign keys | 53 # drop foreign keys |
54 map { $_->table->RemoveConstraint($_) } values %{$table->primaryKey->connectedFK} if $table->primaryKey; | 54 map { $_->table->RemoveConstraint($_) } values %{$table->primaryKey->connectedFK} if $table->primaryKey; |
55 | 55 |
56 # drop table contents | 56 # drop table contents |
60 } | 60 } |
61 | 61 |
62 sub ResolveTable { | 62 sub ResolveTable { |
63 my ($this,$table) = @_; | 63 my ($this,$table) = @_; |
64 | 64 |
65 UNIVERSAL::isa($table,'IMPL::SQL::Schema::Table') ? $table : $this->{$tables}{$table}; | 65 is($table,Table) ? $table : $this->{$_tables}{$table}; |
66 } | 66 } |
67 | 67 |
68 sub GetTable { | 68 sub GetTable { |
69 my ($this,$tableName) = @_; | 69 my ($this,$tableName) = @_; |
70 return $this->{$tables}{$tableName}; | 70 return $this->{$_tables}{$tableName}; |
71 } | 71 } |
72 | 72 |
73 sub GetTables { | 73 sub GetTables { |
74 my ($this) = @_; | 74 my ($this) = @_; |
75 | 75 |
76 return wantarray ? values %{$this->{$tables}} : [values %{$this->{$tables}}]; | 76 return wantarray ? values %{$this->{$_tables}} : [values %{$this->{$_tables}}]; |
77 } | 77 } |
78 | 78 |
79 sub RenameTable { | 79 sub RenameTable { |
80 my ($this,$oldName,$newName) = @_; | 80 my ($this,$oldName,$newName) = @_; |
81 | 81 |
82 die new IMPL::InvalidOperationException("A source table doesn't exists", $oldName) unless exists $this->{$tables}{$oldName}; | 82 die new IMPL::InvalidOperationException("A source table doesn't exists", $oldName) unless exists $this->{$_tables}{$oldName}; |
83 die new IMPL::InvalidOperationException("A target table already exists", $newName) if exists $this->{$tables}{$newName}; | 83 die new IMPL::InvalidOperationException("A target table already exists", $newName) if exists $this->{$_tables}{$newName}; |
84 | 84 |
85 my $table = delete $this->{$tables}{$oldName}; | 85 my $table = delete $this->{$_tables}{$oldName}; |
86 $table->_setName($newName); | 86 $table->_setName($newName); |
87 $this->{$tables}{$newName} = $table; | 87 $this->{$_tables}{$newName} = $table; |
88 } | 88 } |
89 | 89 |
90 sub Dispose { | 90 sub Dispose { |
91 my ($this) = @_; | 91 my ($this) = @_; |
92 | 92 |
93 $_->Dispose foreach values %{$this->{$tables}}; | 93 $_->Dispose foreach values %{$this->{$_tables}}; |
94 | 94 |
95 delete $this->{$tables}; | 95 delete $this->{$_tables}; |
96 | 96 |
97 $this->SUPER::Dispose; | 97 $this->next::method(); |
98 } | 98 } |
99 | 99 |
100 1; | 100 1; |
101 | 101 |
102 __END__ | 102 __END__ |