CL

24. CLP で今すぐ作れる CGI

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