本节描述 PostgreSQL 的 libpq 客户端接口库提供的访问大型对象的工具。 PostgreSQL 大型对象接口的模式与Unix文件系统接口类似,具有 open
、read
、write
、lseek
等对应功能。
所有使用这些函数进行的大型对象操作 必须 在 SQL 事务块内进行,因为大型对象的文件描述符仅在事务期间有效。写操作(包括使用 INV_WRITE
模式的 lo_open
)在只读事务中是不允许的。
如果执行这些函数中的任何一个时发生错误,该函数将返回一个不可能出现的值,通常是 0 或 -1。描述错误的的消息存储在连接对象中,可以通过 PQerrorMessage
检索。
使用这些函数的客户端应用程序应包含头文件 libpq/libpq-fs.h
并链接 libpq 库。
客户端应用程序在使用管道模式的 libpq 连接时不能使用这些函数。
Oid lo_create(PGconn *conn, Oid lobjId);
创建一个新的大型对象。要分配的 OID 可以由 lobjId
指定;如果指定了,如果该 OID 已被某个大型对象使用,则会发生失败。如果 lobjId
是 InvalidOid
(零),则 lo_create
分配一个未使用的 OID。返回值是被分配给新大型对象 OID,或失败时返回 InvalidOid
(零)。
一个例子
inv_oid = lo_create(conn, desired_oid);
Oid lo_creat(PGconn *conn, int mode);
也创建一个新的大型对象,总是分配一个未使用的 OID。返回值是被分配给新大型对象 OID,或失败时返回 InvalidOid
(零)。
在 PostgreSQL 8.1 及更高版本中,mode
被忽略,因此 lo_creat
与 lo_create
加上零的第二个参数完全等效。但是,除非你需要与 8.1 之前的服务器一起工作,否则使用 lo_creat
的理由很少。要与如此老的服务器一起工作,你必须使用 lo_creat
而不是 lo_create
,并且你必须将 mode
设置为 INV_READ
、INV_WRITE
或 INV_READ
|
INV_WRITE
之一。(这些符号常量定义在头文件 libpq/libpq-fs.h
中。)
一个例子
inv_oid = lo_creat(conn, INV_READ|INV_WRITE);
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 已被某个大型对象使用,则会发生失败。如果 lobjId
是 InvalidOid
(零),则 lo_import_with_oid
分配一个未使用的 OID (这与 lo_import
的行为相同)。返回值是被分配给新大型对象 OID,或失败时返回 InvalidOid
(零)。
lo_import_with_oid
是 PostgreSQL 8.4 新增的,并且内部使用 lo_create
,后者是 8.1 新增的;如果此函数在 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);
lobjId
参数指定要打开的大型对象的 OID。mode
位控制对象是打开用于读取 (INV_READ
)、写入 (INV_WRITE
) 还是两者兼有。(这些符号常量定义在头文件 libpq/libpq-fs.h
中。) lo_open
返回一个(非负)大型对象描述符,供以后在 lo_read
、lo_write
、lo_lseek
、lo_lseek64
、lo_tell
、lo_tell64
、lo_truncate
、lo_truncate64
和 lo_close
中使用。该描述符仅在当前事务期间有效。失败时返回 -1。
服务器目前不区分 INV_WRITE
和 INV_READ
|
INV_WRITE
模式:在任一情况下都允许从描述符读取。然而,这些模式与单独的 INV_READ
模式之间存在显著差异:使用 INV_READ
时,不能在描述符上写入,并且从中读取的数据将反映事务快照时大型对象的内容(该快照在执行 lo_open
时处于活动状态),而与此或其他事务的后续写入无关。从以 INV_WRITE
打开的描述符读取会返回反映其他已提交事务的写入以及当前事务的写入的数据。这类似于普通 SQL SELECT
命令的 REPEATABLE READ
与 READ COMMITTED
事务模式的行为。
lo_open
会在大型对象没有 SELECT
权限,或者指定了 INV_WRITE
但没有 UPDATE
权限时失败。(在 PostgreSQL 11 之前,这些权限检查是在第一次实际读写操作时执行的。)可以使用 lo_compat_privileges 运行时参数禁用这些权限检查。
一个例子
inv_fd = lo_open(conn, inv_oid, INV_READ|INV_WRITE);
int lo_write(PGconn *conn, int fd, const char *buf, size_t len);
将 buf
中的 len
字节(buf
的大小必须为 len
)写入大型对象描述符 fd
。fd
参数必须是由之前的 lo_open
返回的。实际写入的字节数将被返回(在当前实现中,除非发生错误,否则这将始终等于 len
)。发生错误时,返回值是 -1。
尽管 len
参数被声明为 size_t
,但此函数将拒绝大于 INT_MAX
的长度值。实际上,最好还是将数据分块传输,每块不超过几兆字节。
int lo_read(PGconn *conn, int fd, char *buf, size_t len);
将最多 len
字节从大型对象描述符 fd
读取到 buf
中(buf
的大小必须为 len
)。fd
参数必须是由之前的 lo_open
返回的。实际读取的字节数将被返回;如果先到达大型对象的末尾,则此值将小于 len
。发生错误时,返回值是 -1。
尽管 len
参数被声明为 size_t
,但此函数将拒绝大于 INT_MAX
的长度值。实际上,最好还是将数据分块传输,每块不超过几兆字节。
int lo_lseek(PGconn *conn, int fd, int offset, int whence);
此函数将由 fd
标识的大型对象描述符的当前位置指针移动到 offset
指定的新位置。whence
的有效值是 SEEK_SET
(从对象开头定位)、SEEK_CUR
(从当前位置定位) 和 SEEK_END
(从对象末尾定位)。返回值是新的位置指针,错误时返回 -1。
int64_t lo_lseek64(PGconn *conn, int fd, int64_t offset, int whence);
此函数与 lo_lseek
具有相同的行为,但它可以接受大于 2GB 的 offset
值,并且/或者返回大于 2GB 的结果。请注意,如果新的位置指针大于 2GB,lo_lseek
将失败。
lo_lseek64
是 PostgreSQL 9.3 新增的。如果此函数在旧版本服务器上运行,它将失败并返回 -1。
int lo_tell(PGconn *conn, int fd);
如果发生错误,返回值是 -1。
int64_t lo_tell64(PGconn *conn, int fd);
此函数与 lo_tell
具有相同的行为,但它可以返回大于 2GB 的结果。请注意,如果当前的读写位置大于 2GB,lo_tell
将失败。
lo_tell64
是 PostgreSQL 9.3 新增的。如果此函数在旧版本服务器上运行,它将失败并返回 -1。
int lo_truncate(PGconn *conn, int fd, size_t len);
此函数将大型对象描述符 fd
截断到长度 len
。fd
参数必须是由之前的 lo_open
返回的。如果 len
大于大型对象的当前长度,则大型对象将扩展到指定长度,并用空字节 ('\0') 填充。成功时,lo_truncate
返回零。错误时,返回值是 -1。
与描述符 fd
关联的读写位置不会改变。
尽管 len
参数被声明为 size_t
,但 lo_truncate
将拒绝大于 INT_MAX
的长度值。
int lo_truncate64(PGconn *conn, int fd, int64_t len);
此函数与 lo_truncate
具有相同的行为,但它可以接受大于 2GB 的 len
值。
lo_truncate
是 PostgreSQL 8.3 新增的;如果此函数在旧版本服务器上运行,它将失败并返回 -1。
lo_truncate64
是 PostgreSQL 9.3 新增的;如果此函数在旧版本服务器上运行,它将失败并返回 -1。
int lo_close(PGconn *conn, int fd);
其中 fd
是 lo_open
返回的大型对象描述符。成功时,lo_close
返回零。错误时,返回值是 -1。
在事务结束时仍打开的任何大型对象描述符将自动关闭。
int lo_unlink(PGconn *conn, Oid lobjId);
lobjId
参数指定要删除的大型对象的 OID。成功时返回 1,失败时返回 -1。
如果您在文档中看到任何不正确、与您在该特定功能上的使用经验不符或需要进一步阐明的内容,请使用 此表单 报告文档问题。