The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Mojolicious::Plugin::PgAsync - Mojolicious Plugin for asynchronous operation with PostgreSQL

SYNOPSIS

        # Mojolicious::Lite
        plugin PgAsync => {dbi => ['dbi:Pg:dbname=test', 'postgres', '', {AutoCommit => 1, RaiseError => 1}]};

        # in controller
        $self->pg('SELECT 3 as id, pg_sleep(?)', undef, 3,
                sub {
                        my $db = shift;
                        my $info = $db->sth->fetchall_arrayref({});
                        $self->render(text => $info->[0]{id});
                }
        );

DESCRIPTION

Mojolicious::Plugin::PgAsync is a plugin for Mojolicious apps for asynchronous operation (non-blocking) with PostgreSQL using DBD::Pg, include listen feature. Plugin uses own connections pool.

HELPERS

Mojolicious::Plugin::PgAsync contains two helpers: pg and pg_listen.

pg

Like DBI method do or selectall_arrayref execute a single statement. Callback return object Mojolicious::Plugin::PgAsync::Db contains methods dbh and sth for fetch result or commit transaction.

        $self->pg('UPDATE test SET name=?', undef, 'foo',
                sub {
                        my $db = shift;
                        my $rv = $db->sth->rows;
                        $db->dbh->commit if $rv == 1;
                }
        );

pg_listen

Listen for a notification.

        $self->pg_listen('foo', sub {
                my $notify = shift;
                $self->render(text => 'channel '.$notify->{channel});
        });

Callback return hashref with keys channel(alias name), pid and payload.

ATTRIBUTES

Mojolicious::Plugin::PgAsync contains the following attributes:

dbi

Arrayref of DBI parameters for connect to PostgreSQL DB.

ttl

Time to life for idle connections, seconds. Default - 30.

EXAMPLE

After 2 seconds print listen foo bar

        plugin PgAsync => {dbi => ['dbi:Pg:dbname=test', 'postgres', '', {AutoCommit => 0, RaiseError => 1}]};

        get '/listen' => sub {
                my $self = shift->render_later;

                Mojo::IOLoop->delay(
                        sub {
                                my $delay = shift;

                                $self->pg_listen('foo', $delay->begin);
                                $self->pg_listen('bar', $delay->begin);
                        },
                        sub {
                                my $delay = shift;
                                my($notify1, $notify2) = @_;

                                $self->render(text => "listen $notify1->{name} $notify2->{name}");
                        },
                );

                Mojo::IOLoop->delay(
                        sub {
                                my $delay = shift;

                                Mojo::IOLoop->timer(2 => $delay->begin);
                        },
                        sub {
                                my $delay = shift;

                                $self->pg(q/SELECT pg_notify('foo')/, $delay->begin);
                                $self->pg(q/SELECT pg_notify('bar')/, $delay->begin);
                        },
                        sub {
                                my $delay = shift;
                                my($db1, $db2) = @_;

                                $db1->dbh->commit;
                                $db2->dbh->commit;
                        },
                );
        };

AUTHOR

Alexander Romanenko romanenko@cpan.org

COPYRIGHT & LICENSE

Copyright (C) 2013 by Alexander Romanenko.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.