?
This document uses PHP Chinese website manual Release
一如往常,也有一些函數(shù),只是不適合在任何地方
PQfreemem
釋放libpq分配的內(nèi)存
void PQfreemem(void *ptr);
釋放libpq分配的內(nèi)存,尤其是PQescapeByteaConn
,
PQescapeBytea
,PQunescapeBytea
和PQnotifies
。
尤其重要的是,在Windows系統(tǒng)上使用這個(gè)函數(shù),而不是free()
。
這是因?yàn)橹挥挟?dāng)多線程/單線程,發(fā)布/調(diào)試,靜態(tài)/動(dòng)態(tài)標(biāo)志是相同的DLL和應(yīng)用程序時(shí),在一個(gè)DLL中分配內(nèi)存,在應(yīng)用程序工作時(shí)釋放內(nèi)存。
在非Windows平臺(tái)上,這個(gè)函數(shù)與標(biāo)準(zhǔn)庫(kù)函數(shù)free()
相同。
PQconninfoFree
釋放PQconndefaults
或PQconninfoParse
分配的數(shù)據(jù)結(jié)構(gòu)。
void PQconninfoFree(PQconninfoOption *connOptions);
一個(gè)簡(jiǎn)單的PQfreemem
不會(huì)這樣做,因?yàn)閿?shù)組包含對(duì)子字符串的引用。
PQencryptPassword
準(zhǔn)備一個(gè)PostgreSQL密碼的加密形式:
char * PQencryptPassword(const char *passwd,const char *user);
這個(gè)函數(shù)旨在用于那些發(fā)送類似于ALTER USER joe PASSWORD 'pwd'命令的客戶端應(yīng)用程序。
這是一個(gè)很好的方法,這種命令不發(fā)送原始的明文密碼,因?yàn)樗赡鼙槐┞对诿钊罩?,活?dòng)顯示等等。
相反,在發(fā)送前個(gè),使用這個(gè)函數(shù)可以將密碼轉(zhuǎn)換為加密的形式。
這個(gè)參數(shù)在使用中是明文密碼,和用戶的SQL名。返回值是malloc
分配,或超出內(nèi)存時(shí)NULL分配的
字符串。調(diào)用可以認(rèn)為字符串中不包含需要逃逸的特殊字符。當(dāng)使用結(jié)束之后,用PQfreemem
進(jìn)行釋放。
PQmakeEmptyPGresult
用給定的狀態(tài),構(gòu)造一個(gè)空PGresult對(duì)象。
PGresult *PQmakeEmptyPGresult(PGconn *conn,ExecStatusType status);
這是libpq內(nèi)部函數(shù)用于分配和初始化一個(gè)空PGresult對(duì)象。
如果不能分配內(nèi)存,那么這個(gè)函數(shù)返回NULL。
對(duì)一些應(yīng)用程序而言,它可以有效的返回生成的結(jié)果對(duì)象本身(特別是對(duì)象帶有錯(cuò)誤狀態(tài))。
如果conn非空,并且status用于表示一個(gè)錯(cuò)誤,那么指定連接的當(dāng)前錯(cuò)誤信息
被復(fù)制到PGresult中。同時(shí),如果conn非空,那么連接中的
任何事件過程會(huì)被復(fù)制到PGresult中。
(它們不會(huì)獲得PGEVT_RESULTCREATE請(qǐng)求,但會(huì)看到PQfireResultCreateEvents
)。
需要注意的是隨著libpq本身返回PGresult時(shí),對(duì)象最后應(yīng)該請(qǐng)求PQclear
。
PQfireResultCreateEvents
為PGresult對(duì)象中的每個(gè)事件過程觸發(fā)一個(gè)PGEVT_RESULTCREATE事件(參閱Section 31.12)。 成功時(shí)返回非0,否則返回0。
int PQfireResultCreateEvents(PGconn *conn,PGresult *res);
conn被傳送給事件過程,但不會(huì)被直接使用。 如果事件過程不使用它,則會(huì)返回NULL。
已經(jīng)接收到這個(gè)對(duì)象的PGEVT_RESULTCREATE或PGEVT_RESULTCOPY事件的事件過程 不會(huì)被再次觸發(fā)。
這個(gè)函數(shù)與PQmakeEmptyPGResult
分開的主要原因是
它經(jīng)常創(chuàng)建一個(gè)PGresult,并且在調(diào)用事件過程之前就用數(shù)據(jù)對(duì)其進(jìn)行填充。
PQcopyResult
完成一個(gè)PGresult對(duì)象的拷貝。
這個(gè)拷貝不會(huì)以任何方式來連接到資源結(jié)果,并且當(dāng)該拷貝不在需要時(shí),需要調(diào)用PQclear
進(jìn)行清理。
如果函數(shù)失敗,返回NULL。
PGresult *PQcopyResult(const PGresult *src,int flags);
不會(huì)制作一個(gè)明確的拷貝。返回的結(jié)果通常會(huì)是PGRES_TUPLES_OK狀態(tài), 并且不會(huì)拷貝資源中的錯(cuò)誤信息,然而會(huì)拷貝命令狀態(tài)字符串。flags決定 其他需要拷貝的。通常是一個(gè)按位或幾個(gè)flags。 PG_COPYRES_ATTRS聲明復(fù)制源結(jié)果的屬性(列定義)。 PG_COPYRES_TUPLES聲明復(fù)制源結(jié)果的元組(這意味著也復(fù)制屬性。)。 PG_COPYRES_EVENTS聲明復(fù)制源結(jié)果的時(shí)間(但任何實(shí)例關(guān)聯(lián)的數(shù)據(jù)源不會(huì)被復(fù)制。)。
PQsetResultAttrs
設(shè)置PGresult對(duì)象屬性。
int PQsetResultAttrs(PGresult *res,int numAttributes,PGresAttDesc *attDescs);
提供的attDescs被復(fù)制到結(jié)果中。 如果attDescs指針為NULL,或numAttributes小于1, 那么請(qǐng)求將被忽略,并且函數(shù)成功。如果res已經(jīng)有了屬性,那么函數(shù)會(huì)失敗。 如果函數(shù)失敗,會(huì)返回0。如果函數(shù)成功,會(huì)返回非0。
PQsetvalue
設(shè)置PGresult對(duì)象的元組字段值。
int PQsetvalue(PGresult *res,int tup_num,int field_num,char *value,int len);
這個(gè)函數(shù)會(huì)自動(dòng)按需增加結(jié)果的內(nèi)置元組。然而,tup_num參數(shù)必須
小于等于PQntuples
,意味著這個(gè)函數(shù)一次只能增加一個(gè)元組。
但已存在的任意的元組中的任意字段可以以任意順序進(jìn)行調(diào)整。
如果field_num中的一個(gè)值已經(jīng)存在,會(huì)被覆蓋重寫。
如果len是-1,或value是NULL,
字段值會(huì)被設(shè)置為一個(gè)SQL空值。value被復(fù)制到結(jié)果的私有存儲(chǔ)中,
因此函數(shù)返回結(jié)果后就不再需要了。如果函數(shù)失敗,會(huì)返回0。如果函數(shù)成功,會(huì)返回非0。
PQresultAlloc
為PGresult對(duì)象分配子存儲(chǔ)。
void *PQresultAlloc(PGresult *res,size_t nBytes);
當(dāng)res被清理時(shí),該函數(shù)分配的內(nèi)存也會(huì)被釋放掉。
如果喊叔叔失敗,返回NULL。結(jié)果是保證任何類型的數(shù)據(jù)能夠充分對(duì)齊,如同對(duì)malloc
一樣。