ECPGPlus-概要

EDBはECPG(PostgreSQLプリコンパイラ)を強化してECPGPlusを作成しました。ECPGPlusは、PostgreSQLCプリコンパイラのPro*C互換バージョンです。ECPGPlusは、Cコードと埋め込みSQLステートメントを組み合わせたプログラムを同等のCプログラムに変換します。変換を実行する際、ECPGPlusは各SQLコンストラクトの構文が正しいことを確認します。

次の図は、実行可能ファイルにコンパイルされる埋め込みSQLステートメントを含むプログラムのパスを示しています。

Compilation of a program containing embedded SQL statements

埋め込み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 オプションを使用して、互換モードを指定します。

INFORMIX

INFORMIX_SE

PROC

-D*記号*

プリプロセッサ*シンボル* を定義します。

PROCモードでコンパイルする場合、-D*キーワードはサポートされません。代わりに、Oracleスタイルの*‘DEFINE=’* 句を使用してください。

-h

ヘッダーファイルを解析します。このオプションにはオプション*-c* が含まれます。

-i

システムを解析し、ファイルもインクルードします。

-Iディレクトリ

ディレクトリ でインクルードファイルを検索します。

-o*outfile*

結果を*outfile* に書き込みます。

-r*オプション*

実行時の動作を指定します。option は次のいずれかです。

no_indicator -インジケータを使用せず、代わりに特別な値を使用してNULL値を表します。

prepare -すべてのステートメントを使用する前に準備します。

questionmarks -疑問符をプレースホルダーとして使用できるようにします。

usebulk -ホスト変数配列を操作するINSERT、UPDATE、およびDELETEステートメントの一括処理を有効にします。

-回帰

回帰テストモードで実行します。

-t

トランザクションの autocommit をオンにします。

-l

#line ディレクティブを無効にします。

-ヘルプ

ヘルプオプションを表示します。

-バージョン

バージョン情報を出力します。

注釈

ECPGPlusを呼び出すときに出力ファイル名を指定しない場合、出力ファイル名は .pgc ファイル名拡張子を取り除き、 .c をファイル名に追加することによって作成されます。