博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对PostgreSQL源代码中的 ObjectClass的初步理解
阅读量:7246 次
发布时间:2019-06-29

本文共 6252 字,大约阅读时间需要 20 分钟。

[作者:技术者高健@博客园  mail:  ]

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:  ]

/*                     * 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:  ]

转载地址:http://yrjbm.baihongyu.com/

你可能感兴趣的文章
三星收购哈曼,物联网领域又迎来一位玩家
查看>>
pssh批量ssh操作
查看>>
博为峰Java技术文章 ——JavaSE Swing 单选按钮II
查看>>
博为峰Java技术文章 ——JavaSE Swing 按钮组件的综合运用
查看>>
Python对象类型
查看>>
认识border
查看>>
关于LUN和存储卷的区别详解
查看>>
JavaSE 学习参考:IO流之字节流
查看>>
Spring集合的注入
查看>>
JavaSE 数组排序
查看>>
java多线程同代码函数
查看>>
php编程 - php分糖果问题
查看>>
我的友情链接
查看>>
某个方法到底应该放到哪个文件中
查看>>
【更新】Word控件Spire.Doc V6.0.63发布| 支持表格样式的应用
查看>>
磁盘IO
查看>>
经典DM×××实验
查看>>
IT行业——Linux
查看>>
Powershell-查询当前文件目录层级结构
查看>>
shell上线脚本
查看>>