磁気テープの入出力
この章は、Caché で磁気テープの入出力をプログラムする方法を説明しています。磁気テープに関連する入出力コマンドと特殊変数も説明しています。
Caché 磁気テープ・ハンドラの使用法
この章は、Caché 磁気テープ・ハンドラを使用する入出力コマンドについて説明しています。
このテープ・ハンドラを使用して、管理ポータルで設定するデバイス番号 47 から 62 までの磁気テープ・デバイスを参照します。
磁気テープ・デバイス番号を設定し、テープ・ハンドラを選択するには、"磁気テープ・デバイスの管理" を参照してください。
OPEN コマンド
デバイスを選択し、パラメータを指定します。
構文
OPEN devicenum:(codesparam:reclenparam:blkszparam):timeout:"mnespace"
各項目の内容は次のとおりです。
| 引数 | 定義 | 
|---|---|
| devicenum | 47 から 62 までの論理デバイス番号です。 | 
| codesparam | オプション — 第 1 位置パラメータ。形式コード。磁気テープのフォーマット・オプションを表す 1 文字以上の文字列です。文字コードの詳細は、テーブル "磁気テープ形式コード" に一覧表示されています。コードの文字列は、引用符内に置く必要があります。特定のコードの組み合わせのみ許可されています。 Windows システムでは、オプションのパラメータの既定値は “AUV” (ANSI D 形式の ASCII 文字、ラベルなし、可変長レコード) です。UNIX® システムの既定値は、“ALV” (ANSI D 形式の ASCII 文字、標準ラベル、可変長レコード) です。 | 
| reclenparam | オプション — 第 2 位置パラメータ。レコード長。codesparam が F (固定長レコード) である場合、reclenparam の論理レコード長は 1 バイトから 510 バイトです。レコードが固定長でない場合、reclenparam に 0 を指定するか reclenparam を省略してください。 | 
| blkszparam | オプション — 第 3 位置パラメータ。バイト単位のブロック・サイズ。16 バイトから 32 キロバイトまでの偶数で、reclenparam の倍数となる値を指定します。既定は 2048 バイトです。最大値は、プラットフォーム、ドライブ、文字コードによって変わります。最大値として 32KB の文字をお勧めます。環境によっては、最大 65,535 バイトのブロック・サイズが可能です。 | 
| timeout | オプション — Caché が OPEN コマンドの完了を待機する最大秒数で、正の整数です。0 を指定すると、OPEN は直ちに制御をプロセスに戻します。タイムアウト付きの OPEN は $TEST に影響します。OPEN がタイムアウト時間内に成功すると、$TEST は True (1) になります。OPEN がタイムアウトの前に失敗すると、$TEST は False (0) になります。 | 
| mnespace | オプション — WRITE /mnemonic コマンドで使用するニーモニックとその意味を示すファイル名です。詳細は、"WRITE /mnemonic 用磁気テープ・ニーモニック空間" のセクションを参照してください。 | 
devicenum 引数のみが必須です。デバイス番号で磁気テープ・デバイスを指定する必要があります。Caché は、磁気テープ・デバイスに 47 番から 62 番のデバイス番号を使用します。これらのデバイス番号は、管理ポータルで定義します。システム, 構成, デバイス設定, デバイス を選択して、デバイス番号の割り当てを編集します。
複数の引数はコロン (:) で区切ります。引数を省略するにはコロンを指定する必要があります。コマンドまたはパラメータ・リストの末尾にはコロンを記述しないでください。
オプションのパラメータ・リストは括弧で囲みます。そのパラメータは、記述した順序による位置パラメータまたは /KEYWORD=value 構文によるキーワード・パラメータとして指定できます。キーワード・パラメータは、任意の順序で指定できます。Caché では、パラメータが左から右の順に実行されるので、パラメータ間の相互関係により優先の順序が決まる場合もあります。位置パラメータとキーワード・パラメータを同じパラメータ・リスト内で混在して使用することもできます。複数のパラメータを含む場合、それらを囲む括弧は必須です。
詳細は、"ObjectScript ランゲージ・リファレンス" の "OPEN" を参照してください。
3 つのオプション・パラメータ (codesparam、reclenparam、blkszparam) はデータ・フォーマットを制御します。パラメータを省略すると、以下の既定のパラメータが割り当てられます。
Windows システムの場合は、ASCII 文字、ラベルなし、可変長レコード、2,048 バイト・ブロックです。
("AUV":0:2048)
UNIX® システムの場合、ASCII 文字、ANSI 標準ラベル、可変長レコード、2,048 バイト・ブロックです。
("ALV":0:2048)
これらの既定の OPEN パラメータ値は、管理ポータルで定義します。システム, 構成, デバイス設定, デバイス を選択して、特定のデバイスの [編集] をクリックします (磁気テープ・デバイスの番号は 47 から 62 です)。リストされているデバイスをクリックすると、[Open パラメータ] の既定値が表示されます。
%IS ユーティリティを実行するか、OPEN コマンドを発行することでデバイスを既に開いている場合、Caché は別の OPEN で指定されたデータ形式パラメータを無視します。したがって、デバイスに CLOSE コマンドを発行した後、デバイスを再度開いて新規パラメータを割り当てる必要があります。
codesparam で指定するテープ形式コード
以下のテーブルは、OPEN コマンドの codesparam で指定できる磁気テープ形式コードです。
| コード | 形式 | 定義 | 
|---|---|---|
| A (既定) | ASCII | ASCII 文字セットを使用します。 | 
| D | DOS-11 | DOS-11 ラベル、ASCII 文字セット、ストリーム・データ形式を使用します。 | 
| E | EBCDIC | 出力時に ASCII を EBCDIC に変換し、入力時に EBCDIC を ASCII に変換します。 | 
| F | 固定長 | 入力用に固定長レコードを使用します。出力にはストリーム・データ形式が使用されるので、正確な長さにレコードを割り当てる必要があります。 | 
| K\name\ または Knum | 入出力変換モード | K プロトコルをデバイスで使用する際に、システム全体で変換が使用できる場合、入出力変換がデバイスで発生します。テーブル名を指定することで、変換の基本となっている既存の定義済みテーブルを識別します。プロトコルのオンとオフを切り替える “+” オプションと “-” オプションは、K プロトコルでは使用できません (テーブルをロードするスロット数の num を示す従来の “Knum” は廃止されましたが、現在もサポートされています。システム管理者は、テーブル・タイプごとの選択ウィンドウにある NLS ユーティリティにスロット番号を表示できます)。 | 
| L (UNIX® の既定) | 標準ラベル | ASCII 文字セットを選択する場合は ANSI 標準ラベルを使用し、EBCDIC 文字セットを選択する場合は IBM 標準ラベルを使用します。 | 
| R | 読み取りモード | 書き込み処理中の論理保護レベルを設定します。Read モードあるいは書き込み保護リングのあるテープに書き込もうとすると、エラーが発生します。Read コマンドでは無視されます。ただし、テープに書き込み保護リングがない場合、このパラメータを指定する必要があります。既定は Write モードです。UNIX® システムの中には、書き込み禁止テープに R を要求するものもあります。 | 
| S | ストリーム形式 | 出力時に <RETURN> を含めた文字をバッファに順番に格納します。入力時、<LINE FEED> と <FORM FEED> を文字列の区切り文字として処理し、<RETURN> と NULL 文字を無視します。TCP デバイスを継承するジョブ起動プロセスは、自動的に S 形式に設定されます。Use コマンドを使用して、この形式をリセットできます。 | 
| U (Windows の既定) | ラベルなし | ラベルはありません。ラベルのないテープから読み取る場合、U を指定して開く必要があります。 | 
| V | 可変長 | ASCII 文字を選択すると ANSI D 形式が使用され、EBCDIC を選択すると EBCDIC V 形式が使用されます。READ または WRITE の各引数は、特定の論理レコードに対応します。 | 
| Y\name\ または Ynum | $X/$Y アクション・モード | デバイスに Y プロトコルを使用する場合、システムは、$X/$Y というアクション・テーブルを使用します。テーブル名を指定することで、変換の基本となっている既存の定義済み $X/$Y アクション・テーブルを識別します。システム管理者からその名前を取得できます。$X/$Y アクションは常に使用できます。Y が指定されず、システム既定の $X/$Y が定義されていない場合、組み込みの $X/$Y アクション・テーブルを使用します。プロトコルのオンとオフを切り替える + オプションと - オプションは、Y プロトコルでは使用できません(テーブルをロードするスロット数の num を示す従来の Ynum は廃止されましたが、現在もサポートされています。システム管理者は、テーブル・タイプごとの選択ウィンドウにある % NLS ユーティリティにスロット番号を表示できます)。 | 
以下のテーブルは、OPEN コマンドの codesparam で指定できる磁気テープの密度コードを示しています。
| コード | 形式 | 定義 | 
|---|---|---|
| 1 | 800 BPI | 多重密度をサポートする 800 BPI (インチあたりのビット数) 記録密度のドライブを選択します。 | 
| 2 | 1600 BPI | 多重密度をサポートする 1,600 BPI のドライブを選択します。 | 
| 3 | 6250 BPI | 多重密度をサポートする 6,250 BPI のドライブを選択します。 | 
使用できる形式とコードの組み合わせ
以下のテーブルは、指定できる codesparam 形式コードの組み合わせです。競合するコードをパラメータ文字列に記述すると、最も後方に記述したコードが優先されます。
| A | D | E | F | L | R | S | U | V | |
|---|---|---|---|---|---|---|---|---|---|
| A ASCII | - | Y | N | Y | Y | Y | Y | Y | Y | 
| D DOS | Y | - | N | N | N | Y | Y | N | N | 
| E EBCDIC | N | N | - | Y | Y | Y | Y | Y | Y | 
| F 固定長 | Y | N | Y | - | Y | Y | N | Y | N | 
| L ラベル付き | Y | N | Y | Y | - | Y | Y | N | Y | 
| R 読み取りモード | Y | Y | Y | Y | Y | - | Y | Y | Y | 
| S ストリーム形式 | Y | Y | Y | N | Y | Y | - | Y | N | 
| U ラベルなし | Y | N | Y | Y | N | Y | Y | - | Y | 
| V 可変長 | Y | N | Y | N | Y | Y | N | Y | - | 
OPEN キーワード・パラメータ
以下のテーブルは、OPEN コマンドで磁気テープ・デバイスを制御するためのキーワード・パラメータです。
| キーワード | 既定値 | 対応する位置パラメータ | 説明 | 
|---|---|---|---|
| /ASCII または /ASC | ASCII を使用 | codesparam =“A” | 使用する ASCII 文字セットを指定します。 | 
| /BLOCKSIZE=n または /BLO=n | 既定なし | blkszparam | テープ・ブロックのサイズを指定します。 | 
| /DENSITY=n または /DEN=n | 既定なし | codesparam =“1” または codesparam =“2” または codesparam =“3” | テープ密度。n の値で BPI のテープ密度を指定します。有効な値は 0、800、1600、および 6250 で、0 はデバイス密度の既定です。その他の値は無視されます。 | 
| /DOS | 既定なし | codesparam =“D” | DOS-11 ラベル、ASCII 文字セット、ストリーム形式を指定します。 | 
| /EBCDIC または /EBC | 既定なし | codesparam =“E” | 出力時に ASCII を EBCDIC に変換し、入力時に EBCDIC を ASCII に変換します。 | 
| /FIXED または /FIX | 固定なし | codesparam =“F” | 入力用に固定長レコードを指定します (プログラマは、出力を正しい長さのレコードにする必要があります)。 | 
| /GZIP[=n] | 1 | GZIP と互換性のあるストリーム・データ圧縮を指定します。/GZIP を指定した場合、または /GZIP=n (n は 0 以外) を指定した場合、WRITE の発行時に圧縮、READ の発行時に解凍が有効になります。/GZIP=0 を指定した場合は、圧縮と解凍が無効になります。/GZIP=0 を発行して圧縮/解凍を無効にする前に、$ZEOS 特殊変数をチェックして、ストリーム・データの読み込みが実行中でないことを確認してください。/GZIP 圧縮は、/IOTABLE を使用して構築した変換などの入出力変換には影響しません。これは、圧縮がその他すべての変換 (暗号化を除く) の後に適用され、解凍がその他すべての変換 (暗号化を除く) の前に適用されるためです。 | |
| /IOTABLE[=name] または /IOT[=name] | name が指定されない場合、デバイスの既定の入出力変換テーブルを使用します。 | codesparam =“K\name\” | デバイスの入出力変換テーブルを構築します。 | 
| /LABELED[=n] または /LAB[=n] | L 形式は UNIX® プラットフォームでの既定、U 形式は Windows プラットフォームでの既定です。 | codesparam =“L” または codesparam =“U” | /LABELEDを指定した場合、および /LABELED=n の n が 0 以外の場合、標準ラベルを指定する L 形式コード文字に相当します (ASCII 文字セットを使用する場合は ANSI 標準ラベル、EBCDIC 文字セットを使用する場合は IBM 標準ラベルです)。/LABELED=n の n が 0 の場合、ラベルなしのテープを指定する U 形式コードに相当します。 | 
| /PARAMS=str または /PAR=str | 既定なし | codesparam | codesparam 形式コード文字列位置パラメータに相当します (このキーワードは、位置に依存しない方法で形式コード文字列を指定する方法を提供します)。 | 
| /READ | 既定なし | codesparam =“R” | テープの論理的な書き込み保護として動作します (WRITE 処理を実行しようとするとエラーが発生します)。 | 
| /RECORDSIZE=n または /REC=n | 既定なし | reclenparam | 入力時に固定長レコードが指定された場合に、論理レコード長を指定します。 | 
| /STREAM または /STR | 0 | codesparam =“S” | ストリーム・レコード形式を指定します。 | 
| /TRANSLATE[=n] または /TRA[=n] | 1 | codesparam =“K” | /TRANSLATE を指定した場合、または /TRANSLATE=n の n が 0 以外の場合、デバイスの入出力変換が有効になります。/TRANSLATE=n の n が 0 の場合はデバイスの入出力変換が無効になります。 | 
| /VARIABLE または /VAR | 既定なし | codesparam =“V” | 可変長レコード形式を指定します (ASCII 文字セットを使用する場合は ANSI D 形式、EBCDIC 文字セットを使用する場合は EBCDIC V 形式となります)。(既定) | 
| /XYTABLE[=name] または /XYT[=name] | name が指定されていない場合、デバイスの既定の $X/$Y アクション・テーブルを使用します。 | codesparam =“Y\name\ ” | デバイスの $X/$Y アクション・テーブルを構築します。 | 
例
以下のコマンドは、論理デバイス 47 を既定パラメータで開きます。
   OPEN 47以下のコマンドは、論理デバイス 48 を ANSI 標準 の D 形式で開きます。これは、可変長の ASCII レコードを持つラベル付きファイルです。
   OPEN 48:"AVL"以下のコマンドは、長さ 80 バイトのラベルのない固定ブロック・レコード EBCDIC を使用して、8,000 バイト・ブロックで論理デバイス 47 を開きます。
   OPEN 47:("EUF":80:8000)OPEN コマンド失敗時のパラメータ検証
OPEN コマンドが失敗した場合、以下の方法を手掛かりに問題を解決してください。
- 
DEVICE ユーティリティを実行します。デバイス番号が、相対順で誤って再変換されていないかを確認します。 
- 
Windows システムおよび UNIX® システムでは、管理ポータルの構成設定を確認します。OPEN コマンドで指定したデバイスに対して、正しい物理デバイス名または論理名が示されているか確認します。 
- 
オペレーティング・システム・レベルと Caché レベルで、正しいテープ・ドライブをマウントしていることを確認してください。 
- 
OPEN コマンドの blkszparam で選択したブロック・サイズが、使用しているオペレーティング・システムの制約に適合していることを確認してください。デバイスの中には、Caché の既定とは一致しないブロック・サイズを要求するものもあります。詳細は、オペレーティング・システムのマニュアルを参照してください。 
- 
残りのパラメータをチェックします。開くデバイスを正しく指定していることを確認してください。 
OPEN コマンドは失敗することもあるので、必ずタイムアウトを指定し、OPEN の失敗によりプロセスが停止しないようにする必要があります。
USE コマンド
事前に開いた磁気テープ・ドライブを現在のデバイスに設定します。
構文
USE devicenum
詳細は、"ObjectScript ランゲージ・リファレンス" の "USE" を参照してください。
例
以下のコマンドは、デバイス 47 を現在のデバイスにします。
   USE 47READ コマンド
指定したコマンド形式にしたがって、現在のデバイスから読み取ります。READ コマンドの実行後、変数はテープの現在位置にあるレコードの内容を保持します。
次のセクションで説明しているように、テープ・ヘッドの位置を WRITE * 制御コード・オプションで制御します。
構文
READ variable READ *variable READ variable#length
詳細は、"ObjectScript ランゲージ・リファレンス" の "READ" を参照してください。
書き込み保護リングのないテープ
書き込み保護リングのないテープを読み取るには、“R” パラメータ付きの OPEN コマンドを使用します。
UNIX® システムの中には、書き込み禁止テープに R を要求するものもあります。
WRITE コマンド
現在の磁気テープ・デバイスの現在の位置にデータを書き込みます。
構文
WRITE *-n WRITE /mnemonic
詳細は、"ObjectScript ランゲージ・リファレンス" の "WRITE" を参照してください。
| 引数 | 定義 | 
|---|---|
| *-n | 制御コードを指定します。詳細は “WRITE *-n による磁気テープ機能の制御” を参照してください。 | 
| /mnemonic | Caché は、ニーモニックをアクティブなニーモニック空間で定義されたものとして解釈します。アクティブなニーモニック空間がない場合は、エラーが返されます。 | 
以下の 2 つの方法で、アクティブなニーモニック空間を指定できます。
- 
ネームスペースとネットワーク構成エディタで、デバイス・タイプごとの既定のニーモニック空間を指定します。 
- 
デバイスに対して実行する OPEN コマンドまたは USE コマンドで mnespace パラメータを指定します。 
ニーモニック空間の詳細は、“ニーモニック空間によるデバイス制御” のセクションを参照してください。
WRITE *-n による磁気テープ機能の制御
WRITE * コマンドの後に負の整数の制御コードを指定し、テープ・ヘッドの位置変更や特殊記号とラベルの書き込みができます。以下はその例です。
   WRITE *-5以下の表は、制御コードの説明です。
| コード | 機能 | 結果 | 
|---|---|---|
| -1 | 後退 | テープを 1 ブロック後退させます。(カートリッジ・テープではサポートされていません。) | 
| -2 | 前送り | テープを 1 ブロック進めます (ラベルはスキップします)。テープの最初 (BOT) で WRITE *-2 を実行すると、ボリューム・ラベル、ヘッダ・ラベル、最初のデータ・ブロックがスキップされます。 OPEN で U 形式コードを指定してもテープがラベル付きの場合、テープの先頭 (BOT) で WRITE *-2 を実行すると、ボリューム・ラベルがスキップされます。(カートリッジ・テープではサポートされていません。) | 
| -3 | テープ・マークの書き込み | テープ・マークを書き込みます。バッファに書き込まれていないデータがある場合、そのデータが最初に書き込まれます。 | 
| -4 | ブロックの書き込み | 現在のバッファをすべて書き込みます。ラベル形式が指定され、テープの位置が BOT である場合、適切な形式のヘッダ・ラベルがデータ・ブロックの前に書き込まれます。 | 
| -5 | 巻き戻し | テープを巻き戻します。まだ書き込まれていないデータ (およびその形式で必要なトレーラ・ラベルとテープ・マーク) は、巻き戻しの前に書き込まれます。 | 
| -6 | ブロックの読み取り | 次のブロックを読み取ります。テープの位置が BOT である場合、読み取りの前にヘッダ・ラベルをスキップします。 | 
| -7 | ラベルの読み取り | 次のブロックを読み取ります。ラベルであっても同様に読み取ります。(カートリッジ・テープではサポートされていません。) | 
| -8 | ヘッダ・ラベルの書き込み | ラベル形式が指定されている場合は、ヘッダ・ラベルを書き込みます。テープの位置が BOT である場合、ヘッダ・ラベルの前にボリューム・ラベルを書き込みます。UNIX® システムの場合、カートリッジ・テープではサポートされていません。 | 
| -9 | EOF ラベルの書き込み | 書き込まれていないデータを書き込みます。ラベル形式が指定されている場合は、適切なトレーラ・ラベルを書き込みます。テープ・マークを 2 つ書き込み、2 番目のテープ・マークまで戻ります。(カートリッジ・テープではサポートされていません。) | 
以下の例は、テープ・デバイス 47 番を開き、現在のデバイスに設定します。その後、テープを巻き戻します。
   OPEN 47
   USE 47
   WRITE *-5ニーモニック・パラメータを使用し、WRITE *-n で可能な多くの機能を実行できます。
CLOSE コマンド
磁気テープ・デバイスを閉じ、他のユーザがそのデバイスを使用できるようにします。テープは巻き戻しません。
構文
CLOSE devicenum
詳細は、"ObjectScript ランゲージ・リファレンス" の "CLOSE" を参照してください。
Caché でテープを閉じて巻き戻す仕組み
Caché は、テープに書き込む際に以下の手順を実行し、プログラムでは以下のコマンドを発行します。
- 
CLOSE コマンド 
- 
WRITE *-9 (EOF ラベルの書き込み) コマンド 
- 
WRITE *-5 (巻き戻し) コマンド 
- 
磁気テープ・バッファのデータがテープに書き込まれていない場合、Caché はバッファをテープに書き込みます。EBCDIC 形式の場合、必要に応じて短いブロックを、IBM テープ標準に従って書き込みます。 
- 
テープが ANSI ラベル付きまたは EBCDIC ラベル付きで、最後の処理が書き込みの場合、Caché は適切な EOF ラベルを書き込みます。 
- 
Caché は 2 つのテープ・マークを書き込み、その後、2 番目のテープ・マークまで戻り、これら 2 つのテープ・マーク間に書き込みヘッドを置きます。 
- 
Caché は、CLOSE コマンドあるいは巻き戻しコマンドを実行します。 
ANSI と EBCDIC のラベル付きテープの読み取りと書き込み
Caché は、テープ・ファイルの最初と最後にある ANSI 標準ラベルと EBCDIC ラベルの読み書きが可能です。
Windows と UNIX® では、9 トラックのテープのみ ANSI 標準ラベルと EBCDIC ラベルを書き込めます。8mm や 4mm のカートリッジ・テープにラベルを付けることはできません。
通常使用するラベル付きテープに単一ファイルを書き込むには、テープを開き、使用するだけで済みます。テープを巻き戻し、データを書き込み、その後閉じるには WRITE *-5 を発行します。
ANSI 標準ラベルまたは EBCDIC ラベルを使用して、Caché は以下を書き込みます。
- 
テープ先頭のボリューム・ラベル 
- 
2つのブロック HDR1 と HDR2 から構成されるヘッダ・ラベル 
- 
テープ・マーク 
- 
データ・ブロック 
- 
2 つのブロック EOF1 と EOF2 から構成されるトレーラ・ラベル (トレーラ・ラベルと EOF ブロックは CLOSE を実行する過程で書き込まれます)。 
- 
2 つのテープ・マーク。これらのラベルは、Caché によって自動的に再書き込みされます。 したがって、単一のファイルが書き込まれたテープでは、以下のようになります。 
VOL1, HDR1, HDR2, TM, Data, TM, EOF1, EOF2, TM, TM
ラベルは、以下のような形式になります。UNIX® と Windows における ANSI 標準ラベルと EBCDIC ラベルの形式は以下のようになります。
Volume label (Vol 1)                        |
    |VOL1CACHE1                            D%B|
    0   10   20      30
    |444400100120                          1|
    40  50   60      70
Header one (HDR1)
   |HDR1CACHE.SCR CACHE10001fseq0001020    1|
   0   10   20       30
   |0 00000 00000 00000 Open |
   40  50   60       70 
Header two (HDR2) 
   |HDR2fblk         M                      |
   0   10   20       30
   | 00 
   40  50   60       70
Trailer one (EOF1) 
   |EOF1CACHE.SRC CACHE100001fseq00010      |
   0   10   20        30
   |0 00000 00000 blkcnt Open                |
   40  50   60        70 
Trailer two (EOF2) 
   |EOF2fblk.rec      M                     |
   0   10   30        30 
   | 00                                     |
   40  50   60        70
DOS ラベル
DOS ラベル付きのテープに書き込む場合、単一のヘッダ・ラベルが各ファイルの前に付けられ、各ファイルはテープ・マークで終了します。ヘッダ・ラベルは、基数 50 表記法のファイル名 “CACHE 001” で構成され、その後に、値 1、1、23 の 3 バイトが続きます。残りの 80 バイトのラベルには、ASCII の NULL が埋め込まれます。
レコード構造
ASCII 可変長データ形式では、レコード長に 4 を加算した値を持つ 4 文字の数値が各レコードの先頭に置かれます。ブロックの最終レコードの後にはキャレット文字 (^) が続きます。それぞれの WRITE や READ の引数は、特定の論理レコードに対応します。
EBCDIC 可変長データも ASCII 可変長と同じ形式ですが、各ブロックは、ブロック長を示す 4 文字の数値で始まる点が異なります。
ファイル構造
テープに複数のファイルを書き込むには、2 番目以降のファイルのラベル位置を指定します。ボリューム・ラベルは、テープの先頭にのみ置かれます。各ファイルの前には 2 つのヘッダ・ラベル・ブロックとテープ・マークが置かれ、最後のファイルを除く各ファイルの後には 2 つのトレーラ・ラベル・ブロックと単一のテープ・マークが置かれます。最後のファイルの後には、テープ・マークを 2 つ書き込みます。
磁気テープ制御コード WRITE *-8 (ヘッダ・ラベルの書き込み) と WRITE *-9 (EOF ラベルの書き込み) を使用して、追加するラベルの場所を制御できます。
ラベル付きテープでのファイル生成
以下のテーブルは、Caché テープ・ハンドラを使用して、ラベル付きテープに 3 つのファイルを生成する手順を示しています。
| 手順 | 制御コード | 定義 | 
|---|---|---|
| 1 | OPEN 47:“ALV” USE 47 WRITE *-5 | テープを開き、巻き戻します。 | 
| 2 | USE 47 WRITE ... | 最初のファイルを書き込みます。Caché は、最初のファイルの前に自動的にボリューム・ラベルとヘッダ・ラベルを置きます。 | 
| 3 | USE 47 WRITE *-9 | 最終データ・ブロック、テープ・マーク、EOF ラベル、2 つのテープ・マークを書き込みます。2 番目のテープ・マークに戻ります。 | 
| 4 | USE 47 WRITE *-8 WRITE ... | 2 番目のファイルにヘッダ・ラベルを書き込み、2 番目のデータ・ファイルを書き込みます。 | 
| 5 | USE 47 WRITE *-9 | 最終データ・ブロック、その EOF ラベルを書き込み、2 番目のテープ・マークに戻ります。 | 
| 6 | USE 47 WRITE *-8 WRITE ... | 3 番目のファイルのヘッダ・ラベルとデータを書き込みます。 | 
| 7 | USE 47 WRITE *-5 CLOSE 47 | 最後のデータ・ブロックと、2 つのテープ・マークを持つトレーラ・ラベルを書き込み、テープを巻き戻して磁気テープを閉じます。 | 
入出力状態を表示する特殊変数
特殊変数 $ZA と $ZB には、磁気テープ処理の情報が収められています。$ZA と $ZB の値を必要とするプログラムでは、磁気テープ処理によって発生しているエラー・トラップを認識できるように、磁気テープ処理のたびにこれらの値を検証する必要があります。
磁気テープのステータスを保持する $ZA
磁気テープのエラーと特別な状態は、特殊変数 $ZA に収められます。Caché は、磁気テープ・デバイスを参照する ObjectScript コマンドを実行するたびに、$ZA を更新します。
以下のテーブルは、$ZA のビットの意味を示しています。トラップ列の Y は、<MAGTAPE> エラーが発生する条件であることを意味します。$ZTRAP を設定しておくと、これらの条件下では $ZTRAP で参照するエラー・コードが呼び出されます。"ObjectScript ランゲージ・リファレンス" の "$ZA" 特殊変数と "$ZTRAP" 特殊変数を参照してください。
| ビット | 値 | トラップ | 意味 | 
|---|---|---|---|
| 0 | 1 | Y | 論理エラー - 読み取りと書き込みの混在 — 読み取りと書き込みを切り替えるには、デバイスを閉じるか開きます。または、Forward Space コマンド、Backspace コマンド、Rewind コマンドのいずれかを発行します。 | 
| 2 | 4 | N | 書き込み保護 — 読み取り専用のパラメータを指定せずに書き込み保護された 9 トラックのテープを開こうとすると、ビット 2 が設定され、テープは読み取り専用として開きます。エラーは発生しません。 | 
| 3 | 8 | Y | エラー・サマリー — エラー・サマリーは、エラーの原因となるすべての条件の論理 OR です (このテーブルで “Y” とマークされているすべての条件)。 | 
| 5 | 32 | N | テープの先頭 [BOT] | 
| 6 | 64 | N | オンライン | 
| 7 | 128 | Y | コントローラ・エラーまたはドライブ・エラー | 
| 10 | 1024 | Y | テープの最後 [EOT] | 
| 12 | 4096 | Y | パリティ・エラーまたは CRC エラー | 
| 14 | 16384 | Y | テープ・マーク — Caché は、Read、Read Block、Forward Space、Backspace にテープ・マークがある場合、テープ・マーク・ビットを設定します。これによってエラー・サマリー・ビットを設定し、Read、Read Label、および Read Block では $ZTRAP にトラップします。 | 
| 15 | 32768 | Y | テープの準備ができていません。 | 
これらのビットには、エラー状況を示すものと、必ずしもエラーを生成するとは限らない状況を示すものがあります。エラーではない状況をプログラムで認識するには、磁気テープを処理するたびに $ZA の該当ビットを検証する必要があります。例えば、プログラムがテープの最後を消去しないように、ビット 10 (EOT) を確認する必要があります。
ビットをテストするには、テーブルのビットにリストされている値で $ZA を割り、モジュロ 2 演算を実行します。例えば、ビット 14 のテープ・マークが設定されているかどうかをチェックするには、以下を入力します。
   USE 47 
   IF $ZA\16384#2 {
      DO Endfile }
   ELSE { QUIT }16384 は 2 の 14 乗を、#2 はモジュロ 2 演算を示しています。数字の 0 乗は 1 と同じであるため、ビット 0 (論理エラー) を検査するための除数は必要ありません。以下のように入力します。
   USE 47 
   GOTO LogErr:$ZA#2ドライバ・バッファの情報を保持する $ZB
$ZB には、磁気テープ・ドライバの内部バッファに残っているデータのバイト数が収められています。ブロックの読み取り直後、この数はブロック・サイズになります。READ コマンドは、バッファにある論理レコード数を ObjectScript 変数に転送するので、$ZB の数値は、次のブロックがバッファに入力されるまで減少した状態になります。
テープに書き込む場合、$ZB はドライバの内部バッファに残っている未使用バイト数を表示します。ブロックの読み取り直後、この数は OPEN コマンドが指定したバッファ・サイズになります。WRITE コマンドは、ObjectScript 変数にある論理レコード数をバッファに転送するので、$ZB の数値は、Caché が次のブロックのバッファ・コンテンツを書き込むまで減少した状態になります。
大半の磁気テープ・プログラムは、$ZB を考慮する必要はありません。$ZB は、特殊な形式や可変長ブロックを処理するプログラム用に使用すると便利です。詳細は、"ObjectScript ランゲージ・リファレンス" の "$ZB" を参照してください。
例
この例は、各磁気テープの読み取りの後で $ZA と $ZB をチェックして、変数のいずれかにエラーの発生が示されていると MTERR を設定します。また、磁気テープ・エラーの発生時に $ZTRAP を設定します。
  ; $$MTIN(MTDEV) = the next logical record read from
  ; magtape device MTDEV.
  ; Also returns ZA=$ZA and ZB=$ZB 
  ; On a magtape error, MTERR=1 and $$MTIN(MTDEV)="" 
  ; Expects the caller to have set $ZTRAP to trap other
  ; errors. 
  ;
MTIN(IO) 
     NEW REC,CURDEV 
     SET MTERR=0,CURDEV=$IO,$ZTRAP="MTIERR" 
     USE IO
     READ REC
MTIEXIT
     SET ZA=$ZA,ZB=$ZB
     USE CURDEV 
     QUIT REC 
  ;
MTIERR 
      IF $ZE'["<MAGTAPE>" { 
          USE CURDEV 
          ZQUIT 1 
          GOTO @$ZT }
  ; Use caller's error trap. 
     SET $ZT="",MTERR=1,REC="" 
     GOTO MTIEXITWRITE /mnemonic 用磁気テープ・ニーモニック空間
Caché は、磁気テープ・デバイスに既定のニーモニック空間を含むルーチン ^%XMAG を備えています。この既定を使用して、以下のテーブルで定義されているニーモニックを使用し、以下の形式のテープ・ドライブにコマンドを発行できます。
   WRITE /mnemonic| ニーモニック | 説明 | 
|---|---|
| INIT(%volume,%density, %format) | ANSI 標準のテープ・ヘッダ・ラベルを、指定された密度 (ソフトウェアで設定可能な場合) と形式で書き込みます。ボリューム・パラメータは使用しません。許容密度値は、800、1600 (既定)、6250 です。形式値については、"磁気テープ形式コード" を参照してください。 “ SA” (stream、ANSI) が既定です。 | 
| MOUNT(%device,%volume) | 実装されていません。 | 
| DISMOUNT(%unload) | 実装されていません。 | 
| SEEKFILE(filename) | 実装されていません。 | 
| REWIND | テープ・ボリュームを最初に戻します。 | 
| ENDFILE | EOF マークを書き込みます。 | 
| NEWFILE | ヘッダ・ラベルを書き込み、新規ファイルを生成します。テープの位置が BOT である場合、ヘッダ・ラベルの前にボリューム・ラベルを書き込みます。 | 
| TAPEMARK | テープマークを書き込みます。バッファに書き込まれていないデータがある場合、そのデータが最初に書き込まれます。 | 
| SKIPBLOC(%1) | テープを %1 ブロックに進めます。%1 は必ず正数です。 | 
| SKIPMARK(%1) | テープを %1 テープマークまで進める、あるいは戻します。%1 がゼロより大きい場合は前に進め、ゼロ以下の場合は後退します。 | 
| SKIPFILE | 実装されていません。 | 
| BLOCKSIZ(%bsize) | 磁気テープ・デバイスを閉じ、bsize に設定されたブロック・サイズで開きます。 | 
| FIXED(%rsize) | 磁気テープ・デバイスを閉じ、rsize に設定された “F” パラメータとレコード長で開きます。 | 
