Daje-Workflow-GenerateSchema-Activity
view release on metacpan or search on metacpan
lib/Daje/Workflow/GenerateSchema/Create/Schema.pm view on Meta::CPAN
#
#
# LICENSE
# =======
#
# Copyright (C) janeskil1525.
#
# This library is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.
#
# AUTHOR
# ======
# janeskil1525 E<lt>janeskil1525@gmail.comE<gt>
use Scalar::Util qw {reftype};
use Syntax::Operator::Matches qw( matches mismatches );
has 'db';
has 'excludes';
sub get_db_schema($self, $schema) {
$schema = 'public' unless $schema;
my @tab;
my @vie;
my @tables = ();
@tables = $self->_get_tables($schema);
my $length = scalar @tables;
for (my $i = 0; $i < $length; $i++) {
my $table->{table}->{table_name} = $tables[$i]->{table_name};
my $column_names = $self->_get_table_column_names($tables[$i]->{table_name}, $schema);
$table->{table}->{column_names} = $column_names;
my $indexes = $self->_get_table_indexes($tables[$i]->{table_name}, $schema);
if (defined $indexes) {
$table->{table}->{indexes} = $indexes;
}
push (@tab, $table);
my $temp = 1;
}
my $result->{tables} = \@tab;
my @views = $self->_get_views($schema);
$length = scalar @views;
for (my $i = 0; $i < $length; $i++ ) {
my $view->{view} = $views[$i];
my $column_names = $self->_get_table_column_names($view->{view}->{table_name}, $schema);
$view->{view}->{column_names} = $column_names;
$view->{view}->{keys} = $self->_get_keys($column_names);
push (@vie, $view);
}
$result->{views} = \@vie;
return $result;
}
sub build_view_methods($self, $view, $column_names) {
my $methods->{table_name} = $view->{table_name};
$methods->{keys} = $self->_get_keys($column_names);
$methods->{create_endpoint} = 1;
my $method = $self->get_view_list($view->{table_name},$column_names);
push @{$methods->{methods}}, $method ;
return $methods;
}
sub _get_keys($self, $column_names) {
my $keys->{has_companies} = 0;
$keys->{has_users} = 0;
$keys->{fk} = ();
my $length = scalar @{$column_names};
for (my $i = 0; $i < $length; $i++ ) {
if (length(@{$column_names}[$i]->{column_name}) > 0) {
if (index(@{$column_names}[$i]->{column_name},'_pkey') > -1){
$keys->{pk} = @{$column_names}[$i]->{column_name};
} elsif (@{$column_names}[$i]->{column_name} eq 'companies_fkey') {
$keys->{has_companies} = 1;
} elsif (@{$column_names}[$i]->{column_name} eq 'users_fkey') {
$keys->{has_users} = 1;
} elsif (index(@{$column_names}[$i]->{column_name},'_fkey') > -1) {
push @{$keys->{fk}}, @{$column_names}[$i]->{column_name};
}
}
}
return $keys;
}
sub _get_tables($self, $schema) {
my $excludes = $self->excludes();
my @tables = $self->db->query(qq {
SELECT table_name
FROM information_schema.tables
WHERE table_schema = ? AND table_name NOT IN(?)
AND table_type='BASE TABLE';
},($schema, $excludes))->hashes;
@tables = @{ $tables[0] };
return @tables;
}
sub _get_views($self, $schema) {
my @views = $self->db->query(qq {
SELECT table_name
FROM
information_schema.views
WHERE
table_schema NOT IN (
'information_schema', 'pg_catalog'
) AND table_schema = ?
ORDER BY table_name;
},($schema))->hashes;
@views = @{$views[0]};
return @views;
}
( run in 0.830 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )