没有libpq++和SQLAPI++的C++和Postgresql

C++ and Postgresql without libpq++ and SQLAPI++

本文关键字:C++ Postgresql SQLAPI++ libpq++ 没有      更新时间:2023-10-16

我如何在不使用libpq++或SQLAPI++的情况下在C++和Postgresql之间创建接口,因为我试图安装这两个库,但我无法安装(没有windows教程)。我知道Postgis和Ppricing使用C++。。也许他们使用另一个库来与Postgresql接口。。。

谢谢:D

有用的文档:

  • https://www.postgresql.org/docs/current/static/spi.html
  • https://www.postgresql.org/docs/current/static/xfunc-c.html
    • 使用:35.9.4。版本1调用约定

对于要用c++编码并将返回集合的函数foo,我有以下文件:

  • foo.c
  • foo_driver.h
  • foo_driver.cpp

foo.c

遵循"35.9.9。Returning Sets(一个简单SRF返回复合类型的完整示例)"除了我们在调用实际的c++函数之前调用一个静态函数来做一些事情(主要是读取更多数据)

  static process ( char* a, bool b, bool c, mystruct* result_tuples, int result_count) {
    <maybe some checking or conversions here of a, b, & c>
    call_cpp_function( a1, b1, c1, result_tuples, result_count )
    }
    PG_FUNCTION_INFO_V1(foo);
    Datum
    foo(PG_FUNCTION_ARGS)    {
      ...
      process(
                pgr_text2char(PG_GETARG_TEXT_P(0)),
                PG_GETARG_BOOL(1),
                PG_GETARG_BOOL(2),
                &result_tuples,
                &result_count);
      ...
      } // end of first call
      ...
      if (call_cntr < max_calls) {
      ...
      else {
        free(result_tuples);
        SRF_RETURN_DONE(funcctx);
      }
    };

foo_driver具有将在C代码和C++代码上使用的C++函数的定义

#ifdef __cplusplus
extern "C" {
#endif
void  call_cpp_function( <parameters > );

#ifdef __cplusplus
}
#endif

foo_driver.cpp

具有函数"call_cpp_function"的实际cpp代码非postgres文件将包含在这里,当然您可以在这里包含更多的c++文件。特殊规则:

  • 不要忘记try/catch,否则可能会使服务器崩溃
  • 尽快将C数组转换为C++容器
  • 不要在C++代码上使用指针,除非
    • 创建生成的C数组时(记住我的示例返回一个集合)
  • 不要忘记最后一次通话结束后的"免费"语句

例如

#include < vector >
#include < deque >
#include "myclass.h"
void  call_cpp_function( <parameters > ) {
  try {
   <process>
   // use malloc to prepare the C array

  } catch( .. ) {
  // do cleanup
  }
}

注意:这个答案中没有涉及的内容:编译、链接、作为扩展添加。