PostgreSQL數(shù)據(jù)庫(kù)學(xué)習(xí)手冊(cè)之libpq_第1頁(yè)
PostgreSQL數(shù)據(jù)庫(kù)學(xué)習(xí)手冊(cè)之libpq_第2頁(yè)
PostgreSQL數(shù)據(jù)庫(kù)學(xué)習(xí)手冊(cè)之libpq_第3頁(yè)
PostgreSQL數(shù)據(jù)庫(kù)學(xué)習(xí)手冊(cè)之libpq_第4頁(yè)
PostgreSQL數(shù)據(jù)庫(kù)學(xué)習(xí)手冊(cè)之libpq_第5頁(yè)
已閱讀5頁(yè),還剩71頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論