|
|
| |
IO::Lambda::DBI(3) |
User Contributed Perl Documentation |
IO::Lambda::DBI(3) |
IO::Lambda::DBI - asynchronous DBI
The module implements asynchronous DBI proxy object, that remotes DBI calls
using any given file handle, such as stream sockets, pipes, etc. All calls to
DBI methods are implemented as method calls to the object, which return
lambdas, that shall be subsequently called and awaited for completion.
use IO::Lambda qw(:all);
use IO::Lambda::DBI;
use IO::Lambda::Thread qw(new_thread);
# use threads as a transport
my ($thread, $socket) = new_thread( sub {
IO::Lambda::Message::DBI-> new( shift )-> run;
}, 1);
my $dbi = IO::Lambda::DBI-> new($socket);
# execute a query
print lambda {
context $dbi-> connect('DBI:mysql:database=mysql', '', '');
tail {
return "connect error:$_[0]" unless shift;
context $dbi-> selectrow_array('SELECT 5 + ?', {}, 2);
tail {
my ($ok,$result) = @_;
return "dbi error:$result" unless $ok;
context $dbi-> disconnect;
tail {
return "select=$result";
}}}}-> wait, "\n";
# finalize
$thread-> join;
All remoted methods return lambdas of type
dbi_result :: () -> ( 1, @result | 0, $error )
where depending on the first returned item in the array, the other
items are either DBI method results, or an error.
The class handles AUTOLOAD methods as proxy methods, so calls such
as "$dbh-> selectrow_array" are
perfectly legal.
- new $class, $r, $w, %options
- See "new" in IO::Lambda::Message.
- connect($dsn, $user, $auth, %attr) :: dbi_result
- Proxies "DBI::connect". In case of
failure, depending on "RaiseError" flag,
returns either "(0,$error)" or
"(1,$error)".
- disconnect :: dbi_result
- Proxies "DBI::disconnect".
- call($method, @parameters) :: dbi_result
- Proxies
"DBI::$method(@parameters)".
- set_attr(%attr)
- Sets attributes on a DBI handle.
- get_attr(@keys)
- Retrieves values for attribute keys from a DBI handle.
- prepare($statement)
- Returns a new prepared statement object or an error string. All method
calls on this object return lambda that also wait until remote methods are
executed.
- begin_group(), end_group()
- These two methods allow grouping of DBI calls.
"begin_group()" affects a
"IO::Lambda::DBI" object so that all
calls to remoted methods are not stored in the queue (and, consequently,
not executed one at a time), but are accumulated instead.
"end_group()" ends such buffering, sends
the message incapsulating all stored calls, and returns a lambda that
executes when all stored calls are finished and replied to. The lambda
returns results to all accumulated calls.
Note: each stored call registers whether it is called in array
or scalar context. The results are returned accordingly in a list, so
the caller is responsible for parsing the results if some or all calls
were made in the array context.
Example:
context
$dbi-> begin_group,
$dbi-> selectrow_arrayref("select * from a"),
$dbi-> selectrow_arrayref("select * from b"),
$dbi-> end_group;
tail {
return warn "error:$_[0]" unless shift;
my ( $a, $b) = @_;
}
Descendant of "IO::Lambda::Message::Simple".
Implements blocking, server side that does the actual calls to the DBI.
Dmitry Karasik, <dmitry@karasik.eu.org>.
Visit the GSP FreeBSD Man Page Interface. Output converted with ManDoc. |