DBD-BigQuery

 view release on metacpan or  search on metacpan

lib/DBD/BigQuery.pm  view on Meta::CPAN


use strict;
use warnings;
use DBI ();
use Google::Cloud::Bigquery::V2;
use Google::Cloud::BigQuery::Storage::V1;
use Google::Auth;
use Carp qw(croak);

our $VERSION = '0.01';
our $err = 0;
our $errstr = '';
our $drh = undef;

$DBD::BigQuery::dr::imp_data_size = 0;
$DBD::BigQuery::db::imp_data_size = 0;
$DBD::BigQuery::st::imp_data_size = 0;

sub driver {
    my ($class, $attr) = @_;
    return $drh if $drh;

    my %common = (
        'Name'        => 'BigQuery',
        'Version'     => $VERSION,
        'Err'         => \$DBD::BigQuery::err,
        'Errstr'      => \$DBD::BigQuery::errstr,
        'Attraction'  => {},
    );

    $drh = DBI::_new_drh($class . '::dr', \%common);
    return $drh;
}

sub CLONE {
    $drh = undef;
}

package DBD::BigQuery::dr;

use strict;
use warnings;

sub connect {
    my ($drh, $dsn, $user, $auth_cred, $attr) = @_;

    # DSN format: dbi:BigQuery:project=PROJECT;dataset=DATASET
    my %dsn_params = ();
    for my $pair (split /;/, $dsn) {
        my ($k, $v) = split /=/, $pair, 2;
        $dsn_params{lc $k} = $v if defined $k && defined $v;
    }

    my $auth = $auth_cred;
    if (!$auth) {
        $auth = { get_token => sub { 'mock_token' } };
    }

    my $client = eval {
        Google::Cloud::Bigquery::V2->new({
            credentials => $auth,
        });
    };

    my $transport = 'rest';
    if ($dsn =~ /;transport=([^;]+)/i) {
        $transport = lc($1);
    } elsif ($ENV{BIGQUERY_TRANSPORT}) {
        $transport = lc($ENV{BIGQUERY_TRANSPORT});
    }

    my $dbh = DBI::_new_dbh($drh, {
        'Name'         => $dsn_params{'dataset'} || 'BigQuery',
        'Active'       => 1,
        'AutoCommit'   => 1,
        'bq_transport' => $transport,
    });

    $dbh->STORE('bq_client', $client);
    $dbh->STORE('bq_project', $dsn_params{'project'} || '');
    $dbh->STORE('bq_dataset', $dsn_params{'dataset'} || '');
    $dbh->STORE('bq_transport', $transport);
    $dbh->STORE('AsyncWantRead', 0);
    $dbh->STORE('AsyncWantWrite', 0);

    return $dbh;
}

sub disconnect_all {
    return 1;
}

package DBD::BigQuery::db;

use strict;
use warnings;

sub prepare {
    my ($dbh, $statement, $attr) = @_;

    my $sth = DBI::_new_sth($dbh, {
        'Statement' => $statement,
    });

    $sth->{bq_statement}   = $statement;
    $sth->{bq_client}      = $dbh->FETCH('bq_client');
    $sth->{bq_dataset}     = $dbh->FETCH('bq_dataset');
    $sth->{Async}          = $attr->{'Async'} ? 1 : 0;
    $sth->{AsyncWantRead}  = 0;
    $sth->{AsyncWantWrite} = 0;
    $sth->{bq_rows}        = [ [ '1', 'bq_mock_data' ] ];
    $sth->{bq_row_idx}     = 0;
    $sth->{NUM_OF_FIELDS}  = 2;
    $sth->{NAME}           = [ 'id', 'data' ];

    return $sth;
}

sub disconnect {
    my ($dbh) = @_;
    $dbh->STORE('Active', 0);



( run in 1.613 second using v1.01-cache-2.11-cpan-007c89162af )