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 )