版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PostgreSQL數(shù)據(jù)庫(kù)學(xué)習(xí)手冊(cè)之libpq-C庫(kù)—介紹(轉(zhuǎn))[@morc@]
ChapterLlibpq-C庫(kù)
TableofContents
l.k介紹
1.2.數(shù)據(jù)庫(kù)聯(lián)接函數(shù)
1.3。命令執(zhí)行函數(shù)
1.3。1.主過(guò)程
U3。2。為包含在SQL杳詢中逃逸字串
1.3。3.逃逸包含在SQL查ifU中的二進(jìn)制字串
1.3。4。檢索SELECT的結(jié)果信息
1.3.5?檢索SELECT結(jié)果數(shù)值
1。3。6.檢索非一SELECT結(jié)果信息
1.4.異步查詢處理
1.5.捷徑接口
E6。異步通知
1.7.與COPY命令相關(guān)的函數(shù)
1。8。libpq跟蹤國(guó)數(shù)
I。901ibpq控制函數(shù)
1。10。環(huán)境變量
1.H.文件
1.12.線程特性
1.13o制作Libpq程序
1。14。例子程序
1.1。介紹
1ibpq是PosigreSQL的C應(yīng)用程序員的接口.1ibpq是一套允盧客戶程序向PostgreSQL后
端服務(wù)進(jìn)程發(fā)送查詢并且獲得查詢返回的庫(kù)過(guò)程.libpq同時(shí)也是其他幾個(gè)PostgreSQL應(yīng)用接口下
面的引擎,包括libpq++(C++),1ibpgtc1(Tel),Perl,和ecpg.所以如果你使用這些軟件包,
1ibpq某些方面的特性會(huì)對(duì)你非常里要.
本節(jié)末尾有三個(gè)小程序顯示如何利用libpq書(shū)寫程序.在下面目錄里面有幾個(gè)完整的1ibpq應(yīng)用的
例子:
src/test/examp1es
src/bin/psql
使用libpq的前端程序必須包括頭文件libpq-fe.h并且必須與Iibpq庫(kù)鏈接.
PosigreSQL數(shù)據(jù)庫(kù)學(xué)習(xí)手冊(cè)之1ibpq-C庫(kù)——數(shù)據(jù)庫(kù)聯(lián)接函數(shù)(轉(zhuǎn))[@more@]
1.2.數(shù)據(jù)庫(kù)聯(lián)接函數(shù)
下面的過(guò)程處理與PostgreSQL后端服分踞聯(lián)接的事情.?個(gè)應(yīng)用程宇?次可以與多個(gè)后端建立聯(lián)接.
(這么做的原因之一是訪問(wèn)多于一個(gè)數(shù)據(jù)庫(kù).)每個(gè)連接都是用一個(gè)從PQconnectdb(〃&PQsetdbLo
gin()獲得的PGconn對(duì)象表示.注意,這些函數(shù)總是返回一個(gè)非空的對(duì)象指針,除非存儲(chǔ)器少得
連個(gè)PGconn對(duì)象都分配不出來(lái).在把查詢發(fā)送給聯(lián)接對(duì)象之前,可以調(diào)用PQstalu5函數(shù)來(lái)檢查一下聯(lián)
接是否成功.
PQconnectdb與后端數(shù)據(jù)庫(kù)服務(wù)器建立一個(gè)新的聯(lián)接.
PGconn*PQconnectdb(constchar*conninfo)
這個(gè)過(guò)程用從一個(gè)字符串conninfo來(lái)的參數(shù)與數(shù)據(jù)庫(kù)打開(kāi)一個(gè)新的聯(lián)接.與下面的PQsetdbLogin()
不同的是.我們可以不必更換函數(shù)簽名(名字)就可以擴(kuò)展參數(shù)集,所以我們建議應(yīng)用程序中使用這個(gè)函
數(shù)或者是它的非阻塞的相似函數(shù)PQconnectStart和PQconneciPoll.傳入的參數(shù)可以為空,表明
使用所有缺省的參數(shù),或者可以包含一個(gè)或更多個(gè)用空白間隔的參數(shù)設(shè)置.
每個(gè)參數(shù)以關(guān)鍵字=數(shù)值的形式設(shè)置.(要寫?個(gè)空值或者?個(gè)包含空白的值,你可以用?對(duì)單引號(hào)包
圍它們,伊妝口,keyword='avalue,.數(shù)值內(nèi)部的單引號(hào)和反斜扛必須用一個(gè)反斜扛逃逸,也
就是說(shuō),'或.)等號(hào)周圍的空白是可選的.目前可識(shí)刖的參數(shù)鍵字是:
host
要聯(lián)接的主機(jī)(host).如果主機(jī)名以斜扛開(kāi)頭,則它聲明使用Unix域套接字通訊而不是TCP/IP
通訊;該值就是套接字文件所存儲(chǔ)的目錄.缺省時(shí)是與位于/tmp里面的Unix一域套接字聯(lián)接.
hostaddr
與之聯(lián)接的主機(jī)的IP地址。這個(gè)可以是標(biāo)準(zhǔn)的數(shù)字一點(diǎn)的形式,象在BSD函數(shù)inet_aton等里面用的
那樣。如果聲明了一個(gè)非零長(zhǎng)的字符串,那么使用TCP/IP通訊機(jī)制.
使用hostaddr取代host可以讓應(yīng)用避免一次主機(jī)名查找,這一點(diǎn)對(duì)于那些書(shū)■時(shí)間約束的應(yīng)用來(lái)
說(shuō)可能是非常重要的。不過(guò),Kerberos認(rèn)證系統(tǒng)要求主機(jī)(h。st)名。因此,應(yīng)用下面的規(guī)則。如果聲
明了不帶hostaddr的host那么就強(qiáng)制進(jìn)行主機(jī)名查找。如果聲明中沒(méi)有host,hostaddr的
值給出遠(yuǎn)端的地址:如果使用了Kerberos,將導(dǎo)致一次反向名字查詢.如果同時(shí)聲明了h。st和h
usIadd1,除非使用了KeIbe1us,否則帶使用husluddr的值作為遠(yuǎn)端地址;h。sl的值將被忽略,
如果使用了Kerberos,host的值用于Kerberos認(rèn)證。要注意如果傳遞給libpq的主機(jī)名(ho
st)不是地址hostaddr處的機(jī)涔名,那么認(rèn)證很有可能失敗。
如果主機(jī)名(host)和主機(jī)地址都沒(méi)有,那么libpq將使用一個(gè)本地的Unix域套接字進(jìn)行通訊。
port
主機(jī)服務(wù)器的端口號(hào),或者在Unix域套接字聯(lián)接時(shí)的套接字?jǐn)U展文件名.
dbname
數(shù)據(jù)庫(kù)名.
user
要聯(lián)接的用戶名。
Password
如果后端要求口令認(rèn)證,所用的口令.
conncct_timcout
給連接過(guò)程設(shè)置的時(shí)間范圍,以秒計(jì)。零或者不設(shè)置表示無(wú)窮。
options
發(fā)給后端的跟蹤/調(diào)試選項(xiàng).
tty
文件或控制臺(tái)(tty),用于從后端的可選調(diào)試輸出.
requiressl
設(shè)為要求與后端進(jìn)行SSL聯(lián)接.如果股務(wù)器不支持SSL,那么Libpq將馬上拒絕聯(lián)接.設(shè)置
為’0'(映?。┡c服務(wù)器進(jìn)行協(xié)商.
如果有任何沒(méi)有聲明的參數(shù),那么將檢查對(duì)應(yīng)的環(huán)境變量(參閱Section1.10小節(jié)).如果環(huán)境變玨也
沒(méi)有設(shè)置,那么使用編譯時(shí)的硬代碼.返回的值是一個(gè)指向代表與后端聯(lián)接的抽象struct指針。
*
PQsetdbUgin與后端數(shù)據(jù)庫(kù)服務(wù)器建立一個(gè)新的聯(lián)接.
PGconn*PQsetdbLogin(constchar*pghost,
constchar*pgport,
constchar*pgoptions,
constchar*pgtty?
constchar*dbName,
constchar*1ogin,
constchar*pwd)
這個(gè)函數(shù)是PQconnecidb前身,它有固定個(gè)數(shù)的參數(shù),但是有相同的功能.
*
PQsetdb與后端數(shù)據(jù)庫(kù)服務(wù)器建立一個(gè)新的聯(lián)接.
PGconn*PQsetdb(char*pghast,
char*pgport,
char*pgoptions,
char*pgtty,
char*dbNamc)
這是一個(gè)調(diào)用PQsetdbLogin()的宏,只是login和pwd參數(shù)用空(null)代替.提供這個(gè)
函數(shù)主要是為了與老版本的程序兼容.
*
PQconncctStart,PQconncctP3l1與數(shù)據(jù)庫(kù)服務(wù)卷建立?詼非阻塞的聯(lián)接。
PGconn*PQconnectStart(constchar+conninfo)
PostgreSQI.PoIlingStatusTypePQconnectPol1(PGconn*conn)
這兩個(gè)過(guò)程用于打開(kāi)一個(gè)與數(shù)據(jù)庫(kù)服務(wù)器之間的非阻塞的聯(lián)接:你的應(yīng)用的執(zhí)行線索在執(zhí)行它的時(shí)候不會(huì)
因遠(yuǎn)端的I/O而阻塞。
數(shù)據(jù)庫(kù)聯(lián)接是用從conninf。字符串里取得的參數(shù)傳遞給PQc。nnectStart進(jìn)行的。這個(gè)字符申
的格式與上面PQconncctdb里描述的樣。
PQconnectStart和PQconnectPo11都不會(huì)阻塞(進(jìn)程),不過(guò)有一些條件:
必須正確提供hostaddr441host參數(shù)以確保不會(huì)發(fā)生止向或者反向的名字查找。參閱上面HQconnect
db里的這些參數(shù)的文檔獲取細(xì)節(jié)。
如果你調(diào)用了PQtrace,確保你跟蹤進(jìn)入的流對(duì)象不會(huì)阻塞。
你必須在調(diào)用PQconnectPoll之前確保socket處于正確的狀態(tài),象下面描述的那樣。
要開(kāi)始(聯(lián)接)?調(diào)用conn=PQconnectStart(*connection_info_string*).如果conn是N
ULL,表明libpq無(wú)法分配一個(gè)新的PGconn結(jié)構(gòu)。否則,返PJ一個(gè)It效的PGconn指針(盡管還不一
定代表一個(gè)與數(shù)據(jù)庫(kù)有效聯(lián)接)。PQconnectStart一返回,調(diào)用status-PQstatus(conn)如果stat
us等于CONNECTION_BAD,PQconnectStart失敗。
如果PQconneclSlari成功了,下一個(gè)階段是輪詢1ibpq,這樣它就可以繼續(xù)進(jìn)行后繼的聯(lián)接動(dòng)作。象
這樣循環(huán):認(rèn)為一個(gè)聯(lián)接缺省時(shí)是‘不活躍”的.如果PQconnectPoll的最后一個(gè)返回是PGRE
S_POLLING_ACTIVE,則認(rèn)為它是“活躍的"。如果PQconnectPolI(conn)的最后一個(gè)返回是P
GRESPOLLINGREADING,執(zhí)行一個(gè)對(duì)PQsockct(conn)的讀sclect().如果最后一個(gè)返回是PG
RES.POLLINGWRITING,執(zhí)行一個(gè)對(duì)PQs。cket(conn)的寫select().如果還要調(diào)用PQconn
ectPoll,也就是調(diào)用完P(guān)Qconnectstart之后,把它當(dāng)作最后返回PGRES一POLL1NG_WRITING那樣對(duì)
待。如果select。顯示sockel已經(jīng)準(zhǔn)備好,那么認(rèn)為它是“活躍的”。如果認(rèn)為一個(gè)聯(lián)接是”
活躍的",再次調(diào)用PQconnectPolI(conn)o如果這次調(diào)用返回PGRES_POLLING_FAILED,聯(lián)接
過(guò)程失敗,如果這次調(diào)用返回PGRES.POLLING_0K,聯(lián)接成功。
要注意上面用sol。ct0來(lái)確保一個(gè)socket準(zhǔn)備好只是一個(gè)(近似)的例子;還可以用其他方法,
比如一個(gè)pol1。調(diào)用,來(lái)代替select。
在聯(lián)接的任意時(shí)刻,我們都可以通過(guò)調(diào)用PQstatus來(lái)檢查聯(lián)接的狀態(tài)。如果這是CONNECTION_BAD,
那么聯(lián)接過(guò)程失敗:如果是CONNECTION0K,那么聯(lián)接已經(jīng)做好。這兩種狀態(tài)同樣也可以從上面的K
connectPoll的返回值里檢測(cè)到。其他狀態(tài)可能(也只能)在一次異步聯(lián)接過(guò)程中看到。這些標(biāo)識(shí)聯(lián)接
過(guò)程的當(dāng)前狀態(tài),因而可能對(duì)給用戶提供反饋有幫助。這些狀態(tài)可能包括:
CONNECTIONSTARTED
等待進(jìn)行聯(lián)接。
CONNECTIONMADE
聯(lián)接成功:等待發(fā)送.
CONNECTION_AWAIT1NG_RESPONSE
等待來(lái)fl服務(wù)器的響應(yīng)。
CONNECTION_AUTH_OK
己收到認(rèn)證;等待聯(lián)接啟動(dòng)繼續(xù)進(jìn)行。
CONNECTION.SETENV
協(xié)商環(huán)境(聯(lián)接啟動(dòng)的一部分)。
注意,盡管這些常量將保持下去(為了維持兼容性),應(yīng)用決不應(yīng)該依賴于這些常量的某種特定順序,或
者是根本不應(yīng)依賴r這些常量,或者是不應(yīng)該依賴:這些狀念總是某個(gè)義檔聲明的值。一個(gè)應(yīng)用可能象
象下面這樣:
switch(PQstatus(conn))
(
caseC0NNECTI0N_STARTED:
feedback=*Connecting....*:
break;
caseCONNECTIONMADE:
feedback="Connected1oserver。..”;
break;
defau1t:
feedback="Connecting..?
)
要注意如果PQconnectStart返回一個(gè)非空的指針,你必須在使用完它(指針)之后調(diào)用PQfinish,
以處理那些結(jié)構(gòu)和所有相關(guān)的存儲(chǔ)塊。甚至調(diào)用PQconnectStart或者PQconnectPo11失敗時(shí)也
要這樣處理。
如果編譯libpq時(shí)定義了USE_SSL那么目前的PQconnectPoll將阻塞住。這個(gè)限制可能在將
來(lái)的版本移除.
這些函數(shù)把socket置于一個(gè)非阻塞的狀態(tài),就好象調(diào)用了PQsetnonb1ocking一樣。
*
PQconndefaults返向缺省的聯(lián)接選項(xiàng)。
PQconninfoOption*PQconndefau1ts(void)
structPQconninfoOption
(
char*keyword:/*Thekey*ordoftheoption*/
char*envvar:/*Fai1backenvironmentvariablename*/
char*compiled:/*Fa1IbackcompiledindefauItva1ue*/
char*vaI;/*Option'scurrentvalue,orNULL?/
char*label;/*Labelforfieldinconnectdialog*/
char+dispchor;/*Charoctertodisplayforthisfield
inaconncctdialog。Valuesare:
”"Displayenteredvalueasis
"*"Passwordfield-hidevalue
"D"Debugoption-don'tshowbydefault*/
intdispsize:/*Fie1dsizeincharactersfordialog*/
)
返回聯(lián)接選項(xiàng)結(jié)構(gòu)的地址.可以用于獲取所有可能的PQconnectdb選項(xiàng)和它們的當(dāng)前缺省值.返回值
指向一個(gè)PQconninfoOplionstruct的數(shù)組,該數(shù)組以一個(gè)有NULL關(guān)鍵字指針的條目結(jié)
束.注意缺省值(val域)將依賴于環(huán)境變量和其他上下文.調(diào)用者必須把聯(lián)接選項(xiàng)當(dāng)作只讀對(duì)待.
在處理完選項(xiàng)數(shù)組后,把數(shù)組交給PQconninfoFree()糅放.如果沒(méi)有這么做,每次調(diào)用PQc。nndefa
ults()都會(huì)有一小部分內(nèi)存泄漏.
在PostgreSQL7。0以前的版本,PQconndefau1ts()返回一個(gè)指向群態(tài)數(shù)組的指針,而不是一
個(gè)動(dòng)態(tài)分配的數(shù)組.這樣做是線程不安全的,因此這個(gè)特點(diǎn)被修改了.
*
PQfinish關(guān)閉與后端的聯(lián)接.同時(shí)糅放被PGconn對(duì)象使用的存儲(chǔ)器.
voidPQfinish(HGconn*conn)
注意,即使與后端的聯(lián)接嘗試失敗(可由PQstatus判斷),應(yīng)用也要調(diào)用PQfinish釋放被PGeon
n對(duì)象使用的存儲(chǔ)器.不應(yīng)該在調(diào)用PQfinish后再使用PGconn指針.
PQresel重置與后端的通訊端口.
voidPQreset(PGconn*conn)
此函數(shù)將關(guān)閉與后端的聯(lián)接并且試圖與同一個(gè)服務(wù)器重建新的聯(lián)接,使用所有前面使用過(guò)的參數(shù).這在失
去工作聯(lián)接后進(jìn)行故障恢復(fù)時(shí)很布?用.
PQresetSiartPQreseiPoll以非阻塞模式重置與后端的通訊端口。
intPQresetStart(PGconn*conn);
PostgreSQLPol1ingStatusTypePQresetPol1(PGconn*conn);
此函數(shù)將關(guān)閉與后端的聯(lián)接并且試圖與同一個(gè)服務(wù)器重建新的聯(lián)接,使用所有?前面使用過(guò)的參數(shù).這在失
去工作聯(lián)接后進(jìn)行故障恢且時(shí)很有用.它們和上面的PQreset的區(qū)別足它們工作在非阻塞模式。這些
函數(shù)的使用有與上面PQconneclStarl和PQconnectPoll一樣的限制.
調(diào)用PQresetSlari。如果它返回0,那么重置失敗。如果返回1,用與使用PQc。nneclPoll建立
聯(lián)接的同樣的方法使用PQresetPo11重置聯(lián)接。
1ibpq應(yīng)用程序員應(yīng)該仔細(xì)維護(hù)PGc。nn結(jié)構(gòu).使用下面的訪問(wèn)由數(shù)來(lái)荻取PGconn的內(nèi)容.避免直接引
用PGconn結(jié)構(gòu)里的字段,因?yàn)檫@些字段在今后可能被改變.(從PostgreSQL版本6.4開(kāi)始,struct
PGconn的定義甚至沒(méi)有放在libpq-fe.h里.如果你有一些直接訪問(wèn)PGconn數(shù)據(jù)域的舊代碼,你
可以通過(guò)包含libpq-inteh來(lái)訪問(wèn)它們,但我們鼓勵(lì)你趕快修改那些代碼.)
PQdb返回聯(lián)接的數(shù)據(jù)庫(kù)名.
char*PQdb(constPGconn*conn)
PQdb和下面幾個(gè)函數(shù)返回聯(lián)接時(shí)建立起來(lái)的幾個(gè)值.這些值在PGconn對(duì)象的生存期內(nèi)是固定的.
*
PQuser返回聯(lián)接的用戶名.
char*PQuser(constP二conn*conn)
*
PQpass返回聯(lián)接的口令.
char*PQpass(constPGconn*conn)
*
PQhost返回聯(lián)接的服務(wù)器主機(jī)名.
char*PQhost(constPGconn*conn)
*
PQport返叵1聯(lián)接的端口號(hào).
char*PQport(constPGconn*conn)
女
PQtty返回聯(lián)接的調(diào)試控制臺(tái)(tty).
char*PQtiy(constFGeonn*conn)
*
PQoptions返回聯(lián)接中使用的后端選項(xiàng).
char*PQoptions(constPSconn*conn)
*
PQstatus返回聯(lián)接的狀態(tài).
ConnStatusTypePQstatus(constPGconn*conn)
這個(gè)狀態(tài)可以是一些值之一.不過(guò),如果不是一次異步聯(lián)接過(guò)程的話,我們只能看到其中的兩個(gè)-CON
NLCT10N_OK或CONNECTION_BAD?一個(gè)與數(shù)據(jù)庫(kù)的成功的聯(lián)接返回狀態(tài)CONNECTIONOK。一次
失敗的企圖用狀態(tài)CONNECTION^BAD標(biāo)識(shí).通常,一個(gè)0K狀態(tài)保持到PQfinish,但是一個(gè)通訊失
敗可能會(huì)導(dǎo)致?tīng)顟B(tài)過(guò)早地改變?yōu)镃3NNECTION_BAD。這時(shí)應(yīng)用可以試著調(diào)用PQreset來(lái)恢復(fù).
參閱PQconnectStart■和PQ,onnectPoll條目看看可能出現(xiàn)的其他的狀態(tài)碼。
*
PQcrrorMessage返回聯(lián)接中操作產(chǎn)生的最近的錯(cuò)誤信息.
char*PQerrorMcssage(c3nsiPGconn*conn);
幾乎所有1ibpq函數(shù)在失敗時(shí)都會(huì)設(shè)置PQerrorMessage,注意libpq的傳統(tǒng)是,一個(gè)非空的
PQerrorMessage將在結(jié)尾包含一■個(gè)新行.
*
PQbackendPID返回控制此聯(lián)接的后端服務(wù)器的進(jìn)程號(hào)ID.
intPQbackendPID(constPGconn*conn);
這個(gè)后端PID在調(diào)試和對(duì)比NOTIFY信息(包含發(fā)出通知的后端的PID)時(shí)很有用.注意該P(yáng)ID
屬于運(yùn)行數(shù)據(jù)庫(kù)服務(wù)器的主機(jī)的進(jìn)程,而不是本地主機(jī)!
*
PQgetssl返回聯(lián)接使用的SSL結(jié)構(gòu),或者如果SSL沒(méi)有使用的話返回NULL.
SSL*PQgetss1(constPGconn*conn);
這個(gè)結(jié)構(gòu)可以用于核實(shí)加密級(jí)別,檢查服務(wù)器認(rèn)證等信息.參考SSL文檔獲取關(guān)于這個(gè)結(jié)構(gòu)的更多信
息.
為了獲取這個(gè)函數(shù)的原形,你必須定義USESSL.這樣做會(huì)自動(dòng)包含來(lái)自O(shè)penSSL的ssl.h.
PostgreSQL數(shù)據(jù)庫(kù)學(xué)習(xí)手冊(cè)之1ibpq-C庫(kù)命令執(zhí)行函數(shù)(轉(zhuǎn))[加。re@]
1.3。命令執(zhí)行函數(shù)
一旦與數(shù)據(jù)庫(kù)服務(wù)器的聯(lián)接成功建立,便可用這里描述的函數(shù)執(zhí)行SQL杳詢和命令。
103.1.主過(guò)程
PQexec給股務(wù)器提交一條命令并且等待結(jié)果.
PGresuit*PQexec(PGconn*conn,
constchar*query);
返回一個(gè)PGresu"指針或者也可能是一個(gè)NULL指針.通常返回一個(gè)非空(non—NUUJ的指針,除
非沒(méi)有內(nèi)存或發(fā)生了象不能把命令發(fā)送到后端這樣的嚴(yán)重錯(cuò)誤.如果返回的是NULL,它應(yīng)該被當(dāng)作
PGRESJ'ATAL_ERROR結(jié)果處理.用PQerrorMessage獲取有關(guān)錯(cuò)誤的更多信息.
PGresull結(jié)構(gòu)封裝了后端返回的結(jié)果.1ibpq應(yīng)用程序員應(yīng)該仔細(xì)睢護(hù)PGresull抽象.用下面的訪
問(wèn)函數(shù)來(lái)獲取PGresu晨的內(nèi)容避免直接引用PGresu1t結(jié)構(gòu)的數(shù)據(jù)域,因?yàn)檫@個(gè)結(jié)構(gòu)可能會(huì)在未
來(lái)被改變.(從PostgreSQL版本6。4開(kāi)始,structPGre$u1t的定義甚至都沒(méi)有放在
libpq—fe。h里.如果你有一些直接訪問(wèn)PGresuit數(shù)據(jù)域的老代碼,你可以通過(guò)包含1ibpq-int.h
繼續(xù)使用它們,但是我們鼓勵(lì)你立刻修改代碼.)
*
PQresuItStatus返回命令的結(jié)果狀態(tài).
ExecStatusTypePQresultStatus(constPGresu1t*res)
PQresultStatus可以返回F面數(shù)值之一:
o
PGRES_EMPTY_QUERY一一發(fā)送給后端的字串是空的
o
PGRES_COMMAND_OK——成功完成一個(gè)沒(méi)有返回?cái)?shù)據(jù)的命令
n
PGRES_TUPLES_OK——成功執(zhí)行查詢
o
PGRES?COPY_OIT—(從服務(wù)器)CopyOut(拷貝出)數(shù)據(jù)傳輸開(kāi)始
o
PGRESCOPYJN一一CopyIn(拷貝入)(到服務(wù)器)數(shù)據(jù)傳輸開(kāi)始
PGRES_BAD_RESPONSE一一服務(wù)器的響應(yīng)無(wú)法理解
PGRES_NONFATAL_ERROR
o
PGRES_FATAL_ERROR
如果結(jié)果狀態(tài)是PGRESTUPLESOK,那么可以用下面的過(guò)程從查詢的返回中抽取元組信息.注意一個(gè)
碰巧檢索了零條元組的SELECT仍然顯示PGRESTUPLESOK。PGRESCOVMAND_OK用于不返
回元組的命令(NSERT,UPDATE,等)。返回PGRES_EMPTY_QUERY的響應(yīng)通常意味著客戶端軟件
里面的臭蟲(chóng)。
PQresStatus把PQrcsultStatus返網(wǎng)的枚舉類型轉(zhuǎn)換成?個(gè)描述狀態(tài)碼的字符串常成。
char*PQresStatus(ExecStatusTypestatus);
PQresuItErrorMessage返回與查詢關(guān)聯(lián)的錯(cuò)誤信息,或在沒(méi)有錯(cuò)誤時(shí)返回一個(gè)空字符串.
char*PQresultErrorMessage(constPGresu1t*res);
緊跟在一個(gè)PQexec或PQgetResult調(diào)用后面,PQerrorMessage(對(duì)聯(lián)接)將返回與PQresu
ItErrorMessage(對(duì)結(jié)果)一樣的字符串.不過(guò),一個(gè)PGresult將保芍其錯(cuò)誤信息直到被刪除,而連結(jié)
的錯(cuò)誤信息將在后續(xù)的操作完成時(shí)被改變.當(dāng)你想知道與某個(gè)PGresult相關(guān)聯(lián)的狀態(tài)時(shí)用PQresult
ErrorMessage;當(dāng)你想知道與聯(lián)接的最近一個(gè)操作相關(guān)聯(lián)的狀態(tài)時(shí)用PQerrorMessage:
PQelpar釋放于PCr。suit相關(guān)聯(lián)的存儲(chǔ)空間任何不再需要的杳詢結(jié)果在不需要的時(shí)候都應(yīng)該用
PQc1ear釋放掉.
voidPQC1ear(PQresu1t*res):
你可以保留PGresult對(duì)象任意長(zhǎng)的時(shí)間:當(dāng)你提交新的查詢時(shí)它并不消失,甚至你斷開(kāi)聯(lián)接后也是
這樣.要?jiǎng)h除它,你必須調(diào)用PQclear.不這么做將導(dǎo)致前端的存儲(chǔ)器泄漏.
*
PQmakeEmptyPGresult構(gòu)造一個(gè)給出狀態(tài)的為空的PGresuIt對(duì)象.
PGresult*PQmakeEmptyPGresult(PGconn*conn,ExecStatusTypestatus):
這是libpq的內(nèi)部過(guò)程,用于分配和初始化一個(gè)空PGresu1t對(duì)象.它被輸出是因?yàn)橐恍?yīng)用需要自
行生成結(jié)果對(duì)象(尤其是特定的帶有錯(cuò)誤狀態(tài)的對(duì)象).如果conn非空(NILL)并且狀態(tài)指示一個(gè)錯(cuò)誤,
聯(lián)接當(dāng)前的錯(cuò)誤信息被拷貝到PGresult.注意最終對(duì)該對(duì)象要調(diào)用PQc】ear,正如1ibpq本身返回的P
Gresu1t一樣.
1.3。2.為包含在SQL查詢中逃逸字串
PQescapoString為在SQL查詢中使用逃逸一個(gè)字串.
size_tPQescapeString(char*to,constchar*from,size_tlength):
如果你需要在查詢字串中包含一個(gè)從不可靠的源頭接收的字串(比如,它們是隨機(jī)用戶輸入的),那么,出
于安全原因,你不能把它們自按包含在SQL食詢里.你應(yīng)該把特殊字符引起來(lái),否則它們就會(huì)被SQL分
析器代換.
PQcscapcString執(zhí)行這個(gè)操伶.fr。m指向?qū)⒁右莸淖执牡?個(gè)字符,】cngth參數(shù)計(jì)算在這
個(gè)字串里的字符數(shù)量(字串結(jié)尾的字節(jié)零不是必須的,也不計(jì)入長(zhǎng)度).to應(yīng)該指向一個(gè)緩沖區(qū),這個(gè)緩沖
區(qū)至少能保存length數(shù)值的兩倍還多一個(gè)的字符,否則該函數(shù)行為洛不可預(yù)測(cè).調(diào)用Ncscape
String就會(huì)把逃逸的from字串轉(zhuǎn)換到I。緩沖區(qū),把特殊字符替換掉以免發(fā)生意外,并且追加終止的
字節(jié)零.那些必須包圍在P。sigreSQL字串文本周圍的單引號(hào)不算結(jié)果字串的一部分.
PQescapeString返回寫到to甲.面的字符數(shù)凡不包括結(jié)尾的字節(jié)零.如果to和from字串相
互垂登,那么其行為不可預(yù)測(cè).
1.3。3.逃逸包含在SQL式諭中的二進(jìn)制字串
PQescapeBytea逃逸那些在S2L查詢中使用二進(jìn)制字串(bylea類型).
unsignedchar*PQescapeBytea(constunsignedchar*from,
size_tfrom_1ength,
size_t*tolength);
在SQL語(yǔ)句中用做BYTEA字串文本的一部分的時(shí)候,有些ASCII字符必需被逃逸(但是對(duì)于所有
字符而言是可以逃逸).通常,要逃逸一個(gè)字符,它是被轉(zhuǎn)換成一個(gè)三位八進(jìn)制數(shù)字,該數(shù)字?jǐn)?shù)值等于相
應(yīng)的十進(jìn)制ASCII數(shù)值,然后前綴兩個(gè)反斜扛.單引號(hào)(‘)和反斜扛字符0有白己特殊的逃逸序列.參
閱用戶手冊(cè)獲取更多信息.PQescapeBytea執(zhí)行這個(gè)操作,它只逃逸需要逃逸的最少的字符.
from參數(shù)指向需要逃逸的字串由第?個(gè)字符,from_]ength參數(shù)反映在這個(gè)二進(jìn)制字串(那種
字節(jié)零既不必要也不計(jì)算在內(nèi)的字串)里字符的個(gè)數(shù).tolength參數(shù)應(yīng)該是一個(gè)指向某個(gè)緩沖區(qū)的指
針,它的空間應(yīng)該能夠保存逃逸后的結(jié)果宇出K度.結(jié)果宇申K度不包括結(jié)果結(jié)尾的字節(jié)零.
PQescapeBytea返回一個(gè)from參數(shù)的二進(jìn)制字串的逃逸后的版本,返回給調(diào)用者提供的緩沖區(qū).返
回的字串已經(jīng)把所有特殊的字符替換調(diào)了,這樣他們就可以由PosigreSQL的字串文本分析器以及
bytea的輸入函數(shù)正確地處理.同時(shí)還追加了一個(gè)結(jié)尾的字節(jié)零.那些必需包圍在P。stgreSQL字串文
本周圍的單引號(hào)不兌結(jié)果字串的部分.
PQunescapeBytea把一個(gè)二進(jìn)制數(shù)據(jù)的逃逸后的字串表現(xiàn)形式轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)-PQcscapeBy
tea的反作用.
unsignedchar*PQunescapeBytea(constunsignedchar*from,size_t*to_length):
from參數(shù)指向一個(gè)逃逸后的字串,比如PQgclvaluo從一個(gè)BYTEA字段返PI的.PQunescapcBytca
把它的字串表現(xiàn)形式轉(zhuǎn)換成一進(jìn)制形式,填充到一個(gè)緩沖區(qū).它返回一個(gè)指向該緩沖區(qū)的指針,若為N
ILL則出錯(cuò),緩沖區(qū)的尺寸放在to」englh里.該指針隨后可以用做free(3)的參數(shù).
1.3。4,檢索SELECT的結(jié)果信息
*
PQntup1es返網(wǎng)查詢結(jié)果里的元組(元組)個(gè)數(shù).
intPQntup1es(constPGresuIt*res);
*
PQnfields返回查詢結(jié)果里每個(gè)元組的數(shù)據(jù)域(字段)的個(gè)數(shù).
intPQnfields(constPGresult*res);
*
PQfname返回與給出的數(shù)據(jù)域編號(hào)相關(guān)聯(lián)的數(shù)據(jù)域(字段)的名稱.數(shù)據(jù)域編號(hào)從0開(kāi)始
char*PQfname(constPGresult*res,
intfield_index);
?
PQfnumber返網(wǎng)與給出的數(shù)據(jù)域名稱相關(guān)聯(lián)的數(shù)據(jù)域(字段)的編號(hào).
intPQfnumber(constPGresuit*res,
constchar*fie1d_name):
如果給出的名字不H配任何域,返回一L
*
PQftype返回與給定數(shù)據(jù)域編號(hào)關(guān)聯(lián)的數(shù)據(jù)域類型.整數(shù)返回值是一個(gè)該類型的內(nèi)部編碼.數(shù)據(jù)域編號(hào)從0
開(kāi)始.
OidPQftype(constPGresult*res,
intfieI<1_index);
你可以查詢系統(tǒng)表pgtype以獲取各種數(shù)據(jù)類型的名稱和屬性。內(nèi)建的數(shù)據(jù)類型的OID在源碼樹(shù)的
src/include/catalog/pg_type.h文件里定義。
*
PQfmod返回與給定數(shù)據(jù)域編號(hào)相關(guān)聯(lián)的類型相關(guān)的修正數(shù)據(jù)(??).數(shù)據(jù)域編號(hào)從0開(kāi)始.
intPQfmod(constPGresult*res,
intfield_index);
*
PQfsize返回一個(gè)PGresult里面的一條元組的單獨(dú)的一個(gè)數(shù)據(jù)域(字段)的值.元組和數(shù)據(jù)域編號(hào)從
0開(kāi)始.
intPQfsize(constPGresu1t*res,
intfield_index);
PQfsize返回在數(shù)據(jù)庫(kù)元組里面給該數(shù)據(jù)域分配的空間,換句話說(shuō)就是該數(shù)據(jù)類型在服務(wù)器里的二進(jìn)制
形式的大小(尺寸).如果該數(shù)據(jù)域是可變尺寸,返同-1.
*
PQbinaryTuples如果PGresult包含二進(jìn)制元組數(shù)據(jù)時(shí)返回1,如果包含ASCII數(shù)據(jù)返回0.
intPQbinaryTupies(constPGresult*res):
目前,二進(jìn)制元組數(shù)據(jù)只能從一個(gè)二進(jìn)制游標(biāo)里抽取數(shù)據(jù)的杳詢返回.
1.3.5.檢索SELECT結(jié)果數(shù)值
*
PQgetvalue返回一個(gè)PGresu1t里面一個(gè)元組單獨(dú)的一個(gè)數(shù)據(jù)域(字段)的值.元組和數(shù)據(jù)域編號(hào)
從0開(kāi)始.
char*PQgetvalue(constPGresult*res,
inttupnum,
intfield_num):
對(duì)大多數(shù)查詢而言,PQgetvalue返回的值是一個(gè)表示字段值的空(NULL)結(jié)尾的字符串.但是如果
PQbinaryTuples()為1,PQgetvalue返回的值就是該類型在后端服務(wù)器內(nèi)部的二進(jìn)制表現(xiàn)形式
(但是不包括尺寸字一一如果數(shù)據(jù)域是變長(zhǎng)的).這樣,把數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)的C類型就是程序員的貴任
了.PQgelvalue返回的指針指向一個(gè)本身是PGresult結(jié)構(gòu)的一部分的存儲(chǔ)區(qū)域,我們不能更改它,
并且如果我們要在PGresult結(jié)構(gòu)的生存期后還要使用它的話,我們必須明確地把該數(shù)值拷貝到其他存
儲(chǔ)器中.
*
PQgetisnull測(cè)試一個(gè)數(shù)據(jù)域是否為空(NULL).元組和數(shù)據(jù)域編號(hào)從0開(kāi)始.
intPQgetisnu11(constPGresult*res,
inttup_num,
intficldnum);
如果該域包含NULL,函數(shù)返回1,如果包含非空(non-null)值,返回0.(注意,對(duì)一個(gè)NULL數(shù)
據(jù)域,PQgetvalue將返回一個(gè)空字符串,不是一個(gè)空指針.)
*
PQ百etlength返回以字節(jié)計(jì)的數(shù)據(jù)域(字段)的長(zhǎng)陵.元組和數(shù)據(jù)域編號(hào)從0開(kāi)始.
intPQgct1cngth(constPGrcsult*res,
inttup_num,
intfic1d_num):
這是某一特定數(shù)據(jù)值的實(shí)際數(shù)據(jù)長(zhǎng)度,也就是由PQgelvalue指向的對(duì)裂的尺寸.注意,對(duì)?于ASCII表
示的數(shù)值,這個(gè)尺寸與PQfsize報(bào)告的二進(jìn)制尺寸無(wú)關(guān).
*
PQprint向指定的輸出流打印所有的元組和(可選的)字段名稱.
voidPQprint(FILE*foul,/*outputstream*/
constPGresult*res.
constPQprintOpt?po);
struet{
pqboo1header;/*printoutputfieldheadingsandrowcount?/
pqboola1ign;/*fi11a1ignthefields*/
pqbooIstandard:/?oldbraindeadformat*/
pqboolhtml3;/*outputhtmlIables*/
pqboolexpanded;/*expandtab1es*/
pqboolpager;/*usepagerforoutputifneeded*/
char*ficldScp;/*fieIdscparator*/
char*tableOpt;/*inSerttoHTMLtable..?*/
char*caption;/*HTMLcaption*/
char**fieldName:/*nullterminatedarrayofrep1acementfie1dnames*/
}PQprintOpt;
這個(gè)函數(shù)以前被psql用于打印查詢結(jié)果,但是現(xiàn)在已經(jīng)不用這個(gè)函數(shù)了,并且此函數(shù)不再有活躍的支
持。
1。3。6.檢索非-SELECT結(jié)果信息
*
PQcmdStatus返回產(chǎn)生PGresuit的SQL命令的命令狀態(tài)字符串.
char*PQcmdStatus(PGrcsuit*res);
*
PQcmdTuples返回被SQL命令影響的行的數(shù)量.
char*PQcmdTupIes(PGresult*res):
如果產(chǎn)生PGresult的SQL命令是INSERT,UPDATE或DELETE這里返回涉及行的行數(shù).如果是
其他命令返向一個(gè)空字符串.
*
PQoidValue返回一個(gè)插入的元組的對(duì)象標(biāo)識(shí)(0ID)一—如果SQL命令是INSERT.否則,返回
InvalidOid.
OidPQoidValue(constPGresult*res);
如果你包含了1ibpq頭文件,那么Oid和常量InvalidOid的類型將被定義。他們都是某種整型
類型。
PQoidStatus返回一個(gè)被插入的元組的對(duì)象標(biāo)識(shí)的字筆,如果SQL命令是INSERT。否則,返
回一個(gè)空字串
char*PQoidStatus(constPGresuIt*res);
因?yàn)橛?了PQoidValue,我們不建議使用這個(gè)函數(shù),而且它在線程里使用也是不安全的
PostgrcSQL數(shù)據(jù)庫(kù)學(xué)習(xí)手冊(cè)之1ibpq-C庫(kù)一一異步查詢處理(轉(zhuǎn))[flmore@]
1.4。異步查詢處理
PQexec函數(shù)對(duì)簡(jiǎn)單的同步應(yīng)用里提交命令已經(jīng)是足夠用的了.但是它卻有幾個(gè)主要的缺陷:
*
PQexcc等待命令結(jié)束.應(yīng)用可能有其他工作要做(例如維護(hù)用戶界面),這時(shí)它可不希望阻塞在這里等待返
回.
因?yàn)榭刂剖遣卦赑Qexec內(nèi)部,前端很難取消掉正進(jìn)行著的命令.(可以通過(guò)信號(hào)控制器進(jìn)行,但沒(méi)有別的方
法.)
PQexec只能返回一個(gè)PGresuIt結(jié)構(gòu).如果提交的命令字符串包含多個(gè)SQL命令,除了最后一個(gè)PGr
esuit以外都會(huì)被PQexec丟棄.
不想受到這些限制的應(yīng)用可以改用下面的函數(shù),這些函數(shù)也是構(gòu)造PQexec的函數(shù):PQsendQuery
和PQgetResu1to
使用這些(異步)功能以及PQputline和PQputnbytes的老?些的程序可能在等待數(shù)據(jù)發(fā)送給
后端時(shí)阻塞住,為解決這樣的問(wèn)題,增加了函數(shù)PQsetnonblocking.
舊應(yīng)用可以忽略PQsetnonblocking的使用,維持原有的阻塞特征。新的程序可以利用NseIn。n
biocking獲得與后端完全非阻塞的聯(lián)接。
PQsetnonblocking把該聯(lián)接的狀態(tài)設(shè)置為非阻塞.
intPQsctnonblocking(PG20nn*conn,intarg)
如果arg為TRUE,把聯(lián)接狀態(tài)設(shè)置為非阻塞,如果arg為FALSE,把聯(lián)接狀態(tài)設(shè)置為阻塞.如果0
K返回0,如果錯(cuò)誤返回一1.此函數(shù)將確保對(duì)
在非阻塞狀態(tài),調(diào)用PQputline,PQputnbytes,PQsendQuery和PQendcopy的時(shí)候不被阻塞,
而是如果需要再次它們時(shí)將是返回一個(gè)錯(cuò)誤「而不是阻塞)。
當(dāng)把一個(gè)數(shù)據(jù)庫(kù)的聯(lián)接設(shè)置為非阻塞的模式并且調(diào)用了PQexec,它將呼時(shí)把聯(lián)接狀態(tài)設(shè)置,為阻塞模式
直到PQexcc完成.
在不久的將來(lái)將有更多的libpq會(huì)設(shè)計(jì)成在PQSetn0nbloCking方式下是安全的。
PQisnonb1ocking返回?cái)?shù)據(jù)南聯(lián)接的阻塞狀態(tài).
intPQisnonblocking(constPGconn*conn)
如果聯(lián)接設(shè)置為非阻塞狀態(tài),返向I,如果是阻塞狀態(tài)返同04
*
PQsendQuery向服務(wù)器提交一個(gè)命令而不等待結(jié)果,如果查詢成功發(fā)送則返回1,否則返回0.此時(shí),可以
用PQerrorMessage獲取關(guān);失敗的信息).
intPQsendQuery(PGconn*conn,
constchar*query);
在成功調(diào)用PQsendQuery后,調(diào)用PQgetResult一次或者多次獲取結(jié)果.可以不再調(diào)用PQsend
Query(在同一次聯(lián)接里)直到PQgelResulI返回NULL,表明命令完成.
PQgetResu1t等待從前面PQsendQuery調(diào)用返回的下一個(gè)結(jié)果,然后返回之.當(dāng)查詢結(jié)束并且沒(méi)
有更多結(jié)果后返回NULL.
PGresuit*PQgetResult(PGconn*conn);
必須重且的調(diào)用PQgetResu1t,直到它返回NULL,表明該命令結(jié)束.(如果在沒(méi)有活躍的命令時(shí)調(diào)用,
PQgetResu1t將只是立即返回VULL.)每個(gè)PQgeiResult返回的非NULL結(jié)果都應(yīng)該用前面描
述的PGresult訪問(wèn)函數(shù)進(jìn)行分析.不要忘了在結(jié)束分析后用PQc1ear釋放每個(gè)結(jié)果對(duì)象.注意,
PQgetResu1t只是在有查詢激活幣口必須的返回?cái)?shù)據(jù)還沒(méi)有被PQconsumeInput讀取時(shí)阻塞.
使用PQsendQuery和PQgetResult解決了PQcxec的一個(gè)問(wèn)題:如果一個(gè)命令字符串包含多個(gè)
SQL命令,這些命令的結(jié)果可以獨(dú)立的獲得.(順便說(shuō)一句:這樣就允許一種簡(jiǎn)單的重總處理模式,前端可以
處理一個(gè)查詢的結(jié)果而后端可以仍然在處理同一命令字符串的后面的查詢)但是,調(diào)用PQgetReSult
將仍然導(dǎo)致前端被阻塞住直到后端完成下一個(gè)SQL命令.這一點(diǎn)可以通過(guò)合理的使用下面三個(gè)函數(shù)來(lái)避
免:
PQconsumelnput如果存在后端來(lái)的輸入可用,則使用之.
intPQconsumeInput(PGconn*conn);
PQconsumelnput通常返回1表明"沒(méi)有錯(cuò)誤",而返回0表明有某種錯(cuò)誤發(fā)生,(同時(shí)設(shè)設(shè)PQ
errorMessage).注意這個(gè)結(jié)果并不表明實(shí)際上是否收集了數(shù)據(jù).在調(diào)用PQconsumelnput之后,
應(yīng)用可以檢查PQisBusy和/或PQnotifies看一眼它們的狀態(tài)是否改變.
PQconsumelnput叫以在應(yīng)用還沒(méi)有做好處埋結(jié)果或通知的情況卜被遍用.這個(gè)過(guò)程將詼取可用的數(shù)據(jù)
并且在一個(gè)緩沖區(qū)里保存它,這樣導(dǎo)致一個(gè)seiectO讀準(zhǔn)備好標(biāo)識(shí)的生成.這樣應(yīng)用就可以使用PQc
onsumelnput立即清掉select()條件,然后在空閑的時(shí)候檜查結(jié)果.
*
PQisBusy在查詢忙的時(shí)候返回1,也就是說(shuō),PQgetResult將阻塞住等待輸入.一個(gè)0的返回表明
這時(shí)調(diào)用PQgetResult可以確保不阻塞.
intPQisBusy(PGconn*conn):
PQisBusy本身將不會(huì)試圖從后端讀取數(shù)據(jù):所以必須先調(diào)用PQconsumeInput,否則忙狀態(tài)將永遠(yuǎn)不
會(huì)消除.
*
PQflush試圖把任何正在排隊(duì)的數(shù)據(jù)沖刷到后端,如果成功(或者發(fā)送隊(duì)列為空)返回0,如果因某種原因
失敗返回EOF。
intPQflush(PGconn*conn);
在一個(gè)非阻塞的聯(lián)接調(diào)用sclcct()判斷是否有響應(yīng)到達(dá)之前需要調(diào)用一個(gè)PQflush.如果返回0
則保證了與后端的發(fā)送隊(duì)列里面沒(méi)有待發(fā)送的數(shù)據(jù).只有使用了PQsetnonblocking的應(yīng)用需要
這個(gè)。
PQsocket獲取用于后端聯(lián)接套接字的文件描述符號(hào).一個(gè)有效的描述符應(yīng)該是〉=0:一個(gè)一1表
明當(dāng)前沒(méi)有打開(kāi)與后端的暇接.
intBQsocket(constconn*conn);
PQs。eket應(yīng)該用于獲取準(zhǔn)備調(diào)用select()的后端套接字描述符.這就允許一個(gè)應(yīng)用使用阻塞的聯(lián)
接等待后端的響應(yīng)或者其他條件,如果select()的結(jié)果表明可以從后端套接字讀取數(shù)據(jù),那么應(yīng)該
調(diào)用PQconsumeInput讀取數(shù)據(jù);之后,,PQisBusy,PQgetResult,和/或PQnotifies可用
于處理返回信息.
非阻塞的聯(lián)接(那些使用了PQseinonblocking的聯(lián)接)在PQflush返回0之前,(這表明沒(méi)有
數(shù)據(jù)緩沖著等待發(fā)送給后端)不應(yīng)該使用select().
一個(gè)使用這些函數(shù)的典型的前端將有一個(gè)主循環(huán)使用select()等待所有它必須處理的條件.其中一個(gè)
條件將會(huì)是后端來(lái)的數(shù)據(jù)已準(zhǔn)備好,從select。的角度來(lái)看就是PQsockct標(biāo)識(shí)的文件描述符上已
經(jīng)有可讀取的數(shù)據(jù).當(dāng)主循環(huán)偵測(cè)到輸入準(zhǔn)備好,它將調(diào)用PQconsumeInput讀取輸入.然后可以調(diào)用PQ
isBusy返回faIse(0)后面可以跟著PQgetResult。同樣它(用戶應(yīng)用)可以調(diào)用PQnotifies
測(cè)NOTIFY信息(參閱下面的“異步通知”).例子程序節(jié)里面給出了一個(gè)例子程序.
個(gè)使用PQsendQuc>y/PQgecReSu1t的前端同樣也可以試圖取消一個(gè)正在被后端處理的命令.
PQrcqucstCanccl要求PostgrcSQL放棄處理當(dāng)前命令.
intPQrequcstCancel(PGconn*conn);
如果取消的請(qǐng)求成功發(fā)送,返回值是1,否則是0.(如果為假,PQerrorMessage會(huì)告之為什么.)不
過(guò),取消請(qǐng)求的成功發(fā)送將不保證請(qǐng)求將產(chǎn)牛?作用.不管PQrequestCancel的返回值是什么,應(yīng)用
都必須繼續(xù)使用PQgetResult進(jìn)行通常的后續(xù)的結(jié)果讀取工作.如果取消動(dòng)作生效,當(dāng)前的命令將提前
退出并返回?個(gè)錯(cuò)誤結(jié)果.如果取消動(dòng)作失敗(也就是后端已經(jīng)處理完
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物標(biāo)志物在藥物臨床試驗(yàn)中的臨床轉(zhuǎn)化研究
- 生物制劑失應(yīng)答后IBD的聯(lián)合治療策略
- 生物3D打印皮膚在皮膚修復(fù)中的個(gè)性化方案
- 深度解析(2026)《GBT 19565-2017總輻射表》
- 考試題質(zhì)量監(jiān)督與檢測(cè)技能測(cè)試
- 資產(chǎn)處置分析師考試題庫(kù)
- 中廣核設(shè)備制造商代表面試題庫(kù)及解析
- 性能測(cè)試工程師崗位測(cè)試結(jié)果分析含答案
- 面試題集永輝超市收銀主管崗位面試要點(diǎn)
- 深度解析(2026)《GBT 19155-2017高處作業(yè)吊籃》
- 2025年云南省人民檢察院聘用制書(shū)記員招聘(22人)備考筆試題庫(kù)及答案解析
- 2026屆四川涼山州高三高考一模數(shù)學(xué)試卷試題(含答案詳解)
- 銀行黨支部書(shū)記2025年抓基層黨建工作述職報(bào)告
- 腫瘤標(biāo)志物的分類
- 2025山西忻州市原平市招聘社區(qū)專職工作人員50人考試歷年真題匯編附答案解析
- 中藥煎煮知識(shí)與服用方法
- 2026東莞銀行秋季校園招聘?jìng)淇碱}庫(kù)及答案詳解(基礎(chǔ)+提升)
- 消防水泵房管理制度及操作規(guī)程
- GB/T 14364-1993船舶軸系滑動(dòng)式中間軸承
- 肺炎教學(xué)查房課件
- 儀表設(shè)備管路脫脂方案(中英)
評(píng)論
0/150
提交評(píng)論