- 2007-02-24
- perl
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のドキュメント