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

时间:2016-07-26 17:34:18

标签: c++ postgresql pgrouting

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

谢谢:D

1 个答案:

答案 0 :(得分:0)

有用的文档:

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

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

<强> foo.c的

遵循“35.9.9。返回集(返回复合类型的简单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
  }
}

注意:此答案中未涉及的内容:编译,链接,添加为扩展名。