/usr/local/CPAN/DBD-Google/DBD/Google/dr.pm
package DBD::Google::dr;
# ----------------------------------------------------------------------
# This is the driver implementation.
# DBI->connect defers to this class.
# ----------------------------------------------------------------------
use strict;
use base qw(DBD::_::dr);
use vars qw($VERSION $imp_data_size);
use Carp qw(carp croak);
use DBI;
use Net::Google;
use Symbol qw(gensym);
$VERSION = "2.00";
$imp_data_size = 0;
# These are valid Net::Google::Search options
my @valid_google_opts = qw(key lr ie oe safe filter http_proxy debug);
# ----------------------------------------------------------------------
# connect($dsn, $user, $pass, \%attrs);
#
# Method called when an external process does:
#
# my %opts = ("filter" => 0, "debug" => 1);
# my $dbh = DBI->connect("dbi:Google:", $KEY, undef, \%opts);
#
# Username must be the google API key, password is ignored and can be
# anything, and valid options in the %attr hash are passed to Net::Google.
# ----------------------------------------------------------------------
sub connect {
my ($drh, $dbname, $user, $pass, $attr) = @_;
my ($dbh, $google, %google_opts, @create_opts);
# Issue a warning, rather than croak, because the user can
# specify a key in %attr
# carp "No Google API key specified\n" unless defined $user;
$user ||= $attr->{'key'} || '';
$pass ||= '';
# If the user sends a keyfile as $user, open it and treat
# the first line as the key
if (-e $user) {
my $fh = gensym;
open $fh, $user or die "Can't open $user for reading: $!";
chomp($user = <$fh>);
close $fh or die "Can't close $user: $!";
}
$dbh = DBI::_new_dbh($drh, {
'Name' => $dbname,
'USER' => $user,
'CURRENT_USER' => $user,
'Password' => $pass,
});
# Get options from %attr. These will be passed
# to $google->search.
for my $google_opt (@valid_google_opts) {
if (defined $attr->{ $google_opt }) {
$google_opts{ $google_opt } =
delete $attr->{ $google_opt };
}
}
# Create a list of name => value pairs to pass to Net::Google
# constructor.
push @create_opts, "key" => $user || $google_opts{'key'} || '';
push @create_opts, 'debug' => $google_opts{'debug'}
if defined $google_opts{'debug'};
push @create_opts, 'http_proxy' => $google_opts{'http_proxy'}
if defined $google_opts{'http_proxy'};
# Create a Net::Google instance, and store it. We can reuse
# this for multiple queries.
$google = Net::Google->new(@create_opts);
$dbh->STORE('driver_google' => $google);
$dbh->STORE('driver_google_opts' => \%google_opts);
return $dbh;
}
sub disconnect_all { 1 }
sub data_sources { return "Google" }
1;
__END__