【问题标题】:How to write a Postgres language handler using MSVC如何使用 MSVC 编写 Postgres 语言处理程序
【发布时间】:2020-10-19 07:16:46
【问题描述】:

这是直接来自示例的代码。 64 位安装,x64 构建。

#include "postgres.h"
#include "executor/spi.h"
#include "commands/trigger.h"
#include "fmgr.h"
#include "access/heapam.h"
#include "utils/syscache.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_type.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif


PGDLLEXPORT Datum plsample_call_handler(PG_FUNCTION_ARGS); // <-- the answer!!


PG_FUNCTION_INFO_V1(plsample_call_handler);

Datum
plsample_call_handler(PG_FUNCTION_ARGS)
{
  Datum          retval;
  retval = 42;
  return retval;
}

它可以编译和链接。这是 SQL:

CREATE FUNCTION plsample_call_handler() RETURNS language_handler
    AS 'TryPostgresPl.dll'
    LANGUAGE C;
CREATE LANGUAGE plsample
    HANDLER plsample_call_handler;

这是错误信息。

ERROR: could not find function "plsample_call_handler" in file "C:/Program Files/PostgreSQL/9.5/lib/TryPostgresPl.dll"
SQL state: 42883

那么近,却又那么远。真的不知道去哪里找。


根据 Nick Barnes 进行编辑以显示答案。请注意,查看 depends.exe 之前显示了 2 个导出,现在是 3 个。

【问题讨论】:

  • @NickBarnes:谢谢!发现。编辑以显示答案。如果您想将您的评论转换为答案,我会接受。顺便说一句,那篇文章中还有其他内容——很好的链接。

标签: postgresql visual-c++ postgresql-extensions


【解决方案1】:

Postgres 文档中的示例直接针对 Linux 环境;显然,Windows 中涉及的内容更多。 @CraigRingeran excellent article 解释了如何在 Visual Studio 中进行操作。

在这种情况下,看起来你只需要添加以下函数原型:

PGDLLEXPORT Datum plsample_call_handler(PG_FUNCTION_ARGS);

【讨论】:

  • 解决了我的问题。那里仍然很糟糕,但这已经足够了。谢谢!
【解决方案2】:

对我来说(Postgres 13 x64,VS2019,MSVC 14.27),只需在PG_FUNCTION_INFO_V1 前面添加PGDLLEXPORT 就足够了,即:

PGDLLEXPORT PG_FUNCTION_INFO_V1(my_func);

仔细观察,这相当于:

PGDLLEXPORT extern Datum my_func(PG_FUNCTION_ARGS);
... plus a bunch more stuff

您会注意到这与在接受的答案中手动完成的操作非常相似,因此这种方式似乎可以避免一些重复。唯一的区别是extern 关键字;老实说,我对 C 的了解还不够,无法知道为什么将 PGDLLEXPORT 之前 extern 放在后面仍然有效(而不是像我在所有示例中看到的那样),但是编译器没有'不要抱怨,扩展工作。

YMMV 特别是如果这些宏在未来发生变化。

【讨论】:

  • 它只是潜入__declspec (dllexport),所以这并不奇怪。似乎说服 MSVC 进行正确的导出的问题现在已广为人知。先驱者得到箭,定居者得到铺砌的道路。
猜你喜欢
  • 1970-01-01
  • 2013-09-08
  • 2010-11-29
  • 1970-01-01
  • 2011-03-24
  • 2013-11-11
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多