スケーラブルデータベースサーバ HiRDB Version 8 コマンドリファレンス(UNIX(R)用)

[目次][索引][前へ][次へ]

付録E.3 EasyMTテープでの作成方法

EasyMTは,E.2で示した可変長ブロックテープを使用して,ボリューム名やファイル名によるテープ管理をするプログラムプロダクトです。

<この項の構成>
(1) 主な媒体
(2) ファイル名の例
(3) ファイル名の作成
(4) 概略
(5) 作成例

(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種類のファイルが扱えます。

(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