C ++ и Postgresql без libpq ++ и SQLAPI ++

Как я могу создать интерфейс между C ++ и Postgresql без использования libpq ++ или SQLAPI ++, потому что я пытался установить эти две библиотеки, но у меня не получилось (учебников для Windows нет). Я знаю, что Postgis и Pgrouting используют C ++. Возможно, они используют другую библиотеку для взаимодействия с Postgresql …

Спасибо: D

2

Решение

Полезная документация:

Для функции foo, которая должна быть написана на c ++ и которая будет возвращать наборы, у меня есть следующие файлы:

  • 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

имеет фактический код cpp функции call_cpp_function, сюда не нужно включать файлы postgres, и, конечно, вы можете включить сюда больше файлов c ++.
Особые правила:

  • не забудьте попробовать / поймать или вы можете разбить сервер
  • как можно скорее преобразовать массивы 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
}
}

Примечание: вещи, не затронутые в этом ответе: компиляция, компоновка, добавление как расширение.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]