付録E.3 EasyMTテープでの作成方法
EasyMTは,E.2で示した可変長ブロックテープを使用して,ボリューム名やファイル名によるテープ管理をするプログラムプロダクトです。
- 〈この項の構成〉
(1) 主な媒体
DAT,CGMT,OMT
(2) ファイル名の例
/dev/dat/vdat010(内蔵DAT),
/dev/cgmt/vcgmt160(カートリッジ磁気テープ),
/dev/omt/vomt055(オープンリール磁気テープ)
(3) ファイル名の作成
可変長ブロックデバイスは,導入時には作成されていません。そのため,事前に作成する必要があります。
スーパユーザが,次のコマンドを実行します。
/etc/mknod /dev/dat/vdat010 c 119 0x010001 /bin/chmod 0666 /dev/dat/vdat010
- (説明)
-
通常はこのコマンドを実行すれば,内蔵DATに対する可変長ブロックアクセスデバイスが作成されます。
- /dev/dat/vdat010:
-
デバイス名称
- c :
-
キャラクタスペシャルファイル
- 119:
-
メジャー番号(DATの可変長ブロック使用を示します)
- 0x010001:
-
マイナー番号(内蔵DATを圧縮モードで使用することを示します)
なお,用語,概念などについては,次のmanを参照してください。
mknod及びchmod:man 1m mknod及びman chmod
メジャー番号,マイナー番号,及びデバイス名称の命名規則:man 6 mt
(4) 概略
EasyMTでは,次のようなヘッダ形式があります。
シンボル |
意味 |
---|---|
EMTVOL_EL |
EasyMTラベル |
EMTVOL_SL |
標準ラベル |
EMTVOL_JL |
JISコードラベル |
EMTVOL_NL |
ラベルなし |
データベース作成ユティリティ(pdload)では,まずヘッダを読み込み,認識できる形式のものを読みます。認識できない場合やラベルなしの場合は,エラーとします。
EasyMTでは,次のようなレコード形式があります。
シンボル |
意味 |
ブロック指定 |
レコード指定 |
ラベル指定 |
---|---|---|---|---|
F |
固定長非ブロックレコード |
N |
F |
SL又はEL |
FB |
固定長ブロックレコード |
B |
||
V |
可変長非ブロックレコード |
N |
V |
|
VB |
可変長ブロックレコード |
B |
||
U |
不定長 |
N |
U |
データベース作成ユティリティ(pdload)では,上記のすべての型に対応します。しかし,ブロック長,レコード長,及びデータ長のうち,最長のものの最大値は次のようになります。
作成機種 |
最大値 |
---|---|
3050RXグループ |
32キロバイト(32768バイト) |
3500シリーズ |
|
HITAC−Mシリーズ |
32キロバイト−8(32760バイト) |
F及びFBのレコード形式は,1レコードの長さが固定なので,入力がバイナリファイルで行の構成列がすべて固定長の表,又はFIX表の場合だけ使用できます。入力がアスキーファイルの場合は,データ長がすべて同じ場合だけ使用できます。
データベース作成ユティリティ(pdload)の入力としては,次の2種類のファイルが扱えます。
-
バイナリ形式ファイル(-b指定)
-
DAT形式ファイル(-b指定なし(デフォルト))
(a) バイナリ形式ファイル
レコード形式には,次の種類があります。
■ F(固定長非ブロックレコード)
■ FB(固定長ブロックレコード)
データ長(レコード長)には,1行の長さを指定します。
行の構成列がすべて固定長の表,又はFIX表の場合だけF/FBを指定できます。
■ V(可変長非ブロックレコード)
■ VB(可変長ブロックレコード)
■ U(不定長)
(b) DAT形式ファイル
DAT形式のファイルは,1行1レコード(NL文字まで)にします。通常レコード形式はV,VB,又はUのどれかの形式にします。データ長がすべて同じ場合だけ,F又はFBが使用できます。
データ長には,NL(LF : 0x0a, '\n')を含みます。NLを含まないレコードは,エラーとなります。
以上のことをまとめると,データ長,レコード長,及びブロック長の最大・最小値は次のようになります。
- 【3050RXグループ・3500シリーズで作成する場合】
-
レコード形式
データ長
レコード長
ブロック長
min
max
min
max
min
max
F/FB
1
32768
1
32768
1
32768
V/VB
1
32760
5
32764
9
32768
U
1
32768
−
−
1
32768
- 【HITAC-Mシリーズで作成する場合】
-
レコード形式
データ長
レコード長
ブロック長
min
max
min
max
min
max
F/FB
1
32760
1
32760
1
32760
V/VB
1
32752
5
32756
9
32760
U
1
32760
−
−
1
32760
(5) 作成例
3050RXグループ又は3500シリーズでEasyMT提供関数を使用して,データベース作成ユティリティ(pdload)用入力ファイルを作成する例を示します。
なお,EasyMTの定義は,MT属性定義ファイルで指定するものとします。
(a) プログラム例
MT属性定義ファイルは,第1引数(argv[1])で指定します。
エラー処理は,必要に応じて指定してください。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include "easymt.h" #define PROC_BUFSIZ 1024 * 32 char buf[PROC_BUFSIZ]; int data_len; /* データ長 */ : void main(int argc, char *argv[]) { EmtDescr_t* emt_fp; if (EmtInit(NULL, argv[1])) { printf("EmtInit失敗, ,EmtErrno=%i\n", EmtErrno); exit(EXIT_FAILURE); } if (emt_fp = EmtAlloc(NULL, argv[1])) { } else { printf("EmtAlloc失敗, ,EmtErrno=%i\n", EmtErrno); exit(EXIT_FAILURE); } if (EmtFopen(emt_fp, NULL)) { printf("EmtFopen失敗, ,EmtErrno=%i\n", EmtErrno); goto proc_free; } while(データがある間) { : ここでbufにデータを作成する。data_lenにデータ長を代入。 DAT形式データの場合はNL(0x0a)をデータ内に含みます。 : rc = EmtWrite(emt_fp, buf, data_len); if (rc != data_len) { printf("EmtWrite失敗,EmtErrno=%i\n", EmtErrno); goto proc_close; } } proc_close: if (EmtFclose(emt_fp)) { printf("EmtFclose失敗,EmtErrno=%i\n", EmtErrno); goto proc_free; } proc_free: if (EmtFree(emt_fp)) { printf("EmtFree失敗,EmtErrno=%i\n", EmtErrno); exit(EXIT_FAILURE); } }
(b) MT属性定義ファイルの例
定義ファイルで「=」の直後が空白のものは,その値を省略したことになります。
- デバイス名:
-
/dev/dat/vdat010
- バッファ面数:
-
2
- ボリューム名:
-
HiRDB
- ラベルタイプ:
-
標準ラベル(SL)
- ファイル名称:
-
input_data
- オープンモード:
-
書き込み指定
- レコードタイプ:
-
VBの最大値
(Mシリーズでも扱えるように最大値を32キロバイト−8(32760バイト)にしたもの)
これで,データ長はレコード長-4(32752バイト)まで扱えることになります。
MT属性定義ファイルのうち,以下のエントリはpdloadの制御情報ファイルのsource文エントリと対応します。
MT属性定義ファイルエントリ |
pdload制御情報ファイルsource文エントリ |
最大文字数 |
---|---|---|
volname= |
vol= |
6 |
filename= |
file= |
17※ |
- 注※
-
MTをHITAC-Mシリーズで作成する場合,filenameは44文字まで指定できますが,そのうち有効な文字数はfilenameの終わりから17文字までです。それを指定してください。
bufnoエントリは単に,書き込み時にバッファ面数を何面使うかの指定なので,pdloadの指定と合わせる必要はありません。
上記のようなファイルを作成する場合の定義例を次に示します。
#/*------------------------------------------------------- # (1) 動作に対する指定 #/*------------------------------------------------------- devname=/dev/dat/vdat010 blking=OFF bufno=2 #/*------------------------------------------------------- # (2) volume属性に関する指定 #/*------------------------------------------------------- volname=HiRDB voltype=SL #/*------------------------------------------------------- # (3) file属性に関する指定 #/*------------------------------------------------------- filename=input_data openmode=EMT_WRONLY blklen=32760 reclen=32756 blktype=B rectype=V