6.3. ecpgの使いかた

このセクションはecpgツールの使いかたを説明します。

6.3.1. プリプロセッサ

プリプロセッサはecpgと呼ばれます。インストールのあと Postgresbin/ディレクトリ に置かれます。

6.3.2. ライブラリ

ecpgライブラリはlibecpg.aもしくは libecpg.soと呼ばれます。更に、このライブラリは Postgresサーバーとの通信にlibpq ライブラリを使うので、プログラムを-lecpg -lpqと リンクしておく必要があります。

このライブラリはいくつか "隠された" メソッドを持っていますが、時においては とても便利です。

6.3.3. エラー処理

Postgresサーバからのエラーを見つけるためには ファイルのincludeセクションに下記のような行を追加して下さい。

      exec sql include sqlca;
     
これは構造体とsqlcaという名前の変数を次のように 定義します。
struct sqlca
{
 char sqlcaid[8];
 long sqlabc;
 long sqlcode;
 struct
 {
  int sqlerrml;
  char sqlerrmc[70];
 } sqlerrm;
 char sqlerrp[8];
 long sqlerrd[6];
 /* 0: empty                                         */
 /* 1: OID of processed tuple if applicable          */
 /* 2: number of rows processed in an INSERT, UPDATE */
 /*    or DELETE statement                           */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */
 char sqlwarn[8];
 /* 0: set to 'W' if at least one other is 'W'       */
 /* 1: if 'W' at least one character string	     */
 /*    value was truncated when it was               */
 /*    stored into a host variable.                  */
 /* 2: empty                                         */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */
 /* 6: empty                                         */
 /* 7: empty                                         */
 char sqlext[8];
} sqlca;
     

もし上のSQL文でエラーが発生した場合 sqlca.sqlcodeが 0 以外になります。もし sqlca.sqlcodeがその 0 よりも小さい場合、 データベース定義が与えられた問い合わせと合わないといった深刻な エラーです。もし 0 以上だった場合はテーブルが要求された行を含まない といった通常のエラーです。

sqlca.sqlerrm.sqlerrmc はエラーを説明する文字列を持っています。 その文字列はソースファイルの行数で終ります。

起こり得るエラーのリスト:

-12, Out of memory in line %d.

通常は起こりません。これは仮想メモリに空きが無いことを知らせるものです。

-200, Unsupported type %s on line %d.

通常は起こりません。これはライブラリの知らないものをプリプロセッサが 作ったことを知らせます。プリプロセッサとライブラリのバージョンが 相容れないものを使っている可能性があります。

-201, Too many arguments line %d.

これはPostgresが、持っている変数より多い 引数を返した場合です。おそらくINTO :var1,:var2 リストでホスト変数を対にするのを忘れたのでしょう。

-202, Too few arguments line %d.

これはPostgresが、持っているホスト変数より少ない 引数を返した場合です。おそらくINTO :var1,:var2リストに ホスト変数を多く入れすぎています。

-203, Too many matches line %d.

これは問い合わせが数行を返したにも関わらず、指定された変数が配列になっていません。 入力したSELECTが一意なものではなかったのです。

-204, Not correctly formatted int type: %s line %d.

これは、ホスト変数がint型でPostgres データベースのフィールドがintでは表せない別の型を含んでいるという意味です。 ライブラリはこの変換にstrtolを使います。

-205, Not correctly formatted unsigned type: %s line %d.

これは、ホスト変数がunsigned int型でPostgres データベースのフィールドがunsigned int型では表せない型を含んでいるという 意味です。

-206, Not correctly formatted floating point type: %s line %d.

これは、ホスト変数がfloat型でPostgresデータベース のフィールドがfloatでは表せない別の型を含んでいるという意味です。 ライブラリはこの変換にstrtodを使います。

-207, Unable to convert %s to bool on line %d.

これはホスト変数がbool型でPostgres データベースのフィールドが't' でも 'f' でもないという意味です。

-208, Empty query line %d.

おそらく問い合わせが空だったために、Postgres がPGRES_EMPTY_QUERYを返しました。

-220, No such connection %s in line %d.

プログラムが存在しない接続にアクセスしようとしています。

-221, Not connected in line %d.

プログラムが、存在するけれども開いていない接続にアクセスしようとしています。

-230, Invalid statement name %s in line %d.

使おうとしている文が用意されていません。

-400, Postgres error: %s line %d.

Postgresのエラーです。 このメッセージはPostgresのバックエンド からのエラーメッセージを含んでいます。

-401, Error in transaction processing line %d.

スタート、コミット、トランザクションの ロールバックができないことをPostgres が警告しています。

-402, connect: could not open database %s.

データベースへの接続ができませんでした。

100, Data not found line %d.

これは「一般的な」エラーで問い合わせているものが見つけられないか、 カーソルで通りすぎてしまったものです。