DBIx-ObjectMapper
view release on metacpan or search on metacpan
lib/DBIx/ObjectMapper/Engine/DBI.pm view on Meta::CPAN
return $self->driver->get_tables($self->dbh);
}
### Query
sub _prepare {
my ( $self, $sql ) = @_;
my $dbh = $self->dbh; # for on_connect_do
return $self->{disable_prepare_caching}
? $dbh->prepare($sql)
: $dbh->prepare_cached( $sql, undef, 3 );
}
sub select {
my ( $self, $query, $callback ) = @_;
my $query_class = ref( $self->query ) . '::Select';
unless ( ref $query eq $query_class ) {
$query = $self->_as_query_object( 'select', $query );
}
return $self->iterator->new( $query, $self, $callback );
}
sub select_single {
my ( $self, $query, $callback ) = @_;
my $query_class = ref( $self->query ) . '::Select';
unless ( ref $query eq $query_class ) {
$query = $self->_as_query_object('select', $query);
}
my ( $sql, @bind ) = $query->as_sql;
$self->log_sql($sql, @bind);
my ($key, $cache) = $self->get_cache_id($query);
my $result;
if( $key and $cache ) {
$result = $cache;
}
else {
#$result = $self->dbh->selectrow_arrayref($sql, +{}, @bind);
my $sth = $self->_prepare($sql);
$sth->execute(@bind) || confess $sth->errstr;
$result = $sth->fetchrow_arrayref;
$sth->finish;
$self->{sql_cnt}++;
}
if( $key and !$cache and $result ) {
$self->log_cache( 'Cache Set:' . $key );
$self->cache->set( $key => $result );
}
return $callback && ref($callback) eq 'CODE'
? $callback->( $result, $query )
: $result;
}
sub _as_query_object {
my ($self, $action, $query ) = @_;
return $self->query->$action( %$query );
}
sub update {
my ( $self, $query, $callback ) = @_;
my $query_class = ref( $self->query ) . '::Update';
unless ( ref $query eq $query_class ) {
$query = $self->_as_query_object('update', $query);
}
$callback->($query, $self->dbh) if $callback and ref($callback) eq 'CODE';
if ( my $keys = $self->{cache_target_table}{ $query->table } ) {
$self->{cache_target_table}{ $query->table } = [];
$self->log_cache( 'Cache Remove : ' . join( ', ', @$keys ) );
$self->cache->remove( $_ ) for @$keys;
}
my ( $sql, @bind ) = $query->as_sql;
$self->log_sql($sql, @bind);
my $ret = $self->dbh->do($sql, {}, @bind);
$self->{sql_cnt}++;
return $ret;
}
sub insert {
my ( $self, $query, $callback, $primary_keys ) = @_;
my $query_class = ref( $self->query ) . '::Insert';
unless ( ref $query eq $query_class ) {
$query = $self->_as_query_object('insert', $query);
}
$callback->($query, $self->dbh) if $callback and ref($callback) eq 'CODE';
my ( $sql, @bind ) = $query->as_sql;
$self->log_sql($sql, @bind);
$self->dbh->do( $sql, {}, @bind );
$self->{sql_cnt}++;
my $ret_id = ref($query->values) eq 'HASH' ? $query->values : +{};
if( $primary_keys ) {
for my $pk (@$primary_keys) {
unless ( defined $query->{values}->{$pk} ) {
$ret_id->{$pk} = $self->driver->last_insert_id(
$self->dbh,
($self->__get_table_name($query->into))[0],
$pk
);
}
}
}
return $ret_id;
}
sub delete {
my ( $self, $query, $callback ) = @_;
my $query_class = ref( $self->query ) . '::Delete';
unless ( ref $query eq $query_class ) {
$query = $self->_as_query_object('delete', $query);
( run in 0.581 second using v1.01-cache-2.11-cpan-39bf76dae61 )