30.10. 杂项函数 #
一如往常,总有一些函数不适合放在任何其他地方。
-
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不足以完成此项释放,因为数组还包含指向附属字符串的引用。-
PQencryptPassword# 准备一个PostgreSQL密码的加密形式。
char * PQencryptPassword(const char *passwd, const char *user);
这个函数旨在用于那些希望发送类似于
ALTER USER joe PASSWORD 'pwd'命令的客户端应用。不在这样一个命令中发送原始的明文密码是一个好习惯,因为它可能被暴露在命令日志、活动显示等等中。相反,在发送之前使用这个函数可以将密码转换为加密的形式。参数是明文密码和该密码所属用户的 SQL 名称。返回值是由malloc分配的字符串,如果内存不足则为NULL。调用者可以假定该字符串不包含任何需要转义的特殊字符。用完之后用PQfreemem释放结果。-
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事件(见第 30.12 节)。成功时返回非 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,字段值将被设置为一个 SQLNULL。value会被复制到结果的私有存储中,因此在函数返回之后就不再需要它。如果函数失败,返回值为零;如果函数成功,返回值为非零。-
PQresultAlloc# 为一个
PGresult对象分配附属存储。void *PQresultAlloc(PGresult *res, size_t nBytes);
使用此函数分配的所有内存都会在清除
res时释放。函数失败时返回NULL。与malloc一样,返回的内存保证满足任意数据类型的对齐要求。