W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
一個(gè)目錄頭文件的關(guān)鍵部分是一個(gè)C的結(jié)構(gòu)定義,它描述該目錄中每一行的布局。這個(gè)結(jié)構(gòu)開始于一個(gè)CATALOG
宏,它對(duì)于C編譯器而言只不過(guò)是typedef struct FormData_
的一個(gè)簡(jiǎn)寫。該結(jié)構(gòu)中的每一個(gè)域會(huì)導(dǎo)致出現(xiàn)一個(gè)目錄列。域可以用catalogname
genbki.h
中描述的BKI屬性宏進(jìn)行標(biāo)注,例如可以為域定義默認(rèn)值或者把域標(biāo)記為可以為空或者不能為空。CATALOG
行也可以用genbki.h
中描述的一些其他BKI屬性宏標(biāo)注,用于定義該目錄整體的其他屬性,例如是否為共享的關(guān)系。
系統(tǒng)目錄緩沖代碼(以及大部分目錄功能代碼)假定所有的系統(tǒng)目錄元組的定長(zhǎng)部分是實(shí)際的存在形式,因?yàn)樗鼤?huì)把這個(gè)C結(jié)構(gòu)聲明映射到定長(zhǎng)部分之上。因此,所有變長(zhǎng)域和可以為空的域必須被放置在最后,并且不能夠以結(jié)構(gòu)的域的方式訪問(wèn)。例如,如果嘗試設(shè)置pg_type
.typrelid
為NULL,當(dāng)某段代碼嘗試引用typetup->typrelid
(或者更糟糕的是引用
typetup->typelem
,因?yàn)樗S在typrelid
之后)時(shí)將會(huì)出現(xiàn)失敗。這會(huì)導(dǎo)致隨機(jī)錯(cuò)誤乃至段錯(cuò)誤。
作為對(duì)這類錯(cuò)誤的一種部分保護(hù),變長(zhǎng)或可以為空的域不應(yīng)該對(duì)C編譯器可見。 通過(guò)將它們包裹在#ifdef CATALOG_VARLEN
... #endif
(其中CATALOG_VARLEN
是一個(gè)永不被定義的符號(hào))中可以實(shí)現(xiàn)這一點(diǎn)。 這能防止C代碼不小心嘗試訪問(wèn)可能不在那里或者可能在其他某個(gè)偏移位置的域。 作為一種防止創(chuàng)建不正確行的措施,我們要求所有應(yīng)該為非空的列在
pg_attribute
中也被標(biāo)記為非空。 如果目錄列是定長(zhǎng)的并且前面沒(méi)有任何可以為空的列,bootstrap代碼將自動(dòng)把它標(biāo)記為NOT NULL
。 在這一規(guī)則不適用的地方,可以根據(jù)需要使用BKI_FORCE_NOT_NULL
和BKI_FORCE_NULL
標(biāo)注強(qiáng)制正確的標(biāo)記。
前端代碼不應(yīng)該包括任何pg_xxx.h
目錄頭文件,因?yàn)檫@些文件可能包含在后端之外無(wú)法編譯的C代碼(通常,這是因?yàn)檫@些文件還包含src/backend/catalog/
文件中函數(shù)的聲明)。不過(guò),前端代碼可以包括相應(yīng)的pg_xxx_d.h
頭文件,它將包含OID #define
以及任何其他可能要在客戶端使用的數(shù)據(jù)。如果希望前端代碼能看到目錄頭文件中的宏或者其他代碼,可以在相應(yīng)部分的周圍寫上
#ifdef EXPOSE_TO_CLIENT_CODE
... #endif
,這樣會(huì)指示genbki.pl
把相應(yīng)的部分拷貝到pg_xxx_d.h
頭文件中。
少數(shù)目錄是非常基礎(chǔ)的,以至于它們無(wú)法用大部分目錄采用的BKI create
命令來(lái)創(chuàng)建,因?yàn)槟莻€(gè)命令需要在這些目錄中寫入信息來(lái)描述新的目錄。這些目錄被稱為bootstrap目錄,定義一個(gè)這樣的目錄需要一些額外的工作:開發(fā)者必須為它在pg_class
和
pg_type
的預(yù)裝載內(nèi)容中手工準(zhǔn)備合適的項(xiàng),并且后續(xù)對(duì)該目錄結(jié)構(gòu)的更改將會(huì)更新那些項(xiàng)(bootstrap目錄還需要pg_attribute
中的預(yù)裝載項(xiàng),但是幸運(yùn)地是現(xiàn)如今的genbki.pl
會(huì)處理這些雜務(wù))。如果可能,一定避免將新目錄創(chuàng)建為bootstrap目錄。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: