?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
下面的函數(shù)處理與PostgreSQL服務(wù)器服務(wù)器聯(lián)接的事情。
一個(gè)應(yīng)用程序一次可以與多個(gè)服務(wù)器建立聯(lián)接。(這么做的原因之一是訪問(wèn)多于一個(gè)數(shù)據(jù)庫(kù)。
) 每個(gè)連接都是用一個(gè)從函數(shù)PQconnectdb
,
PQconnectdbParams
或PQsetdbLogin
獲得的PGconn對(duì)象表示。
注意,這些函數(shù)總是返回一個(gè)非空的對(duì)象指針,除非存儲(chǔ)器少得連個(gè)PGconn對(duì)象都分配不出來(lái)。
在把查詢發(fā)送給聯(lián)接對(duì)象之前,可以調(diào)用PQstatus
函數(shù)來(lái)檢查一下聯(lián)接是否成功。
在Unix上,分叉與開(kāi)放的libpq連接進(jìn)程可能會(huì)導(dǎo)致
不可預(yù)知的結(jié)果,因?yàn)楦负妥舆M(jìn)程共享
相同的插座和操作系統(tǒng)資源。出于這個(gè)原因,
這種用法是不推薦,雖然做的exec
子進(jìn)程加載一個(gè)新的可執(zhí)行文件是安全的。
Note: 在Windows上,有一個(gè)方式可以提高性能,如果一個(gè)單一的數(shù)據(jù)庫(kù)連接重復(fù)的開(kāi)啟和關(guān)閉。 內(nèi)部,libpq為連接啟動(dòng)和關(guān)閉分別調(diào)用
WSAStartup()
和WSACleanup()
。WSAStartup()
引用WSACleanup()
遞減的技術(shù)來(lái)增量?jī)?nèi)置Windows庫(kù)。 當(dāng)引用的技術(shù)只有一時(shí),調(diào)用WSACleanup()
來(lái)釋放所有的資源并寫在所有的DLL。 這個(gè)操作的開(kāi)銷很大,為了避免,一個(gè)應(yīng)用程序可以經(jīng)常調(diào)用WSAStartup()
, 這樣當(dāng)最后一個(gè)數(shù)據(jù)庫(kù)連接關(guān)閉時(shí),不會(huì)釋放所有資源。
PQconnectdbParams
與服務(wù)器數(shù)據(jù)庫(kù)服務(wù)器建立一個(gè)新的聯(lián)接。
PGconn *PQconnectdbParams(const char **keywords,const char **values,int expand_dbname);
這個(gè)函數(shù)使用取自兩個(gè)NULL終止數(shù)組的參數(shù)來(lái)開(kāi)啟一個(gè)新的數(shù)據(jù)庫(kù)連接。
首先,被定義為一個(gè)字符串?dāng)?shù)組的keywords中的每個(gè)元素都是一個(gè)關(guān)鍵字。
其次,values為每個(gè)關(guān)鍵字賦值。不同于下面的PQsetdbLogin
,
這個(gè)參數(shù)設(shè)置可以無(wú)需修改參數(shù)簽名來(lái)擴(kuò)展,因此,使用這個(gè)函數(shù)(或其非阻塞的變形PQconnectStartParams
和PQconnectPoll
)
更適合一個(gè)新的應(yīng)用程序編程。
當(dāng)expand_dbname非0時(shí),dbname關(guān)鍵字值允許被確認(rèn)為 一個(gè)conninfo字符串。
所有傳遞的數(shù)組可以被清空以用于所有的缺省參數(shù),或用于包含一個(gè)或多個(gè)參數(shù)設(shè)置。 它們必須是等長(zhǎng)的。進(jìn)程會(huì)隨著keywords數(shù)組中最后一個(gè)非NULL元素而終止。
目前可識(shí)別的參數(shù)鍵字是:
要聯(lián)接的主機(jī)名。如果主機(jī)名以斜杠開(kāi)頭,則它聲明使用 Unix 域套接字通訊而 不是 TCP/IP 通訊;該值就是套接字文件所存儲(chǔ)的目錄。如果沒(méi)有聲明host, 那么缺省時(shí)是與位于/tmp目錄(或者制作PostgreSQL的時(shí)候聲明的套接字目錄) 里面的 Unix-域套接字聯(lián)接。在沒(méi)有域套接字的機(jī)器上, 缺省是與localhost連接。
與之聯(lián)接的主機(jī)的IP地址。這個(gè)應(yīng)該是標(biāo)準(zhǔn)的IPv4地址格式, 比如,172.28.40.9。如果你的機(jī)器支持IPv6,那么你也可以使用IPv6的地址。 如果聲明了一個(gè)非空的字符串,那么使用TCP/IP通訊機(jī)制。
使用hostaddr取代host可以讓應(yīng)用避免一次主機(jī)名查找, 這一點(diǎn)對(duì)于那些有時(shí)間約束的應(yīng)用來(lái)說(shuō)可能是非常重要的。不過(guò),Kerberos認(rèn)證 系統(tǒng)要求主機(jī)(host)名。因此,應(yīng)用下面的規(guī)則:如果聲明了 不帶hostaddr的host那么就強(qiáng)制進(jìn)行主機(jī)名查找。如果聲明中沒(méi)有host,hostaddr的值 給出遠(yuǎn)端的地址; 如果使用了 Kerberos,將導(dǎo)致一次反向名字查詢。 如果同時(shí)聲明了host和hostaddr,除非使用了Kerberos, 否則將使用hostaddr的值作為遠(yuǎn)端地址;host的值將被忽略, 如果使用了Kerberos,host的值用于 Kerberos 認(rèn)證。 (要注意如果傳遞給libpq的主機(jī)名(host)不是地址hostaddr處的機(jī)器名, 那么認(rèn)證很有可能失敗。) 同樣,在~/.pgpass(參閱Section 31.14)中是 使用host而不是hostaddr來(lái)標(biāo)識(shí)連接。
如果主機(jī)名(host)和主機(jī)地址都沒(méi)有,那么libpq將使用一個(gè)本地 的 Unix 域套接字進(jìn)行通訊; 或者是在沒(méi)有 Unix 域套接字的機(jī)器上, 它將嘗試與localhost連接。
主機(jī)服務(wù)器的端口號(hào),或者在Unix域套接字聯(lián)接時(shí)的套接字?jǐn)U展文件名。
數(shù)據(jù)庫(kù)名。缺省和用戶名相同。
要聯(lián)接的PostgreSQL用戶名。 缺省是與運(yùn)行該應(yīng)用的用戶操作系統(tǒng)名同名的用戶。
如果服務(wù)器要求口令認(rèn)證,所用的口令。
連接的最大等待時(shí)間,以秒計(jì)(用十進(jìn)制整數(shù)字串書寫)。零或者不聲明表示無(wú)窮。 我們不建議把連接超時(shí)的值設(shè)置得小于2秒。
發(fā)送給服務(wù)器的命令行選項(xiàng)。 例如,設(shè)置這-c geqo=off設(shè)置 會(huì)話的價(jià)值geqo參數(shù)為 off。為詳細(xì)討論了可用 選項(xiàng),參閱Chapter 18。
為application_name配置參數(shù)指定值
為application_name配置參數(shù)聲明一個(gè)備用值。 如果連接參數(shù)或PGAPPNAME環(huán)境變量沒(méi)有為application_name賦值,那么就會(huì)使用該值。 在通用的應(yīng)用程序(最好設(shè)置一個(gè)缺省應(yīng)用程序名)中,聲明一個(gè)備用名字時(shí)很有用的,這樣用戶自己可以重寫該名字。
控制是否保持客戶端的TCP連接使用。缺省值是1,表示開(kāi)啟,但可以改為0,表示不開(kāi)啟。 通過(guò)一個(gè)Unix域套接字,可以為連接模式忽略該參數(shù)。
控制空閑秒數(shù),在這個(gè)秒數(shù)之后,TCP應(yīng)該向服務(wù)器發(fā)送一個(gè)保持活動(dòng)的信息。 系統(tǒng)缺省是0。通過(guò)一個(gè)Unix域套接字,或者如果禁用保持活動(dòng),可以為連接模式忽略該參數(shù)。 只有在Windows,或TCP_KEEPIDLE或TCP_KEEPALIVE套接字選項(xiàng)可用的操作系統(tǒng) 上才可以使用這個(gè)參數(shù),在其他操作系統(tǒng)上,該參數(shù)無(wú)效。
控制空閑秒數(shù),在這個(gè)秒數(shù)之后,一個(gè)服務(wù)器無(wú)法識(shí)別的TCP保持活動(dòng)的信息應(yīng)該被重新翻譯。 系統(tǒng)缺省是0。通過(guò)一個(gè)Unix域套接字,或者如果禁用保持活動(dòng),可以為連接模式忽略該參數(shù)。 只有在Windows,或TCP_KEEPINTVL套接字選項(xiàng)可用的操作系統(tǒng) 上才可以使用這個(gè)參數(shù),在其他操作系統(tǒng)上,該參數(shù)無(wú)效。
控制那些在客戶端到服務(wù)器端連接被認(rèn)為dead之前會(huì)丟失的TCP保持連接的數(shù)目。 系統(tǒng)缺省是0。通過(guò)一個(gè)Unix域套接字,或者如果禁用保持活動(dòng),可以為連接模式忽略該參數(shù)。 只有在Windows,或TCP_KEEPINTVL套接字選項(xiàng)可用的操作系統(tǒng) 上才可以使用這個(gè)參數(shù),在其他操作系統(tǒng)上,該參數(shù)無(wú)效。
忽略(以前,這個(gè)選項(xiàng)聲明服務(wù)器日志的輸出方向)。
這個(gè)選項(xiàng)決定是否需要和服務(wù)器協(xié)商一個(gè)SSL連接, 以及以什么樣的優(yōu)先級(jí)與服務(wù)器進(jìn)行SSL連接。有六種模式可供 選擇:
Table 31-1. sslmode選項(xiàng)
Option | Description |
---|---|
disable | 只有嘗試非SSL連接 |
allow | 首次嘗試非SSL 連接,如果失敗,嘗試SSL 連接 |
prefer(缺省) | 首次嘗試SSL 連接,如果失敗,嘗試非SSL 連接。 |
require | 僅嘗試一個(gè)SSL連接 |
verify-ca | 只嘗試SSL連接,并通過(guò)可信任的CA驗(yàn)證 服務(wù)器證書。 |
verify-full | 只嘗試SSL連接,通過(guò)可信任的CA驗(yàn)證 服務(wù)器證書是和證書中 該服務(wù)器的主機(jī)名是否匹配。 |
了解這些選項(xiàng)的詳細(xì)信息請(qǐng)查閱Section 31.17。
sslmode被Unix域套接字溝通忽略 如果不支持SSL編譯PostgreSQL的, 使用選項(xiàng)require,verify-ca,或 verify-full將導(dǎo)致一個(gè)錯(cuò)誤,而 選項(xiàng)??allow和prefer會(huì) 接受,但的libpq實(shí)際上不會(huì)嘗試 SSL連接。
這個(gè)選項(xiàng)因?yàn)橛辛?tt class="LITERAL">sslmode設(shè)置之后已經(jīng)廢棄了。
如果設(shè)為1,則要求與服務(wù)器進(jìn)行SSL聯(lián)接 (等效于sslmode。 如果服務(wù)器不支持SSL,那么libpq 將馬上拒絕聯(lián)接。設(shè)置為0(缺?。┡c服務(wù)器進(jìn)行協(xié)商連接類型(等效于 sslmode)。這個(gè)選項(xiàng)只有 在編譯PostgreSQL時(shí)打開(kāi)了SSL支持才有效。
此參數(shù)指定的客戶端SSL 證書文件名,替換默認(rèn) ~/.postgresql/postgresql.crt。 如果沒(méi)有一個(gè)SSL連接,則忽略此參數(shù)。
這個(gè)參數(shù)聲明用于客戶端認(rèn)證的密鑰的位置。要么聲明一個(gè)文件名用于代替缺省的~/.postgresql/postgresql.key, 要么從外部"engine"獲得并聲明的一個(gè)關(guān)鍵字("engine"是OpenSSL可加載模塊)。 一個(gè)外部引擎聲明得是由一個(gè)冒號(hào)分隔的引擎名稱和一個(gè)特定引擎的密鑰標(biāo)識(shí)符組成。 如果不是SLL連接模式,那么忽略該參數(shù)。
此參數(shù)指定的文件包含SSL的名稱 證書頒發(fā)機(jī)構(gòu)(CA)證書(S)。 如果該文件存在,服務(wù)器的證書 由這些機(jī)構(gòu)簽署確認(rèn)。 默認(rèn)是~/.postgresql/root.crt。
這個(gè)參數(shù)聲明的是CRL的文件名。如果存在,那么在這個(gè)文件中的聲明列表在嘗試認(rèn)證服務(wù)器端認(rèn)證時(shí)會(huì)使用。 缺省是~/.postgresql/root.crl。
當(dāng)認(rèn)證帶有Kerberos 5或GSSAPI是使用的Kerberos服務(wù)名。 它必須匹配在Kerberos認(rèn)證成功的服務(wù)器配置參數(shù)中聲明的服務(wù)名。 (參閱Section 19.3.5和Section 19.3.3)。
用于GSSAPI認(rèn)證的GSS庫(kù)。只用于Windows操作系統(tǒng)。 設(shè)置gssapi強(qiáng)制libpq使用GSSAPI庫(kù)以代替缺省的SSPI來(lái)認(rèn)證。
用于額外參數(shù)的服務(wù)名。它在pg_service.conf里面聲明一個(gè)服務(wù)名, 這個(gè)配置文件保 存額外的連接參數(shù)。這樣就允許應(yīng)用應(yīng)用只聲明一個(gè)服務(wù)名,而連接參數(shù)就可以在一 個(gè)地方維護(hù)了。參閱安裝目錄中的Section 31.15獲取如何設(shè)置這個(gè)文 件的信息。
如果有任何沒(méi)有聲明的參數(shù),那么將檢查對(duì)應(yīng)的環(huán)境變量 (參閱Section 31.13小節(jié))。 如果環(huán)境變量也沒(méi)有設(shè)置,那么使用編譯時(shí)的指明的內(nèi)置缺省。
如果expand_dbname非0,同時(shí)dbname中包含
一個(gè)=標(biāo)記,它會(huì)看做是一個(gè)conninfo字符串,
以相同的方式傳遞到PQconnectdb
中。之前的關(guān)鍵字會(huì)被conninfo
中的關(guān)鍵字代替。
通常情況下,關(guān)鍵字會(huì)從索引序列中的數(shù)組的開(kāi)始進(jìn)程處理。這樣的話,如果關(guān)鍵字重復(fù)了,那么在這之前的最后一個(gè) 處理結(jié)果會(huì)被保留。因此,通過(guò)仔細(xì)防放置dbname關(guān)鍵字, 可以決定哪些方式可以通過(guò)conninfo字符串來(lái)覆蓋,哪些不可以。
PQconnectdb
與服務(wù)器數(shù)據(jù)庫(kù)服務(wù)器建立一個(gè)新的聯(lián)接。
PGconn *PQconnectdb(const char *conninfo);
此函數(shù)打開(kāi)一個(gè)新的數(shù)據(jù)庫(kù)連接, 從字符串conninfo使用所采取的參數(shù)。
可以清空傳遞的字符串以使用所有的缺省參數(shù),或包含一個(gè)或多個(gè)通過(guò)空格分開(kāi)的參數(shù)設(shè)置。 每個(gè)參數(shù)設(shè)置是以keyword = value出現(xiàn)的。 等號(hào)兩邊的空格可以有,也可以沒(méi)有。在寫一個(gè)空值,或value中包含空格,可以在其兩邊使用單引號(hào),如keyword = 'a value'。 在value中的單引號(hào)和反斜杠必須使用一個(gè)反斜杠來(lái)逃逸,如\',\\。
目前公認(rèn)的參數(shù)關(guān)鍵詞是與上述相同。
PQsetdbLogin
Makes a new connection to the database server.
PGconn *PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, const char *pgtty, const char *dbName, const char *login, const char *pwd);
這個(gè)函數(shù)是PQconnectdb
前身,
它有固定個(gè)數(shù)的參數(shù)。它有相同的功能,
只是在調(diào)用中那些它缺少的參數(shù)總是用缺省值。如果么給任意的固定參數(shù)設(shè)置缺省值,
那么寫一個(gè)NULL或者一個(gè)空字串給它們。
如果的dbName包含=符號(hào),它
作為的conninfo字符串完全相同的方式
如果它已通過(guò)PQconnectdb
,其余
上述參數(shù)然后被應(yīng)用。
PQsetdb
與服務(wù)器數(shù)據(jù)庫(kù)服務(wù)器建立一個(gè)新的聯(lián)接。
PGconn *PQsetdb(char *pghost, char *pgport, char *pgoptions, char *pgtty, char *dbName);
這是一個(gè)調(diào)用PQsetdbLogin
的宏,
只是login和pwd參數(shù)null代替。
提供這個(gè)函數(shù)是為了與非常老版本的程序兼容
PQconnectStartParams
PQconnectStart
PQconnectPoll
與數(shù)據(jù)庫(kù)服務(wù)器建立一次非阻塞的聯(lián)接。
PGconn *PQconnectStartParams(const char **keywords,const char **values,int expand_dbname); PGconn *PQconnectStart(const char *conninfo); PostgresPollingStatusType PQconnectPoll(PGconn *conn);
這3個(gè)函數(shù)用于打開(kāi)一個(gè)與數(shù)據(jù)庫(kù)服務(wù)器之間的非阻塞的聯(lián)接:
你的應(yīng)用的執(zhí)行線索在執(zhí)行它的時(shí)候不會(huì)因遠(yuǎn)端的I/O而阻塞。
這個(gè)方法的要點(diǎn)是等待I/O結(jié)束可以發(fā)生在應(yīng)用的主循環(huán)里,
而不是在PQconnectdbParams
或PQconnectdb
里,
這樣應(yīng)用可以把這件事與其它操作并發(fā)起來(lái)一起執(zhí)行。
通過(guò)PQconnectStartParams
,數(shù)據(jù)庫(kù)連接使用來(lái)自keywords和
values數(shù)組的參數(shù),并且通過(guò)expand_dbname控制,如在PQconnectdbParams
中的描述。
數(shù)據(jù)庫(kù)聯(lián)接是用從conninfo字符串里取得的參數(shù)傳遞給
PQconnectStart
進(jìn)行的。
這個(gè)字符串的格式與上面PQconnectdb
里描述的一樣
PQconnectStartParams
,
PQconnectStart
,PQconnectPoll
都不會(huì)阻塞,只要有一些限制。
必須正確提供hostaddr和host參數(shù)以確保不會(huì)發(fā)生正向或者反向的名字查找。
參閱上面PQconnectdbParams
里的這些參數(shù)的文檔獲取細(xì)節(jié)。
如果你調(diào)用了PQtrace
,確保你跟蹤進(jìn)入的流對(duì)象不會(huì)阻塞。
你必須在調(diào)用PQconnectPoll
之前確保socket處于正確的狀態(tài),
象下面描述的那樣。
注意:PQconnectStartParams
是類似于PQconnectStart
如下所示。
要開(kāi)始一次非阻塞連接請(qǐng)求,調(diào)用
conn = PQconnectStart("connection_info_string")。
如果conn是空,表明libpq無(wú)法分配一個(gè)新的PGconn結(jié)構(gòu)。
否則,返回一個(gè)有效的PGconn指針
(盡管還不一定代表一個(gè)與數(shù)據(jù)庫(kù)有效聯(lián)接)。PQconnectStart
一返回,調(diào)用
status = PQstatus(conn)。
如果status等于CONNECTION_BAD,PQconnectStart
失敗。
如果PQconnectStart
成功了,下一個(gè)階段是輪詢libpq,這樣它就可以繼續(xù)連接序列動(dòng)作。
使用PQsocket(conn)
獲取數(shù)據(jù)庫(kù)鏈接下層的套接字描述符。象這樣循環(huán):
如果PQconnectPoll(conn)
的最后一個(gè)返回是PGRES_POLLING_READING,那么就等到套接
字準(zhǔn)備好被讀取了的時(shí)候(就像系統(tǒng)函數(shù)select()
,poll()
,或者類似的系統(tǒng)調(diào)用聲明的那樣)。
然后再次調(diào)用PQconnectPoll(conn)
。同樣,如果PQconnectPoll(conn)
最后返
回PGRES_POLLING_WRITING,那么就等到套接字準(zhǔn)備好可以寫了,然后再次調(diào)用PQconnectPoll(conn)
。
如果你還沒(méi)調(diào)用PQconnectPoll
,比如,剛剛調(diào)用完PQconnectStart
,那么按照它剛
返回PGRES_POLLING_WRITING的原則行動(dòng)。繼續(xù)這個(gè)循環(huán)直到PQconnectPoll(conn)
返
回PGRES_POLLING_FAILED,表明連接失敗,或者PGRES_POLLING_OK,表明連接成功建立。
在聯(lián)接的任意時(shí)刻,我們都可以通過(guò)調(diào)用PQstatus
來(lái)檢查聯(lián)接的狀態(tài)。
如果這是CONNECTION_BAD,那么聯(lián)接過(guò)程失??;如果是CONNECTION_OK
,那么聯(lián)接已經(jīng)做好。
這兩種狀態(tài)同樣也可以從上面的PQconnectPoll
的返回值里檢測(cè)到。其他狀態(tài)可能(也只能)
在一次異步聯(lián)接過(guò)程中發(fā)生。這些標(biāo)識(shí)聯(lián)接過(guò)程的當(dāng)前狀態(tài),因而可能對(duì)給用戶提供反饋有幫助。
這些狀態(tài)可能包括:
等待進(jìn)行聯(lián)接。
聯(lián)接成功;等待發(fā)送
等待來(lái)自服務(wù)器的響應(yīng)。
已收到認(rèn)證;等待聯(lián)接啟動(dòng)繼續(xù)進(jìn)行。
協(xié)商SSL加密。
協(xié)商環(huán)境驅(qū)動(dòng)的參數(shù)設(shè)置。
注意,盡管這些常量將保持下去(為了維持兼容性),應(yīng)用決不應(yīng)該依賴于這些常 量以某種特定順序出現(xiàn),或者是根本不應(yīng)依賴于這些常量,或者是不應(yīng)該依賴于這些 狀態(tài)總是某個(gè)文檔聲明的值。一個(gè)應(yīng)用可能象象下面這樣:
switch(PQstatus(conn)) { case CONNECTION_STARTED: feedback = "Connecting..."; break; case CONNECTION_MADE: feedback = "Connected to server..."; break; . . . default: feedback = "Connecting..."; }
在使用PQconnectPoll
的時(shí)候,連接參數(shù)connect_timeout將被忽略;
判斷是否超時(shí)是應(yīng)用的責(zé)任。否則,后面跟著一個(gè)PQconnectPoll
循環(huán)的
PQconnectStart
等效于PQconnectdb
。
要注意如果PQconnectStart
返回一個(gè)非空的指針,你必須在使用完它(指針)之后調(diào)用
PQfinish
,
以處理那些結(jié)構(gòu)和所有相關(guān)的存儲(chǔ)塊,甚至連接失敗時(shí)也要這樣處理。
PQconndefaults
返回缺省的聯(lián)接選項(xiàng)。
PQconninfoOption *PQconndefaults(void); typedef struct { char *keyword; /* The keyword of the option */ char *envvar; /* Fallback environment variable name */ char *compiled; /* Fallback compiled in default value */ char *val; /* Option's current value,or NULL */ char *label; /* Label for field in connect dialog */ char *dispchar; /* Indicates how to display this field in a connect dialog. Values are: "" Display entered value as is "*" Password field - hide value "D" Debug option - don't show by default */ int dispsize; /* Field size in characters for dialog */ } PQconninfoOption;
返回一個(gè)連接選項(xiàng)數(shù)組。可以用于獲取所有可能的PQconnectdb
選項(xiàng)和它們的當(dāng)前缺省值。
返回值指向一個(gè)PQconninfoOption結(jié)構(gòu)的數(shù)組,該數(shù)組以一個(gè)有NULLkeyword指針的條目結(jié)束。
如果無(wú)法分配內(nèi)存,則返回空指針。注意缺省值(val域)將依賴于環(huán)境變量和其他環(huán)境。
調(diào)用者必須把連接選項(xiàng)當(dāng)作只讀對(duì)待。
在處理完選項(xiàng)數(shù)組后,把數(shù)組交給PPQconninfoFree
釋放。如果沒(méi)有這么做,
每次調(diào)用PQconndefaults
都會(huì)有一小部分內(nèi)存泄漏。
PQconninfoParse
返回解析提供的連接字符串的連接選項(xiàng)。
PQconninfoOption *PQconninfoParse(const char *conninfo,char **errmsg);
解析一個(gè)連接字符串,并返回結(jié)果選項(xiàng)為一個(gè)數(shù)組,或這,如果連接字符串有問(wèn)題,那么返回一個(gè)NULL。
這個(gè)可以用于決定在提供的連接字符串中的PQconnectdb
選項(xiàng)。
返回值指向一個(gè)PQconninfoOption結(jié)構(gòu)的數(shù)組,這個(gè)結(jié)構(gòu)一個(gè)帶有空keyword指針
的條目結(jié)束。
需要注意的是,只有明確在字符串中聲明的選項(xiàng)可以在結(jié)果數(shù)組中的設(shè)置中有參數(shù)值;沒(méi)有缺省的話是插入。
如果errmsg非NULL,那么成功的時(shí)候,*errmsg被設(shè)置為NULL,
否則設(shè)置為malloc
的錯(cuò)誤字符串以說(shuō)明錯(cuò)誤。
(也可以將*errmsg設(shè)置為NULL,即使返回一個(gè)NULL;這表示內(nèi)存溢出)。
在處理完選項(xiàng)數(shù)組之后,通過(guò)將其傳遞給PQconninfoFree
來(lái)進(jìn)行釋放。
如果沒(méi)有這么做,那么每個(gè)PQconninfoParse
的請(qǐng)求時(shí)會(huì)有一些內(nèi)存溢出。
反過(guò)來(lái),如果發(fā)生錯(cuò)誤并且errmsg非NULL,通過(guò)PQfreemem
來(lái)釋放錯(cuò)誤字符串。
PQfinish
關(guān)閉與服務(wù)器的連接。同時(shí)釋放被PGconn對(duì)象使用的存儲(chǔ)器。
void PQfinish(PGconn *conn);
注意,即使與服務(wù)器的連接嘗試失?。捎?code class="FUNCTION">PQstatus判斷),應(yīng)用也要
調(diào)用PQfinish
釋放被PGconn對(duì)象使用的存儲(chǔ)器。
不應(yīng)該在調(diào)用PQfinish
后再使用PGconn 指針。
PQreset
重置與服務(wù)器的通訊端口。
void PQreset(PGconn *conn);
此函數(shù)將關(guān)閉與服務(wù)器的連接并且試圖與同一個(gè)服務(wù)器重建新的連接, 使用所有前面使用過(guò)的參數(shù)。這在失去工作連接后進(jìn)行故障恢復(fù)時(shí)很有用。
PQresetStart
PQresetPoll
以非阻塞模式重置與服務(wù)器的通訊端口。
int PQresetStart(PGconn *conn); PostgresPollingStatusType PQresetPoll(PGconn *conn);
此函數(shù)將關(guān)閉與服務(wù)器的連接并且試圖與同一個(gè)服務(wù)器重建新的連接,使用所有前面使用過(guò)的參數(shù)。
這在失去工作連接后進(jìn)行故障恢復(fù)時(shí)很有用。它們和上面的PQreset
的區(qū)別是它們工作在非阻塞模式。
這些函數(shù)的使用有與上面PQconnectStartParams
,PQconnectStart
和PQconnectPoll
一樣的限制。
要發(fā)起一次連接重置,調(diào)用PQresetStart
。如果它返回0,那么重置失敗。
如果返回1,用與使用PQresetPoll
建立連接的同樣的方法使用PQconnectPoll
重置連接。