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 )