第 10 课 PostgreSQL 在内核增加一个配置参数
时间:2019-05-23 13:27 来源:linux.it.net.cn 作者:IT
1. 在配置文件增加你需要的参数
例如我增加一个参数,配置文件:data/postgresql.conf,
data目录怎么来的,可以参考《第5课 PostgreSQL 编译源代码进行开发》
2. 修改源代码
src/backend/utils/misc/guc.c,在这个文件中,针对不同的数据类型(bool,int, double,string)实现了4个init*函数和4个数据结构数组:
-
InitConfigureNamesBool()用来初始化bool类型参数,myConfigureNamesBool[]数组里配置我们需要的bool参数;
-
InitConfigureNamesInt()用来初始化int类型参数,myConfigureNamesInt[]数组里配置我们需要的int参数;
-
InitConfigureNamesReal()用来初始化double类型参数,InitConfigureNamesReal[]数组里配置我们需要的double参数;
-
InitConfigureNamesString()用来初始化string类型参数,InitConfigureNamesString[]数组里配置我们需要的string参数;
回到我们例子,我增加是字符串类型,我需要在InitConfigureNamesString[]数组中增加我的参数:
static void
InitConfigureNamesString(void)
{
struct config_string myConfigureNamesString[] =
{
{
{"myname", PGC_SIGHUP, LOGGING_WHAT,
gettext_noop("my name"),
},
&myname,
"duye", NULL, NULL
},
myname需要在前面定义好:
MT_LOCAL char* myname = NULL;
3. 查看变量是否设置成功
我们就在src/backend/postmaster/postmaster.c的PostmasterMain()函数中读取该参数,我们在该函数中可以看到InitializeGUCOptions()函数,他就是为了初始所有参数。
查看参数:
postgres=# show myname;
myname
--------
duye
(1 行)
4. 程序中使用变量
在源码文件src/backend/utils/misc/guc.c提供了几个对外查询参数的接口,外部模块可以使用这些函数获取参数。
extern const char *GetConfigOption(const char *name);
extern const bool GetBoolConfigOption(const char *name);
extern const int GetIntConfigOption(const char *name);
extern const char *GetConfigOptionResetString(const char *name);
extern char *GetConfigOptionByName(const char *name, const char **varname);
extern void GetConfigOptionByNum(int varnum, const char **values, bool *noshow);
extern int GetNumConfigOptions(void);
例如:
#include "utils/guc.h"
const char* var = GetConfigOption("myname");
printf("%s\n", var);
(责任编辑:IT)
1. 在配置文件增加你需要的参数
例如我增加一个参数,配置文件:data/postgresql.conf,
2. 修改源代码src/backend/utils/misc/guc.c,在这个文件中,针对不同的数据类型(bool,int, double,string)实现了4个init*函数和4个数据结构数组:
回到我们例子,我增加是字符串类型,我需要在InitConfigureNamesString[]数组中增加我的参数: static void InitConfigureNamesString(void) { struct config_string myConfigureNamesString[] = { { {"myname", PGC_SIGHUP, LOGGING_WHAT, gettext_noop("my name"), }, &myname, "duye", NULL, NULL }, myname需要在前面定义好: MT_LOCAL char* myname = NULL; 3. 查看变量是否设置成功我们就在src/backend/postmaster/postmaster.c的PostmasterMain()函数中读取该参数,我们在该函数中可以看到InitializeGUCOptions()函数,他就是为了初始所有参数。 查看参数: postgres=# show myname; myname -------- duye (1 行) 4. 程序中使用变量在源码文件src/backend/utils/misc/guc.c提供了几个对外查询参数的接口,外部模块可以使用这些函数获取参数。 extern const char *GetConfigOption(const char *name); extern const bool GetBoolConfigOption(const char *name); extern const int GetIntConfigOption(const char *name); extern const char *GetConfigOptionResetString(const char *name); extern char *GetConfigOptionByName(const char *name, const char **varname); extern void GetConfigOptionByNum(int varnum, const char **values, bool *noshow); extern int GetNumConfigOptions(void); 例如: #include "utils/guc.h" const char* var = GetConfigOption("myname"); printf("%s\n", var); (责任编辑:IT) |