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 )