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 )