ECPGPlus overview

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

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

Compilation of a program containing embedded SQL statements

Compilation of a program containing embedded SQL statements

埋め込みSQL文を含むプログラムのコンパイル

埋め込みSQLステートメントを含むCプログラムから実行可能ファイルを生成するには:

1.プログラム(図のmy_program.pgc )をECPGPlusプリコンパイラーに渡します。 ECPGPlusは、 my_program.pgc の各SQLステートメントを、 ecpglib APIを呼び出してCプログラム(my_program.c )を生成するCコードに変換します。

  1. CプログラムをCコンパイラに渡します。 Cコンパイラは、オブジェクトファイル(my_program.o )を生成します。

1.オブジェクトファイル(my_program.o )、ecpglib ライブラリファイル、およびその他の必要なライブラリをリンカーに渡します。リンカーは実行可能ファイル(my_program )を生成します。

ECPGPlusプリプロセッサは各SQLステートメントの構文を検証しますが、セマンティクスは検証できません。たとえば、プリプロセッサはINSERT ステートメントが構文的に正しいことを確認しますが、 INSERT ステートメントで指定されたテーブルが存在することを確認できません。

舞台裏

クライアントアプリケーションには、次の要素で構成されるCコードとSQLコードが混在してい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行目は、embedded- SQLの宣言部です。

SQLコードで参照するC変数は、ホスト変数と呼ばれます。 ECPGPlusプリプロセッサをPro*Cモード(-C PROC )で呼び出すと、 SQL文でC変数を参照できます。それ以外の場合は、各ホスト変数をBEGIN/END DECLARATION SECTION ペアで宣言する必要があります。

・ 16~19行目はSQL文です。

SQLステートメントは、ECPGPlusランタイムライブラリへの呼び出しに変換されます。

・21~23行目はCコードです。

Cコードは変更なしで出力ファイルにコピーされます。

任意のSQLステートメントにEXEC SQL をプレフィックスします。 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はEDB Postgres Advanced ServerインストールウィザードによってDatabase Serverコンポーネントの一部としてインストールされます。 Linuxでは、 edb-asxx-server-devel RPMパッケージでインストールします。ここで、 xx はEDB Postgres Advanced Serverのバージョン番号です。デフォルトでは、実行可能ファイルはWindows上の次の場所にあります。

C:\Program Files\edb\as14\bin

Linuxでは、次の場所にあります。

/usr/edb/as14/bin

ECPGPlusコンパイラを呼び出すとき、実行可能ファイルは検索パス( Windowsでは %PATH% 、Linuxでは $PATH )にある必要があります。たとえば、次のコマンドは、ECPGPlus実行ファイルecpg を保持するディレクトリを含むように検索パスを設定します。

Windows:

set EDB_PATH=C:\Program Files\edb\as14\bin
set PATH=%EDB_PATH%;%PATH%

Linuxの場合:

export EDB_PATH==/usr/edb/as14/bin
export PATH=$EDB_PATH:$PATH

makefileの作成

makefileには、埋め込みSQLを含むCで記述されたプログラムをCプログラムに変換する方法をmakeユーティリティに指示する一連の命令が含まれています。例を試すには、次のものが必要です。

  • Cコンパイラ(およびリンカ)

  • makeユーティリティ

  • ECPGPlusプリプロセッサとライブラリ

  • ECPGPlusの指示を含むmakeファイル

次のコードは、このドキュメントに含まれるサンプルのメイクファイルの例です。サンプルコードを使用するには、ソースコードファイルが含まれるディレクトリにある 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 プログラムはEDB Postgres Advanced Serverに同梱されています。

makeは、Cコンパイラの実行時にCFLAGS 変数を使用し、リンカーを呼び出すときにLDFLAGS およびLDLIBS を使用することを知っています。 ECPGプログラムは、ECPGランタイムライブラリ(-lecpg )およびlibpqライブラリ(-lpq )に対してリンクする必要があります。

CFLAGS += $(INCLUDES) -g
LDFLAGS += -g
LDLIBS += $(LIBPATH) -lecpg -lpq

サンプルmakeファイルは、 .pgc または.pc ファイルをCプログラムに変換する方法をmakeに示しています。 makefileの2行は、ソースファイルのコンパイルモードを指定します。最初のコンパイルオプションは次のとおりです。

.pgc.c:
      ecpg -c $(INCLUDES) $?

最初のオプションは、 ECPGPlusの拡張機能なしで、コミュニティECPGを使用して、 .pgc (おそらくECPGソースファイル)で終わるファイルを.c (Cプログラム)で終わるファイルに変換する方法を指示します。これは、 INCLUDES 変数の値と.pgc ファイルの名前を使用して、 SQLコードをCに変換するようにコンパイラーに指示します。

.pc.c:
    ecpg -C PROC -c $(INCLUDES) $?

2番目のオプションは、 ECPGPlus拡張機能を使用して、 .pg (ECPGソースファイル)で終わるファイルを .c (Cプログラム) で終わるファイルに変換する方法を指示します。 -c フラグを使用してECPGプリコンパイラーを呼び出し、 SQLコードをCに変換するようにコンパイラーに指示します。また、 -C PROC フラグを使用して、 INCLUDES 変数と.pgc ファイルの名前。

makeを実行するときに、コンパイルするECPGソースコードファイルの名前を渡します。たとえば、 customer_list.pgc という名前のECPGソースコードファイルをコンパイルするには、次のコマンドを使用します。

make customer_list

makeユーティリティ:

  1. 現在のディレクトリにあるmakefileを調べます。

  2. makefileにcustomer_list.pgc をCプログラム(customer_list.c )にコンパイルするルールが含まれていることを発見します。

  3. make に組み込まれたルールを使用して、 customer_list.c を実行可能プログラムにコンパイルします。

ECPGPlusのコマンドラインオプション

サンプルmakeファイルでは、ECPGPlusを呼び出してPro*C互換モードでECPGPlusを呼び出すときに、makeに-C オプションが含まれます。

ECPG構文に加えて、コマンドラインで-C PROC キーワードを含めると、Pro*Cコマンドライン構文を使用できます。例:

$ ecpg -C PROC INCLUDE=/usr/edb/as14/include acct_update.c

使用可能な他のECPGPlusオプションの完全なリストを表示するには、ECPGPlusインストールディレクトリで次のように入力します。

./ecpg --help

コマンドラインオプションは次のとおりです。

Option

Description

-c

Embedded SQLコードからCコードを自動生成します。

-C mode

-C`オプションを使用して、互換性モードを指定します。<br /><br />`INFORMIX`<br /><br />`INFORMIX_SE`<br /><br />`PROC

-D symbol

プリプロセッサ*シンボル*を定義します。<br /><br />*PROCモード*でコンパイルする場合、-D*キーワードはサポートされていません。代わりに、Oracleスタイルの'DEFINE='*句を使用します。

-h

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

-i

パースシステム、インクルードファイルも。

-I directory

`include`ファイルを*ディレクトリ*で検索します。

-o outfile

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

-r option

実行時の動作を指定します。 option: br /><br />`questionmarks` - プレースホルダーとしての疑問符の使用を許可します。<br /><br />`usebulk` - ホスト変数配列で動作する`INSERT`、UPDATE、および`DELETE`ステートメントの一括処理を有効にします。

--regression

リグレッションテストモードで実行します。

-t

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

-l

`#line`指示子を無効にします。

--help

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

--version

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

注釈

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