DBIx-PgLink
view release on metacpan or search on metacpan
lib/DBIx/PgLink/Accessor/Table.pm view on Meta::CPAN
our $VERSION = '0.01';
extends 'DBIx::PgLink::Accessor::BaseAccessor';
with 'DBIx::PgLink::Accessor::HasColumns';
has '+columns_class' => (default=>'DBIx::PgLink::Accessor::TableColumns');
with 'DBIx::PgLink::Accessor::HasQueries';
# class method, enumerates remote TABLEs/VIEWs and create accessor for each
sub _implement_build_accessors {
my ($class, $p) = @_;
my $objects = $p->{connector}->adapter->table_info_arrayref(
$p->{remote_catalog},
$p->{remote_schema},
$p->{remote_object},
$p->{remote_object_type},
) or return 0;
my $cnt = 0;
for my $obj (@{$objects}) {
my $local_object = $p->{object_name_mapping}->{$obj->{TABLE_NAME}}
|| $obj->{TABLE_NAME};
my $accessor = $class->new_from_remote_metadata({
%{$p},
%{$obj},
local_object => $local_object,
});
$cnt += $accessor->build;
}
return $cnt;
};
# constructor
sub new_from_remote_metadata {
my ($class, $meta) = @_;
my $connector = delete $meta->{connector};
return $class->new(
%{$meta},
connector => $connector,
remote_catalog => $meta->{TABLE_CAT},
remote_schema => $meta->{TABLE_SCHEM},
remote_object => $meta->{TABLE_NAME},
remote_object_type => $meta->{TABLE_TYPE},
table_info => $meta,
);
}
# -------------------------------------------------------
has 'table_info' => ( is=>'ro', isa=>'HashRef' ); # passed by build_accessors
# NAMES
my %name_attr = (is=>'ro', isa=>'Str', lazy=>1);
# name without schema or quoting
has 'function' => (%name_attr, default=>sub{ $_[0]->local_object . '$' });
# $-suffix to prevent collision with remote function accessor
has 'view' => (%name_attr, default=>sub{ $_[0]->local_object });
has 'rowtype' => (%name_attr, default=>sub{ $_[0]->local_object . '_rowtype' });
has 'shadow_table' => (%name_attr, default=>sub{ $_[0]->local_object . '_shadow' });
has 'shadow_row_trigger' => (%name_attr, default=>sub{ $_[0]->local_object . '_trg_row' });
has 'shadow_bs_trigger' => (%name_attr, default=>sub{ $_[0]->local_object . '_trg_bs' });
has 'shadow_as_trigger' => (%name_attr, default=>sub{ $_[0]->local_object . '_trg_as' });
has 'insert_rule' => (%name_attr, default=>sub{ $_[0]->local_object . '_insert' });
has 'update_rule' => (%name_attr, default=>sub{ $_[0]->local_object . '_update' });
has 'delete_rule' => (%name_attr, default=>sub{ $_[0]->local_object . '_delete' });
# full qualified, double-quoted name
has 'view_quoted' => (%name_attr, default=>sub{ $_[0]->QLIS($_[0]->view) } );
has 'rowtype_quoted' => (%name_attr, default=>sub{ $_[0]->QLIS($_[0]->rowtype) } );
has 'function_quoted' => (%name_attr, default=>sub{ $_[0]->QLIS($_[0]->function) } );
has 'shadow_table_quoted' => (%name_attr, default=>sub{ $_[0]->QLIS($_[0]->shadow_table) } );
# function signature (with args)
has 'function3_quoted_sign' => (%name_attr, default=>sub{ $_[0]->function_quoted . '(TEXT,TEXT[],TEXT[])' });
has 'function0_quoted_sign' => (%name_attr, default=>sub{ $_[0]->function_quoted . '()' });
# rule and trigger don't need schema
has 'shadow_row_trigger_quoted' => (%name_attr, default=>sub{ $_[0]->QLI($_[0]->shadow_row_trigger) } );
has 'shadow_bs_trigger_quoted' => (%name_attr, default=>sub{ $_[0]->QLI($_[0]->shadow_bs_trigger) } );
has 'shadow_as_trigger_quoted' => (%name_attr, default=>sub{ $_[0]->QLI($_[0]->shadow_as_trigger) } );
has 'insert_rule_quoted' => (%name_attr, default=>sub{ $_[0]->QLI($_[0]->insert_rule) } );
has 'update_rule_quoted' => (%name_attr, default=>sub{ $_[0]->QLI($_[0]->update_rule) } );
has 'delete_rule_quoted' => (%name_attr, default=>sub{ $_[0]->QLI($_[0]->delete_rule) } );
# additional functions (query filter)
has 'function_set_filter' => (%name_attr, default=>sub{ $_[0]->local_object . '_set_filter' });
has 'function_reset_filter' => (%name_attr, default=>sub{ $_[0]->local_object . '_reset_filter' });
has 'function_set_filter_quoted_sign' => (%name_attr,
default=>sub{ $_[0]->QLIS($_[0]->function_set_filter) . '(TEXT,TEXT[],TEXT[])' });
has 'function_reset_filter_quoted_sign' => (%name_attr,
default=>sub{ $_[0]->QLIS($_[0]->function_reset_filter) . '()' });
sub create_metadata {
my $self = shift;
$self->columns->require_quoted_names;
die "Cannot detect columns of ".$self->remote_object_quoted
unless @{$self->columns->metadata};
$self->create_query( $self->_select_query );
$self->create_query( $self->_insert_query );
$self->create_query( $self->_update_query );
$self->create_query( $self->_delete_query );
}
( run in 1.348 second using v1.01-cache-2.11-cpan-d8267643d1d )