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 )