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 )