2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

32.12. 杂项函数 #

像往常一样,有些函数不适合任何地方。

PQfreemem #

释放由 libpq 分配的内存。

void PQfreemem(void *ptr);

释放由 libpq 分配的内存,特别是 PQescapeByteaConnPQescapeByteaPQunescapeByteaPQnotifies。在 Microsoft Windows 上使用此函数而不是 free() 尤其重要。这是因为在 DLL 中分配内存并在应用程序中释放它,只有在 DLL 和应用程序的 多线程/单线程、发布/调试以及静态/动态标志相同的情况下才有效。在非 Microsoft Windows 平台上,此函数与标准库函数 free() 相同。

PQconninfoFree #

释放由 PQconndefaultsPQconninfoParse 分配的数据结构。

void PQconninfoFree(PQconninfoOption *connOptions);

如果参数是 NULL 指针,则不执行任何操作。

简单的 PQfreemem 对此不起作用,因为数组包含对辅助字符串的引用。

PQencryptPasswordConn #

准备 PostgreSQL 密码的加密形式。

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

此函数旨在供希望发送类似 ALTER USER joe PASSWORD 'pwd' 的命令的客户端应用程序使用。最好不要在这样的命令中发送原始明文密码,因为它可能会在命令日志、活动显示等中暴露出来。相反,请使用此函数将密码转换为加密形式,然后再发送。

参数 passwduser 是明文密码,以及它所属用户的 SQL 名称。 algorithm 指定用于加密密码的加密算法。当前支持的算法是 md5scram-sha-256onoff 也被接受为 md5 的别名,以兼容旧版本的服务器)。请注意,对 scram-sha-256 的支持是在 PostgreSQL 版本 10 中引入的,在旧版本的服务器上将无法正常工作。如果 algorithmNULL,此函数将查询服务器以获取当前 password_encryption 设置的值。这可能会阻塞,如果当前事务被中止,或连接忙于执行其他查询,则会失败。如果您希望使用服务器的默认算法,但想避免阻塞,请在调用 PQencryptPasswordConn 之前,先自行查询 password_encryption,并将该值作为 algorithm 传递。

返回值是由 malloc 分配的字符串。调用者可以假设字符串不包含任何需要转义的特殊字符。完成后,使用 PQfreemem 释放结果。如果出错,将返回 NULL,并且会在连接对象中存储一条适当的消息。

PQchangePassword #

更改 PostgreSQL 密码。

PGresult *PQchangePassword(PGconn *conn, const char *user, const char *passwd);

此函数使用 PQencryptPasswordConn 来构建和执行命令 ALTER USER ... PASSWORD '...',从而更改用户的密码。它的存在原因与 PQencryptPasswordConn 相同,但更方便,因为它既构建了命令,又为您运行了命令。传递给 PQencryptPasswordConn 的算法参数是 NULL,因此加密是根据服务器的 password_encryption 设置完成的。

参数 userpasswd 是目标用户的 SQL 名称,以及新的明文密码。

返回一个表示 ALTER USER 命令结果的 PGresult 指针,或者如果例程在发出任何命令之前失败,则返回一个空指针。应调用 PQresultStatus 函数来检查返回值中是否存在任何错误(包括空指针的值,在这种情况下它将返回 PGRES_FATAL_ERROR)。使用 PQerrorMessage 获取有关此类错误的更多信息。

PQencryptPassword #

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

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

PQencryptPasswordPQencryptPasswordConn 的旧版本,已被弃用。不同之处在于 PQencryptPassword 不需要连接对象,并且始终使用 md5 作为加密算法。

PQmakeEmptyPGresult #

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

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

这是 libpq 的内部函数,用于分配和初始化一个空的 PGresult 对象。如果内存无法分配,则此函数返回 NULL。它被导出是因为一些应用程序发现生成结果对象(特别是具有错误状态的对象)很有用。如果 conn 不为空,并且 status 指示错误,则指定连接的当前错误消息将被复制到 PGresult 中。此外,如果 conn 不为空,则连接中注册的任何事件过程都将被复制到 PGresult 中。(它们不会收到 PGEVT_RESULTCREATE 调用,但请参见 PQfireResultCreateEvents。)请注意,最终应在对象上调用 PQclear,就像使用 libpq 本身返回的 PGresult 一样。

PQfireResultCreateEvents #

PGresult 对象中注册的每个事件过程触发 PGEVT_RESULTCREATE 事件(请参见 第 32.14 节)。成功返回非零值,如果任何事件过程失败,则返回零。

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

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

已经为此对象收到 PGEVT_RESULTCREATEPGEVT_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 指定复制源结果的事件。(但与源相关联的任何实例数据都不会被复制。)事件过程会收到 PGEVT_RESULTCOPY 事件。

PQsetResultAttrs #

设置 PGresult 对象的属性。

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

提供的 attDescs 将被复制到结果中。如果 attDescs 指针为 NULLnumAttributes 小于 1,则请求将被忽略,函数成功。如果 res 已经包含属性,则函数将失败。如果函数失败,则返回值为零。如果函数成功,则返回值为非零。

PQsetvalue #

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

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

该函数将根据需要自动扩展结果的内部元组数组。但是,tup_num 参数必须小于或等于 PQntuples,这意味着此函数只能一次扩展元组数组一个元组。但是任何现有元组的任何字段都可以以任何顺序修改。如果 field_num 上的值已存在,它将被覆盖。如果 len 为 -1 或 valueNULL,则字段值将被设置为 SQL 空值。 value 将被复制到结果的私有存储区中,因此在函数返回后不再需要。如果函数失败,则返回值为零。如果函数成功,则返回值为非零。

PQresultAlloc #

PGresult 对象分配辅助存储。

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

使用此函数分配的任何内存将在 res 被清除时释放。如果函数失败,则返回值为 NULL。结果保证与任何类型的數據对齐,就像 malloc 一样。

PQresultMemorySize #

检索为 PGresult 对象分配的字节数。

size_t PQresultMemorySize(const PGresult *res);

此值是与 PGresult 对象关联的所有 malloc 请求的总和,也就是说,所有将被 PQclear 释放的内存。此信息对于管理内存消耗非常有用。

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 来确定逻辑主版本号。在所有发行系列中,只有最后两位数字在次要版本(bug 修复版本)之间有所不同。

注意

此函数出现在 PostgreSQL 版本 9.1 中,因此它不能用于检测早期版本中所需的的功能,因为调用它会创建一个对版本 9.1 或更高版本的链接依赖关系。

PQgetCurrentTimeUSec #

检索当前时间,表示为自 Unix 纪元(即 time_t 乘以一百万)以来的微秒数。

pg_usec_time_t PQgetCurrentTimeUSec(void);

这主要用于计算用于 PQsocketPoll 的超时值。

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。