6.6. 開発者向けに

このセクションはecpgインタフェースを開発したい人 のために書かれています。内部構造を見たい人に役立つ情報とどのように使えば よいかを入れれば大体の質問には答えられるのではないかと思います。 ですから、ecpgの中を見る前にこれを読んで下さい。 その部分に興味のない人はとばしてください。

6.6.1. ToDo リスト

このバージョンではプリプロセッサにいくつか難点があります。

ライブラリ関数

to_date 等は存在しませんが、Postgresは優れた変換 ルーチンを持っていますので不便はないでしょう。

構造体とユニオン

構造体とユニオンは宣言セクションで定義されなくてはいけません。

欠落している文

以下の文は今のところ実装されていません。

exec sql allocate

exec sql deallocate

SQLSTATE

メッセージ 'no data found'

exec の中の insert select from 文の "no data" エラーメッセージは100でなければいけません。

sqlwarn[6]

sqlwarn[6] は、もし SET DESCRIPTOR 文で定義された PRECISION もしくは SCALE 値が無視 された場合 'W' になります。

6.6.2. プリプロセッサ

出力される最初の4行は ecpg から常に追加されます。これらは2つのコメントで、2つは インタフェースに必要な行をライブラリに含んでいます。

そしてプリプロセッサは一つのパスでのみ動きます。入力ファイルを読み、出力に 書き込むのです。通常は先をみないでただ出力に echo します。

EXEC SQL文になるとその内容に基づいて、間に入り変更します。

宣言セクション

宣言セクションは

exec sql begin declare section;
	 
で始まり、
exec sql end declare section;
	 
で終ります。 このセクションでは変数宣言だけが許可されています。ここで宣言される変数 はすべて、型と名前がインデックスされた変数のリストにも入ります。

特に構造体やユニオンの定義は宣言セクションでリストされなければいけません。 そうしないとecpgは定義を知らないためにこれらの型 を扱えなくなります。

変数を通常の C 変数にもするために、宣言はファイルにも echo されます。

特別な型であるVARCHAR と VARCHAR2 は変数ごとに名前のある構造体に変換されます。 下記のような宣言は

VARCHAR var[180];
	 
下のように変換されます。
struct varchar_var { int len; char arr[180]; } var;
	 

Include 文

include文はこのようになります。

exec sql include filename;
	 
下記のものとは違うことに注意して下さい。
#include <filename.h>
	 

そのかわり、指定されたファイルはecpg自身で構文解析します。 ですから指定されたファイルの中身は、結果のC コードに含まれます。この方法だと、 EXEC SQL コマンドをinclude ファイルに指定することができます。

Connect 文

connect 文は次のようになります。

exec sql connect to connection target;
	 
これは指定されたデータベースへの接続をします。

接続ターゲットは次のように指定することができます。

dbname[@server][:port][as connection name][user user name]

tcp:postgresql://server[:port][/dbname][as connection name][user user name]

unix:postgresql://server[:port][/dbname][as connection name][user user name]

character variable[as connection name][user user name]

character string[as connection name][user]

default

user

ユーザ名を指定するには別の方法もあります。

userid

userid/password

passwordで定義される userid

passwordを使ったuserid

最後に userid と password です。それぞれテキスト、文字変数、 もしくは文字列である可能性があります。

Disconnect 文

disconnect 文はこのようになります。

exec sql disconnect [connection target];
	 
これは指定されたデータベースへの接続を閉じます。

接続ターゲットは次のように指定することが できます。

connection name

default

current

all

Open cursor 文

open cursor 文はこのようになります。

exec sql open cursor;
	 
これは無視され出力にコピーされません。

Commit 文

commit 文はこのようになります。

exec sql commit;
	 
そして出力上で翻訳されます。
ECPGcommit(__LINE__);
	 

Rollback 文

rollback 文はこのようになります。

exec sql rollback;
	 
そして出力上で翻訳されます。
ECPGrollback(__LINE__);
	 

他の構文

他のSQL文はexec sqlで始まり ;で終るものです。その中間はすべてSQL 文として扱われ、変数の代用が構文解析されます。

変数の代用はシンボルがコロン(:)で始まる場合 に起こります。そしてその名前の変数が、宣言セクションで以前宣言 された変数の中から探されます。変数が入力用か出力用であるかに よって、関数からのアクセスを許可するために変数へのポインタが 出力に書かれます。

SQL要求の一部であるすべての変数には、関数が さらに10の引数を与えられます。

特別シンボルとしての型
値へのポインタもしくはポインタのポインタ
変数が char か varchar だった場合はそのサイズ
配列の要素数(配列取り出し用)
配列の次の要素のオフセット(配列取り出し用)
特別シンボルとしての指示変数の型
指示変数の値へのポインタもしくは指示変数のポインタへのポインタ
0.
指示配列の要素数(配列取り出し用)
指示配列の次の要素のオフセット(配列取り出し用)

6.6.3. 完全な例

これはファイル foo.pgc のプリプロセッサの出力を説明した完全な例です。

exec sql begin declare section;
int index;
int result;
exec sql end declare section;
...
exec sql select res into :result from mytable where index = :index;
     
これはこのように翻訳されます。
/* Processed by ecpg (2.6.0) */
/* These two include files are added by the preprocessor */
#include <ecpgtype.h>;
#include <ecpglib.h>;

/* exec sql begin declare section */

#line 1 "foo.pgc"

 int index;
 int result;
/* exec sql end declare section */
...
ECPGdo(__LINE__, NULL, "select  res  from mytable where index = ?     ",
	ECPGt_int,&(index),1L,1L,sizeof(int),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
        ECPGt_int,&(result),1L,1L,sizeof(int),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 147 "foo.pgc"

     
このマニュアルのインデントは読みやすさのためにこうしてありますが、 プリプロセッサはこのようにはしません。

6.6.4. ライブラリ

ライブラリの中で最も重要な関数はECPGdoです。これは 様々な数の引数をとります。vararg 関数に許可される変数の数が限られていない マシンを使わないことを願います。その場合50かそれ以上の引数を追加 することになるからです。

引数は:

行数

これはエラーメッセージのみで使われた元の行の数です。

文字列

これは発行されるべきSQL要求です。 その要求は入力変数により変更されます(例:コンパイル時には知られて いなかったが要求時に入力された変数)。変数が行くべきところには "."があります。

入力変数

プリプロセッサのセクションで説明されているように、すべての 入力変数は10の引数を持ちます。

ECPGt_EOIT

入力変数がもうないことを表します。

出力変数

プリプロセッサの部分で説明されるように、全ての入力変数は10の引数 を受けます。これらの変数は関数で埋められています。

ECPGt_EORT

変数がもうないことを表します。

すべてのSQL文はコミットトランザクションを発行しない 限り一つのトランザクションで処理されます。この自動トランザクション を実行するために、最初の文もしくはコミットかロールバックのあとの 最初の文が常にトランザクションを始めます。この機能を無効にする ためにはコマンドラインで-tオプションをつけて下さい。

他の項目を説明する項目はまだ書かれていません。