Полезная документация:
Для функции Foo, который должен быть закодирован с C++ и собирается возвращать наборы у меня есть следующие файлы:
- Foo.c
- foo_driver. ч
- 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
}
}
Примечание: вещи, не охваченные в этом ответе: составление, связывание, добавляя в качестве расширения.
спасибо @Vicky за вашу помощь, но как я могу скомпилировать эти файлы и добавить расширение? –
в pgRouting, который в основном закодирован C++, есть CmakeLists.txt , вы можете посмотреть на него. (найти его в GitHub) – Vicky