2.3. 接口 #
下面描述 PostgreSQL 提供的访问大对象的设施,既包括后端中作为用户自定义函数一部分的用法,也包括前端中作为使用该接口的应用一部分的用法。对于熟悉 POSTGRES 4.2 的用户来说,PostgreSQL 有一套新函数,提供了更连贯的接口。
注意
所有对大对象的操作必须在一个 SQL 事务中进行。这一要求从 PostgreSQL 6.5 起被严格执行,尽管在之前的版本中它一直是隐含的要求,忽略它会导致错误行为。
PostgreSQL 的大对象接口模仿
Unix 文件系统接口设计,有与
open(2)、read(2)、write(2)、lseek(2) 等对应的函数。用户函数调用这些例程来只从大对象中检索感兴趣的数据。例如,假设存在一个存储面孔照片的名为
mugshot 的大对象类型,那么可以在
mugshot 数据上声明一个名为 beard 的函数。beard
可以查看照片的下三分之一部分,并确定那里出现的胡须颜色(如果有的话)。整个大对象的值不需要被
beard 函数缓冲,甚至不需要被检查。大对象可以从动态装载的 C
函数或链接了该库的数据库客户端程序访问。PostgreSQL 提供了一组支持打开、读取、写入、关闭和在大对象上定位的例程。
2.3.1. 创建一个大对象
例程
Oid lo_creat(PGconn *conn, intmode)
创建一个新的大对象。mode 是一个位掩码,描述新大对象的若干不同属性。这里列出的符号常量定义在头文件
libpq/libpq-fs.h 中。访问类型(读、写或读写)由把
INV_READ 和
INV_WRITE 位"或"在一起来控制。历史上,掩码的低十六位在伯克利被用来指定大对象应驻留的存储管理器编号。现在这些位应当始终为零。下面的命令创建一个大对象:
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, OidlobjId, 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_read、lo_write、lo_lseek、lo_tell 和
lo_close 中使用。
2.3.5. 向大对象写入数据
例程
int lo_write(PGconn *conn, int fd, const char *buf, size_t len)
把 len 字节从 buf 写入大对象 fd。fd
参数必须是先前某个 lo_open 返回的。返回值是实际写入的字节数。发生错误时,返回值为负。
2.3.6. 从大对象读取数据
例程
int lo_read(PGconn *conn, int fd, char *buf, size_t len)
从大对象 fd 中读取
len 字节到 buf。fd
参数必须是先前某个 lo_open 返回的。返回值是实际读取的字节数。发生错误时,返回值为负。
2.3.7. 在大对象上定位
要更改大对象上当前的读或写位置,调用
int lo_lseek(PGconn *conn, int fd, int offset, int whence)
此例程把
fd 所描述大对象的当前位置指针移动到
offset 指定的新位置。whence
的有效值是 SEEK_SET、SEEK_CUR 和
SEEK_END。
2.3.8. 关闭一个大对象描述符
可以通过调用下面的函数来关闭一个大对象:
int lo_close(PGconn *conn, int fd)
其中 fd 是由
lo_open 返回的大对象描述符。成功时
lo_close
返回零。发生错误时,返回值为负。
2.3.9. 移除一个大对象
要从数据库中移除一个大对象,调用
int lo_unlink(PGconn *conn, Oid lobjId)
lobjId 参数指定要删除的大对象的
OID。发生错误时,返回值为负。