Daje-Generate
view release on metacpan or search on metacpan
lib/Daje/Generate/Perl/CreateSchema.pm view on Meta::CPAN
use v5.40;
use feature 'class';
no warnings 'experimental::class';
class Daje::Generate::Perl::CreateSchema {
use Scalar::Util qw {reftype};
use Syntax::Operator::Matches qw( matches mismatches );
field $db :param;
method get_db_schema( $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;
}
method build_view_methods($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;
}
method _get_keys($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;
}
method _get_tables($schema) {
my @tables = $db->query(qq {
SELECT table_name
FROM information_schema.tables
WHERE table_schema = ?
AND table_type='BASE TABLE';
},($schema))->hashes;
@tables = @{ $tables[0] };
return @tables;
}
method _get_views($schema) {
my @views = $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;
}
method _get_table_column_names($table, $schema) {
( run in 1.418 second using v1.01-cache-2.11-cpan-d7f47b0818f )