2.3. 接口

PostgreSQL 提供的用于访问大对象的机制, 包括作为用户定义函数的后端的一部分或者作为使用接口的前端应用的一部分, 都在下面描述.对于熟悉 PostgreSQL 4.2的用户, PostgreSQL 有一套新的函数提供更连贯的接口.

注意: 有大对象的操作都必须在一个SQL事务里实现。 这在 PostgreSQL v6.5 里有严格的要求,尽管在以前的版本里就隐含这样的要求, 如果忽略这一点会导致错误的表现。

PostgreSQL大对象接口是对 Unix 文件系统的模仿,有仿真的 open(2)read(2)write(2)lseek(2),等. 用户函数调用这些路径从一个大对象中检索她们感兴趣的数据. 例如,如果一个名为mugshot的大对象类型存在, 在其中保存面孔的图象,那么可以在mugshot数据上定义一个 叫beard(胡子)的函数.Beard 会检查图片的下三分之一区域, 并且如果存在胡子的话判断胡子的颜色. 整个大对象的值不需要被brard函数缓存起来或者甚至是做些检查. 大对象可以从动态装载的 C 函数或者是链接该库的数据库客户程序访问. PostgreSQL 提供一套过程支持对大对象的打开, 读,写,关闭和搜索。

2.3.1. 创建大对象

过程

Oid lo_creat(PGconn *conn, int mode)

创建一个新的大对象. mode是一个位掩码, 描述新对象的不同属性. 这里列出的符号常量在 $PGROOT/src/backend/libpq/libpq-fs.h 列出.访问类型(读,写或者两者)是对位 INV_READINV_WRITE进行或操作构成的. 掩码的低十六位是大对象要存放于内的存储管理器号. 对于除 Berkeley (伯克利)以外的节点,这些位都应总是零. 下面的命令创建一个 (转置的)大对象:

inv_oid = lo_creat(INV_READ|INV_WRITE);
     

2.3.2. 输入大对象

要把一个操作系统文件输入成为大对象,调用

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

filename 参数指明要被输入成为大对象的操作系统文件路径名.

2.3.3. 输出大对象

要把一个大对象输出为操作系统文件,调用

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

lobjId参数指明要输出的大对象 OID,filename 参数指明操作系统文件的路径名.

2.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

2.3.5. 向大对象中写数据

过程

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

buf中向大对象fd中写len字节. 参数fd必须是前面一个 lo_open 调用的返回。 返回实际写的字节数.出错时返回负数.

2.3.6. 从大对象中读取数据

过程

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

从大对象中读取len字节数据到buf中。 fd参数必须是前面的一个 lo_open调用的返回。 返回实际读取的字节数。出错时,返回一个负数。

2.3.7. 对大对象中数据的查找

要改变当前大对象的读或写位置,调用

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

这个过程把当前fd代表的大对象位置指针移动到 offset指明的新的位置. 参数whence的合法的取值是 SEEK_SETSEEK_CURSEEK_END

2.3.8. 关闭一个大对象描述符

可以通过调用

int lo_close(PGconn *conn, int fd)

关闭一个大对象,这里fdlo_open返回的大对象的描述符.成功时, lo_close 返回零.错误时,返回值是负数.

2.3.9. 删除一个大对象

从数据库中删除一个大对象,调用

Oid lo_unlink(PGconn *conn, Oid lobjId)

lobjId参数声明要删除的大对象的 OID.