CellBIS-SQL-Abstract

 view release on metacpan or  search on metacpan

lib/CellBIS/SQL/Abstract/Table.pm  view on Meta::CPAN

package    # hide from PAUSE
  CellBIS::SQL::Abstract::Table;
use Mojo::Base -base;

use Scalar::Util qw(blessed);
use Mojo::Util qw(trim);
use Hash::MultiValue;

has 'db_type' => 'mariadb';

# For Foreign Key Validator:
# ------------------------------------------------------------------------
sub fk_validator {
  my ($table_attr, $col_attr) = @_;
  my %fk_attr = (name => 0, col_name => 0, table_target => 0, col_target => 0,);

  my $fk = $table_attr->{fk};
  if (exists $fk->{name} && $fk->{name} ne '') {
    $fk_attr{name} = 1;
  }
  if (exists $fk->{col_name} && $fk->{col_name} ne '') {
    $fk_attr{col_name} = 1;
  }

  if (exists $fk->{table_target} && $fk->{table_target} ne '') {
    $fk_attr{table_target} = 1;
  }

  if (exists $fk->{col_target} && $fk->{col_target} ne '') {
    $fk_attr{col_target} = 1;
  }
  my @r_val       = grep { !$_ } values %fk_attr;
  my $size_result = scalar @r_val;

  if ($size_result >= 1) {
    my $new_TableAttr = Hash::MultiValue->new(%{$table_attr});
    $new_TableAttr->remove('fk');
    $table_attr = $new_TableAttr->as_hashref;
  }
  else {
    unless (exists $col_attr->{$fk->{col_name}}) {
      my $new_TableAttr = Hash::MultiValue->new(%{$table_attr});
      $new_TableAttr->remove('fk');
      $table_attr = $new_TableAttr->as_hashref;
    }
  }
  return $table_attr;
}

# For Foreign key attribute :
# ------------------------------------------------------------------------
sub fk_attr_validator {
  my ($fk_table) = @_;
  my $data       = '';
  my %ondelup    = ('cascade' => 'CASCADE', 'null' => 'SET NULL',
    'default' => 'SET DEFAULT');
  my $ondel = 0;
  if (exists $fk_table->{ondelete}) {
    if (exists $ondelup{(lc $fk_table->{ondelete})}) {
      $ondel = 1;
      $data .= 'ON DELETE ' . $ondelup{(lc $fk_table->{ondelete})};
    }
  }

  if (exists $fk_table->{onupdate}) {
    if (exists $ondelup{(lc $fk_table->{onupdate})}) {
      $data .= ' ' if $ondel == 1;
      $data .= 'ON UPDATE ' . $ondelup{(lc $fk_table->{onupdate})};
    }
  }
  $data = trim($data);
  return $data;
}

# For Table Attribute Validator :
# ------------------------------------------------------------------------
sub table_attr_val {
  my $self = shift;
  my ($col_attr, $table_attr) = @_;
  my $new_tblAttr  = {};
  my $attrib_table = '';
  my $db_type      = $self->db_type // 'mariadb';

  if (exists $table_attr->{fk}) {
    $table_attr = fk_validator($table_attr, $col_attr);
    my $table_fk = '';
    if (exists $table_attr->{fk}) {
      my $fk_table     = $table_attr->{fk};
      my $fk_name      = $fk_table->{name};
      my $col_name     = $fk_table->{col_name};
      my $table_target = $fk_table->{table_target};
      my $col_target   = $fk_table->{col_target};
      my $fk_attr      = '';
      if ($fk_table->{attr}) {
        $fk_attr = fk_attr_validator($fk_table->{attr});
      }
      if ($db_type eq 'sqlite') {
        $table_fk .= "\tCONSTRAINT $fk_name ";
        $table_fk .= "FOREIGN KEY ($col_name) ";
        $table_fk .= "REFERENCES $table_target ($col_target)\n"
          if $fk_attr eq '';
        $table_fk .= "REFERENCES $table_target ($col_target) \n\t$fk_attr\n"
          unless $fk_attr eq '';
      }
      else {
        $table_fk .= "\tKEY " . $fk_name . " ($col_name), \n"
          if $db_type eq 'mariadb';
        $table_fk .= "\tCONSTRAINT $fk_name ";
        $table_fk .= "FOREIGN KEY ($col_name) ";
        $table_fk .= "REFERENCES $table_target ($col_target)\n"
          if $fk_attr eq '';
        $table_fk .= "REFERENCES $table_target ($col_target) \n\t$fk_attr\n"
          unless $fk_attr eq '';
      }



( run in 1.236 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )