DBD-D1

 view release on metacpan or  search on metacpan

META.json  view on Meta::CPAN

      },
      "configure" : {
         "requires" : {
            "ExtUtils::MakeMaker" : "0"
         }
      },
      "runtime" : {
         "requires" : {
            "DBI" : "1.640",
            "HTTP::Tiny" : "0.070",
            "IO::Socket::SSL" : "1.42",
            "JSON::PP" : "2.97",
            "Net::SSLeay" : "1.49",
            "perl" : "5.014"
         }
      }
   },
   "release_status" : "stable",
   "resources" : {
      "bugtracker" : {
         "web" : "https://github.com/amzt/DBD-D1/issues"

META.yml  view on Meta::CPAN

  url: http://module-build.sourceforge.net/META-spec-v1.4.html
  version: '1.4'
name: DBD-D1
no_index:
  directory:
    - t
    - inc
requires:
  DBI: '1.640'
  HTTP::Tiny: '0.070'
  IO::Socket::SSL: '1.42'
  JSON::PP: '2.97'
  Net::SSLeay: '1.49'
  perl: '5.014'
resources:
  bugtracker: https://github.com/amzt/DBD-D1/issues
  repository: https://github.com/amzt/DBD-D1.git
version: '0.02'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'

Makefile.PL  view on Meta::CPAN

    NAME             => 'DBD::D1',
    AUTHOR           => 'Aldo Montes Zapata <amontes@cpan.org>',
    VERSION_FROM     => 'lib/DBD/D1.pm',
    ABSTRACT_FROM    => 'lib/DBD/D1.pm',
    LICENSE          => 'perl_5',
    MIN_PERL_VERSION => '5.014',
    PREREQ_PM => {
        'DBI'             => '1.640',
        'HTTP::Tiny'      => '0.070',
        'JSON::PP'        => '2.97',
        'IO::Socket::SSL' => '1.42',
        'Net::SSLeay'     => '1.49',
    },
    BUILD_REQUIRES => { 'Test::More' => '0.98' },
    dist  => { COMPRESS => 'gzip -9f', SUFFIX => 'gz' },
    clean => { FILES    => 'DBD-D1-*' },
    META_MERGE => {
        'meta-spec' => { version => 2 },
        resources => {
            repository => {
                type => 'git',

README.md  view on Meta::CPAN

while (my $row = $sth->fetchrow_hashref) {
    print "$row->{name}\n";
}

$dbh->disconnect;
```

## Requirements

```
cpanm DBI IO::Socket::SSL Net::SSLeay
```

HTTP::Tiny and JSON::PP ship with Perl 5.14+.

## Installation

```bash
perl Makefile.PL && make && make test && make install
```

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

my $json = JSON::PP->new->utf8->allow_nonref;

sub _ssl_available { HTTP::Tiny->can_ssl ? 1 : 0 }

# Returns ($result_arrayref, undef) on success or (undef, $error_string) on failure.
sub query {
    my ($account_id, $database_id, $api_token, $sql, $params) = @_;

    unless (_ssl_available()) {
        return (undef,
            'DBD::D1 requires HTTPS. Install IO::Socket::SSL and Net::SSLeay: '
          . 'cpanm IO::Socket::SSL Net::SSLeay');
    }

    my $url = sprintf(
        'https://api.cloudflare.com/client/v4/accounts/%s/d1/database/%s/query',
        $account_id, $database_id,
    );

    my $body = $json->encode({
        sql    => $sql,
        params => ($params && @$params) ? $params : [],

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

    my $data;
    if ($res->{content}) {
        $data = eval { $json->decode($res->{content}) };
    }

    unless ($res->{success}) {
        my $detail = $res->{content} // '';
        if ($res->{status} == 599 && $detail =~ /ssl|IO::Socket/i) {
            return (undef,
                'HTTPS failed (status 599). '
              . 'Install IO::Socket::SSL and Net::SSLeay: '
              . 'cpanm IO::Socket::SSL Net::SSLeay');
        }
        
        # If we have JSON error details, use those
        if ($data && ref $data eq 'HASH') {
            if (!$data->{success}) {
                my $errs = $data->{errors} // [];
                if (@$errs) {
                    my $msg = $errs->[0]{message} // 'Unknown D1 API error';
                    return (undef, $msg);
                }

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


=item * B<AutoCommit only> – D1 REST has no multi-statement transaction support.

=item * B<Column ordering> – rows arrive as JSON objects; column order follows
C<sort> on key names. Use C<fetchrow_hashref> for reliable named access.

=back

=head1 DEPENDENCIES

L<DBI>, L<HTTP::Tiny>, L<JSON::PP>, L<IO::Socket::SSL>, L<Net::SSLeay>

=head1 AUTHOR

Aldo Montes Zapata, C<< <amontes@cpan.org> >>

=head1 COPYRIGHT (c)

Copyright 2026 by Aldo Montes Zapata C<< <amontes@cpan.org> >>.

=head1 LICENSE

t/02-live.t  view on Meta::CPAN

use Test::More;

unless ($ENV{CF_ACCOUNT_ID} && $ENV{CF_D1_DATABASE_ID} && $ENV{CF_API_TOKEN}) {
    plan skip_all =>
        'Live tests skipped: set CF_ACCOUNT_ID, CF_D1_DATABASE_ID, CF_API_TOKEN to enable';
}

eval { require DBI; require DBD::D1 };
plan skip_all => "DBI or DBD::D1 not available: $@" if $@;

eval { require IO::Socket::SSL; require Net::SSLeay };
if ($@) {
    plan skip_all =>
        'Live tests skipped: install IO::Socket::SSL and Net::SSLeay first';
}

unless (HTTP::Tiny->can_ssl) {
    plan skip_all => 'Live tests skipped: HTTP::Tiny reports SSL unavailable';
}

plan tests => 10;

my $dbh = DBI->connect(
    "dbi:D1:account_id=$ENV{CF_ACCOUNT_ID};database_id=$ENV{CF_D1_DATABASE_ID}",



( run in 1.470 second using v1.01-cache-2.11-cpan-6aa56a78535 )