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 によって印刷用のプログラムを呼び出して、印刷結果をリダイレクトしたり、プリンタに出力したりするようなケースとして効果的な活用ができる。