package DBD::Google::st; # ---------------------------------------------------------------------- # DBD::Google::st - Statement handle # ---------------------------------------------------------------------- use strict; use base qw(DBD::_::st); use vars qw($VERSION $imp_data_size); use DBI; $VERSION = "2.00"; $imp_data_size = 0; # ---------------------------------------------------------------------- # execute() # # I have no intention of supporting bind_params, BTW. # ---------------------------------------------------------------------- sub execute { my $sth = shift; my (@data, @columns); my ($google, $search, $results, $result); # The Net::Google::Search instance $search = $sth->{'GoogleSearch'}; # The names of the columns in which we are interested @columns = @{ $sth->{'Columns'} }; # This is where fetchrow_hashref etc get their names from $sth->{'NAME'} = [ map { $_->{'ALIAS'} } @columns ]; # This executes the search $results = $search->results; for $result (@$results) { my (@this, $column); for $column (@columns) { my ($name, $method, $value, $function); $name = lc $column->{'FIELD'}; # These are in the same order as described # in Net::Google::Response if ($name eq 'title') { $method = "title"; } elsif ($name eq 'url') { $method = "URL"; } elsif ($name eq 'snippet') { $method = "snippet"; } elsif ($name eq 'cachedsize') { $method = 'cachedSize'; } elsif ($name eq 'directorytitle') { $method = 'directoryTitle'; } elsif ($name eq 'summary') { $method = 'summary'; } elsif ($name eq 'hostname') { $method = 'hostName'; } elsif ($name eq 'directorycategory') { $method = 'directoryCategory'; } $value = defined $method ? $result->$method() : ""; $function = $column->{'FUNCTION'}; eval { $value = &$function($search, $value); } if defined $function; push @this, ($@ or $value or ""); } push @data, \@this; } # Need to do stuff with total rows, search time, and such, # all from $search $sth->{'driver_data'} = \@data; $sth->{'driver_rows'} = @data; $sth->STORE('NUM_OF_FIELDS', scalar @columns); return scalar @data || 'E0E'; } sub fetchrow_arrayref { my $sth = shift; my ($data, $row); $data = $sth->FETCH('driver_data'); $row = shift @$data or return; return $sth->_set_fbav($row); } *fetch = *fetch = \&fetchrow_arrayref; sub rows { my $sth = shift; return $sth->FETCH('driver_rows'); } # Alas! This currently doesn't work. sub totalrows { my $sth = shift; return $sth->estimateTotalResultsNumber(); } # Returns available tables sub table_info { return "Google" } # Implement metadata functions { no strict qw(refs); for my $sub (qw(documentFiltering searchComments searchQuery estimateTotalResultsNumber estimateIsExact startIndex endIndex searchTips searchTime)) { *{$sub} = sub { my $sth = shift; my $search = $sth->{'GoogleSearch'}; return $search->$sub() if defined $search; return; }; } } 1; sub DESTROY { 1 } __END__