Karas

 view release on metacpan or  search on metacpan

lib/Karas.pm  view on Meta::CPAN

    # cannot select row. just create new object from arguments.
    return $row_class->new($values);
}

sub fast_insert {
    my ($self, $table, $values) = @_;
    Carp::croak("Missing mandatory parameter: table") unless defined $table;
    Carp::croak("Missing mandatory parameter: values")   unless defined $values;
    $self->_insert($table, $values);
    return $self->last_insert_id;
}

sub _insert {
    my ($self, $table, $values) = @_;
    $self->call_trigger(BEFORE_INSERT => $table, $values);
    my ($sql, @binds) = $self->query_builder->insert($table, $values);
    my $sth = $self->dbh->prepare($sql);
    $sth->execute(@binds);
    return undef;
}

sub replace {
    my ($self, $table, $values) = @_;
    $self->call_trigger(BEFORE_REPLACE => $table, $values);
    my ($sql, @binds) = $self->query_builder->insert($table, $values, {prefix => 'REPLACE INTO'});
    my $sth = $self->dbh->prepare($sql);
    $sth->execute(@binds);
    my $last_insert_id = $self->last_insert_id;
    return $last_insert_id;
}

sub retrieve {
    my ($self, $table, $vals) = @_;
    Carp::croak("Missing mandatory parameter: table") unless defined $table;
    Carp::croak("Too many arguments") if @_ > 3;

    my $row_class = $self->get_row_class($table);
    my %where;
    if (ref $vals eq 'HASH') {
        %where = %$vals;
    } elsif (ref $vals) {
        Carp::croak("Bad arguments for retrieve: $vals");
    } else {
        my @pk = $row_class->primary_key;
        if (@pk != 1) {
            Carp::croak(sprintf("%s has %d primary keys, but you passed %d(%s)", $table, 0+@pk, 1, join(', ', @pk)));
        }
        $where{$pk[0]} = $vals;
    }
    my ($sql, @binds) = $self->query_builder->select($table, [\'*'], \%where);
    my $sth = $self->dbh->prepare($sql);
    $sth->execute(@binds);
    my $row = $sth->fetchrow_hashref;
    if ($row) {
        return $row_class->new($row);
    } else {
        return undef;
    }
}

sub update {
    my $self = shift;
    if (UNIVERSAL::isa($_[0], 'Karas::Row')) {
        my ($row, $set) = @_;
        $set ||= +{};
        $set = +{ %{$row->get_dirty_columns()}, %$set };
        my $where = $row->make_where_condition();
        $self->call_trigger(BEFORE_UPDATE_ROW => $row, $set);
        my $rows = $self->_update($row->table_name, $set, $where);
        $self->call_trigger(AFTER_UPDATE_ROW => $row, $set);
        return $rows;
    } else {
        my ($table_name, $set, $where) = @_;
        Carp::croak("Usage: \$db->update(\$table_name, \%set, \%where)") if ref $table_name;
        Carp::croak("Usage: \$db->update(\$table_name, \%set, \%where)") if @_!=3;
        $self->call_trigger(BEFORE_UPDATE_DIRECT => $table_name, $set, $where);
        my $rows = $self->_update($table_name, $set, $where);
        $self->call_trigger(AFTER_UPDATE_DIRECT => $table_name, $set, $where);
        return $rows;
    }
}

sub _update {
    my ($self, $table, $set, $where) = @_;
    Carp::croak("Missing mandatory parameter: table") unless defined $table;
    Carp::croak("Missing mandatory parameter: set")   unless defined $set;
    my ($sql, @binds) = $self->query_builder->update($table, $set, $where);
    my $sth = $self->dbh->prepare($sql);
    $sth->execute(@binds);
    return $sth->rows;
}

sub delete {
    my $self = shift;
    if (UNIVERSAL::isa($_[0], 'Karas::Row')) {
        my ($row) = @_;
        $self->call_trigger(BEFORE_DELETE_ROW => $row);
        my $where = $row->make_where_condition();
        my $retval = $self->_delete($row->table_name, $row->where);
        $self->call_trigger(AFTER_DELETE_ROW => $row);
        return $retval;
    } else {
        my ($table_name, $where);
        $self->call_trigger(BEFORE_DELETE_DIRECT => $table_name, $where);
        my $rows = $self->_delete($table_name, $where);
        $self->call_trigger(AFTER_DELETE_DIRECT => $table_name, $where);
        return $rows;
    }
}

sub _delete {
    my ($self, $table, $where) = @_;
    Carp::croak("Missing mandatory parameter: table") unless defined $table;
    Carp::croak("Missing mandatory parameter: where") unless defined $where;
    my ($sql, @binds) = $self->query_builder->delete($table, $where);
    my $sth = $self->dbh->prepare($sql);
    $sth->execute(@binds);
    return $sth->rows;
}

sub refetch {



( run in 0.822 second using v1.01-cache-2.11-cpan-bbe5e583499 )