Daje-Plugin-GenerateSchema
view release on metacpan or search on metacpan
lib/Daje/Plugin/Schema/Create.pm view on Meta::CPAN
package Daje::Plugin::Schema::Create;
use Mojo::Base -base, -signatures;
our $VERSION = "0.01";
use Scalar::Util qw {reftype};
use Syntax::Operator::Matches qw( matches mismatches );
has 'db';
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 @tables = $self->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;
}
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;
}
sub _get_table_column_names($self, $table, $schema) {
( run in 0.916 second using v1.01-cache-2.11-cpan-59e3e3084b8 )