↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2
历史版本。 PostgreSQL 10 已结束支持。 2022-11-10. 请参阅 当前版本手册.

33.11. 杂项函数 #

一如往常,总有一些函数不适合放在任何其他地方。

PQfreemem #

释放 libpq 分配的内存。

void PQfreemem(void *ptr);

释放 libpq 分配的内存,特别是 PQescapeByteaConn、PQescapeBytea、PQunescapeBytea 和 PQnotifies 分配的内存。在 Microsoft Windows 上,务必使用此函数,而不是 free()。这是因为只有 DLL 与应用程序使用相同的多线程/单线程、发布/调试和静态/动态标志,才能在 DLL 中分配内存并在应用程序中释放它。在 Microsoft Windows 以外的平台上,此函数与标准库函数 free() 相同。

PQconninfoFree #

释放 PQconndefaults 或 PQconninfoParse 分配的数据结构。

void PQconninfoFree(PQconninfoOption *connOptions);

仅调用 PQfreemem 不足以完成此项释放,因为数组还包含指向附属字符串的引用。

PQencryptPasswordConn #

准备一个 PostgreSQL 密码的加密形式。

char *PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, const char *algorithm);

这个函数旨在用于那些希望发送类似于 ALTER USER joe PASSWORD 'pwd' 命令的客户端应用。不在这样一个命令中发送原始的明文密码是一个好习惯,因为它可能被暴露在命令日志、活动显示等等中。相反,在发送之前使用这个函数可以将密码转换为加密的形式。

passwd 和 user 参数是明文密码以及用户的 SQL 名称。algorithm 指定用来加密密码的加密算法。当前支持的算法是 md5 和 scram-sha-256(on 和 off 也被接受作为 md5 的别名,用于与较老的服务器版本兼容)。注意,对 scram-sha-256 的支持是在 PostgreSQL 版本 10 中引入的,并且在老的服务器版本上无法工作。如果 algorithm 是 NULL,这个函数将向服务器查询 password_encryption 设置的当前值。这一查询可能阻塞,并且当前事务被中止或者连接正忙于执行另一个查询时会失败。如果希望为服务器使用默认的算法但避免阻塞,应在调用 PQencryptPasswordConn 之前自行查询 password_encryption,并且将该值作为 algorithm 传入。

返回值是一个由 malloc 分配的字符串。调用者可以假设该字符串不含有需要转义的任何特殊字符。在处理完它之后,用 PQfreemem 释放结果。发生错误时,返回的是 NULL,并且适当的消息会被存储在连接对象中。

PQencryptPassword #

准备一个 PostgreSQL 密码的 md5 加密形式。

char *PQencryptPassword(const char *passwd, const char *user);

PQencryptPassword 是 PQencryptPasswordConn 的旧版本,现已弃用。其差别是 PQencryptPassword 不需要连接对象,并且总是用 md5 作为加密算法。

PQmakeEmptyPGresult #

用给定的状态,构造一个空 PGresult 对象。

PGresult *PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);

这是 libpq 内部用于分配并初始化一个空 PGresult 对象的函数。如果无法分配内存,此函数返回 NULL。将它导出供外部调用,是因为一些应用需要自行生成结果对象,特别是带有错误状态的对象。如果 conn 不为 null,并且 status 表示错误,指定连接的当前错误消息会被复制到 PGresult 中。此外,如果 conn 不为 null,连接中注册的所有事件过程也会被复制到 PGresult 中。(这些过程不会收到 PGEVT_RESULTCREATE 调用,但可参见 PQfireResultCreateEvents。)注意,最终应对该对象调用 PQclear,就像处理 libpq 自身返回的 PGresult 一样。

PQfireResultCreateEvents #

为每一个在 PGresult 对象中注册的事件过程触发一个 PGEVT_RESULTCREATE 事件(见第 33.13 节)。成功时返回非 0,如果任何事件过程失败则返回 0。

int PQfireResultCreateEvents(PGconn *conn, PGresult *res);

conn 参数会传递给事件过程,但此函数不会直接使用它。如果事件过程不使用此参数,则可以传入 NULL。

已经接收到这个对象的 PGEVT_RESULTCREATE 或 PGEVT_RESULTCOPY 事件的事件过程不会被再次触发。

此函数与 PQmakeEmptyPGresult 分开的主要原因是,通常适合先创建 PGresult 并填充数据,然后再调用事件过程。

PQcopyResult #

创建 PGresult 对象的副本。副本与源结果没有任何关联,不再需要副本时必须调用 PQclear。函数失败时返回 NULL。

PGresult *PQcopyResult(const PGresult *src, int flags);

这不是为了制作一个精确的副本。返回的结果总是放在 PGRES_TUPLES_OK 状态中,并且不复制源中的任何错误消息。(但是会复制命令状态字符串。)flags 参数确定要复制的其他内容。它是几个标志的按位或。PG_COPYRES_ATTRS 指定复制源结果的属性(列定义)。PG_COPYRES_TUPLES 指定复制源结果的元组。(这也意味着复制属性。)PG_COPYRES_NOTICEHOOKS 指定复制源结果的通知钩子。PG_COPYRES_EVENTS 指定复制源结果的事件。(但不复制与源相关的任何实例数据。)

PQsetResultAttrs #

设置 PGresult 对象的属性。

int PQsetResultAttrs(PGresult *res, int numAttributes, PGresAttDesc *attDescs);

提供的 attDescs 被复制到结果中。如果 attDescs 指针为 NULL 或 numAttributes 小于 1,那么请求将被忽略并且函数成功。如果 res 已经包含属性,那么函数会失败。如果函数失败,返回值是 0。如果函数成功,返回值是非 0。

PQsetvalue #

设置 PGresult 对象中某个元组的字段值。

int PQsetvalue(PGresult *res, int tup_num, int field_num, char *value, int len);

此函数会根据需要自动扩展结果内部的元组数组。不过,tup_num 参数必须小于或等于 PQntuples,也就是说,每次只能向元组数组增加一个元组。已有元组的任何字段都可以按任意顺序修改。如果 field_num 指定的位置已有值,该值会被覆盖。如果 len 为 -1 或 value 为 NULL,则将该字段设置为 SQL null 值。value 会被复制到结果的私有存储中,因此函数返回后就不再需要它。函数失败时返回零,成功时返回非零值。

PQresultAlloc #

为一个 PGresult 对象分配附属存储。

void *PQresultAlloc(PGresult *res, size_t nBytes);

使用此函数分配的所有内存都会在清除 res 时释放。函数失败时返回 NULL。与 malloc 一样,返回的内存保证满足任意数据类型的对齐要求。

PQlibVersion #

返回所使用的 libpq 版本。

int PQlibVersion(void);

可在运行时根据此函数的结果,判断当前已加载的 libpq 版本是否具有特定功能。例如,可用它判断 PQconnectdb 支持哪些连接选项。

返回值等于库的主版本号乘以 10000 再加上次版本号。例如,版本 10.1 返回 100001,版本 11.0 返回 110000。

在主版本 10 之前,PostgreSQL 使用由三个部分组成的版本号,前两个部分共同表示主版本。对于这些版本,PQlibVersion 用两位数字表示每个部分;例如,版本 9.1.5 返回 90105,版本 9.2.0 返回 90200。

因此,为了判断功能兼容性,应用程序应将 PQlibVersion 的结果除以 100 而非 10000,得到逻辑上的主版本号。在所有版本系列中,次版本(错误修复版本)之间只有最后两位数字不同。

注意

此函数从 PostgreSQL 9.1 起提供,因而不能用它检测更早版本是否具有所需功能:调用它会建立对 9.1 或更高版本的链接依赖。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.