iakioの日記 RSSフィード

2008-07-13

ruby-pgで非同期通知

| 14:10 | ruby-pgで非同期通知 - iakioの日記 を含むブックマーク はてなブックマーク - ruby-pgで非同期通知 - iakioの日記

http://postgresql.g.hatena.ne.jp/iakio/20080623で、ruby-pgでPGconn#traceが使えないと書きましたが実は ruby-pg-0.7.9.2008.03.18では使えるようです(この時使っていたのはruby-pg-0.7.9.2008.01.28)。

なんだけどgemだとこの最新版は入らない様子。

# gem query -r -n ruby-pg

*** REMOTE GEMS ***

ruby-pg (0.7.9.2008.01.28, 0.7.9.2008.01.24, 0.7.9.2008.01.08)

何ででしょう。

(2008-09-05追記:解決しました)

それはともかく最新のruby-pgでは非同期通知も使える、というかPGconn#notifiesは前からあったんだけどPGconn#socketが前は使えなかった。

//TODO PQsocket
/*
 * call-seq:
 *    conn.socket() -> TCPSocket
 *
 * Returns the socket file descriptor of this
 * connection.
 */

TODOになっていたんだけど、「それfdそのまま返していいんじゃなかろうか」と思ってたら最新版ではそう実装されました。

で、こんな風に使います。

con = PGconn.new("dbname=testdb")
sock = IO.for_fd(con.socket)
con.exec("listen foo")
while 1
    select([sock])
    con.consume_input
    p con.notifies
end

これを動かしつつ、別の端末からnotifyします。

=> notify foo;
NOTIFY
=> notify foo;
NOTIFY

すると、

$ ruby listen.rb
{:be_pid=>79597, :extra=>"", :relname=>"foo"}
{:be_pid=>79597, :extra=>"", :relname=>"foo"}

となるわけです。これをトリガと組み合わせると、データが更新されたときに何かするようなプログラムが簡単に書けます。

Perl + libeventはこちら。

Nothing found for Blog Perl E070224_Pg_Notify

MarcoMarco2013/08/10 19:32That's a sensible answer to a chnileaglng question

PetyPety2013/08/14 19:36This is the ideal answer. <a href="http://fnyfeg.com">Evoeryne</a> should read this