ecpg の使い方

このセクションでは ecpg ツールの使い方を解説します.

プリプロセッサ

プリプロセッサは ecpg という名前です. インストールすると Postgresbin/ ディレクトリに置かれます.

ライブラリ

ecpg のライブラリは libecpg.a あるいは libecpg.so という名前です. 加えてこのライブラリは Postgres サーバとの通信に libpq ライブラリを使うので, プログラムのリンクで -lecpg -lpq を指定しなければなりません.

ライブラリはいくつか「秘密の」メソッドを持っていますが, これが時として非常に役立つことがわかるはずです.

エラー処理

Postgres からのエラーを検出できるようにするには,

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: 空                                             */
 /* 1: 空                                             */
 /* 2: INSERT, UPDATE, DELETE 文で処理された行数      */
 /* 3: 空                                             */
 /* 4: 空                                             */
 /* 5: 空                                             */
 char sqlwarn[8];
 /* 0: 他の要素が 'W' であれば 'W' がセットされます   */
 /* 1: 'W' であれば,ホスト変数に文字列を代入する時に */
 /*    少なくともひとつの値が余分を切り落とされていま */
 /*    す                                             */
 /* 2: 空                                             */
 /* 3: 空                                             */
 /* 4: 空                                             */
 /* 5: 空                                             */
 /* 6: 空                                             */
 /* 7: 空                                             */
 char sqlext[8];
} sqlca;

直前の SQL 文でエラーが発生すると sqlca.sqlcode が 0 以外の値になります. もし sqlca.sqlcode が 0 より小さな値であれば, データベースの定義が与えられた問い合わせと合致しないといった何らかの深刻なエラーです. 0 よりも大きな値であれば, テーブルが要求した行を含んでいないなどの普通のエラーです.

sqlca.sqlerrm.sqlerrmc にはエラーを説明する文字列が含まれます. 文字列はソースファイル中の該当行番号で終わります.

発生する可能性のあるエラーのリストです:

-12, Out of memory in line %d.(メモリが足りません:行番号 %d.)

通常は発生しません.これは仮想メモリを使い尽くしてしまったことを示すものです.

-200, Unsupported type %s on line %d. (%s はサポートされていない型です:行番号 %d.)

通常は発生しません. これはライブラリの知らない何かをプリプロセッサが生成したことを示すものです. おそらく互換性のないバージョンのプリプロセッサとライブラリを使ったのでしょう.

-201, Too many arguments line %d. (引数が多すぎます:行番号 %d.)

これは用意したホスト変数よりも多くの引数を Postgres が返したことを意味します. おそらく INTO :var1,:var2 リストの中のホスト変数の組を忘れてしまったのでしょう.

-202, Too few arguments line %d. (引数が足りません:行番号 %d.)

これは用意したホスト変数よりも少ない引数を Postgres が返したことを意味します. おそらく INTO :var1,:var2 リストの中に余分なホスト変数の組があるのでしょう.

-203, Too many matches line %d. (マッチするものが多すぎます:行番号 %d.)

これは問い合わせが複数行を返したが,指定した変数が配列ではないことを意味します. たぶん,発行した SELECT 文が一意になるものではなかったのでしょう.

-204, Not correctly formatted int type: %s line %d. (正しくフォーマットされた int 型ではありません : %s :行番号 %d.)

これはホスト変数の型が int であるにもかかわらず, Postgres データベースのフィールドが他の型であり, int として解釈できない値が含まれていることを意味します. ライブラリはこの変換に strtol を使います.

-205, Not correctly formatted unsigned type: %s line %d. (正しくフォーマットされた unsigned 型ではありません : %s :行番号 %d.)

これはホスト変数の型が unsigned int であるにもかかわらず, Postgres データベースのフィールドが他の型であり, unsigned int として解釈できない値が含まれていることを意味します. ライブラリはこの変換に strtoul を使います.

-206, Not correctly formatted floating point type: %s line %d. (正しくフォーマットされた浮動小数点型ではありません : %s :行番号 %d.)

これはホスト変数の型が float であるにもかかわらず, Postgres データベースのフィールドが他の型であり, float として解釈できない値が含まれていることを意味します. ライブラリはこの変換に strtod を使います.

-207, Unable to convert %s to bool on line %d. (%s から論理値へ変換できません:行番号 %d.)

これはホスト変数の型が bool であるにもかかわらず, Postgres データベースのフィールドが 't' と 'f' のいずれでもないことを意味します.

-208, Empty query line %d. (空の問い合わせ行です:行番号 %d.)

Postgres が PGRES_EMPTY_QUERY を返しました. おそらく問い合わせが実際には空だったのでしょう.

-220, No such connection %s in line %d. (%s という接続はありません:行番号 %d.)

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

-221, Not connected in line %d. (接続されていません:行番号 %d.)

プログラムがアクセスしようとした接続は存在しますがオープンはされていません.

-230, Invalid statement name %s in line %d. (無効な文の名前です %s :行番号 %d)

まだ準備 (prepare) していない文を使おうとしました.

-400, Postgres error: %s line %d. (Postgres のエラー %s :行番号 %d.)

Postgres の何らかのエラーです. このメッセージには Postgres バックエンドからのエラーメッセージも含まれています.

-401, Error in transaction processing line %d. (トランザクション処理内のエラー:行番号 %d.)

トランザクションのコミット,あるいはロールバックを開始できないと Postgres が知らせてきました.

-402, connect: could not open database %s. (connect: データベース %s を開けません)

データベースへの接続が動作しません.

100, Data not found line %d. (データが見つかりません:行番号 %d.)

これは問い合わせをしたものが見つからない, あるいはカーソルが末端を通り過ぎたといった「普通の」エラーです.