在PostgreSQL函数或过程中使用C ++代码

时间:2018-07-30 18:35:43

标签: c++ postgresql

我在编写 C ++ 代码时与#include <seal/seal.h>一起使用的 PostgreSQL 在同一台PC上有一个已编译的库。我必须使用该库来处理PostgresSQL数据库中的某些表值。遗憾的是,不能选择使用 Postgres 在同一台PC上运行单独的客户端来与数据库进行通信。

是否可以在 PostgreSQL 函数或过程中包含和使用#include <seal/seal.h>随附的函数? 我读到一些有关使用的信息:

external "C" {

#include <seal/seal.h>
// do something with the seal functions here

}

但是这里没有太多的例子,我也不理解。 PostgreSQL 文档中有关 C ++ 的部分也没有使其更清晰。

1 个答案:

答案 0 :(得分:0)

如文档所建议,从PostgreSQL调用的函数必须声明为extern C,以便C代码可以与其链接。

在必须从C ++库调用函数的地方,您可以使用异常处理程序,该处理程序使用catch (...)捕获所有可能的异常并将其转换为PostgreSQL错误消息通过调用ereport()(在catch子句之外,因此您的调用堆栈中没有C ++)。

如果必须调用PostgreSQL C函数,请确保调用堆栈不包含任何非Result的值:

  

C ++中的PDS类型或Plain Old C ++ Object被定义为标量类型或PDS类。 PDS类没有用户定义的副本分配运算符,没有用户定义的析构函数,也没有本身不是PDS的非静态数据成员。而且,PDS类必须是一个聚合,这意味着它没有用户声明的构造函数,没有私有或受保护的非静态数据,没有虚拟基类,也没有虚拟函数。

简而言之,除非调用库函数,否则应尽可能使用C编写代码。