Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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 名称和新明文密码。

返回一个PGresult指针,表示ALTER USER命令的结果,或者在发出任何命令之前该例程失败的话返回一个空指针。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不为null,并且status指示错误,则指定连接的当前错误消息将被复制到PGresult中。另外,如果conn不为null,则连接中注册的任何事件过程将被复制到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 参数确定还应复制的内容。它是一个由几个标志按位运算组成的 OR。 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 null值。value 被复制到结果的私有存储,因此在函数返回后不再需要此值。若函数失败,则返回值为 0。若函数成功,则返回值为非 0 值。

PQresultAlloc #

PGresult 对象分配辅助存储。

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

若用此函数分配的任何内存,当 res 清除后将被释放。若函数失败,返回值为 NULL。结果得到保证可以为任何类型的适当对齐数据,就像 malloc

PQresultMemorySize #

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

size_t PQresultMemorySize(const PGresult *res);

该值是 malloc 请求的总和与 PGresult 对象关联,也就是说全部内存在通过 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 搭配使用的超时值。