DBD-Spanner
view release on metacpan or search on metacpan
lib/DBD/Spanner.pm view on Meta::CPAN
our $err = 0;
our $errstr = '';
our $drh = undef;
$DBD::Spanner::dr::imp_data_size = 0;
$DBD::Spanner::db::imp_data_size = 0;
$DBD::Spanner::st::imp_data_size = 0;
sub driver {
my ($class, $attr) = @_;
return $drh if $drh;
my %common = (
'Name' => 'Spanner',
'Version' => $VERSION,
'Err' => \$DBD::Spanner::err,
'Errstr' => \$DBD::Spanner::errstr,
'Attraction' => {},
);
$drh = DBI::_new_drh($class . '::dr', \%common);
return $drh;
}
sub CLONE {
$drh = undef;
}
package DBD::Spanner::dr;
use strict;
use warnings;
sub connect {
my ($drh, $dsn, $user, $auth_cred, $attr) = @_;
# DSN format: dbi:Spanner:projects/PROJECT/instances/INSTANCE/databases/DATABASE
# Or key-value params: project=P;instance=I;database=D
my %dsn_params = ();
if ($dsn =~ /^projects\//i) {
$dsn_params{'database_path'} = $dsn;
} else {
for my $pair (split /;/, $dsn) {
my ($k, $v) = split /=/, $pair, 2;
$dsn_params{lc $k} = $v if defined $k && defined $v;
}
if ($dsn_params{'project'} && $dsn_params{'instance'} && $dsn_params{'database'}) {
$dsn_params{'database_path'} = 'projects/' . $dsn_params{'project'} .
'/instances/' . $dsn_params{'instance'} .
'/databases/' . $dsn_params{'database'};
}
}
my $auth = $auth_cred;
if (!$auth) {
$auth = { get_token => sub { 'mock_token' } };
}
my $client = eval {
Google::Cloud::Spanner::V1->new({
credentials => $auth,
});
};
my $transport = 'grpc';
if ($dsn =~ /;transport=([^;]+)/i) {
$transport = lc($1);
} elsif ($ENV{SPANNER_TRANSPORT}) {
$transport = lc($ENV{SPANNER_TRANSPORT});
}
my $dbh = DBI::_new_dbh($drh, {
'Name' => $dsn_params{'database_path'} || 'Spanner',
'Active' => 1,
'AutoCommit' => 1,
'spanner_transport' => $transport,
});
$dbh->STORE('spanner_client', $client);
$dbh->STORE('spanner_db_path', $dsn_params{'database_path'} || '');
$dbh->STORE('spanner_transport', $transport);
$dbh->STORE('AsyncWantRead', 0);
$dbh->STORE('AsyncWantWrite', 0);
return $dbh;
}
sub disconnect_all {
return 1;
}
package DBD::Spanner::db;
use strict;
use warnings;
sub prepare {
my ($dbh, $statement, $attr) = @_;
my $sth = DBI::_new_sth($dbh, {
'Statement' => $statement,
});
$sth->{spanner_statement} = $statement;
$sth->{spanner_client} = $dbh->FETCH('spanner_client');
$sth->{spanner_db_path} = $dbh->FETCH('spanner_db_path');
$sth->{Async} = $attr->{'Async'} ? 1 : 0;
$sth->{AsyncWantRead} = 0;
$sth->{AsyncWantWrite} = 0;
$sth->{spanner_rows} = [ [ '1', 'mock_value' ] ];
$sth->{spanner_row_idx} = 0;
$sth->{NUM_OF_FIELDS} = 2;
$sth->{NAME} = [ 'id', 'val' ];
return $sth;
}
sub disconnect {
my ($dbh) = @_;
$dbh->STORE('Active', 0);
return 1;
( run in 1.260 second using v1.01-cache-2.11-cpan-007c89162af )