[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 メーリングリストの案内