28.3. 客戶端接口

本節描述 PostgreSQL 客戶端接口庫提供來訪問大對象的設施。 所有使用這些函數進行的大對像操作都必須在一個SQL交易裡實現。 (這個要求是自 PostgreSQL 6.5 以來的一個嚴格的要求,雖然在以前的版本裡就隱含這樣的要求,如果忽略這一點會導致錯誤的資料表現。) PostgreSQL大對像接口是對 Unix 文件系統的模仿,有仿真的 openreadwritelseek,等.

使用 libpq 裡面大對像接口的的客戶端應用應該包含頭文件 libpq/libpq-fs.h 並且和 libpq 庫鏈接。

28.3.1. 建立大對像

函數

Oid lo_creat(PGconn *conn, int mode);

建立一個新的大對像. mode是一個位掩碼, 描述新對象的不同屬性。 這裡使用的符號常量在 libpq/libpq-fs.h 列出。 訪問類型(讀,寫或者兩者)是對位 INV_READINV_WRITE進行或操作構成的。 掩碼的低十六位是大對像要存放於內的儲存管理器號。 對於除 Berkeley (伯克利)以外的節點,這些位都應總是零。 (訪問類型現在實際上也不作任何事情,但是其中一個或者兩個位都需要置上,以避免錯誤。) 返回值是賦予新大對象的 OID,或者是失敗的時候是 InvalidOid(零)。

例子:

inv_oid = lo_creat(conn, INV_READ|INV_WRITE);

28.3.2. 輸入大對像

要把一個操作系統文件輸入成為大對象,調用

Oid lo_import(PGconn *conn, const char *filename);

filename 參數指明要被輸入成為大對象的操作系統文件路徑名。返回值是賦予新大對象的 OID。 如果失敗則返回 InvalidOid(零)。請注意這個文件是由客戶端接口庫讀取的, 而不是伺服器端;因此它必須存在於客戶端文件系統上並且可以被客戶應用讀取。

28.3.3. 輸出大對像

要把一個大對像輸出為操作系統文件,調用

int lo_export(PGconn *conn, Oid lobjId, const char *filename);

lobjId參數指明要輸出的大對像 OID,filename 參數指明操作系統文件的路徑名。請注意這個文件是由客戶端接口庫寫入的, 而不是伺服器端。成功時返回 1,失敗時返回 -1。

28.3.4. 打開一個現有的大對像

要打開一個現存的大對像讀寫,調用

int lo_open(PGconn *conn, Oid lobjId, int mode);

參數lobjId指明要打開的大對象的 OID (對像標識)。 mode位控制該對象是用於讀 (INV_READ), 寫(INV_WRITE)還是讀寫。 一個大對像在其建立之前不能被打開。 lo_open 返回一個(非負的)大對像標識用於以後的 lo_readlo_writelo_lseeklo_tell,和 lo_close。這個描述符只是在目前交易中有效。 失敗的時候,返回 -1。

28.3.5. 向大對像中寫資料

函數

int lo_write(PGconn *conn, int fd, const char *buf, size_t len);

buf中向大對像描述符fd中寫len字元. 參數fd必須是前面一個 lo_open 調用的返回。 返回實際寫的字元數.出錯時返回負數.

28.3.6. 從大對像中讀取資料

函數

int lo_read(PGconn *conn, int fd, char *buf, size_t len);

從大對像描述符 fd 中讀取len字元資料到buf中。 fd參數必須是前面的一個 lo_open調用的返回。 返回實際讀取的字元數。出錯時,返回一個負數。

28.3.7. 大對像中資料的查找

要改變與一個大對像描述符相關的讀寫位置,調用

int lo_lseek(PGconn *conn, int fd, int offset, int whence);

這個過程把目前fd代資料表的大對像描述符位置指針移動到 offset指明的新的位置。 參數whence的合法的取值是 SEEK_SET(從對像開頭開始找),SEEK_CUR(從目前位置開始找),和SEEK_END (從對像結尾開始找)。返回值是新位置指針,如果出錯為 -1。

28.3.8. 獲取一個大對象的目前搜索位置

要獲取一個大對像描述符的目前讀或寫位置,調用

int lo_tell(PGconn *conn, int fd);

如果有錯誤,返回值是負數。

28.3.9. 關閉一個大對像描述符

可以透過調用

int lo_close(PGconn *conn, int fd);

關閉一個大對像描述符,這裡fdlo_open返回的大對象的描述符.成功時, lo_close 返回零.錯誤時,返回值是負數.

任何在交易結尾時仍然打開的大對像描述符將在交易結束時自動關閉。

28.3.10. 刪除一個大對像

從資料庫中刪除一個大對象,調用

int lo_unlink(PGconn *conn, Oid lobjId);

lobjId參數聲明要刪除的大對象的 OID。 成功時返回 1,失敗時返回 -1。