ECPGPlus-概要¶
EDBはECPG(PostgreSQLプリコンパイラ)を強化してECPGPlusを作成しました。ECPGPlusは、PostgreSQLCプリコンパイラのPro*C互換バージョンです。ECPGPlusは、Cコードと埋め込みSQLステートメントを組み合わせたプログラムを同等のCプログラムに変換します。変換を実行する際、ECPGPlusは各SQLコンストラクトの構文が正しいことを確認します。
次の図は、実行可能ファイルにコンパイルされる埋め込みSQLステートメントを含むプログラムのパスを示しています。
埋め込みSQLステートメントを含むプログラムのコンパイル¶
埋め込みSQLステートメントを含むCプログラムから実行可能ファイルを生成するには、プログラム(上図の my_program.pgc )をECPGPlusプリコンパイラに渡します。ECPGPlusは、 my_program.pgc の各SQLステートメントを ecpglib APIを呼び出すCコードに変換し、Cプログラム( my_program.c )を生成します。次に、CプログラムをCコンパイラに渡します。Cコンパイラはオブジェクトファイル( my_program.o )を生成します。最後に、オブジェクトファイル( my_program.o )、 ecpglib ライブラリファイル、およびその他の必要なライブラリをリンカーに渡し、リンカーが実行可能ファイル( my_program )を生成します。
ECPGPlusプリプロセッサーは各SQLステートメントの*構文*を検証しますが、セマンティクス を検証することはできません。たとえば、プリプロセッサは INSERT ステートメントが構文的に正しいことを確認しますが、 INSERT ステートメントに記載されているテーブルが実際に存在することは確認できません。
Behind the Scenes
クライアントアプリケーションには、次の要素で構成されるCコードとSQLコードが混在しています。
Cプリプロセッサディレクティブ
C宣言(変数、型、関数、...)
C定義(変数、型、関数、...)
SQLプリプロセッサディレクティブ
SQL文
例:
1 #include <stdio.h>
2 EXEC SQL INCLUDE sqlca;
3
4 extern void printInt(char *label, int val);
5 extern void printStr(char *label, char *val);
6 extern void printFloat(char *label, float val);
7
8 void displayCustomer(int custNumber)
9 {
10 EXEC SQL BEGIN DECLARE SECTION;
11 VARCHAR custName[50];
12 float custBalance;
13 int custID = custNumber;
14 EXEC SQL END DECLARE SECTION;
15
16 EXEC SQL SELECT name, balance
17 INTO :custName, :custBalance
18 FROM customer
19 WHERE id = :custID;
20
21 printInt("ID", custID);
22 printStr("Name", custName);
23 printFloat("Balance", custBalance);
24 }
上記のコードフラグメント:
1行目は、Cプリプロセッサへのディレクティブを指定しています。
Cプリプロセッサディレクティブは解釈または無視されます。このオプションは、ECPGPlusを起動するときに入力されるコマンドラインオプション(
-C PROC)によって制御されます。いずれの場合でも、ECPGPlusは各Cプリプロセッサディレクティブを変更せずに出力ファイル(4)にコピーします。ソースファイルで見つかったCプリプロセッサディレクティブは、出力ファイルに表示されます。2行目は、SQLプリプロセッサへのディレクティブを指定しています。
SQLプリプロセッサディレクティブはECPGPlusプリプロセッサによって解釈され、出力ファイルにコピーされません。
行4〜6にはC宣言が含まれています。
C宣言は、各
VARCHAR宣言が同等のstruct宣言に変換されることを除いて、変更せずに出力ファイルにコピーされます。- 行10〜14には、埋め込みSQL宣言セクションが含まれています。SQLコード内で参照するC変数は
host variablesと呼ばれます。Pro*Cモード(-C PROC)でECPGPlusプリプロセッサを呼び出す場合、SQLステートメント内で*any* C変数を参照できます。それ以外の場合は、BEGIN/END DECLARATION SECTIONペア内の各ホスト変数を宣言する必要があります。 行16〜19にはSQLステートメントが含まれています。
SQLステートメントは、ECPGPlusランタイムライブラリの呼び出しに変換されます。
行21〜23にはCコードが含まれています。
Cコードは変更せずに出力ファイルにコピーされます。
SQLステートメントには EXEC SQL をプレフィックスとして付け、次の(引用符なし)セミコロンまで拡張する必要があります。例:
printf(“Updating employee salaries\n”);
EXEC SQL UPDATE emp SET sal = sal * 1.25;
EXEC SQL COMMIT;
printf(“Employee salaries updated\n”);
プリプロセッサは上記のコードフラグメントを検出すると、Cコード(最初の行と最後の行)を変換せずに出力ファイルに渡し、各 EXEC SQL ステートメントを ecpglib 関数の呼び出しに変換します。結果は次のようになります。
printf("Updating employee salaries\n");
{
ECPGdo( __LINE__, 0, 1, NULL, 0, ECPGst_normal,
"update emp set sal = sal * 1.25",
ECPGt_EOIT, ECPGt_EORT);
}
{
ECPGtrans(__LINE__, NULL, "commit");
}
printf(“Employee salaries updated\n”);
インストールと構成¶
Windowsでは、ECPGPlusはAdvancedServerインストールウィザードによって Database Server コンポーネントの一部としてインストールされます。Linuxでは、 xx がAdvancedServerのバージョン番号である edb-asxx-server-devel RPMパッケージでインストールします。デフォルトでは、実行可能ファイルは次の場所にあります。
Windowsの場合:
C:\Program Files\edb\as13\bin
Linuxの場合:
/usr/edb/as13/bin
ECPGPlusコンパイラーを呼び出すとき、実行可能ファイルは検索パス(Windowsでは %PATH% 、Linuxでは $PATH )になければなりません。たとえば、次のコマンドは、ECPGPlus実行可能ファイル ecpg を保持するディレクトリを含むように検索パスを設定します。
Windowsの場合:
set EDB_PATH=C:\Program Files\edb\as13\bin
set PATH=%EDB_PATH%;%PATH%
Linuxの場合:
export EDB_PATH==/usr/edb/as13/bin
export PATH=$EDB_PATH:$PATH
Makefileの構築¶
makefile には、「埋め込みSQLを含む」Cで記述されたプログラムをCプログラムに変換する方法を make ユーティリティに指示する一連の命令が含まれています。このガイドの例を試すには、次のものが必要です。
Cコンパイラー(およびリンカー)
makeユーティリティECPGPlusプリプロセッサとライブラリ
ECPGPlusの指示を含む
makefile
次のコードは、このガイドに含まれるサンプルの makefile の例です。サンプルコードを使用するには、ソースコードファイルを含むディレクトリの makefile という名前のファイルに保存します。
INCLUDES = -I$(shell pg_config --includedir)
LIBPATH = -L $(shell pg_config --libdir)
CFLAGS += $(INCLUDES) -g
LDFLAGS += -g
LDLIBS += $(LIBPATH) -lecpg -lpq
.SUFFIXES: .pgc,.pc
.pgc.c:
ecpg -c $(INCLUDES) $?
.pc.c:
ecpg -C PROC -c $(INCLUDES) $?
最初の2行は pg_config プログラムを使用して、必要なヘッダーファイルとライブラリディレクトリを見つけます。
INCLUDES = -I$(shell pg_config --includedir)
LIBPATH = -L $(shell pg_config --libdir)
pg_config プログラムはAdvancedServerに付属しています。
make は、Cコンパイラを実行するときに CFLAGS 変数を使用し、リンカーを呼び出すときに LDFLAGS および LDLIBS 変数を使用する必要があることを知っています。ECPGプログラムは、ECPGランタイムライブラリ( -lecpg )およびlibpqライブラリ( -lpq )にリンクする必要があります。
CFLAGS += $(INCLUDES) -g
LDFLAGS += -g
LDLIBS += $(LIBPATH) -lecpg -lpq
サンプル makefile は、 .pgc または .pc ファイルをCプログラムに変換する方法をmakeに指示します。 makefile の2行は、ソースファイルがコンパイルされるモードを指定します。最初のコンパイルオプションは次のとおりです。
最初のオプションは、コミュニティECPG(ECPGPlus拡張なし)を使用して、 .pgc で終わるファイル(おそらくECPGソースファイル)を .c (Cプログラム)で終わるファイルに変換する方法を make に指示します。。 INCLUDES 変数の値と .pgc ファイルの名前を使用して、 -c フラグ(SQLコードをCに変換するようコンパイラーに指示します)でECPGプリコンパイラーを呼び出します。
.pc.c:
ecpg -C PROC -c $(INCLUDES) $?
2番目のオプションは、ECPGPlus拡張機能を使用して、 .pg で終わるファイル(ECPGソースファイル)を .c で終わるファイル(Cプログラム)に変換する方法をmakeに指示します。 -c フラグ(SQLコードをCに変換するようにコンパイラーに指示する)と -C PROC フラグ(Pro*C互換モードでECPGPlusを使用するようコンパイラーに指示する)でECPGプリコンパイラーを呼び出します。 INCLUDES 変数の値と .pgc ファイルの名前。
make を実行するとき、コンパイルしたいECPGソースコードファイルの名前を渡します。たとえば、 customer_list.pgc という名前のECPGソースコードファイルをコンパイルするには、次のコマンドを使用します。
make customer_list
make ユーティリティは makefile (現在のディレクトリにある)を調べ、 makefile に customer_list.pgc をCプログラムにコンパイルする規則( customer_list.c )が含まれていることを検出し、次に組み込まれた規則を使用します customer_list.c を実行可能プログラムにコンパイルするには make 。
ECPGPlusコマンドラインオプション¶
上記のサンプル makefile では、ECPGPlusをPro*C互換モードで起動するように指定するためにECPGPlusを起動するときに make に -C オプションが含まれています。
コマンドラインにECPG構文に加えて -C PROC キーワードを含める場合、Pro*Cコマンドライン構文を使用できます。例えば:
$ ecpg -C PROC INCLUDE=/usr/edb/as13/include acct_update.c
利用可能な他のECPGPlusオプションの完全なリストを表示するには、ECPGPlusインストールディレクトリに移動して、次のように入力します。
./ecpg --help
コマンドラインオプションは次のとおりです。
Option |
Description |
|---|---|
-c |
埋め込みSQLコードからCコードを自動的に生成します。 |
-C*モード* |
-C オプションを使用して、互換モードを指定します。
|
-D*記号* |
プリプロセッサ*シンボル* を定義します。 PROCモードでコンパイルする場合、-D*キーワードはサポートされません。代わりに、Oracleスタイルの*‘DEFINE=’* 句を使用してください。 |
-h |
ヘッダーファイルを解析します。このオプションにはオプション*-c* が含まれます。 |
-i |
システムを解析し、ファイルもインクルードします。 |
-Iディレクトリ |
ディレクトリ でインクルードファイルを検索します。 |
-o*outfile* |
結果を*outfile* に書き込みます。 |
-r*オプション* |
実行時の動作を指定します。option は次のいずれかです。
|
-回帰 |
回帰テストモードで実行します。 |
-t |
トランザクションの |
-l |
|
-ヘルプ |
ヘルプオプションを表示します。 |
-バージョン |
バージョン情報を出力します。 |
注釈
ECPGPlusを呼び出すときに出力ファイル名を指定しない場合、出力ファイル名は .pgc ファイル名拡張子を取り除き、 .c をファイル名に追加することによって作成されます。