標籤:
1、BKI介紹:http://www.postgresql.org/docs/9.4/static/bki.html
可以不瞭解,也不影響我們繼續,因為有很多現成例子參考;
2、為pg_database增加一個欄位 datdummy,開啟 /src/include/catalog/pg_database.h:
CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO{NameDatadatname;/* database name */Oiddatdba;/* owner of database */int32encoding;/* character encoding */NameDatadatcollate;/* LC_COLLATE setting */NameDatadatctype;/* LC_CTYPE setting */booldatistemplate;/* allowed as CREATE DATABASE template? */booldatallowconn;/* new connections allowed? */int32datconnlimit;/* max connections allowed (-1=no limit) */Oiddatlastsysoid;/* highest OID to consider a system OID */TransactionId datfrozenxid; /* all Xids < this are frozen in this DB */TransactionId datminmxid;/* all multixacts in the DB are >= this */Oiddattablespace;/* default table space for this DB */#ifdef CATALOG_VARLEN/* variable-length fields start here */aclitemdatacl[1];/* access permissions */#endif} FormData_pg_database;/* ---------------- *Form_pg_database corresponds to a pointer to a tuple with *the format of pg_database relation. * ---------------- */typedef FormData_pg_database *Form_pg_database;/* ---------------- *compiler constants for pg_database * ---------------- */#define Natts_pg_database13#define Anum_pg_database_datname1#define Anum_pg_database_datdba2#define Anum_pg_database_encoding3#define Anum_pg_database_datcollate4#define Anum_pg_database_datctype5#define Anum_pg_database_datistemplate6#define Anum_pg_database_datallowconn7#define Anum_pg_database_datconnlimit8#define Anum_pg_database_datlastsysoid9#define Anum_pg_database_datfrozenxid10#define Anum_pg_database_datminmxid11#define Anum_pg_database_dattablespace12#define Anum_pg_database_datacl13
它們最終會被指令碼 genbki.pl 利用產生 postgresql.bki檔案,用在 initdb 初始化 data cluster 時,有興趣可以自己學習一下,PG編譯系統也是一個充分展示強大 perl 語言的系統;
3、在 dattablespace 下增加新定義:
int8datdummy;/* dummy column */
後邊欄位序號的定義也是很重要的,必須按順序修改,也要記得屬性數相應修改:
#define Natts_pg_database14...#define Anum_pg_database_dattablespace12#define Anum_pg_database_datdummy13#define Anum_pg_database_datacl14
預定義的資料庫必須也要修改,_null_ 前邊增加 100的欄位為 datdummy 資料:
DATA(insert OID = 1 ( template1 PGUID ENCODING "LC_COLLATE" "LC_CTYPE" t t -1 0 0 1 1663 100 _null_));
4、編譯運行,會發生什麼,編譯正常,然後 initdb,竟然也神奇的通過了,難道這就好了嗎?
Tip:Linux 下不停在一個目錄下改代碼,可能會遇到莫名的程式問題,試試 make clean
5、那麼建立一個資料庫試試看:CREATE DATABASE quanzl; 成功了,是不是感覺似乎還缺點什嗎?
datdummy的賦值,總不能 UPDATE pg_database SET datdummy = xxx 吧?
預訂義的資料庫比如template1,我們可以在catalog裡邊定義 BKI 指令碼,比如上邊的例子,給它一個初始值。程式裡也必須有所改動才能成為可操作屬性;
6、參照文法修改,建立一個 CREATE DATABASE xxx DUMMY nnn文法,修改結構體 CreatedbStmt 增加新屬性,文法分析階段將此值讀入,建立資料庫時將它寫入屬性;
new_record[Anum_pg_database_datdummy - 1] = 1234;
此部分代碼在 src/backend/commands/dbcommands.c 中,自行閱讀好了,寫程式就這麼簡單。:)
如何為 PostgreSQL 增加系統資料表欄位