对PostgreSQL源代码中的 ObjectClass的初步理解

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:

depency.h 中:

复制代码
/*                            
 * This enum covers all system catalogs whose OIDs can appear in                            
 * pg_depend.classId or pg_shdepend.classId.                            
 */                            
typedef enum ObjectClass                            
{                            
    OCLASS_CLASS,            /* pg_class */            
    OCLASS_PROC,            /* pg_proc */            
    OCLASS_TYPE,            /* pg_type */            
    OCLASS_CAST,            /* pg_cast */            
    OCLASS_COLLATION,            /* pg_collation */            
    OCLASS_CONSTRAINT,            /* pg_constraint */            
    OCLASS_CONVERSION,            /* pg_conversion */            
    OCLASS_DEFAULT,            /* pg_attrdef */            
    OCLASS_LANGUAGE,            /* pg_language */            
    OCLASS_LARGEOBJECT,            /* pg_largeobject */            
    OCLASS_OPERATOR,            /* pg_operator */            
    OCLASS_OPCLASS,            /* pg_opclass */            
    OCLASS_OPFAMILY,            /* pg_opfamily */            
    OCLASS_AMOP,            /* pg_amop */            
    OCLASS_AMPROC,            /* pg_amproc */            
    OCLASS_REWRITE,            /* pg_rewrite */            
    OCLASS_TRIGGER,            /* pg_trigger */            
    OCLASS_SCHEMA,            /* pg_namespace */            
    OCLASS_TSPARSER,            /* pg_ts_parser */            
    OCLASS_TSDICT,            /* pg_ts_dict */            
    OCLASS_TSTEMPLATE,            /* pg_ts_template */            
    OCLASS_TSCONFIG,            /* pg_ts_config */            
    OCLASS_ROLE,            /* pg_authid */            
    OCLASS_DATABASE,            /* pg_database */            
    OCLASS_TBLSPACE,            /* pg_tablespace */            
    OCLASS_FDW,            /* pg_foreign_data_wrapper */            
    OCLASS_FOREIGN_SERVER,            /* pg_foreign_server */            
    OCLASS_USER_MAPPING,            /* pg_user_mapping */            
    OCLASS_DEFACL,            /* pg_default_acl */            
    OCLASS_EXTENSION,            /* pg_extension */            
    MAX_OCLASS            /* MUST BE LAST */            
} ObjectClass;                            
复制代码

而dependency.c 中又有如此的代码,看下:

[作者:技术者高健@博客园  mail: luckyjackgao@gmail.com ]

复制代码
/*                    
 * This constant table maps ObjectClasses to the corresponding catalog OIDs.                    
 * See also getObjectClass().                    
 */                    
static const Oid object_classes[MAX_OCLASS] = {                    
    RelationRelationId,                /* OCLASS_CLASS */
    ProcedureRelationId,                /* OCLASS_PROC */
    TypeRelationId,                /* OCLASS_TYPE */
    CastRelationId,                /* OCLASS_CAST */
    CollationRelationId,                /* OCLASS_COLLATION */
    ConstraintRelationId,                /* OCLASS_CONSTRAINT */
    ConversionRelationId,                /* OCLASS_CONVERSION */
    AttrDefaultRelationId,                /* OCLASS_DEFAULT */
    LanguageRelationId,                /* OCLASS_LANGUAGE */
    LargeObjectRelationId,                /* OCLASS_LARGEOBJECT */
    OperatorRelationId,                /* OCLASS_OPERATOR */
    OperatorClassRelationId,                /* OCLASS_OPCLASS */
    OperatorFamilyRelationId,                /* OCLASS_OPFAMILY */
    AccessMethodOperatorRelationId,                /* OCLASS_AMOP */
    AccessMethodProcedureRelationId,                /* OCLASS_AMPROC */
    RewriteRelationId,                /* OCLASS_REWRITE */
    TriggerRelationId,                /* OCLASS_TRIGGER */
    NamespaceRelationId,                /* OCLASS_SCHEMA */
    TSParserRelationId,                /* OCLASS_TSPARSER */
    TSDictionaryRelationId,                /* OCLASS_TSDICT */
    TSTemplateRelationId,                /* OCLASS_TSTEMPLATE */
    TSConfigRelationId,                /* OCLASS_TSCONFIG */
    AuthIdRelationId,                /* OCLASS_ROLE */
    DatabaseRelationId,                /* OCLASS_DATABASE */
    TableSpaceRelationId,                /* OCLASS_TBLSPACE */
    ForeignDataWrapperRelationId,                /* OCLASS_FDW */
    ForeignServerRelationId,                /* OCLASS_FOREIGN_SERVER */
    UserMappingRelationId,                /* OCLASS_USER_MAPPING */
    DefaultAclRelationId,                /* OCLASS_DEFACL */
    ExtensionRelationId                /* OCLASS_EXTENSION */
}                    
复制代码

可以看到上述两段代码,几乎是一行一行对应的。对于其目的,再看如下的代码:

复制代码
/*                                    
 * Add an entry to an ObjectAddresses array.                                    
 *                                    
 * It is convenient to specify the class by ObjectClass rather than directly                                    
 * by catalog OID.                                    
 */                                    
static void                                    
add_object_address(ObjectClass oclass, Oid objectId, int32 subId,                                    
                   ObjectAddresses *addrs)                    
{                                    
    ObjectAddress *item;                                
                                    
    /* enlarge array if needed */                                
    if (addrs->numrefs >= addrs->maxrefs)                                
    {                                
        addrs->maxrefs *= 2;                            
        addrs->refs = (ObjectAddress *)                            
            repalloc(addrs->refs, addrs->maxrefs * sizeof(ObjectAddress));                        
        Assert(!addrs->extras);                            
    }                                
    /* record this item */                                
    item = addrs->refs + addrs->numrefs;                                
    item->classId = object_classes[oclass];                                
    item->objectId = objectId;                                
    item->objectSubId = subId;                                
    addrs->numrefs++;                                
}                                    
复制代码

比如,当我用 的oclass 为 OCLASS_SCHEMA 的时候,我通过

item->classId = object_classes[oclass]; 得到的 classId 就是  NamespaceRelationId

再者,当我用 的oclass 为 OCLASS_TRIGGER 的时候,我通过

item->classId = object_classes[oclass]; 得到的 classId 就是  TriggerRelationId









本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/10/26/2741073.html,如需转载请自行联系原作者

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
XML 关系型数据库 Linux
从小白到专家 PG技术大讲堂 - Part 2:PostgreSQL源代码安装
Part 2:PG源代码安装 步骤1 创建用户与环境配置 步骤2 系统内核参数配置 步骤3 PostgreSQL 安装
250 1
从小白到专家 PG技术大讲堂 - Part 2:PostgreSQL源代码安装
|
存储 SQL Oracle
源代码编译安装 MySQL 和多实例| 学习笔记
快速学习源代码编译安装 MySQL 和多实例
320 0
|
关系型数据库 C++ PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 17 章 在Windows上从源代码安装
第 17 章 在Windows上从源代码安装 目录 17.1. 使用Visual C++或Microsoft Windows SDK构建 17.1.1. 要求 17.1.2. 针对64位Windows的特殊考虑 17.1.3. 构建 17.1.4. 清理和安装 17.1.5. 运行回归测试 17.1.6. 构建文档 对于大部分用户,推荐下载Windows的二进制发布,它在PostgreSQL 的网站上作为一个图形化安装包可供下载。
1331 0
|
关系型数据库 开发工具 C++
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 17 章 在Windows上从源代码安装_17.1. 使用Visual C++或Microsoft Windows SDK构建
17.1. 使用Visual C++或Microsoft Windows SDK构建 17.1.1. 要求 17.1.2. 针对64位Windows的特殊考虑 17.1.3. 构建 17.1.4. 清理和安装 17.1.5. 运行回归测试 17.1.6. 构建文档 PostgreSQL可以使用来自微软的Visual C++编译器套件构建。
1556 0
|
关系型数据库 Unix C++
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.7. 平台相关的说明
16.7. 平台相关的说明 16.7.1. AIX 16.7.2. Cygwin 16.7.3. HP-UX 16.7.4. MinGW/原生 Windows 16.7.5. Solaris 这一节提供了考虑 PostgreSQL 安装和设置的附加平台相关的话题。
1497 0
|
关系型数据库 Unix 测试技术
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.6. 平台支持
16.6. 平台支持 如果代码包含规定要工作在一个平台(即一种 CPU 架构和操作系统的结合)上并且它最近已经被验证能在该平台上编译并通过其回归测试,PostgreSQL开发社区才会认为该平台是被支持的。
1299 0
|
关系型数据库 Unix Shell
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.5. 安装后设置
16.5. 安装后设置 16.5.1. 共享库 16.5.2. 环境变量 16.5.1. 共享库 在一些有共享库的系统里,你需要告诉你的系统如何找到新安装的共享库。那些并不是必须做这个工作的系统包括 FreeBSD、HP-UX、Linux、NetBSD、OpenBSD和Solaris。
1366 0
|
关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.3. 获取源码
16.3. 获取源码 PostgreSQL 10.1 源代码可以从我们的官方网站 https://www.postgresql.org/download/的下载区中获得。你将得到一个名为postgresql-10.1.tar.gz或postgresql-10.1.tar.bz2的文件。
1298 0
|
关系型数据库 PostgreSQL Python
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.2. 要求
16.2. 要求 一般说来,一个现代的与 Unix 兼容的平台应该就能运行PostgreSQL。 到发布为止已经明确测试过的平台的列表在 第 16.6 节中列出。在发布的doc子目录里面有许多平台相关的 FAQ文档,如果你碰到问题你可能会需要参考它们。
1391 0
|
关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.1. 简单版
16.1. 简单版 ./configure make su make install adduser postgres mkdir /usr/local/pgsql/data chown postgres /usr/local/pgsql/data su - postgres /usr/loc.
1192 0