gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:55 25 4
gpt4 key购买 nike

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

谢谢你:D

最佳答案

有用的文档:

对于要用 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
}
}

注意:此答案中未涵盖的内容:编译、链接、添加为扩展。

关于没有 libpq++ 和 SQLAPI++ 的 C++ 和 Postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38596443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com