DBD::Gofer::Transport::corostream(3) User Contributed Perl Documentation DBD::Gofer::Transport::corostream(3)

# [NAME](#NAME)

DBD::Gofer::Transport::corostream - Async DBD::Gofer stream transport using Coro and AnyEvent

# [SYNOPSIS](#SYNOPSIS)

```
   DBI_AUTOPROXY="dbi:Gofer:transport=corostream" perl some-perl-script-using-dbi.pl
```

or

```
   $dsn = ...; # the DSN for the driver and database you want to use
   $dbh = DBI->connect("dbi:Gofer:transport=corostream;dsn=$dsn", ...);
```

# [DESCRIPTION](#DESCRIPTION)

The *BIG WIN* from using Coro is that it enables the use of existing DBI frameworks like DBIx::Class.

# [KNOWN ISSUES AND LIMITATIONS](#KNOWN_ISSUES_AND_LIMITATIONS)

```
  - Uses Coro::Select so alters CORE::select globally
    Parent class probably needs refactoring to enable a more encapsulated approach.
  - Doesn't prevent multiple concurrent requests
    Probably just needs a per-connection semaphore
  - Coro has many caveats. Caveat emptor.
```

# [STATUS](#STATUS)

THIS IS CURRENTLY JUST A PROOF-OF-CONCEPT IMPLEMENTATION FOR EXPERIMENTATION.

Please note that I have no plans to develop this code further myself. I'd very much welcome contributions. Interested? Let me know!

# [AUTHOR](#AUTHOR)

Tim Bunce, &lt;http://www.tim.bunce.name&gt;

# [LICENCE AND COPYRIGHT](#LICENCE_AND_COPYRIGHT)

Copyright (c) 2010, Tim Bunce, Ireland. All rights reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic.

# [SEE ALSO](#SEE_ALSO)

DBD::Gofer::Transport::stream

DBD::Gofer

# [APPENDIX](#APPENDIX)

Example code:

```
    #!perl
    use strict;
    use warnings;
    use Time::HiRes qw(time);
    BEGIN { $ENV{PERL_ANYEVENT_STRICT} = 1; $ENV{PERL_ANYEVENT_VERBOSE} = 1; }
    use AnyEvent;
    BEGIN { $ENV{DBI_TRACE} = 0; $ENV{DBI_GOFER_TRACE} = 0; $ENV{DBD_GOFER_TRACE} = 0; };
    use DBI;
    $ENV{DBI_AUTOPROXY} = 'dbi:Gofer:transport=corostream';
    my $ticker = AnyEvent->timer( after => 0, interval => 0.1, cb => sub {
        warn sprintf "-tick- %.2f\n", time
    } );
    warn "connecting...\n";
    my $dbh = DBI->connect("dbi:NullP:");
    warn "...connected\n";
    for (1..3) {
        warn "entering DBI...\n";
        $dbh->do("sleep 0.3"); # pseudo-sql understood by the DBD::NullP driver
        warn "...returned\n";
    }
    warn "done.";
```

Example output:

```
    $ perl corogofer.pl
    connecting...
    -tick- 1293631437.14
    -tick- 1293631437.14
    ...connected
    entering DBI...
    -tick- 1293631437.25
    -tick- 1293631437.35
    -tick- 1293631437.45
    -tick- 1293631437.55
    ...returned
    entering DBI...
    -tick- 1293631437.66
    -tick- 1293631437.76
    -tick- 1293631437.86
    ...returned
    entering DBI...
    -tick- 1293631437.96
    -tick- 1293631438.06
    -tick- 1293631438.16
    ...returned
    done. at corogofer.pl line 39.
```

You can see that the timer callback is firing while the code 'waits' inside the **do()** method for the response from the database. Normally that would block.

2026-09-30 perl v5.44.0

---

Document: DBD::Gofer::Transport::corostream(3pm) from perl-dbi 1.655-r0 (Chainguard OS)
Source: https://github.com/perl5-dbi/dbi
