2

libpq++ または SQLAPI++ を使用せずに C++ と Postgresql の間のインターフェイスを作成するにはどうすればよいですか。これら 2 つのライブラリをインストールしようとしましたが、できませんでした (Windows のチュートリアルはありません)。Postgis と Pgrouting が C++ を使用していることは知っています。おそらく、別のライブラリを使用して Postgresql とのインターフェースをとっています...

ありがとう:D

4

1 に答える 1

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

postgres ファイル以外の関数「call_cpp_function」の実際の cpp コードがここに含まれます。もちろん、ここにさらに 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
  }
}

注:この回答でカバーされていないこと:コンパイル、リンク、拡張機能としての追加。

于 2016-07-26T22:52:30.017 に答える