一如既往,总有一些函数不适合放在任何地方。
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);
如果参数是 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 名称和新的明文密码。
返回表示 ALTER USER
命令结果的 PGresult
指针,或者如果例程在发出任何命令之前失败,则返回空指针。应该调用 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
事件(请参阅 第 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,以确定逻辑主版本号。在所有发行系列中,只有最后两位数字在次要版本(错误修复版本)之间有所不同。
此函数出现在 PostgreSQL 版本 9.1 中,因此不能用于检测早期版本中所需的功能,因为调用它将创建对 9.1 或更高版本的链接依赖项。
PQgetCurrentTimeUSec
#检索当前时间,表示为自 Unix 纪元以来的微秒数(即,time_t
乘以 100 万)。
pg_usec_time_t PQgetCurrentTimeUSec(void);
这主要用于计算与 PQsocketPoll
一起使用的超时值。
如果您发现文档中任何不正确、与您使用特定功能的体验不符或需要进一步澄清的地方,请使用此表单报告文档问题。