本節では内部的なECPGの動作を説明します。 この情報はECPGの使用方法を理解する手助けとして有用なことがあります。
ecpg
によって出力に書き込まれる最初の4行は固定されています。
2行はコメントで、残り2行はライブラリとのインタフェースのために必要なインクルード行です。
その後、プリプロセッサはファイル全体を読み取り、出力に書き出します。
通常は、単にすべてそのまま出力に書き出します。
EXEC SQL
を検出すると、間に入り、それを変更します。
このコマンドはEXEC SQL
で始まり、;
で終わります。
この間のすべてはSQL文として扱われ、変数の置換のために解析されます。
変数置換は、シンボルがコロン(:
)から始まる場合に発生します。
その名前の変数が、EXEC SQL DECLARE
セクションで事前に宣言された変数の中から検索されます。
ライブラリ内で最も重要な関数はECPGdo
です。
これが、ほとんどのコマンドの実行を管理します。
可変長の引数をとります。
すべてのプラットフォームで問題にならないことを祈っていますが、これは50程度の引数まで簡単に追加できます。
引数を以下に示します。
SQLコマンドの一部となるすべての変数に対して、この関数は以下の10個の引数を生成します。
特別シンボルとしての型。
値へのポインタ、もしくはポインタのポインタ。
変数がchar
かvarchar
の場合はそのサイズ。
配列の要素数(配列取り出し用)。
配列の次の要素のオフセット(配列取り出し用)。
特別シンボルとしての指示子変数の型。
指示子変数へのポインタ。
0
指示子配列内の要素数(配列取り出し用)。
指示子配列内の次要素へのオフセット(配列取り出し用)。
すべてのSQLコマンドがこの方法で扱われるわけではないことに注意してください。 例えば、以下のカーソルを開くSQL文は出力にコピーされません。
EXEC SQL OPEN cursor
;
その代わりにカーソルのDECLARE
コマンドがOPEN
コマンドの場所で使用されます。
実際にこのコマンドがカーソルを開くからです。
以下に、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"
ここで可読性のためにインデントを付けています。 プリプロセッサが行ったものではありません。