PostgreSQL 外部动态连接库魔法块的使用

PostgreSQL 外部动态连接库魔法块的使用,第1张

概述最常见的一种方式 CREATE FUNCTION c_overpaid(emp, integer) RETURNS boolean AS 'os_libpath', 'c_funcname' LANGUAGE C STRICT; 文档中提到两种调用习惯 V0 和 V1,从代码里边看,V0已经不再支持。 这里不去考虑函数定义方法,着重看 MAGIC 定义,相信很多朋友遇到过这个错 最常见的一种方式
CREATE FUNCTION c_overpaID(emp,integer) RETURNS boolean    AS 'os_libpath','c_funcname'    LANGUAGE C STRICT;

文档中提到两种调用习惯 V0 和 V1,从代码里边看,V0已经不再支持。
这里不去考虑函数定义方法,着重看 MAGIC 定义,相信很多朋友遇到过这个错误:

ereport(ERROR,(errmsg("incompatible library \"%s\": missing magic block",libname),errhint("Extension librarIEs are required to use the PG_MODulE_MAGIC macro.")));


这是没有在外部库里边引入 magic data 引起的,它定义在 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 \}/** Declare the module magic function. It needs to be a function as the dlsym* in the backend is only guaranteed to work on functions,not data*/typedef const Pg_magic_struct *(*pgmoduleMagicFunction) (voID);#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" 函数,如果有将它的返回值与当前数据库内核定义作比较,如果不符合就会报错,具体逻辑请看 src/backend/utils/fmgr/dfmgr.c 中定义的 internal_load_library 函数 源代码。 总结

以上是内存溢出为你收集整理的PostgreSQL 外部动态连接库魔法块的使用全部内容,希望文章能够帮你解决PostgreSQL 外部动态连接库魔法块的使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1178080.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存