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 )