pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
本节描述 PostgreSQL 客户端接口库为 访问大对象所提供的功能。使用这些函数对大对象进行的所有操作 必须发生在一个 SQL 事务块内。 PostgreSQL 的大对象接口是仿照 Unix 文件系统接口设计的,提供了与 open、read、 write、lseek 等相对应 的操作。
在 libpq 中使用大对象接口的客户端 应用应包含头文件 libpq/libpq-fs.h 并与 libpq 库链接。
The function
Oid lo_creat(PGconn *conn, int mode);
创建一个新的大对象。返回值是分配给新大对象的 OID,失败时为 InvalidOid(零)。 自 PostgreSQL 8.1 起, mode 未被使用且被 忽略;不过,为了与更早版本的向后兼容,最好将其设置为 INV_READ、INV_WRITE 或 INV_READ | INV_WRITE。(这些符号常量定义在头文件 libpq/libpq-fs.h 中。)
例如:
inv_oid = lo_creat(conn, INV_READ|INV_WRITE);
The function
Oid lo_create(PGconn *conn, Oid lobjId);
也会创建一个新的大对象。要分配的 OID 可以由 lobjId 指定;如果 指定了它,而该 OID 已经被某个大对象使用,则会失败。如果 lobjId 是 InvalidOid(零),则 lo_create 会分配一个未使用的 OID(其行为与 lo_creat 相同)。返回值是分配给新大对象的 OID, 失败时为 InvalidOid(零)。
lo_create是PostgreSQL 8.1 新增的;如果将该函数用于更早版本的服务器,它会失败并返回InvalidOid。
例如:
inv_oid = lo_create(conn, desired_oid);
要把一个操作系统文件导入为大对象,调用
Oid lo_import(PGconn *conn, const char *filename);
filename 指定要作为大对象导入的操作系统文件名。返回值是分配给新大对象 的 OID,失败时为 InvalidOid(零)。注意,该 文件是由客户端接口库读取的,而不是由服务器读取的;因此它必须 存在于客户端文件系统中,并且对客户端应用可读。
The function
Oid lo_import_with_oid(PGconn *conn, const char *filename, Oid lobjId);
也会导入一个新的大对象。要分配的 OID 可以由 lobjId 指定;如果 指定了它,而该 OID 已经被某个大对象使用,则会失败。如果 lobjId 是 InvalidOid(零),则 lo_import_with_oid 会分配一个未使用的 OID(其行为 与 lo_import 相同)。返回值是分配给新大对象的 OID,失败时为 InvalidOid(零)。
lo_import_with_oid是PostgreSQL 8.4 新增的,它在内部使用了 8.1 新增的lo_create;如果将该函数用于 8.0 或更早版本的服务器,它会失败并返回InvalidOid。
要把一个大对象导出到操作系统文件,调用
int lo_export(PGconn *conn, Oid lobjId, const char *filename);
lobjId 参数指定要导出的大对象的 OID, filename 参数指定该文件的操作系统文件名。 注意,该文件是由客户端接口库写入的,而不是由服务器写入的。 成功时返回 1,失败时返回 -1。
要打开一个现有的大对象进行读取或写入,调用
int lo_open(PGconn *conn, Oid lobjId, int mode);
The lobjId argument specifies the OID of the large object to open. The mode bits control whether the 该对象将以读取(INV_READ)、写入 (INV_WRITE)或两者兼有的方式打开。 (这些符号常量定义在头文件 libpq/libpq-fs.h 中。)大对象必须先创建 才能打开。lo_open 返回一个(非负的) 大对象描述符,供后续在 lo_read、 lo_write、lo_lseek、 lo_tell 和 lo_close 中使用。该描述符只在当前事务持续期间有效。失败时返回 -1。
服务器当前不区分 INV_WRITE 和 INV_READ | INV_WRITE 这两种模式:在这两种情况下都允许 通过该描述符读取。不过,这两种模式与单独使用 INV_READ 存在一个重要区别:使用 INV_READ 时,不能通过该描述符写入,而且从该 描述符读取到的数据会反映执行 lo_open 时 活动事务快照中的大对象内容,而不受本事务或其他事务之后写入的 影响。对于以 INV_WRITE 打开的描述符,读取 返回的数据会反映其他已提交事务的所有写入以及当前事务的写入。 这类似于普通 SQL SELECT 命令在 SERIALIZABLE 与 READ COMMITTED 事务模式下的行为差异。
例如:
inv_fd = lo_open(conn, inv_oid, INV_READ|INV_WRITE);
The function
int lo_write(PGconn *conn, int fd, const char *buf, size_t len);
把 buf 中的 len 个 字节写入大对象描述符 fd。 fd 参数必须是先前由 lo_open 返回的。返回值是实际写入的字节数。 发生错误时,返回值为负。
The function
int lo_read(PGconn *conn, int fd, char *buf, size_t len);
从大对象描述符 fd 中读取 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(从对象末尾定位)。返回值是新的位置指针, 出错时为 -1。
要把大对象截断为给定长度,调用
int lo_truncate(PGcon *conn, int fd, size_t len);
把大对象描述符 fd 对应的大对象截断为长度 len。fd 参数必须是 先前由 lo_open 返回的。如果 len 大于大对象当前的长度,则会用零字节 ('\0')把该大对象扩展到指定长度。
文件偏移量不会改变。
成功时 lo_truncate 返回零。出错时, 返回值为负。
lo_truncate 是 PostgreSQL 8.3 新增的;如果对更旧版本 的服务器运行该函数,它会失败并返回负值。
可以通过调用
int lo_close(PGconn *conn, int fd);
来关闭一个大对象描述符, 其中 fd 是由 lo_open 返回的大对象描述符。成功时, lo_close 返回零。出错时,返回值为负。
任何在事务结束时仍保持打开的大对象描述符都会被自动关闭。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。