diff Lib/Schema/DB.pm @ 0:03e58a454b20

Создан репозитарий
author Sergey
date Tue, 14 Jul 2009 12:54:37 +0400
parents
children 16ada169ca75
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/Schema/DB.pm	Tue Jul 14 12:54:37 2009 +0400
@@ -0,0 +1,57 @@
+use strict;
+package Schema::DB;
+use Common;
+use Schema::DB::Table;
+
+our @ISA = qw(Object);
+
+BEGIN {
+    DeclareProperty Version => ACCESS_READ;
+    DeclareProperty Name => ACCESS_READ;
+    DeclareProperty Tables => ACCESS_READ;
+}
+
+sub AddTable {
+    my ($this,$table) = @_;
+    
+    if (UNIVERSAL::isa($table,'Schema::DB::Table')) {
+        $table->Schema == $this or die new Exception('The specified table must belong to the database');
+        not exists $this->{$Tables}->{$table->Name} or die new Exception('a table with the same name already exists in the database');
+    } elsif (UNIVERSAL::isa($table,'HASH')) {
+        not exists $this->{$Tables}->{$table->{'Name'}} or die new Exception('a table with the same name already exists in the database');
+        $table->{'Schema'} = $this;
+        $table = new Schema::DB::Table(%{$table});
+    } else {
+        die new Exception('Either a table object or a hash with table parameters is required');
+    }
+    
+    $this->{$Tables}{$table->Name} = $table;
+}
+
+sub RemoveTable {
+    my ($this,$table) = @_;
+    
+    my $tn = UNIVERSAL::isa($table,'Schema::DB::Table') ? $table->Name : $table;
+    $table = delete $this->{$Tables}{$tn} or die new Exception('The table doesn\'t exists',$tn);
+    
+    # drop foreign keys
+    map { $_->Table->RemoveConstraint($_) } values %{$table->PrimaryKey->ConnectedFK} if $table->PrimaryKey;
+    
+    # drop table contents
+    $table->Dispose();
+
+    return 1;
+}
+
+sub Dispose {
+    my ($this) = @_;
+    
+    $_->Dispose foreach values %{$this->{$Tables}};
+    
+    delete $this->{$Tables};
+    
+    $this->SUPER::Dispose;
+}
+
+
+1;