从源代码构建时,钩子在postgresql 9.3中不起作用

时间:2014-04-30 15:30:28

标签: postgresql hook

我需要在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中的方法。请帮助

1 个答案:

答案 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中的任何代码,这是你安装钩子函数等的机会。