zoukankan      html  css  js  c++  java
  • 对PostgreSQL源代码中的 ObjectClass的初步理解

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

    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

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

  • 相关阅读:
    异地多活(异地双活)实践经验
    申诉受理
    申诉受理
    关于数据采集需求的讨论帖
    Http压测工具wrk使用指南
    设计爬虫Hawk背后的故事
    APP接口版本兼容的问题
    .net点选验证码实现思路分享
    央企晒年薪 现在终于有机会看到了_青新闻__中国青年网
    蘑菇街电商交易平台服务架构及改造优化历程(含PPT)
  • 原文地址:https://www.cnblogs.com/gaojian/p/2741073.html
Copyright © 2011-2022 走看看