[pgpool-general-jp: 343] Re: lo_create() [libpq ラージオブジェクトインタフェース]の使い方
Tatsuo Ishii
ishii @ sraoss.co.jp
2007年 12月 31日 (月) 20:40:02 JST
石井です。
> 陶山です。
>
> pgpool-II 2.0.2 がうまく動作しなくて、また pgpool-II 2.0.1 に戻してテ
> ストしています。
>
>
> Sun, 30 Dec 2007 17:47:14 +0900 の
> [pgpool-general-jp: 340] lo_create() [libpq ラージオブジェクトインタフェース]の使い方
> に関するメールについてのお返事です。
>
> 陶山> で、もっともポイントとなる
> 陶山> Oid lo_create( PGconn *conn, Oid lobjId );
> 陶山> の使い方がわからなくてまた行き詰っています。
>
> psql で、pg_largeobject の loid の列の値を見て重ならないように次の値
> を lo_create( PGconn *conn, Oid lobjId ) 関数の lobjId に入れてやると
> レプリケーション(書き込み)してくれることを確認しました。
>
> しかし、lobjId をプログラムでどうやって決めるのかがまだわかっていませ
> ん。
> lobjId にゼロを設定してみましたが、見事に失敗しました。
>
> どうやれば、lobjId を取得できるのでしょうか。
取得する必要はありません。pg_largeobjectの中で,単に重複しない値(32bit
整数)を使う側で決めて上げればよいだけです。たとえば,1秒間に1個以上ラー
ジオブジェクトを登録しないことが分かっていれば,UNIX timeを使っても良
いわけです。
別の方法としては,
BEGIN;
LOCK pg_largeobject IN SHARE ROW EXCLUSIVE MODE;
SELECT max(loid)+1 from pg_largeobject;
で取ってきた値をlo_create()に渡す
:
:
COMMIT;
みたいな感じでいけると思います。
# ラージオブジェクトが1個も登録されていない場合はこれでは実際にはうま
# くいかないので,COALESCEを使うなりして工夫してください。
--
Tatsuo Ishii
SRA OSS, Inc. Japan
pgpool-general-jp メーリングリストの案内