Postgres 提供的用于访问大对象的机制, 包括作为用户定义函数的后端的一部分或者作为使用接口的前端应用的一部分, 都在下面描述.对于熟悉 Postgres 4.2的用户, PostgreSQL 有一套新的函数提供更连贯的接口.
注意: 有大对象的操作都必须在一个SQL事务里实现。 这在 Postgres v6.5 里有严格的要求,尽管在以前的版本里就隐含这样的要求, 如果忽略这一点会导致错误的表现。
Postgres大对象接口是对 Unix 文件系统的模仿,有仿真的 open(2),read(2), write(2), lseek(2),等. 用户函数调用这些路径从一个大对象中检索她们感兴趣的数据. 例如,如果一个名为 mugshot 的大对象类型存在, 在其中保存面孔的图象,那么可以在 mugshot 数据上定义一个 叫 beard (胡子)的函数.Beard (胡子函数)会检查图片的下三分之一区域, 并且如果存在胡子的话判断胡子的颜色. 整个大对象的值不需要被 brard 函数缓存起来或者甚至是做些检查. 大对象可以从动态装载的 C 函数或者是链接该库的数据库客户程序访问. Postgres 提供一套过程支持对大对象的打开, 读,写,关闭和搜索。
过程
Oid lo_creat(PGconn *conn, int mode)创建一个新的大对象. mode是一个位掩码, 描述新对象的不同属性. 这里列出的符号常量在 $PGROOT/src/backend/libpq/libpq-fs.h 列出.访问类型(读,写或者两者)是对位 INV_READ 和 INV_WRITE进行 OR (或)操作构成的. 如果大对象应被归档--也就是说,如果因历史原因它应该被周期地 移到一个特殊的归档关系(表)中--那么就要设置 INV_ARCHIVE 位. 掩码的低十六位是大对象要存放于内的存储管理器号. 对于除 Berkeley (伯克利)以外的节点,这些位都应总是零. 下面的命令创建一个 (转置的)大对象:
inv_oid = lo_creat(INV_READ|INV_WRITE|INV_ARCHIVE);
要把一个UNIX 文件输入成为大对象,调用
Oid lo_import(PGconn *conn, const char *filename)filename 参数指明要被输入成为大对象的 Unix文件路径名.
要把一个大对象输出为 UNIX 文件,调用
int lo_export(PGconn *conn, Oid lobjId, const char *filename)lobjId 参数指明要输出的大对象 Oid,filename 参数指明 UNIX 文件的路径名.
要打开一个现存的大对象,调用
int lo_open(PGconn *conn, Oid lobjId, int mode)参数 lobjId 指明要打开的大对象的 Oid (对象标识). mode 位控制该对象是用于读 (INV_READ),写还是读写. 一个大对象在其创建之前不能被打开. lo_open 返回一个大对象标识用于以后的 lo_read,lo_write, lo_lseek,lo_tell,和 lo_close。
过程
int lo_write(PGconn *conn, int fd, const char *buf, size_t len)从 buf 中向大对象 fd 中写 len 字节.参数 fd 必须是前面一个 lo_open 调用的返回。 返回实际写的字节数.出错时返回负数.
过程
int lo_read(PGconn *conn, int fd, char *buf, size_t len)从大对象中读取 len 字节数据到 buf 中。fd 参数必须是前面的一个 lo_open调用的返回。 返回实际读取的字节数。出错时,返回一个负数。
要改变当前大对象的读或写位置,调用
int lo_lseek(PGconn *conn, int fd, int offset, int whence)这个过程把当前 fd 代表的大对象位置指针移动到 offset 指明的新的位置. 参数 whence 的合法的取值是 SEEK_SET,SEEK_CUR 和 SEEK_END.
可以通过调用
int lo_close(PGconn *conn, int fd)关闭一个大对象,这里 fd 是 lo_open返回的大对象的描述符.成功时, lo_close 返回零.错误时,返回值是负数.