我使用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之外,我在其他任何地方都看不到它,在那里也看不到a
PGDLLEXPORT
。 最佳答案
在非windows平台上,这没有任何作用。
在windows上,PGDLLIMPORT
的含义根据PostgreSQL服务器是正在编译还是扩展而改变。标题是从扩展的角度编写的,这就是为什么它会说PGDLLIMPORT
。
如果您查看PGDLLIMPORT
中src/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 - PGDLLIMPORT和PostgreSQL C钩子(Hook),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43804054/