Coteng
view release on metacpan or search on metacpan
lib/Coteng.pm view on Meta::CPAN
$opt
);
my $rows = $self->search_by_sql($sql, \@binds, $class);
return $rows;
}
sub fast_insert {
my ($self, $table, $args, $prefix) = @_;
my ($sql, @binds) = $self->sql_builder->insert(
$table,
$args,
{ prefix => $prefix },
);
$self->execute($sql, @binds);
return $self->dbh->last_insert_id($table);
}
sub insert {
my $self = shift;
my ($table, $args, $opt) = @_;
my $class = do {
my $klass = pop;
ref($klass) ? undef : $klass;
};
if (ref($opt) ne "HASH") {
$opt = {};
}
if (ref($args) ne "HASH" && ref($args) ne "ARRAY") {
Carp::croak "'args' required to be HASH or ARRAY";
}
$opt->{primary_key} ||= "id";
my $id = $self->fast_insert($table, $args, $opt->{prefix});
return $self->single($table, { $opt->{primary_key} => $id }, $class);
}
sub bulk_insert {
my ($self, $table, $args) = @_;
return undef unless scalar(@{$args || []});
my $dbh = $self->dbh;
my $can_multi_insert = $dbh->{Driver}{Name} eq 'mysql' ? 1 : 0;
if ($can_multi_insert) {
my ($sql, @binds) = $self->sql_builder->insert_multi($table, $args);
$self->execute($sql, @binds);
} else {
# use transaction for better performance and atomicity.
my $txn = $dbh->txn_scope();
for my $arg (@$args) {
$self->insert($table, $arg);
}
$txn->commit;
}
}
sub update {
my ($self, $table, $args, $where) = @_;
my ($sql, @binds) = $self->sql_builder->update($table, $args, $where);
$self->execute($sql, @binds);
}
sub delete {
my ($self, $table, $where) = @_;
my ($sql, @binds) = $self->sql_builder->delete($table, $where);
$self->execute($sql, @binds);
}
sub count {
my ($self, $table, $column, $where, $opt) = @_;
if (ref $column eq 'HASH') {
Carp::croak('Do not pass HashRef to second argument. Usage: $db->count($table[, $column[, $where[, $opt]]])');
}
$column ||= '*';
my ($sql, @binds) = $self->sql_builder->select($table, [\"COUNT($column)"], $where, $opt);
my ($cnt) = $self->dbh->select_one($sql, @binds);
$cnt;
}
sub last_insert_id {
my $self = shift;
$self->dbh->last_insert_id;
}
sub txn_scope {
my $self = shift;
$self->dbh->txn_scope;
}
sub _expand_args (@) {
my ($class, $query, @args) = @_;
if (@args == 1 && ref $args[0] eq 'HASH') {
( $query, my $binds ) = SQL::NamedPlaceholder::bind_named($query, $args[0]);
@args = @$binds;
}
return ($query, @args);
}
sub load_if_class_not_loaded {
my $class = shift;
if (! is_class_loaded($class)) {
Module::Load::load $class;
}
}
# stolen from Mouse::PurePerl
sub is_class_loaded {
my $class = shift;
( run in 2.342 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )