Home > perl > DBD::PgとEvent::Libで非同期通知

DBD::PgとEvent::Libで非同期通知

DBの変更をトリガーにしてPushしたいなら、PostgreSQLのLISTEN/NOTIFYですよ。 最近のDBD::Pgは$dbh->func('getfd')というのが使えるらしい。

POEとかよく知りませんが、libeventならCから使ったことがあるので書いてみた。 こんな感じ。

#!/usr/local/bin/perl
use strict;
use warnings;
use IO::Handle;
use Event::Lib;
use DBI;
use Data::Dumper;

sub listener {
    my ($ev, $type, $dbh) = @_;

    print Dumper($dbh->func('pg_notifies'));
}

my $dbh = DBI->connect("dbi:Pg:", "", "");
$dbh->do("listen hoge");

my $reader = event_new(
    IO::Handle->new_from_fd($dbh->func('getfd'), "r"),
    EV_READ | EV_PERSIST, \&listener, $dbh);

$reader->add;

event_mainloop;

ファイルディスクリプタからファイルハンドルを得るあたりが自信無し。

# 実行
$ perl notify.pl
...
# 別端末でpsqlからnotifyすると、
=> notify hoge;
=> notify hoge;
...
# 非同期通知。ってこの説明で伝わるのか!?
$VAR1 = [
      'hoge',
      15164
    ];
$VAR1 = [
      'hoge',
      15164
    ];

普通はトリガと一緒に使います。

=> create or replace function t1_trig_func() returns trigger as
     $$begin notify hoge; end;$$ language plpgsql;
CREATE FUNCTION
=> create trigger t1_trigger after insert or update or delete on t1
     for each statement execute procedure t1_trig_func();
CREATE TRIGGER
=> insert into t1 values(1);

以下、関連するPostgreSQLのドキュメント

Writeback:0

Comment Form

writeback message: Ready to post a comment.

TrackBack ping me at
http://www.mono-space.net/blog/perl/e070224_pg_notify.trackback

Page Top