DB2 エクステンダーを使用するプログラムを開発する前に、DB2 アプリケーションの開発プロセスとプログラミング技法について知っておく必要があります。 DB2 アプリケーション開発の手引き を参照してください。 DB2 エクステンダーを使ったプログラムを開発するプロセスは、本質的には従来の DB2 アプリケーションのそれと同じです。
エクステンダーによって新しいデータ・タイプと関数が定義されるので、このアプリケーション・プログラムのコードは従来の DB2 アプリケーションと異なります。 たとえば、次の図 に示す C でコーディングされたアプリケーションは、イメージ・エクステンダーを使用して、データベース表に保管されている GIF 形式の画像を識別します。 画像を識別すると、プログラムは、画像ブラウザーを使ってそれらを表示します。
この例が示すように、DB2 エクステンダーを使用するアプリケーションでは、次の機能を行う必要があります。
(1) エクステンダー定義を組み込む。 この例では、dmbimage.h ファイルが、イメージ・エクステンダーのためのインクルード (ヘッダー) ファイルです。 このインクルード・ファイルによって、エクステンダー用の定数や、変数、関数プロトタイプが定義されます。
(2) 必要に応じて、UDF への入力またはそこからの出力を入れるホスト変数、または API 呼び出しへの入力を入れるホスト変数を定義する。 この例では、hvFormat、hvSize、hvWidth、hvHeight、hvComment がホスト変数で、イメージ・エクステンダーの UDF によって検索されるデータを入れるために使用されます。 ホスト変数 hvImg_hdl には、イメージ・エクステンダー API 呼び出しの入力として指定する画像ハンドルが入ります。
(3) 必要に応じて UDF 要求を指定する。 この例では、SIZE、WIDTH、HEIGHT、COMMENT、FORMAT がイメージ・エクステンダー UDF です。
(4) 必要に応じて API 呼び出しを指定する。 この例では、DBiBrowse がローカル C 関数に対する API 呼び出しであり、表からハンドルが取り出された画像を表示します。
図 18. DB2 エクステンダーを使用するアプリケーション
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sqlenv.h> #include <sqlcodes.h> #include <dmbimage.h> (1) int count=0; long main(int argc,char *argv[]) { EXEC SQL BEGIN DECLARE SECTION; (2) char hvImg_hdl[251]; /* image handle */ char hvDBName[19]; /* database name */ char hvName[40]; /* employee name */ char hvFormat[9]; /* image format */ long hvSize; /* image size */ long hvWidth; /* image width */ long hvHeight; /* image height */ struct { short len; char data[32700] } hvComment; /* comment about the image */ EXEC SQL END DECLARE SECTION; /* Connect to database */ strcpy(hvDBName, argv[1]); /* copy the database name */ EXEC SQL CONNECT TO :hvDBName IN SHARE MODE; /* * Set current function path */ EXEC SQL SET CURRENT FUNCTION PATH = mmdbsys, CURRENT FUNCTION PATH; /* * Select (query) using Image Extender UDF * * The SQL statement below finds all images in GIF format. */ EXEC SQL DECLARE c1 CURSOR FOR SELECT PICTURE, NAME, (3) SIZE(PICTURE), WIDTH(PICTURE), HEIGHT(PICTURE), COMMENT(PICTURE) FROM EMPLOYEE WHERE PICTURE IS NOT NULL AND FORMAT(PICTURE) LIKE 'GIF%' FOR FETCH ONLY; EXEC SQL OPEN c1; for (;;) { EXEC SQL FETCH c1 INTO :hvImg_hdl, :hvName, :hvSize, :hvWidth, :hvHeight, :hvComment; if (SQLCODE != 0) break; printf("\nRecord %d:\n", ++count); printf("employee name = '%s'\n", hvName); printf("image size = %d bytes, width=%d, height=%d\n", hvSize, hvWidth, hvHeight); hvComment.data[Comment.len]='\0'; printf("comment len = %d\n", hvComment.len); printf("comment = %s\n", hvComment.data); /* * The API call below displays the images */ (4) rc=DBiBrowse ("ib %s",MMDB_PLAY_HANDLE,hvImg_hdl, MMDB_PLAY_WAIT); } EXEC SQL CLOSE c1; /* end of program */ |