Database-Abstraction
view release on metacpan or search on metacpan
lib/Database/Abstraction.pm view on Meta::CPAN
=cut
sub execute
{
my $self = shift;
if($self->{'berkeley'}) {
Carp::croak(ref($self), ': execute is meaningless on a NoSQL database');
}
my $args = Params::Get::get_params('query', @_);
# Ensure the 'query' parameter is provided
Carp::croak(__PACKAGE__, ': Usage: execute(query => $query)')
unless defined $args->{'query'};
my $table = $self->_open_table($args);
my $query = $args->{'query'};
# Append "FROM <table>" if missing
$query .= " FROM $table" unless $query =~ /\sFROM\s/i;
# Log the query if a logger is available
$self->_debug("execute $query");
# Prepare and execute the query
my $sth = $self->{$table}->prepare_cached($query);
# DBI->execute() takes a list; normalise args to an array whether it
# was passed as an arrayref ([30]) or a bare scalar/list (30).
if(exists($args->{'args'})) {
my @bind = ref($args->{'args'}) eq 'ARRAY' ? @{$args->{'args'}} : ($args->{'args'});
$sth->execute(@bind) or croak("$query: ", join(', ', @bind));
} else {
$sth->execute() or croak($query);
}
# Fetch the results
my @results;
while (my $row = $sth->fetchrow_hashref()) {
unless(wantarray) {
$sth->finish();
return $row;
}
push @results, $row;
}
# Return all rows as an array in list context
return @results;
}
=head2 updated
Returns the Unix timestamp of the last database update (mtime for
file-based backends, or the time of the most recent C<new()> call for
DSN-based connections).
=cut
sub updated {
my $self = shift;
return $self->{'_updated'};
}
=head2 columns
Returns an array reference of column names for the current table.
my $cols = $db->columns(); # e.g. ['entry', 'name', 'score', 'status']
The column list is determined by the backend:
=over 4
=item * B<Slurp mode> - sorted keys of the first row in memory.
=item * B<SQLite / other DBI> - a zero-row C<SELECT *> exposes the driver's
C<NAME> attribute.
=item * B<BerkeleyDB> - always returns C<['entry', 'value']>.
=back
The result is cached inside the object after the first call.
=cut
sub columns {
my $self = shift;
return $self->{'_columns'} if $self->{'_columns'};
my $table = $self->_open_table({});
my @cols;
if($self->{'berkeley'}) {
return $self->{'_columns'} = ['entry', 'value'];
}
if(my $data = $self->{'data'}) {
if(ref($data) eq 'HASH') {
my ($first) = values %{$data};
@cols = sort keys %{$first} if $first;
}
} else {
my $sth = $self->{$table}->prepare_cached("SELECT * FROM $table WHERE 1=0");
$sth->execute();
@cols = @{$sth->{NAME}};
$sth->finish();
}
return $self->{'_columns'} = \@cols;
}
=head2 schema
Returns a hash reference describing the schema of the current table.
Each key is a column name; each value is a hash reference with these keys:
( run in 0.979 second using v1.01-cache-2.11-cpan-9581c071862 )