AnyEvent::Pg::Pool::Multiserver - Asyncronious multiserver requests to Postgresql with AnyEvent::Pg
my $servers = [ { id => 1, name => 'remote 1', conn => 'host=remote1 port=5432 dbname=mydb user=myuser password=mypass', }, { id => 2, name => 'remote 2', conn => 'host=remote2 port=5432 dbname=mydb user=myuser password=mypass', }, ]; my $pool = AnyEvent::Pg::Pool::Multiserver->new( servers => $servers, local => 1 ); # multi-server request $pool->selectall_arrayref( query => 'SELECT val FROM ( SELECT 1 AS val ) tmp WHERE tmp.val = $1;', args => [ 1 ], cb => sub { my $results = shift; my $errors = shift; if ( $errors ) { foreach my $srv ( @$errors ) { say "err $srv->{error} with $srv->{server_name} $srv->{server_id}"; } } if ( $results ) { foreach my $val ( @$results ) { say "server_id=$val->{_server_id} value=$val->{val}"; } } }, ); # single-server request $pool->selectall_arrayref( query => 'SELECT val FROM ( SELECT 1 AS val ) tmp WHERE tmp.val = $1;', args => [ 1 ], server_id => 1, cb => sub { ... }, ); # multi-server request with sub-callbacks to some data manipulation # and may be to make another request to current server # main request | server_1 select -> ... select end -> cb_server call -> subrequests to current server | wait both | global callback # | server_2 select -> ... select end -> cb_server call -> subrequests to current server | subrequests | $pool->selectall_arrayref( query => 'SELECT val FROM ( SELECT 1 AS val ) tmp WHERE tmp.val = $1;', args => [ 1 ], cb => sub { ... }, cb_server => sub { my $params = { @_ }; my $result_of_main_request = $params->{result}; # Now we can do some sub-request to current server # And MUST call cb $params->{cb}->(); }, ); # single-server request to select row in arrayref $pool->selectrow_array( query => 'SELECT val FROM ( SELECT 1 AS val ) tmp WHERE tmp.val = $1;', args => [ 1 ], server_id => 1, cb => sub { my $result = shift; my $error = shift; if ( $error ) { say "err $error->{error} with $error->{server_name} $error->{server_id}"; } if ( $result ) { say "server_id=$result->[ 0 ] value=$result->[ 1 ]"; } }, ); # single-server request to select row in hashref $pool->selectrow_hashref( query => 'SELECT val FROM ( SELECT 1 AS val ) tmp WHERE tmp.val = $1;', args => [ 1 ], server_id => 1, cb => sub { my $result = shift; my $error = shift; if ( $error ) { say "err $error->{error} with $error->{server_name} $error->{server_id}"; } if ( $result ) { say "server_id=$result->{_server_id} value=$result->{val}"; } }, ); # single-server request to do something $pool->do( query => 'UPDATE table SET column = 1 WHERE id = $1;', args => [ 1 ], server_id => 1, cb => sub { my $result = shift; my $error = shift; if ( $error ) { say "err $error->{error} with $error->{server_name} $error->{server_id}"; } if ( $result ) { say "server_id=$result->[ 0 ] updated=$result->[ 1 ]"; } }, ); # local-server request to do something $pool->do( query => 'UPDATE table SET column = 1 WHERE id = $1;', args => [ 1 ], server_id => $pool->local(), cb => sub { ... }, );
query and args are the same, that in AnyEvent::Pg
Required: query, cb Optional: args, cb_server, server_id
Required: query, server_id, cb Optional: args, cb_server
The source code for this module is available at Github
Andrey Kuzmin, <kak-tus@mail.ru>
Copyright (C) 2014 by Andrey Kuzmin
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install AnyEvent::Pg::Pool::Multiserver, copy and paste the appropriate command in to your terminal.
cpanm
cpanm AnyEvent::Pg::Pool::Multiserver
CPAN shell
perl -MCPAN -e shell install AnyEvent::Pg::Pool::Multiserver
For more information on module installation, please visit the detailed CPAN module installation guide.