PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

32.12. 其他杂项函数 #

与往常一样, 总有一些放在哪里都不合适的函数。

PQfreemem #

释放由 libpq 分配的内存。

void PQfreemem(void *ptr);

释放由 libpq 分配的内存, 特别是 PQescapeByteaConn、 PQescapeBytea、 PQunescapeBytea 和 PQnotifies 分配的内存。 在 Microsoft Windows 上, 使用这个函数而非 free() 尤其重要。 这是因为在一个 DLL 中分配内存而在应用程序中释放它, 只有当 DLL 与应用程序的多线程/单线程、 release/debug 以及静态/动态标志相同时才能工作。 在非 Microsoft Windows 平台上, 这个函数与标准库函数 free() 相同。

PQconninfoFree #

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

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' 之类命令的客户端应用程序使用。 在这种命令中发送原始的明文密码不是好做法, 因为它可能暴露在命令日志、 活动显示等之中。 作为替代, 应当在发送之前用这个函数把密码转换为加密形式。

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, 并且一条合适的消息被存储在连接对象中。

PQchangePassword #

更改一个 PostgreSQL 密码。

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

这个函数使用 PQencryptPasswordConn 来构建并执行命令 ALTER USER ... PASSWORD '...', 从而更改该用户的密码。 它存在的理由与 PQencryptPasswordConn 相同, 但它更方便, 因为它同时为你构建和运行该命令。 PQencryptPasswordConn 的算法参数被传入 NULL, 因此加密按照服务器的 password_encryption 设置完成。

user 和 passwd 参数分别是目标用户的 SQL 名和新的明文密码。

返回一个 PGresult 指针, 表示 ALTER USER 命令的结果; 如果该例程在发出任何命令之前失败, 则返回一个空指针。 应当调用 PQresultStatus 函数来检查返回值中是否有任何错误 (包括空指针的值, 在那种情况下它会返回 PGRES_FATAL_ERROR)。 错误细节请使用 PQerrorMessage 检索。

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 不为空且 status 指示一个错误, 那么指定连接的当前错误消息会被复制到该 PGresult 中。 此外, 如果 conn 不为空, 在该连接中注册的任何事件过程都会被复制到该 PGresult 中。 (它们不会收到 PGEVT_RESULTCREATE 调用, 但请参见 PQfireResultCreateEvents。) 注意, 最终应当在这个对象上调用 PQclear, 就像对 libpq 自身返回的 PGresult 一样。

PQfireResultCreateEvents #

为 PGresult 对象中注册的每个事件过程触发一个 PGEVT_RESULTCREATE 事件(参见 Section 32.14)。 成功时返回非零, 任何一个事件过程失败则返回零。

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

PQsetResultAttrs #

设置一个 PGresult 对象的属性。

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

所提供的 attDescs 会被复制到结果中。 如果 attDescs 指针为 NULL 或 numAttributes 小于 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 或 value 为 NULL, 字段值会被设置为一个 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, 以得到一个逻辑主版本号。 在所有发行系列中, 次要发行版(缺陷修复发行版)之间只有最后两位数字不同。

Note

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

PQgetCurrentTimeUSec #

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

pg_usec_time_t PQgetCurrentTimeUSec(void);

这主要用于计算与 PQsocketPoll 一起使用的超时值。