千家信息网

PostgreSQL中怎么载入外部模块

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,本篇文章为大家展示了PostgreSQL中怎么载入外部模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。PostgreSQL如何加载extension,例如
千家信息网最后更新 2024年11月23日PostgreSQL中怎么载入外部模块

本篇文章为大家展示了PostgreSQL中怎么载入外部模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

PostgreSQL如何加载extension,例如 PL/pgSQL、postgres_fdw,查看它们的symbol:

quanzl-mac:postgresql.builtin_pool quanzl$ nm lib/plpgsql.so                  U _AllocSetContextCreateExtended                 U _BeginInternalSubTransaction                 U _BlessTupleDesc...0000000000007a50 T _Pg_magic_func000000000001c86c s _Pg_magic_func.Pg_magic_data...0000000000007e10 T _pg_finfo_plpgsql_call_handler000000000001c888 s _pg_finfo_plpgsql_call_handler.my_finfo...0000000000007e20 T _plpgsql_call_handler...

T 表示 The symbol is in the text (code) section.
s 表示 The symbol is in an uninitialized data section for small objects.

本文关注模块加载时的动作,涉及上边的两个对象:_Pg_magic_func 和 _Pg_magic_func.Pg_magic_data

来看一个PG模块的代码(节选自 src/pl/plpgsql/src/pl_handler.c):

...static void plpgsql_extra_errors_assign_hook(const char *newvalue, void *extra);PG_MODULE_MAGIC;/* Custom GUC variable */static const struct config_enum_entry variable_conflict_options[] = {        {"error", PLPGSQL_RESOLVE_ERROR, false},        {"use_variable", PLPGSQL_RESOLVE_VARIABLE, false},        {"use_column", PLPGSQL_RESOLVE_COLUMN, false},        {NULL, 0, false}};...

这里注意 PG_MODULE_MAGIC,它的定义(src/include/fmgr.h):

.../* The actual data block contents */#define PG_MODULE_MAGIC_DATA \{ \        sizeof(Pg_magic_struct), \        PG_VERSION_NUM / 100, \        FUNC_MAX_ARGS, \        INDEX_MAX_KEYS, \        NAMEDATALEN, \        FLOAT4PASSBYVAL, \        FLOAT8PASSBYVAL \}...#define PG_MAGIC_FUNCTION_NAME Pg_magic_func#define PG_MAGIC_FUNCTION_NAME_STRING "Pg_magic_func"#define PG_MODULE_MAGIC \extern PGDLLEXPORT const Pg_magic_struct *PG_MAGIC_FUNCTION_NAME(void); \const Pg_magic_struct * \PG_MAGIC_FUNCTION_NAME(void) \{ \        static const Pg_magic_struct Pg_magic_data = PG_MODULE_MAGIC_DATA; \        return &Pg_magic_data; \} \extern int no_such_variable

可以看出,这里就是 Pg_magic_func 这个函数定义(symbol为什么多一个下划线请自行查资料),还有它的静态变量 Pg_magic_data。

Pg_magic_struct 这个结构体作用是在加载时检查模块是否与当前数据库内核匹配,防止不同版本或者不是PG模块的库的加载。

动态库的加载函数 internal_load_library 代码节选(src/backend/utils/fmgr/dfmgr.c):

    magic_func = (PGModuleMagicFunction)      pg_dlsym(file_scanner->handle, PG_MAGIC_FUNCTION_NAME_STRING);    if (magic_func)    {      const Pg_magic_struct *magic_data_ptr = (*magic_func) ();...

如果找不到 Pg_magic_func,或者是它的返回值与当前数据库服务器不一致,拒绝加载。

用于结构体初始化的 PG_MODULE_MAGIC_DATA,包含

1、结构体尺寸
2、版本号
3、函数最大参数个数
4、索引最大列数
5、单精度浮点传值
6、双精度浮点传值

上述内容就是PostgreSQL中怎么载入外部模块,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

模块 函数 结构 最大 代码 内容 就是 技能 数据 数据库 浮点 版本 知识 不同 简明 一致 简明扼要 上边 下划线 两个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海工业软件开发定制 云顶网络技术有限公司 什么是数据库的吞吐量 网络安全个人总结报告 学网络技术有哪些网站可以借鉴 孙正义互联网科技 电脑b站显示找不到服务器 安徽北斗授时模块服务器虚拟主机 重庆苹果软件开发费用 包河区综合网络技术服务优势 计算机3级网络技术考试报名时间 江苏嵌入式软件开发服务费 思迅sql数据库在哪打开 软件开发编程教程 大话2经典版有没有免费服务器 河北企业党性体检软件开发 美国租服务器怎么样 北京富讯盈科网络技术有限公司 oledb数据库操作 政府网络安全管理条例 访问服务器内部地址失败 网络安全资产保护资源投入 医疗信息数据库的常见安全威胁 应用层软件开发待遇 黎城网络安全员 英国软件开发公司 计算机二级关于数据库的知识点 云服务器市占率全球第一 金山区工程软件开发调试 注意网络安全 传播信息
0