Database-Abstraction
view release on metacpan or search on metacpan
lib/Database/Abstraction.pm view on Meta::CPAN
"WHERE entry IS NOT NULL AND entry NOT LIKE '#%'"
to the query.
If the data have been slurped,
this will still work by accessing that actual database.
If "args" is given, it's an array of the arguments (see C<execute()> in L<DBI>).
=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($query);
if(exists($args->{args})) {
$sth->execute($args->{args}) or croak("$query: ", join(', ', $args->{args})); # Die with the query in case of error
} else {
$sth->execute() or croak($query); # Die with the query in case of error
}
# Fetch the results
my @results;
while (my $row = $sth->fetchrow_hashref()) {
# Return a single hashref if scalar context is expected
return $row unless wantarray;
push @results, $row;
}
# Return all rows as an array in list context
return @results;
}
=head2 updated
Returns the timestamp of the last database update.
=cut
sub updated {
my $self = shift;
return $self->{'_updated'};
}
=head2 AUTOLOAD
Directly access a database column.
Returns all entries in a column, a single entry based on criteria.
Uses cached data if available.
Returns an array of the matches,
or only the first when called in scalar context
If the database has a column called "entry" you can do a quick lookup with
my $value = $foo->column('123'); # where "column" is the value you're after
my @entries = $foo->entry();
print 'There are ', scalar(@entries), " entries in the database\n";
Set distinct or unique to 1 if you're after a unique list.
Throws an error in slurp mode when an invalid column name is given.
=cut
sub AUTOLOAD {
our $AUTOLOAD;
my ($column) = $AUTOLOAD =~ /::(\w+)$/;
return if($column eq 'DESTROY');
my $self = shift or return;
Carp::croak(__PACKAGE__, ": Unknown column $column") if(!ref($self));
# Allow the AUTOLOAD feature to be disabled
Carp::croak(__PACKAGE__, ": Unknown column $column") if(exists($self->{'auto_load'}) && boolean($self->{'auto_load'})->isFalse());
# Validate column name - only allow safe column name
Carp::croak(__PACKAGE__, ": Invalid column name: $column") unless $column =~ /^[a-zA-Z_][a-zA-Z0-9_]*$/;
my $table = $self->_open_table();
my %params;
if(ref($_[0]) eq 'HASH') {
%params = %{$_[0]};
} elsif((scalar(@_) % 2) == 0) {
%params = @_;
} elsif(scalar(@_) == 1) {
# Don't error on key-value databases, since there's no idea of columns
if($self->{'no_entry'} && !$self->{'berkeley'}) {
Carp::croak(ref($self), "::($_[0]): ", $self->{'id'}, ' is not a column');
}
$params{'entry'} = shift;
}
if($self->{'berkeley'}) {
( run in 2.908 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )