実行環境

38. スプール・ファイルを完全に保存するには?

スプール・ファイルの保存の方法についての質問は多い。
OUTQ そのものを SAVLIBSAVOBJ で保管してもスプール・ファイルだけは脱落してしまう
からである。このため iSeries400をリプレースしたり、リリース・アップのときにも保存しておいた
スプールだけは消失してしまって新しいホストへ移行することができない。
このため泣く泣くスプールをあきらめることもあったのではないだろうか?
CPYSPLF で物理ファイルに変換して戻す方法もあるがAPW などの罫線やバーコード情報
さらにスプール自体の用紙サイズなどの属性はやはり消滅してしまう。
Spoolライター Ver 3.0 では、このことを解決するために「SAVSPLF : スプールの保管
というコマンドが追加された。

下記はその実行中の様子である。

Spoolライター Ver 3.0 ではさらに WRKSAVSPLF コマンドを使ってWRKOUTQ の画面
と同じようなオプション打鍵の操作も行うことができる。

それでは、OS/400ではスプールの保管/復元コマンドは提供されていないのに、
Spoolライターはどのようにスプールを完全保管して、また復元することができるのだろうか?
ポイントは2つある。

最初に「スプール属性の保管」は API: QUSRSPLA の様式「SPLA0200」によって
保管する。これは3636バイトの長いデータなのでファイルなどに保管する必要がある。
次にスプール自体の内容は API : QSPGETSP によって「ユーザー・スペース」に保管する
のである。
前者はファイル、そして後者は 「ユーザー・スペース」であるからこうなれば テープでも
*SAVF にでも自由に保管することができる。
この方法は *SCS/*AFP を問わずどのようなスプールも保存して完全に復元することができる。

次にユーザー・スペースに保管する作業の抜粋を紹介しよう。

0001.00 int           h;
0002.00 typedef struct {                                                        
0003.00    char JOBNAME[10];                                                    
0004.00    char USRNAME[10];                                                    
0005.00    char JOBNUM[6];                                                      
0006.00 } QJOBNAM;     /* Define the qualified job name structure            */ 
0007.00 QJOBNAM       qjobnam;                 /* Qualified job name         */ 
0008.00 char jobid[16];                                                         
0009.00 char splid[16];                                                         
0010.00 char          splfnam[10];                                              
0011.00 int           splfnum;                 /* Spool file number          */ 
0012.00 int           readrecs;                /* Number of records to read  */ 
0013.00 char          format[8];                                                
0014.00 int           buffer;                  /* Ordinal number of the      */ 
0015.00 typedef struct {                                                        
0016.00    char NM[10];                                                         
0017.00    char LIB[10];                                                        
0018.00 } QNAME;     /* Define the qualified name                            */ 
0019.00 QNAME         inname;                  /*  Qualified user space name */ 
0020.00 typedef struct {                                                        
0021.00    int  BYTESPRO;                                                       
0022.00    int  BYTESAVL;                                                       
0023.00    char EXCPID[7];                                                      
0024.00    char RESRVD;                                                         
0025.00    char EXCPDATA[100];                                                  
0026.00 } ERRSTRUCTURE;     /* Define the error return structure            */  
0027.00 ERRSTRUCTURE  errcode;                 /* Error Code Structure       */ 
0028.00                                                                         
0029.00      readrecs = -1;                                                     
0030.00    /*[  スプールのオープン ]*/                                          
0031.00      QSPOPNSP(&h,(char *)(&qjobnam), jobid,                             
0032.00              splid, splfnam, splfnum, readrecs,                         
0033.00              (char *)(&errcode));                                       
0034.00    /*[ スプールを取得してユーザー・スペースに保管する ]*/               
0035.00      memcpy(format,"SPFR0200",sizeof(format));                          
0036.00      memcpy(eofind,"*WAIT     ", sizeof(eofind));                       
0037.00      buffer = -1;                                                       
0038.00      QSPGETSP(h, (char *)(&inname), format,                             
0039.00               buffer, eofind, (char *)(&errcode));                      
0040.00    /*[  スプールのクローズ ]*/                                          
0041.00      QSPCLOSP(h, (char *)(&errcode) );