我需要在postgresql 9.3中使用planner的钩子功能来执行任务。我正在从源代码构建postgresql。 首先,我想知道如何创建一个钩子并将该共享库附加到postgresql。因此,我尝试了“wiki.postgresql.org/images/e/e3/Hooks_in_postgresql.pdf”中给出的示例, “https://github.com/gleu/Hooks-in-PostgreSQL/tree/master/examples/my_client_auth”。
我已将“my_client_auth.c”文件和Makefile复制到contrib / client_auth文件夹中。 make和make install工作正常。 这是make install的输出。
/bin/mkdir -p '/home/rajmohan/projects/lib/postgresql'
/usr/bin/install -c -m 755 my_client_auth.so '/home/rajmohan/projects/lib/postgresql/'
之后我将shared_preload_libraries ='my_client_auth'添加到postgresql.conf。
当我重建并运行项目并在postgresql代码中检查client_auth_hook时 client_auth_hook值始终为零。似乎my_client_auth.so文件没有正确链接到我的postgresql项目。 我错过了任何一步吗?如何从postgresql访问my_client_auth.so中的方法。请帮助
答案 0 :(得分:1)
然后我添加了行ClientAuthentication_hook_type client_auth_hook = NULL;在文件的顶部说planner.c
你为什么这样做?
如果要使用扩展中的挂钩,则必须定义_PG_init
函数,以便在shared_preload_libraries
时加载时在扩展中设置挂钩。
无需自行修改PostgreSQL源代码。只有您的扩展名。请查看现有的示例,例如PostgreSQL源代码树中的contrib/auth_delay
,了解如何正确执行此操作。
你的扩展程序没有链接到postgresql项目"在编译/链接时,也是。它是PostgreSQL在运行时通过create extension
提出或在shared_preload_libraries
中列出时可链接到的可加载模块。那时它运行_PG_init
中的任何代码,这是你安装钩子函数等的机会。