The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use warnings;
use strict;
use Test::More;
use AnyEvent;

use AnyEvent::DBI::MySQL;


chomp(my ($db, $login, $pass) = `cat t/.answers`);

if ($db eq q{}) {
    plan skip_all => 'No database provided for testing';
} else {
    plan tests => 8;
}

my $dbh = AnyEvent::DBI::MySQL->connect('dbi:mysql:'.$db, $login, $pass);
my ($sth, $sth1, $sth2);
my $res;

ok $dbh->do('CREATE TABLE IF NOT EXISTS Async (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, s VARCHAR(255) NOT NULL)');
ok $dbh->do('TRUNCATE TABLE Async');

$sth  = $dbh->prepare('INSERT INTO Async (s) VALUES (?), (?)', {async=>0});
$sth1 = $dbh->prepare('INSERT INTO Async (s) VALUES (?)');
$sth2 = $dbh->prepare('SELECT * FROM Async WHERE id > ?');

push my @tests,
sub {
    $sth1->execute('one', sub {
        ok shift, 'async insert1';
        $sth1->execute('two', sub {
            ok shift, 'async insert2';
            $sth1->execute('three', sub {
                ok shift, 'async insert3';
                NEXT();
            });
        });
    });
},
sub {
    is $sth->execute('four', 'five'), 2, 'sth sync';
    NEXT();
},
sub {
    $sth2->execute(2, sub {
        my ($res, $sth) = @_;
        is $res, 3, 'async select';
        is_deeply $sth->fetchall_arrayref, [[3,'three'],[4,'four'],[5,'five']], 'fetchall';
        NEXT();
    });
},
sub {
    $dbh->do('DROP TABLE Async');
    done_testing();
    exit;
};


sub NEXT {
    shift @tests;
    goto $tests[0];
}

$tests[0]->();

AnyEvent->condvar->recv;