openGauss数据库源码解析(三)| 公共组件源码解析(1)

在数据库组件中,一些组件是专用的,如词法解析只用于SQL引擎;而另外一些组件是公共的,用于整个数据库系统。openGauss的公共组件包括系统表、数据库初始化、多线程架构、线程池、内存管理、多维监控和模拟信号机制等。每个组件实现了一个独立的功能。本章对公共组件的源代码实现进行介绍。

3.1 系统表

系统表又称为数据字典或者元数据,存储管理数据库对象的定义信息,如表、索引、触发器等。用户可通过系统表查询用户定义的具体对象信息,如表的每个字段类型。因为openGauss支持一个实例管理多个数据库,所以系统表分为实例级别的系统表和数据库级别的系统表。实例级别的系统表在一个实例管理的多个数据库之间共享,整个实例只有一份,这些系统表为pg_authid、pg_auth_members、pg_database、pg_db_role_setting 、pg_tablespace、pg_shdepend、pg_shdescription、pg_shseclabel。数据库级别的系统表比如pg_class,pg_depend,pg_index,pg_attribute等,每个数据库各有一份。

3.1.1 系统表的定义
openGauss系统表定义全部在src/include/catalog目录下,每个头文件就是一个系统表的定义。如pg_database.h就是对pg_database的定义。在pg_database.h中,主要包括pg_database的表OID(object identifier,对象标识符)、类型OID、结构体定义、字段个数和每个字段ID(identifier,标识符)枚举值、数据库初始化默认值。下面是代码及其具体解释:

#define DatabaseRelationId 1262 /* pg_database本身也是一个结构类型,DatabaseRelation_Rowtype_Id表示pg_database在系统表pg_type中的OID为1248 */ #define DatabaseRelation_Rowtype_Id 1248 /* pg_database本身也是一个结构类型,DatabaseRelation_Rowtype_Id表示pg_database在系统表pg_type中的OID为1248 */ /* BKI_SHARED_RELATION表示pg_database是实例级别的系统表 */ CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO { NameData datname; /* 数据库名称 */ Oid datdba; /* 数据库拥有者 */ int4 encoding; /* 字符集编码 */ NameData datcollate; /* LC_COLLATE 设置值 */ NameData datctype; /* LC_CTYPE 设置值 */ bool datistemplate; /* 是否允许作为模板数据库*/ bool datallowconn; /* 是否允许链接 */ int4 datconnlimit; /* 最大连接数*/ Oid datlastsysoid; /* 系统OID最大值*/ ShortTransactionId datfrozenxid; /* 冻结事务ID,所有小于这个值的事务ID已经冷冻。为了兼容原来的版本,使用32位事务ID*/ Oid dattablespace; /* 数据库的缺省表空间 */ NameData datcompatibility;/* 数据库兼容模式,比如除0是报错还是当做正常处理*/ #ifdef CATALOG_VARLEN /* 下面字段是变长字段 */ aclitem datacl[1]; /* 访问权限*/ #endif TransactionId datfrozenxid64; /* 冷冻事务ID,64-bit(比特)事务ID */ } FormData_pg_database;