2.3. インターフェース

Postgres システムでは、ユーザ定義関数の一部として バックエンド側から、もしくは、アプリケーションの一部としてフロントエンド側からの ラージオブジェクトへのアクセスに使用されるインタフェースを提供しています。 これらは後述説明があります。Postgres 4.2に慣れている ユーザ向けに、PostgreSQL はより理路整然とした インタフェースを提供する新しい関数群を持っています。

Note: すべてのラージオブジェクトの操作は必ずSQLの トランザクション内で行う必要があります。この制約は、Postgres 6.5以前の バージョンでは暗黙の必要条件でしたが、それ以降のバージョンでは 厳しく強制されています。

Postgresラージオブジェクト・インタフェースは、 Unixファイルシステムにならって作成され、 open(2)read(2)write(2)lseek(2)などと酷似した インタフェースを持っています。ユーザ関数は、ラージオブジェクトから必要なデータだけを 取り出す時にこれらの処理を呼び出します。例えば、顔写真を格納するmugshotという名前の ラージオブジェクト型があり、beardという名前の関数で、mugshotデータについて宣言した とします。beard 関数は写真の下 1/3 をみて、もしあれば、そこにあるひげの色を 測定するものとします。beard 関数では、ラージオブジェクトの値全体をバッファに 取り出すことも、全体を確認することも必要ありません。ラージオブジェクトは、 動的に読み込まれるC関数、または、ライブラリとリンクされた データベースクライアントプログラムのどちらからでもアクセスできます。 Postgresは、ラージオブジェクトについて 「開く」、「読む」、「書く」、「閉じる」、「シークする」機能を提供しています。

2.3.1. ラージオブジェクトの作成

Oid lo_creat(PGconn *conn, int mode)
この処理は、新しいラージオブジェクトを作成します。引数 modeは新しいオブジェクト用の 複数の異なる属性を示すビットマスクです。以下で使用する定数シンボルは、 $PGROOT/src/backend/libpq/libpq-fs.h で定義されています。アクセスタイプ(読み取り、書き込み、または両方)は、 INV_READビット、INV_WRITEビットの 論理和で指定できます。ラージオブジェクトをアーカイブしたい時、 つまり、その複数世代のバー ジョンを定期的に特別なアーカイブリレーションに 移動したい場合には、INV_ARCHIVEビットを設定します。 マスクの下位16ビットは、ラージオブジェクトが属するストレージマネージャの番号です。 バークレイ以外のサイトでは、これらのビット列は常に0となります。 次のコマンドは、(転置)ラージオブジェクトを作成します。
inv_oid = lo_creat(INV_READ|INV_WRITE|INV_ARCHIVE);
     

2.3.2. ラージオブジェクトのインポート

UNIXファイルをラージオブジェクトとしてインポートするには、

Oid lo_import(PGconn *conn, const char *filename)
を呼び出します。引数filenameには、 ラージオブジェクトとしてインポートするUnixファイルの パス名を指定します。

2.3.3. ラージオブジェクトのエクスポート

ラージオブジェクトをUNIXファイルにエクスポートするには、

int lo_export(PGconn *conn, Oid lobjId, const char *filename)
を呼び出します。引数lobjIdには、エクスポートしたいラージオブジェクトのoidを指定し、 引数filename には、UNIXファイルのパス名を指定します。

2.3.4. 既存ラージオブジェクトを開く

既存のラージオブジェクトを開く場合は、

int lo_open(PGconn *conn, Oid lobjId, int mode)
を呼び出します。引数lobjIdには開きたいラージオブジェクトのoidを指定します。 引数modeの各ビットは、そのオブジェクトを読み取りのみ(INV_READ)、書き込みのみ、 またはその両方できるように開くのかを制御するものです。 作成していないラージオブジェクトを開くことはできません。 lo_openは、lo_readlo_writelo_lseeklo_telllo_closeで使用する ラージオブジェクト記述子を返します。

2.3.5. ラージオブジェクトにデータを書く

int lo_write(PGconn *conn, int fd, const char *buf, size_t len)
この処理は、引数len長のバイトを、引数bufから引数fdが示すラージオブジェクトに 書き込みます。引数fdは事前に実行したlo_openの 戻り値でなければいけません。実際に書き込まれたバイト数が返されます。 エラーが発生した場合は、負の値を返します。

2.3.6. ラージオブジェクトのデータを読む

int lo_read(PGconn *conn, int fd, char *buf, size_t len)
この処理は、引数len長のバイトを、引数fdが示すラージオブジェクトから buf(訳注:英文ではbyfとなっていますが、それはタイプミスと思われます。) に読み込みます。引数fdは事前に実行したlo_openの 戻り値でなければいけません。実際に読み込まれたバイト数が返されます。 エラーが発生した場合は、負の値を返します。

2.3.7. ラージオブジェクトのシーク

ラージオブジェクトの現在の読み取り、または、書き込みを行なう位置を変更するには、

int lo_lseek(PGconn *conn, int fd, int offset, int whence)
を呼び出します。この処理は、引数fdで指定されたラージオブジェクトの現在の 位置を指すポインタを、引数offsetで指定した新しい位置に変更します。 引数whenceにて指定可能な値は、SEEK_SET、SEEK_CUR、SEEK_ENDのいずれかです。

2.3.8. ラージオブジェクト記述子を閉じる

int lo_close(PGconn *conn, int fd)
を呼び出すことで、ラージオブジェクトを閉じることができます。 ここで、fd はlo_openの戻り値であるラージオブジェクト 記述子です。成功すると、lo_closeは0を返します。 失敗すると、負の値を返します。

2.3.9. ラージオブジェクトの削除

ラージオブジェクトをデータベースから削除するには、

Oid lo_unlink(PGconn *conn, Oid lobjId)
を呼び出します。引数lobjIdは削除したいラージオブジェクトのoidを示します。