前回までに、エラーメッセージが出ながらもssw_gdlを起動する事ができた。
次にSSWDBのインストールのため、sswdb_upgrade.proを動かした。
ON_IOERRORの不備
sswdb_upgrade.proを動かした。
GDL> sswdb_upgrade, /spawn, /loud
すると、file_stat.pro, ssw_file_delete.proで、openrについてのエラーが出て、停止した。
% OPENR: Error opening file. Unit: 100, File:
% Execution halted at: FILE_STAT 69 /media/yamamoto/_dat11/ssw/gen/idl/system/file_stat.pro
これらの共通の要素は、次の2行である。
> on_ioerror,err
> openr,lun,/get_lun,files(i)
IDLなら、openrでエラーが出た際に、条件式on_ioerrorがスイッチとなり、他の箇所に書いてあるようなエラー処理をする。
しかし、GDLではこのon_ioerrorが機能していないようで、openrでエラーが出た段階で止まっていた。
そこでエラー変数を受け取り、エラー時の処理を行うように書き換えたところ、エラーで止まる事は無くなった。
例、file_stat.pro
> on_ioerror,err
> openr,lun,/get_lun,files(i)
> fstat_lun = fstat(lun)
> free_lun,lun
< openr,lun,/get_lun,files(i),ERROR=err1
< if err1 ne 0 then begin
< fstat_lun = fstat(1)
< fstat_lun.name=''
< fstat_lun.size=0
< endif else begin
< fstat_lun = fstat(lun)
< free_lun,lun
< endelse
fstatコマンドから返されるfstat_lun.name, sizeがこの関数の返り値である。
free_lunは、元のプロシージャでは離れた場所に書いてあるが、ここではまとめた。
なお、以下のコマンドでon_ioerrorが使われている行数を調べた所、265行だった。
find /???/ssw/ -type f -print | xargs grep 'on\_ioerror' > ioerror.txt
何箇所かはプロシージャの説明書きであるが、これだけ修正するのは現実的ではない。
(つまり、私がインストールした限られたSSWのプロシージャについてでさえ、100ファイル以上の書き直しが必要)
GDLの開発にお任せかな?(´・ω・`)
追記
ssw_upgradeを実行すると、元ファイルが上書きされてしまうので、手動で修正が必要。FTP転送の際、ファイルの容量の違いで判断している模様。
次回の記事のmake_mirror.proも同じく修正が必要。
0 件のコメント:
コメントを投稿