选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.2 已于 2017 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

32.3. 客户端接口 #

PostgreSQL客户端接口库为访问大对象提供了支持。使用这些函数对大对象进行的所有操作都必须发生在一个 SQL 事务块内。PostgreSQL的大对象接口是仿照Unix文件系统接口设计的,提供了与openreadwritelseek等相对应的操作。

libpq中使用大对象接口的客户端应用应包含头文件libpq/libpq-fs.h并与libpq库链接。

32.3.1. 创建一个大对象 #

函数

Oid lo_creat(PGconn *conn, int mode);

创建一个新的大对象。返回值是分配给新大对象的 OID,失败时为InvalidOid(零)。 自PostgreSQL 8.1 起,mode未被使用且被忽略;不过,为了与更早版本的向后兼容,最好将其设置为INV_READINV_WRITEINV_READ | INV_WRITE。(这些符号常量定义在头文件libpq/libpq-fs.h中。)

例如:

inv_oid = lo_creat(conn, INV_READ|INV_WRITE);

函数

Oid lo_create(PGconn *conn, Oid lobjId);

也会创建一个新的大对象。要分配的 OID 可以由lobjId指定;如果指定了它,而该 OID 已经被某个大对象使用,则会失败。如果lobjIdInvalidOid(零),则lo_create会分配一个未使用的 OID(其行为与lo_creat相同)。返回值是分配给新大对象的 OID,失败时为InvalidOid(零)。

lo_createPostgreSQL 8.1 新增的;如果将该函数用于更早版本的服务器,它会失败并返回InvalidOid

例如:

inv_oid = lo_create(conn, desired_oid);

32.3.2. 导入一个大对象 #

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

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

filename指定要作为大对象导入的操作系统文件名。返回值是分配给新大对象的 OID,失败时为InvalidOid(零)。注意,该文件是由客户端接口库读取的,而不是由服务器读取的;因此它必须存在于客户端文件系统中,并且对客户端应用可读。

函数

Oid lo_import_with_oid(PGconn *conn, const char *filename, Oid lobjId);

也会导入一个新的大对象。要分配的 OID 可以由lobjId指定;如果指定了它,而该 OID 已经被某个大对象使用,则会失败。如果lobjIdInvalidOid(零),则lo_import_with_oid会分配一个未使用的 OID(其行为与lo_import相同)。返回值是分配给新大对象的 OID,失败时为InvalidOid(零)。

lo_import_with_oidPostgreSQL 8.4 新增的,它在内部使用了 8.1 新增的lo_create;如果将该函数用于 8.0 或更早版本的服务器,它会失败并返回InvalidOid

32.3.3. 导出一个大对象 #

要把一个大对象导出到操作系统文件中,调用

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

lobjId参数指定要导出的大对象的 OID,filename参数指定操作系统文件名。注意,该文件是由客户端接口库写入的,而不是由服务器写入的。成功时返回 1,失败时返回 -1。

32.3.4. 打开一个现有的大对象 #

要打开一个现有的大对象以供读取或写入,调用

int lo_open(PGconn *conn, Oid lobjId, int mode);

lobjId参数指定要打开的大对象的 OID。mode位控制该对象是以读取(INV_READ)、写入(INV_WRITE)还是两者兼有的方式打开。(这些符号常量定义在头文件libpq/libpq-fs.h中。)lo_open返回一个(非负的)大对象描述符,供后续在lo_readlo_writelo_lseeklo_telllo_close中使用。大对象在被创建之前不能被打开。该描述符只在当前事务持续期间有效。失败时返回 -1。

服务器当前不区分INV_WRITEINV_READ | INV_WRITE这两种模式:在这两种情况下都允许通过该描述符读取。不过,这两种模式与单独使用INV_READ存在一个重要区别:使用INV_READ时,不能通过该描述符写入,而且从该描述符读取到的数据会反映执行lo_open时活动事务快照中的大对象内容,而不受本事务或其他事务之后写入的影响。对于以INV_WRITE打开的描述符,读取返回的数据会反映其他已提交事务的所有写入以及当前事务的写入。这类似于普通 SQL SELECT命令在REPEATABLE READREAD COMMITTED事务模式下的行为差异。

例如:

inv_fd = lo_open(conn, inv_oid, INV_READ|INV_WRITE);

32.3.5. 向大对象写入数据 #

函数

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

buf中的len字节写入大对象描述符fdfd参数必须是先前由lo_open返回的大对象描述符。返回值是实际写入的字节数。发生错误时,返回值为负。

32.3.6. 从大对象读取数据 #

函数

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

从大对象描述符fd中读取len字节到buf中。fd参数必须是先前由lo_open返回的大对象描述符。返回实际读取的字节数。发生错误时,返回值为负。

32.3.7. 在大对象中定位 #

要改变与大对象描述符关联的当前读或写位置,调用

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

该函数将由fd标识的大对象描述符的当前位置指针移动到由offset指定的新位置。whence的有效值是SEEK_SET(从对象起始处定位)、SEEK_CUR(从当前位置定位)以及SEEK_END(从对象末尾定位)。返回值是新的位置指针,出错时为 -1。

32.3.8. 获取大对象的当前位置 #

要取得大对象描述符当前的读或写位置,调用

int lo_tell(PGconn *conn, int fd);

如果发生错误,返回值是 -1。

32.3.9. 截断一个大对象 #

要把一个大对象截断为给定长度,调用

int lo_truncate(PGcon *conn, int fd, size_t len);

该函数把大对象描述符fd对应的大对象截断为长度lenfd参数必须是先前由lo_open返回的大对象描述符。如果len大于大对象当前的长度,则会用零字节('\0')把该大对象扩展。成功时,lo_truncate返回零;出错时返回值为 -1。

文件偏移量不会改变。

lo_truncatePostgreSQL 8.3 新增的;如果将该函数用于更早版本的服务器,它会失败并返回一个负值。

32.3.10. 关闭一个大对象描述符 #

可以通过调用

int lo_close(PGconn *conn, int fd);

来关闭一个大对象描述符,其中fd是由lo_open返回的大对象描述符。成功时,lo_close返回零;出错时返回值为 -1。

任何在事务结束时仍保持打开的大对象描述符都会被自动关闭。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。