我使用PostgreSQL钩子已经有一段时间了,昨天我想尝试添加我自己的钩子来测试一些东西(并且是为了好玩)。
所以我查了一下ExecutorStart_hook,看看我需要做些什么,才能把自己的钩子挂到PostgreSQL上。
在execMain.c中,首先定义钩子

ExecutorStart_hook_type ExecutorStart_hook = NULL;

然后在ExecutorStart(...);中使用它。
在executor.h中,我们首先定义hook类型,然后导入hook变量。
typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);
extern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;

从何处导入此钩子变量?除了execMain.c之外,我在其他任何地方都看不到它,在那里也看不到aPGDLLEXPORT

最佳答案

在非windows平台上,这没有任何作用。
在windows上,PGDLLIMPORT的含义根据PostgreSQL服务器是正在编译还是扩展而改变。标题是从扩展的角度编写的,这就是为什么它会说PGDLLIMPORT
如果您查看PGDLLIMPORTsrc/include/port/win32.h的定义:

#ifdef BUILDING_DLL
#define PGDLLIMPORT __declspec (dllexport)
#else                           /* not BUILDING_DLL */
#define PGDLLIMPORT __declspec (dllimport)
#endif

... 您将看到,如果设置了BUILDING_DLL,我们将其展开为__declspec(ddlexport)。所以它从服务器二进制文件中导出符号。我们只在编译时设置了BUILDING_DLL;它的名称有点不幸。这是因为在Windows上,通常是从dll导出符号以供应用程序使用,而不是像postgres那样从dll导出符号。
如果未设置postgres.exe,则将BUILDING_DLL定义为PGDLLIMPORT,将符号从服务器二进制文件导入到链接到它的任何文件中。
所以。。。当postgres包含__declspec(dllimport)时,它将导出符号。当您在扩展DLL项目中包含executor.h时,它将导入符号。
所有这些都是必要的,因为how DLL linkage works on win32/PE。在ELF平台(Linux、BSD等)和Mach-O(MacOSX)上,没有任何必要。

关于c - PGD​​LLIMPORT和PostgreSQL C钩子(Hook),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43804054/

10-11 04:53