本节描述 PostgreSQL 客户端接口库提供来访问大对象的设施。 所有使用这些函数进行的大对象操作都必须在一个SQL事务里实现。 (这个要求是自 PostgreSQL 6.5 以来的一个严格的要求,虽然在以前的版本里就隐含这样的要求,如果忽略这一点会导致错误的表现。) PostgreSQL大对象接口是对 Unix 文件系统的模仿,有仿真的 open,read, write, lseek,等.
使用 libpq 里面大对象接口的的客户端应用应该包含头文件 libpq/libpq-fs.h 并且和 libpq 库链接。
函数
Oid lo_creat(PGconn *conn, int mode);
创建一个新的大对象. mode是一个位掩码, 描述新对象的不同属性。 这里列出的符号常量在 libpq/libpq-fs.h 列出。 访问类型(读,写或者两者)是对位 INV_READ 和 INV_WRITE进行或操作构成的。 掩码的低十六位是大对象要存放于内的存储管理器号。 对于除 Berkeley (伯克利)以外的节点,这些位都应总是零。 返回值是赋予新大对象的 OID。
例子:
inv_oid = lo_creat(INV_READ|INV_WRITE);
要打开一个现存的大对象,调用
int lo_open(PGconn *conn, Oid lobjId, int mode);
参数lobjId指明要打开的大对象的 OID (对象标识)。 mode位控制该对象是用于读 (INV_READ), 写(INV_WRITE)还是读写。 一个大对象在其创建之前不能被打开。 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 返回零.错误时,返回值是负数.
任何在事务结尾时仍然打开的大对象描述符将在事务结束时自动关闭。