2016-07-26 5 views
2

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

Спасибо: D

ответ

0

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

Для функции 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 
    } 
} 

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

+0

спасибо @Vicky за вашу помощь, но как я могу скомпилировать эти файлы и добавить расширение? –

+0

в pgRouting, который в основном закодирован C++, есть CmakeLists.txt , вы можете посмотреть на него. (найти его в GitHub) – Vicky