如何为 PostgreSQL 增加系统表字段
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_RELATIONBKI_ROWTYPE_OID(1248)BKI_SCHEMA_MACRO { NameData datname; /*databasename*/ Oid datdba; /*ownerofdatabase*/ int32 encoding; /*characterencoding*/ NameData datcollate; /*LC_COLLATEsetting*/ NameData datctype; /*LC_CTYPEsetting*/ bool datistemplate; /*allowedasCREATEDATABASEtemplate?*/ bool datallowconn; /*newconnectionsallowed?*/ int32 datconnlimit; /*maxconnectionsallowed(-1=nolimit)*/ Oid datlastsysoid; /*highestOIDtoconsiderasystemOID*/ TransactionIddatfrozenxid;/*allXids<thisarefrozeninthisDB*/ TransactionIddatminmxid; /*allmultixactsintheDBare>=this*/ Oid dattablespace; /*defaulttablespaceforthisDB*/ #ifdefCATALOG_VARLEN /*variable-lengthfieldsstarthere*/ aclitem datacl[1]; /*accesspermissions*/ #endif }FormData_pg_database; /*---------------- * Form_pg_databasecorrespondstoapointertoatuplewith * theformatofpg_databaserelation. *---------------- */ typedefFormData_pg_database*Form_pg_database; /*---------------- * compilerconstantsforpg_database *---------------- */ #defineNatts_pg_database 13 #defineAnum_pg_database_datname 1 #defineAnum_pg_database_datdba 2 #defineAnum_pg_database_encoding 3 #defineAnum_pg_database_datcollate 4 #defineAnum_pg_database_datctype 5 #defineAnum_pg_database_datistemplate 6 #defineAnum_pg_database_datallowconn 7 #defineAnum_pg_database_datconnlimit 8 #defineAnum_pg_database_datlastsysoid 9 #defineAnum_pg_database_datfrozenxid 10 #defineAnum_pg_database_datminmxid 11 #defineAnum_pg_database_dattablespace 12 #defineAnum_pg_database_datacl 13 它们最终会被脚本 genbki.pl 利用生成 postgresql.bki文件,用在 initdb 初始化 data cluster 时,有兴趣可以自己学习一下,PG编译系统也是一个充分展示强大 perl 语言的系统; 3、在 dattablespace 下增加新定义: int8 datdummy; /*dummycolumn*/ 后边字段序号的定义也是很重要的,必须按顺序修改,也要记得属性数相应修改: #defineNatts_pg_database 14 ... #defineAnum_pg_database_dattablespace 12 #defineAnum_pg_database_datdummy 13 #defineAnum_pg_database_datacl 14 预定义的数据库必须也要修改,_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 中,自行阅读好了,写程序就这么简单。:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |