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。

例子:

inv_oid = lo_creat(INV_READ|INV_WRITE);

28.3.2. 輸入大對象

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

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

filename 參數指明要被輸入成為大對象的操作系統文件路徑名. 返回值是賦予新大對象的 OID。

28.3.3. 輸出大對象

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

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

lobjId參數指明要輸出的大對象 OID,filename 參數指明操作系統文件的路徑名.

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。這個描述符只是在當前事務中有效。

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);

從大對象中讀取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 (從對象結尾開始找)。返回值是新位置指針。

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。 發生錯誤的時候,返回值是負數。