DBIx-PgLink

 view release on metacpan or  search on metacpan

lib/DBIx/PgLink/Accessor/BaseAccessor.pm  view on Meta::CPAN

        return 0;
      }
    }
    die $@;
  }
  pg_dbh->do("RELEASE SAVEPOINT $savepoint_name");

  return 1;
};


sub create_metadata { abstract() }
sub drop_local_objects { abstract() }
sub create_local_objects { abstract() }


sub load_old_accessor {
  my $self = shift;

  # load metadata for previous version of same remote object
  my $old_meta = $self->load_metadata_by_remote_name;
  $self->old_accessor( 
    $old_meta
    ? $self->new( %{$old_meta}, connector=>$self->connector ) 
    : undef 
  );
}


# constructor
method load => named ( 
  connector => { isa=>'DBIx::PgLink::Connector', required=>1},
  object_id => { isa=>'Int', required=>1},
) => sub {
  my ($class, $p) = @_;

  my $data = pg_dbh->selectrow_hashref(<<END_OF_SQL,
SELECT *
FROM @{[ $class->metadata_table ]}
WHERE object_id = \$1
END_OF_SQL
    { 
      %{$class->metadata_table_attr}, 
      Slice => {}, 
      no_cursor=>1, 
      types=>[qw/INT4/],
    },
    $p->{object_id},
  )
  or confess "Cannot load accessor metadata with id=$p->{object_id}";
  return $class->new( %{$data}, connector => $p->{connector} );
};


method delete_metadata_by_id => positional(
  {isa=>'Int', required=>1},
) => sub {
  my ($self, $object_id) = @_;

  # delete base row by id
  # foreign key cascade to child metadata (columns, queries, etc)
  pg_dbh->do(<<'END_OF_SQL',
DELETE FROM dbix_pglink.objects
WHERE object_id = $1
END_OF_SQL
    {types=>[qw/INT4/]},
    $object_id,
  );
};

sub load_metadata_by_local_name {
  my $self = shift;

  # load row by natural key
  return pg_dbh->selectrow_hashref(<<END_OF_SQL,
SELECT *
FROM @{[ $self->metadata_table ]}
WHERE conn_name = \$1
  and remote_object_type = \$2
  and local_schema = \$3
  and local_object = \$4
END_OF_SQL
    {
      %{$self->metadata_table_attr}, 
      no_cursor=>1, 
      types=>[qw/TEXT TEXT TEXT TEXT/],
    },
    $self->conn_name,
    $self->remote_object_type,
    $self->local_schema,
    $self->local_object,
  );
}


sub load_metadata_by_remote_name {
  my $self = shift;
  # find row by natural key (remote schema+name + local schema+name)
  # one remote table can have many accessors in different local schemas
  # compare object class instead type (remote TABLE can become VIEW)
  return pg_dbh->selectrow_hashref(<<END_OF_SQL,
SELECT *
FROM @{[ $self->metadata_table ]}
WHERE conn_name = \$1
  and dbix_pglink.object_type_class(remote_object_type) = dbix_pglink.object_type_class(\$2)
  and remote_catalog is not distinct from \$3
  and remote_schema is not distinct from \$4
  and remote_object = \$5
  and local_schema = \$6
  and local_object = \$7
END_OF_SQL
    {
      %{$self->metadata_table_attr}, 
      types=>[qw/TEXT TEXT TEXT TEXT TEXT TEXT TEXT/],
      #          1    2    3    4    5    6    7
    },
    $self->conn_name,          # 1
    $self->remote_object_type, # 2
    $self->remote_catalog,     # 3
    $self->remote_schema,      # 4
    $self->remote_object,      # 5



( run in 3.010 seconds using v1.01-cache-2.11-cpan-63c85eba8c4 )