DBIx-PgLink
view release on metacpan or search on metacpan
lib/DBIx/PgLink/Accessor/Routine.pm view on Meta::CPAN
my $local_object = $p->{object_name_mapping}->{$obj->{ROUTINE_NAME}}
|| $obj->{ROUTINE_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->{SPECIFIC_CATALOG},
remote_schema => $meta->{SPECIFIC_SCHEMA},
remote_object => $meta->{SPECIFIC_NAME},
remote_object_type => $meta->{ROUTINE_TYPE},
remote_routine_name => $meta->{ROUTINE_NAME},
defined $meta->{DATA_TYPE}
? $meta->{DATA_TYPE} eq 'TABLE'
? (returns_set => 1)
: (returns_set => 0)
: (),
routine_info => $meta,
);
}
# -------------------------------------------------------
sub metadata_table { 'dbix_pglink.v_routines' }
sub metadata_table_attr { { boolean=>[qw/returns_set/]} } # attr for pg_dbh->prepare
with 'DBIx::PgLink::Accessor::HasColumns';
has '+columns_class' => (default=>'DBIx::PgLink::Accessor::RoutineColumns');
with 'DBIx::PgLink::Accessor::HasQueries';
has 'arguments' => (
is => 'rw',
isa => 'ArrayRef[HashRef]',
auto_deref => 1,
lazy => 1,
default => sub {
my $self = shift;
return $self->building_mode
? $self->get_remote_arguments
: $self->load_arguments
},
);
has 'routine_info' => ( is=>'ro', isa=>'HashRef' ); # passed by build_accessors
has 'remote_routine_name' => (is=>'ro', isa=>'Str', required=>1 );
has 'returns_set' => (is=>'ro', isa=>'Bool', lazy=>1,
default => sub {
my $self = shift;
return ($self->columns->metadata) ? 1 : 0; # has non-empty column list?
}
);
my %name_attr = (is=>'ro', isa=>'Str', lazy=>1);
has 'local_object_quoted' => (%name_attr, default=>sub{ $_[0]->QLIS($_[0]->local_object) } );
# WARNING: function that returns single row (composite) treated as set-returning
# use object id to make unique rowtype name
has 'rowtype' => (%name_attr,
default=>sub{
my $self = shift;
if ($self->returns_set) {
return "routine_" . $self->object_id . "_rowtype";
} else { # scalar or void
my $c = $self->columns->metadata->[0];
return $c ? $c->{local_type} : 'void';
}
}
);
has 'rowtype_quoted' => (%name_attr,
default=>sub{
my $self = shift;
if ($self->returns_set) {
return $self->QLIS($self->rowtype);
} else { # scalar or void
return $self->rowtype;
}
}
);
# argument part of function signature
has 'local_sign_arg' => (%name_attr,
default=>sub {
my $self= shift;
return '(' . join(', ', map { $_->{local_type} } $self->arguments) . ')';
}
);
# same, but with argument name (more informative for user)
has 'local_sign_arg_named' => (%name_attr,
default=>sub {
my $self= shift;
return '(' . join(', ', map {
( $_->{arg_name} ? $self->QLI($_->{arg_name}) . ' ' : '' )
. $_->{local_type}
} $self->arguments) . ')';
}
);
has 'function_quoted_sign' => (%name_attr,
default=>sub {
my $self= shift;
( run in 1.657 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )