NAME
DBIx::Async - use DBI with IO::Async
VERSION
version 0.003
SYNOPSIS
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
use IO::Async::Loop;
use DBIx::Async;
my $loop = IO::Async::Loop->new;
say 'Connecting to db';
$loop->add(my $dbh = DBIx::Async->connect(
'dbi:SQLite:dbname=:memory:',
'',
'', {
AutoCommit => 1,
RaiseError => 1,
}
));
$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;
DESCRIPTION
Wrapper for DBI, for running queries much slower than usual but without blocking.
NOTE
: This is an early release, please get in contact via email (see "AUTHOR" section) or RT before relying on it for anything.
PERFORMANCE
Greatly lacking. See 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.
METHODS
Where possible, DBI method signatures are used.
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:
$dsn - the data source name, should be something like 'dbi:SQLite:dbname=:memory:'
$user - username to connect as
$pass - password to connect with
$opt - any options
Options consist of:
RaiseError - set this to 1
AutoCommit - whether to run in AutoCommit mode by default, probably works better if this is set to 1 as well
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 $self
.
Returns $self.
dsn
Returns the DSN used in the "connect" request.
user
Returns the username used in the "connect" request.
pass
Returns the password used in the "connect" request.
options
Returns any options that were set in the "connect" request.
do
Runs a query with optional bind parameters. Takes the following parameters:
$sql - the query to run
$options - any options to apply (can be undef)
@params - the parameters to bind (can be empty)
Returns a Future which will resolve when this query completes.
begin_work
Starts a transaction.
Returns a Future which will resolve when this transaction has started.
commit
Commit the current transaction.
Returns a Future which will resolve when this transaction has been committed.
savepoint
Marks a savepoint. Takes a single parameter: the name to use for the savepoint.
$dbh->savepoint('here');
Returns a Future which will resolve once the savepoint has been created.
release
Releases a savepoint. Takes a single parameter: the name to use for the savepoint.
$dbh->release('here');
This is similar to "commit" for the work which has been completed since the savepoint, although the database state is not updated until the transaction itself is committed.
Returns a Future which will resolve once the savepoint has been released.
rollback
Rolls back this transaction. Takes an optional savepoint which can be used to roll back to the savepoint rather than cancelling the entire transaction.
Returns a Future which will resolve once the transaction has been rolled back.
prepare
Attempt to prepare a query.
Returns the statement handle as a DBIx::Async::Handle instance.
INTERNAL METHODS
These are unlikely to be of much use in application code.
queue
Queue a request. Used internally.
Returns a Future.
worker_class_from_dsn
Attempts to locate a suitable worker subclass, given a DSN.
For example:
$dbh->worker_class_from_dsn('dbi:SQLite:memory')
should return 'DBIx::Async::Worker::SQLite'.
Note that this method will load the class if it is not already present.
Returns the class as a string.
sth_ch
The channel used for prepared statements.
ret_ch
The channel which returns values.
_add_to_loop
Sets things up when we are added to a loop.
_remove_from_loop
Doesn't do anything yet.
TODO
Much of the DBI API is not yet implemented. Fix this.
Provide a nicer wrapper around transactions.
Consider supporting Net::Async::PostgreSQL and Net::Async::MySQL natively, might lead to some performance improvements.
SEE ALSO
DBI - the database framework that does all the real work
Net::Async::PostgreSQL - nonblocking interaction with PostgreSQL, not DBI compatible
INHERITED METHODS
- IO::Async::Notifier
-
add_child, adopt_future, can_event, children, configure, configure_unknown, debug_printf, get_loop, invoke_error, invoke_event, loop, make_event_cb, maybe_invoke_event, maybe_make_event_cb, new, notifier_name, parent, remove_child, remove_from_parent
AUTHOR
Tom Molesworth <cpan@perlsite.co.uk>
LICENSE
Copyright Tom Molesworth 2012-2015. Licensed under the same terms as Perl itself.