DBIx-Async
view release on metacpan or search on metacpan
lib/DBIx/Async.pm view on Meta::CPAN
}
));
$dbh->do(q{CREATE TABLE tmp(id integer primary key autoincrement, content text)})
# ... put some values in it
->then(sub { $dbh->do(q{INSERT INTO tmp(content) VALUES ('some text'), ('other text') , ('more data')}) })
# ... and then read them back
->then(sub {
# obviously you'd never really use * in a query like this...
my $sth = $dbh->prepare(q{select * from tmp});
$sth->execute;
# the while($row = fetchrow_hashref) construct isn't a good fit
# but we attempt to provide something reasonably close using the
# ->iterate helper
$sth->iterate(
fetchrow_hashref => sub {
my $row = shift;
say "Row: " . join(',', %$row);
}
);
})->on_done(sub {
say "Query complete";
})->on_fail(sub { warn "Failure: @_\n" })->get;
=head1 DESCRIPTION
Wrapper for L<DBI>, for running queries much slower than usual but without blocking.
C<NOTE>: This is an early release, please get in contact via email (see L</AUTHOR>
section) or RT before relying on it for anything.
=head2 PERFORMANCE
Greatly lacking. See C<examples/benchmark.pl>, in one sample run the results looked
like this:
Rate DBIx::Async DBD::SQLite
DBIx::Async 1.57/s -- -89%
DBD::SQLite 13.8/s 776% --
If you're doing anything more than occasional light queries, you'd probably be better
off with blocking DBI-based code running in a fork.
=head1 METHODS
Where possible, L<DBI> method signatures are used.
=cut
use IO::Async::Channel;
use IO::Async::Routine;
use Future;
use Module::Load qw();
use Variable::Disposition qw(retain_future);
use DBIx::Async::Handle;
# temporary pending next release of curry
our $_curry_weak = sub {
my ($invocant, $code) = splice @_, 0, 2;
Scalar::Util::weaken($invocant) if Scalar::Util::blessed($invocant);
my @args = @_;
sub {
return unless $invocant;
$invocant->$code(@args => @_)
}
};
=head2 connect
Constuctor. Sets up our instance with parameters that will be used when we attempt to
connect to the given DSN.
Takes the following options:
=over 4
=item * $dsn - the data source name, should be something like 'dbi:SQLite:dbname=:memory:'
=item * $user - username to connect as
=item * $pass - password to connect with
=item * $opt - any options
=back
Options consist of:
=over 4
=item * RaiseError - set this to 1
=item * AutoCommit - whether to run in AutoCommit mode by default, probably works better
if this is set to 1 as well
=back
C<NOTE>: Despite the name, this method does not initiate a connection. This may change in
a future version, but if this behaviour does change this method will still return C<$self>.
Returns $self.
=cut
sub connect {
my $class = shift;
my ($dsn, $user, $pass, $opt) = @_;
my $self = bless {
options => {
RaiseError => 1,
PrintError => 0,
AutoCommit => 1,
%{ $opt || {} },
},
pass => $pass,
user => $user,
dsn => $dsn,
}, $class;
$self
}
( run in 2.273 seconds using v1.01-cache-2.11-cpan-437f7b0c052 )