| 
0
 | 
     1 package Schema::DB::Constraint;
 | 
| 
 | 
     2 use Common;
 | 
| 
 | 
     3 our @ISA = qw(Object);
 | 
| 
 | 
     4 
 | 
| 
 | 
     5 BEGIN {
 | 
| 
 | 
     6     DeclareProperty Name => ACCESS_READ;
 | 
| 
 | 
     7     DeclareProperty Table => ACCESS_READ;
 | 
| 
 | 
     8     DeclareProperty Columns => ACCESS_READ;
 | 
| 
 | 
     9 }
 | 
| 
 | 
    10 
 | 
| 
 | 
    11 sub CTOR {
 | 
| 
 | 
    12     my ($this,%args) = @_;
 | 
| 
 | 
    13     die new Exception("The table argument must be an instance of a table object") if not UNIVERSAL::isa($args{'Table'},'Schema::DB::Table');
 | 
| 
 | 
    14     $this->{$Name} = $args{'Name'};
 | 
| 
 | 
    15     $this->{$Table} = $args{'Table'};
 | 
| 
 | 
    16     $this->{$Columns} = [map { ResolveColumn($this->Table,$_) } @{$args{'Columns'}}];
 | 
| 
 | 
    17 }
 | 
| 
 | 
    18 
 | 
| 
 | 
    19 sub ResolveColumn {
 | 
| 
 | 
    20     my ($Table,$Column) = @_;
 | 
| 
 | 
    21     
 | 
| 
 | 
    22     my $cn = UNIVERSAL::isa($Column,'Schema::DB::Column') ? $Column->Name : $Column;
 | 
| 
 | 
    23     
 | 
| 
 | 
    24     my $resolved = $Table->Column($cn);
 | 
| 
 | 
    25     die new Exception("The column is not found in the table", $cn, $Table->Name) if not $resolved;
 | 
| 
 | 
    26     return $resolved;
 | 
| 
 | 
    27 }
 | 
| 
 | 
    28 
 | 
| 
 | 
    29 sub HasColumn {
 | 
| 
 | 
    30     my ($this,@Columns) = @_;
 | 
| 
 | 
    31     
 | 
| 
 | 
    32     my %Columns = map { $_, 1} @Columns;
 | 
| 
 | 
    33     
 | 
| 
 | 
    34     return scalar(grep { $Columns{$_->Name} } $this->Columns) == scalar(@Columns);
 | 
| 
 | 
    35 }
 | 
| 
 | 
    36 
 | 
| 
 | 
    37 sub UniqName {
 | 
| 
 | 
    38     my ($this) = @_;
 | 
| 
 | 
    39     return $this->{$Table}->Name.'_'.$this->{$Name};
 | 
| 
 | 
    40 }
 | 
| 
 | 
    41 
 | 
| 
 | 
    42 sub Dispose {
 | 
| 
 | 
    43     my ($this) = @_;
 | 
| 
 | 
    44     
 | 
| 
 | 
    45     delete @$this{$Table,$Columns};
 | 
| 
 | 
    46     $this->SUPER::Dispose;
 | 
| 
 | 
    47 }
 | 
| 
 | 
    48 1; |