暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GUC参数hook机制简介

Thornger 2021-04-12
2016

GUC (Grand Unified Configuration)模块主要功能是系统中的配置参数的实现和管理。模块实现多种类型的配置变量(当前为boolean、enum、int、real和string)。配置参数可以来自很多地方,如配置文件、SET命令、初始化选项等,GUC对于不同来源采用优先级原则来决定哪种参数的值在系统中生效。

GUC所知道的每个变量都可以有一个check_hook,assign_hook、show_hook来提供定制的行为。
  • check_hook函数用于对变量值(超出GUC可以执行的操作)执行有效性检查,在特殊情况下计算原始设置,并可选择“规范化”用户提供的值。

  • assign_hook函数用于更新设置GUC变量时需要更改的状态(state)。

  • show_hook函数用于修改变量SHOW时的默认显示方式。


如果提供了check_hook,它将指向签名的函数,

    bool check_hook(datatype *newvalue, void **extra, GucSource source)

     “newvalue”参数的类型是bool *、int *、double *或char ** 分别用于bool、int/enum、real或string变量。chek_hook函数将会验证给定的值是否满足需求,如果满足返回true。如果不满足,返回false。同时,它还可以做一些格外的事情,例如:

     

         void GUC_check_errdetail(const char * format,...)


      当拒接了一个错误的值时,有必要将一些额外的误信息添加到报错信息中。上面函数中额外的错误信息字符串会嵌入到guc.c的错误报告中,成为DETAIL的一部分,所以,它必须要遵从错误消息的格式。


        void GUC_check_errhint(const char *format, ...)


        同样,也可以利用上面这个函数以的方式添加一个HINT(提示)消息。


        当然也可以修改相应的打印错误代码和错误消息

          void GUC_check_errcode(int sqlerrcode)
          void GUC_check_errmsg(const char *format, ...)


          如果提供了一个assign_hook变量,它将指向签名的函数

           void assign_hook(datatype newvalue, void *extra)


          newvalue 对应变量的类型,extra 保存来自check_hook(extera参数的值,如果没有提供check_hook时,通常是NULL值)。这个函数在实际设置变量值之前调用。因此,它可以查看实际的变量来确定行为,例如:当值没有真正变化时,它可以避免执行操作)
          注意:assign_hook没有提供处理错误情况的代码,所以,对于可能会出现问题的代码,用check_hook来替代assign_hook。

          如果提供了一个show_hook参数,他指向一个标记函数
            const char *show_hook(void)
            这个钩子允许对SHOW所显示的值进行特定于变量的计算,以及显示GUC变量值的其他SQL特性。
            例如我们用SHOW命令来显示一个GUC参数的当前值并且加上一些描述性的内容,就可以用show_hook函数来实现


            文章转载自Thornger,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论