DBIx-QuickORM

 view release on metacpan or  search on metacpan

worktrees/dbic-compat-native-features/lib/DBIx/QuickORM/RowManager.pm  view on Meta::CPAN

        push @lost => $field;
    }

    return unless @lost;

    carp "vivify() returned an already-loaded row for this primary key; the supplied data for "
        . join(', ', map { "'$_'" } @lost)
        . " differs from the loaded row and was not applied. To change a loaded row, fetch it and call ->update(); to ensure a row exists in the database, use the connection's find_or_insert() or update_or_insert() helpers";
}

=pod

=item $row = $mgr->insert(source => $source, fetched => \%data, ...)

=item $row = $mgr->update(source => $source, fetched => \%data, ...)

=item $row = $mgr->delete(source => $source, fetched => \%data, ...)

=item $row = $mgr->select(source => $source, fetched => \%data, ...)

Apply the named storage operation to a row (creating one if needed),
updating the cache accordingly, and return the row.

=item $row = $mgr->do_insert($source, $fetched, $old_pk, $new_pk, $row)

=item $row = $mgr->do_update($source, $fetched, $old_pk, $new_pk, $row)

=item $row = $mgr->do_delete($source, $fetched, $old_pk, $new_pk, $row)

=item $row = $mgr->do_select($source, $fetched, $old_pk, $new_pk, $row)

Backend state transitions invoked by the matching public method, after
parameters have been parsed. They change the row's state and skip cache
maintenance.

=cut

sub insert {
    my $self = shift;
    my ($source, $fetched, $old_pk, $new_pk, $row) = $self->parse_params({@_});

    $row = $self->do_insert($source, $fetched, $old_pk, $new_pk, $row);
    $self->cache($source, $row, $old_pk, $new_pk);

    return $row;
}

sub do_insert {
    my $self = shift;
    my ($source, $fetched, $old_pk, $new_pk, $row) = @_;

    my $state = $self->_state(stored => $fetched, pending => undef);

    $row->{+ROW_DATA}->change_state($state) if $row;

    $row //= $self->_vivify($source, $state);

    return $row;
}

sub update {
    my $self = shift;
    my ($source, $fetched, $old_pk, $new_pk, $row) = $self->parse_params({@_});

    $row = $self->do_update($source, $fetched, $old_pk, $new_pk, $row);
    $self->cache($source, $row, $old_pk, $new_pk);

    return $row;
}

sub do_update {
    my $self = shift;
    my ($source, $fetched, $old_pk, $new_pk, $row) = @_;

    my $state = $self->_state(stored => $fetched, pending => undef, desync => undef);

    if ($row) {
        $row->{+ROW_DATA}->change_state($state);
    }
    else {
        $row = $self->_vivify($source, $state)
    }

    return $row;
}

sub delete {
    my $self = shift;
    my ($source, $fetched, $old_pk, $new_pk, $row) = $self->parse_params({@_}, fetched => 1);

    return unless $row;
    $row = $self->do_delete($source, $fetched, $old_pk, $new_pk, $row);
    $self->uncache($source, $row, $old_pk, $new_pk);

    return $row;
}

sub do_delete {
    my $self = shift;
    my ($source, $fetched, $old_pk, $new_pk, $row) = @_;

    $row->{+ROW_DATA}->change_state($self->_state(stored => undef));

    return $row;
}

sub select {
    my $self = shift;
    my ($source, $fetched, $old_pk, $new_pk, $row) = $self->parse_params({@_});

    $row = $self->do_select($source, $fetched, $old_pk, $new_pk, $row);
    $self->cache($source, $row, $old_pk, $new_pk);

    return $row;
}

sub do_select {
    my $self = shift;
    my ($source, $fetched, $old_pk, $new_pk, $row) = @_;

    my $state = $self->_state(stored => $fetched);



( run in 1.920 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )