Oryx
view release on metacpan or search on metacpan
lib/Oryx/DBI/Association/Hash.pm view on Meta::CPAN
$sth = $obj->dbh->prepare($stmnt);
while (my ($key, $thing) = each %{tied(%$value)->deleted}) {
$lt_where{$lt_flds[2]} = $key;
@bind = $sql->values(\%lt_where);
$sth->execute(@bind);
}
$sth->finish;
tied(%$value)->deleted({});
}
if (%{tied(%$value)->created}) {
@lt_fieldvals{@lt_flds} = ($obj->id, '', '');
$stmnt = $sql->insert($lt_name, \%lt_fieldvals);
$sth = $obj->dbh->prepare($stmnt);
while (my ($key, $thing) = each %{tied(%$value)->created}) {
$lt_fieldvals{$lt_flds[1]} = defined $thing ? $thing->{id} : undef;
$lt_fieldvals{$lt_flds[2]} = $key;
@bind = $sql->values(\%lt_fieldvals);
$sth->execute(@bind);
}
$sth->finish;
tied(%$value)->created({});
}
if (%{tied(%$value)->updated}) {
%lt_where = ( $lt_flds[0] => $obj->id, $lt_flds[2] => '' );
%lt_fieldvals = ( $lt_flds[1] => '' );
$stmnt = $sql->update($lt_name, \%lt_fieldvals, \%lt_where);
$sth = $obj->dbh->prepare($stmnt);
while (my ($key, $thing) = each %{tied(%$value)->updated}) {
$lt_fieldvals{$lt_flds[1]} = defined $thing ? $thing->id : undef;
$lt_where{$lt_flds[2]} = $key;
@bind = $sql->values(\%lt_fieldvals);
push @bind, $sql->values(\%lt_where);
$sth->execute(@bind);
}
$sth->finish;
tied(%$value)->updated({});
}
$self->update_backrefs($obj, values %$value);
$obj->dbh->commit;
}
sub delete {
my $self = shift;
my ($query, $obj) = @_;
my $accessor = $self->role;
my $value = $obj->$accessor;
if ($self->constraint eq 'Composition') {
# composition, so cascade the delete
foreach my $thing (values %$value) {
$thing->delete;
}
} elsif ($self->constraint eq 'Aggregation') {
# aggregation so just clear the Hash
%$value = ();
}
$self->update(@_);
}
sub search {
}
sub construct {
my ($self, $obj) = @_;
my $assoc_name = $self->role;
my @args = ($self, $obj);
my %hash;
if ($obj->{$assoc_name}) {
%hash = %{$obj->{$assoc_name}};
}
$obj->{$assoc_name} = { } unless $obj->{$assoc_name};
tie %{$obj->{$assoc_name}}, __PACKAGE__, @args;
if (%hash) {
warn "got prefil hash";
while (my ($k, $v) = each %hash) {
warn "set_created $k => $v";
tied(%{$obj->{$assoc_name}})->_set_created($k, $v);
}
my $tieobj = tied(%{$obj->{$assoc_name}});
my $sql = SQL::Abstract->new;
my $lt_name = $self->link_table;
my @lt_flds = $self->link_fields;
my %lt_where = ($lt_flds[0] => $obj->id);
my $stmnt = $sql->delete($lt_name, \%lt_where);
my $sth = $obj->dbh->prepare($stmnt);
my @bind = $sql->values(\%lt_where);
$sth->execute(@bind);
$sth->finish;
$tieobj->deleted({});
$tieobj->updated({});
}
}
sub load {
my ($self, $owner) = @_;
my $lt_name = $self->link_table;
my ($source_id, $target_id, $_key) = $self->link_fields;
my (@fields, %where);
@fields = ($target_id, $_key);
( run in 0.791 second using v1.01-cache-2.11-cpan-98e64b0badf )