CGI というとRPG/COBOL/C などの高級言語での開発が必要と思われがちであるが、
CLP でも CGI を作ることができる。CLP であれば気軽にCGIの動作を検証することができる。
また, RPG-CGI などの開発においても、最初にCLPを呼んで OVRDBF などのような
CLP独自の作業を行いたいと思ったことはないだろうか?
これから紹介するCLP によるCGI は、そのような希望を叶えてくれる第一歩となる。
まず、この リンク を押して初期画面HTML を表示して何らかの任意のコードを入力して「検索」ボタンを押して頂きたい。
CLPCGI という名前のCLP による CGI がその結果のHTML を戻す。
以下に CLPCGI のソースを示す。
0001.00 PGM
0002.00 /*---------------------------------------------------------*/
0003.00 /* CLPCGI : CLP による CGI のサンプル */
0004.00 /* */
0005.00 /* この CLP は CGI として呼びだされて */
0006.00 /* 結果の HTML をブラウザへ戻します。 */
0007.00 /* */
0008.00 /*---------------------------------------------------------*/
0009.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
0010.00 DCL VAR(&ENBUFF) TYPE(*CHAR) LEN(2048)
0011.00 DCL VAR(&ENBUFFLN) TYPE(*CHAR) LEN(4)
0012.00 DCL VAR(&ENVARNAME) TYPE(*CHAR) LEN(20) +
0013.00 VALUE('QUERY_STRING')
0014.00 DCL VAR(&ENACTLN) TYPE(*CHAR) LEN(4)
0015.00 DCL VAR(&ENVARLN) TYPE(*CHAR) LEN(4)
0016.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(4) +
0017.00 VALUE(X'00000000') /* 2 進数 */
0018.00 DCL VAR(&FRMCOD) TYPE(*CHAR) LEN(10)
0019.00 DCL VAR(&DTA001) TYPE(*CHAR) LEN(80) +
0020.00 VALUE('CONTENT-TYPE: TEXT/HTML')
0021.00 DCL VAR(&DTA002) TYPE(*CHAR) LEN(80) VALUE(' ')
0022.00 DCL VAR(&DTA003) TYPE(*CHAR) LEN(80) +
0023.00 VALUE('<HTML><HEAD><TITLE>CLP による CGI</T+
0024.00 ITLE></HEAD><BODY>')
0025.00 DCL VAR(&DTA004) TYPE(*CHAR) LEN(80) +
0026.00 VALUE('<CENTER><H1> あなたが入力したのは </+
0027.00 H1></CENTER>')
0028.00 DCL VAR(&DTA005) TYPE(*CHAR) LEN(80) +
0029.00 VALUE('<HR><P><PRE>')
0030.00 DCL VAR(&DTA006) TYPE(*CHAR) LEN(80) +
0031.00 VALUE('</PRE></P><HR>')
0032.00 DCL VAR(&DTA007) TYPE(*CHAR) LEN(80) +
0033.00 VALUE('<BR><A +
0034.00 HREF="シイヨイミエハサツヤ:ケサミヤチハル.ウイエス()"> 元の画面 +
0035.00 に戻る </A>')
0036.00 DCL VAR(&DTA008) TYPE(*CHAR) LEN(80) +
0037.00 VALUE('</BODY></HTML>')
0038.00 DCL VAR(&DATA) TYPE(*CHAR) LEN(640)
0039.00 DCL VAR(&HTML) TYPE(*CHAR) LEN(80)
0040.00 DCL VAR(&N) TYPE(*DEC) LEN(4 0) VALUE(1)
0041.00 DCL VAR(&POS) TYPE(*DEC) LEN(4 0) VALUE(1)
0042.00 DCL VAR(&OUTLN) TYPE(*CHAR) LEN(4)
0043.00 DCL VAR(&CRLN) TYPE(*CHAR) LEN(2) VALUE(X'1500')
0044.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0045.00
0046.00 /*( ブラウザからの入力値を取得 )*/
0047.00 CHGVAR VAR(%BIN(&ENBUFFLN)) VALUE(2048)
0048.00 CHGVAR VAR(%BIN(&ENACTLN)) VALUE(0)
0049.00 CHGVAR VAR(%BIN(&ENVARLN)) VALUE(12)
0050.00 CALLPRC PRC(QtmhGetEnv) PARM(&ENBUFF &ENBUFFLN +
0051.00 &ENACTLN &ENVARNAME &ENVARLN &APIERR)
0052.00 CHGVAR VAR(&FRMCOD) VALUE(%SST(&ENBUFF 8 10))
0053.00 /*( ブラウザに HTML を戻す )*/
0054.00 CHGVAR VAR(&DATA) VALUE(&DTA001 *CAT &DTA002 *CAT +
0055.00 &DTA003 *CAT &DTA004 *CAT &DTA005 *CAT +
0056.00 &DTA006 *CAT &DTA007 *CAT &DTA008)
0057.00 CHGVAR VAR(%BIN(&OUTLN)) VALUE(80)
0058.00 LOOP: CHGVAR VAR(&HTML) VALUE(%SST(&DATA &POS 80))
0059.00 IF COND(&N *EQ 5) THEN(DO)
0060.00 CHGVAR VAR(&HTML) VALUE(&HTML *TCAT &FRMCOD *TCAT +
0061.00 ' です。 ')
0062.00 ENDDO
0063.00 CHGVAR VAR(&HTML) VALUE(&HTML *TCAT &CRLN)
0064.00 CALLPRC PRC(QtmhWrStout) PARM(&HTML &OUTLN &APIERR)
0065.00 IF COND(&N < 8) THEN(DO)
0066.00 CHGVAR VAR(&N) VALUE(&N + 1)
0067.00 CHGVAR VAR(&POS) VALUE(&POS + 80)
0068.00 GOTO LOOP
0069.00 ENDDO
0070.00 RETURN
0071.00
0072.00 ERROR: RCVMSG RMV(*NO) MSG(&MSG)
0073.00 SNDMSG: SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP)
0074.00 ENDPGM
【 解説 】
CLPCGI の動作原理は至って簡単である。
API : QtmhGetEnv によってブラウザからの入力値を受け取って
API : QtmhWrStoutによって標準出力によってHTTPサーバーに
&DTA001 から
&DATA008 までのHTML句を改行コードを付加して戻しているだけである。
コンパイルは
CRTCLMOD MODULE(MYILB/CLPCGI) SRCFILE(MYSRCLIB/QCLLESRC) AUT(*ALL)
でモジュールを作成してから
CRTPGM PGM(MYLIB/CLPCGI) BNDSRVPGM(QTCP/QTMHCGI) AUT(*ALL)
で QTCP/QTMHCGI をバインドして *PGM を作成する。
CLP によるCGI の利点はまだ多くある。
CLP による CGI を使えば、そのCLP-CGI から呼び出されるRPG などは
ILE-RPG である必要は無い。
伝統的な CRTRPGPGM コンパイルによる OPM-RPG で十分なのである。
これは既存の基幹業務をWeb化したいときに、なるべく既存のRPG資産を有効活用
してWeb化するのにも適している。
CLP-CGI の使用によってうまくいけば既存のRPGはほとんどそのまま使うことができる。
さらに印刷業務をWeb化したいような場合にはCLP-CGI によって印刷用のプログラムを呼び出して、印刷結果をリダイレクトしたり、プリンタに出力したりするようなケースとして効果的な活用ができる。
