Btrieve

Btrieve は Pervasive Software 社が提供するファイル処理システムです。Btrieve の詳細については、Pervasive Software 社が提供する Btrieve マニュアルを参照してください。

Btrieve ファイルを処理するために、Micro Focus ファイルハンドラ API を使用する Xfh2btr 呼び出し変換モジュールが Net Express で提供されています。

注:

Xfh2btr 呼び出し変換モジュール

Xfh2btr 呼び出し変換モジュールを使用すると、この COBOL システムから Btrieve ファイルにアクセスするための Micro Focus ファイルハンドラ API を使用できます。

Btrieve は通常、ANSI 規格に準拠しません。ただし、デフォルトでは、Xfh2btr 呼び出し変換モジュールは、ANSI 動作をエミュレートさせるために Btrieve ランタイムシステムに必要な呼び出しを行います。 非 ANSI モードで操作することもできます。

Xfh2btr は Btrieve 6.1x 以降と互換性があります。

Xfh2btr は COBOL システムの一部として提供されます。これは、リンク可能なモジュール xfh2btr.obj としても提供され、Btrieve ファイル上で入出力を行うどのアプリケーションともリンクできます。

呼び出し変換モジュールで入出力を行うために Btrieve ランタイムシステムを呼び出す必要がある場合は、モジュール _BTRV が呼出されます。このモジュールの機能は、呼び出しをフォーマットし、Btrieve マイクロカーネルインターフェイス (Windows NT および Windows 95 用の wbtrv32.dll) に呼び出しを渡すことです。モジュール _BTRV は、Btrieve API 呼び出しで使用されるのと同じパラメータを使って COBOL プログラムから直接呼び出せます (詳細は『Btrieve プログラマーズリファレンスマニュアル』を参照)。

スタンドアロンの実行ファイルにアプリケーションをリンクする場合は、_btrv.obj にリンクする必要があります。または、Btrieve 開発者キットを持っている場合は、Pervasive Software 社から提供されるモジュールを _btrv.obj のかわりにリンクできます。これは、cobrbtrv.objcobpbtrv.obj です。 これらのモジュールの詳細については、Btrieve 開発者キットで提供されるマニュアルを参照してください。

Xfh2btr の呼び出し

Xfh2btr 呼び出し変換モジュールを呼び出すには、次の 3 つの方法があります。

Btrieve では、サポートしないファイル操作とファイル形式がいくつかあるので注意が必要です。たとえば、WRITE AFTER や行順ファイルなどはサポートされていません。 この場合に、変換モジュールにファイル入出力を直接行おうとすると、プログラムにエラーが返されます。

CALLFH コンパイラ指令

CALLFH コンパイラ指令は、プログラムによって使用されるファイルハンドラにすべての COBOL 入出力操作を実行することを指定します。 デフォルトでは、ファイルハンドラを指定しない場合は Micro Focus ファイルハンドラが使用されます。

CALLFH コンパイラ指令を Xfh2btr 呼び出し変換モジュールを指定するために使用する場合は、プログラムはすべての入出力を Xfh2btr 呼び出し変換モジュールに渡して、COBOL 入出力操作を Btrieve 入出力操作に変換します。

次のようにして、原始プログラムの先頭に最初の $SET 文として CALLFH を置きます。

$set callfh"xfh2btr"

FILETYPE コンパイラ指令

FILETYPE コンパイラ指令は、プログラムで作成されたファイルの形式を指定します。

次のようにして、プログラムの先頭に最初の $SET文 として FILETYPE コンパイラ指令を置きます。

$set filetype"n"

このときの、n は 5 または 6 です。

FILETYPE"5" は、ファイル操作で ANSI 規格に準拠することが要求される場合に使用します。Btrieve は通常 ANSI 規格に準拠しないため、この操作モードでは Btrieve ランタイムシステムに ANSI 動作をエミュレートするように何度も呼び出しを要求します。

FILETYPE"6" は、速さが要求される場合に使用します。 このモードでは、各 Micro Focus ファイルハンドラ操作が最も近い Btrieve ランタイム呼び出しにマップされます。 ANSI 規格への準拠は行われません。

異なった形式のファイルをプログラム内に混在させることができます。次の例のように、FILETYPE コンパイラ指令を個々の SELECT 文に置きます。

$set filetype"0"
select testfile-1 assign to "test-1.dat"
   organization indexed
   record key prime-key
   access sequential.
$set filetype"5"
select testfile-2 assign to "test-2.dat"
   organization relative
   access sequential.

この例では、test-1.dat 上のすべての入出力は Micro Focus ファイルハンドラによって処理され、test-2.dat 上のすべての入出力は Xfh2btr 呼び出し変換モジュールによって処理されます。

注:索引ファイルを作成するときに使用する形式を指定するには、ファイルハンドラ構成ファイルにあるファイル設定の下に IDXFORMAT パラメータを含めます。 ANSI 準拠または非 ANSI 準拠で Btrieve を示すには、IDXFORMAT を 5 または 6 のどちらかに設定します。詳細については、『ファイルハンドラの構成』の章を参照してください。

Btrieve 環境変数

Xfh2btr 呼び出し変換モジュールの操作を切り替えるために使用する、2 つの環境変数 BTRPAGE と BTRMAXREC があります。

BTRPAGE 環境変数

BTRPAGE 環境変数には、Btrieve ファイルが作成されるときに使用されるページサイズを指定します。 次のコマンドを使用して設定できます。

set BTRPAGE=nnn
        

ここで nnn は、512~4096 の範囲にある 512 バイトの倍数とします。 レコードサイズより大きい値にする必要があります。

BTRPAGE を設定しない場合、または不正な値を記述した場合には、ページサイズのデフォルトは 1024 バイトになります。

注:

BTRMAXREC 環境変数

BTRMAXREC 環境変数には、最大レコードサイズを指定します。

BTRMAXREC は、次のコマンドを使用して設定できます。

set BTRMAXREC=nnnn
        

ここで nnnn は最大レコード長を指定するバイト値です。

BTRMAXREC には、アクセスされる最大レコードのレコードサイズを設定します。

BTRMAXREC を設定しない場合は、デフォルト値の 32 KB が使用されます。

BTRMAXREC の値は、xfh2btr 構成ファイルを使用してファイルごとに設定できます。

Xfh2btr 構成ファイル

注:Xfh2btr 構成ファイルを使用する場合は、mfini.obj を使ってプログラムにリンクする必要があります。

Xfh2btr 構成ファイルを使用すると、すべてのファイルまたは個々のファイルに対して、ページサイズ、最大レコード長、Btrieve オープンモードを指定できます。

構成ファイルの名前は、XFH2BTR 環境変数で指定できます。この環境変数が設定されていない場合は、デフォルトの構成ファイル名 xfh2btr.cfg が使用されます。 構成ファイルはまず現在のディレクトリで検索され、次に COBDIR 環境変数で指定されたパスに沿って検索されます。

タグ [X2B-DEFAULTS] は、ページサイズ、最大レコード長、Btrieve オープンモードのデフォルト値を指定するために使用されます。一方、ファイル名 (たとえば [test.dat]) を含むタグは、特定のファイルに値を指定するために使用されます。

属性名は空白またはコロン (:) によって、属性値と分けます。

注:構成ファイルがある場合は、Btrieve 環境変数 BTRPAGE および BTRMAXREC は無効です。

また、Xfh2btr トレースオプションをオンにして、Xfh2btr 構成ファイルでトレースファイルの名前を指定できます。

ページサイズ

Btrieve ファイルの作成時に使用するページサイズは、Xfh2btr 構成ファイルで次のように属性を設定することで指定できます。

BTRPAGE:nnn
        

ここで nnn は、512~4096 の範囲にある 512 バイトの倍数とします。

BTRPAGE を設定しない場合、または不正な値を記述した場合には、ページサイズのデフォルトは 1024 バイトになります。

最大レコードサイズ

Btrieve ファイルの最大レコードサイズは、Xfh2btr 構成ファイルで次のように属性を設定することで指定できます。

BTRMAXREC:nnnn
        

ここで nnnn はバイト値です。 BTRMAXREC には、アクセスされる最大レコードのレコードサイズを設定します。 BTRMAXREC を設定しない場合は、デフォルト値 32 KB が使用されます。

Btrieve ファイルオープンモード

Xfh2btr 構成ファイルは、ファイルを開くときに使用する Btrieve オープンモードを指定するために使用できます。

INPUT-EXCLUSIVE:オープンモード
INPUT-SHAREABLE:オープンモード
OUTPUT:オープンモード
EXTEND-EXCLUSIVE:オープンモード
EXTEND-SHAREABLE:オープンモード
I-O-EXCLUSIVE:オープンモード
I-O-SHAREABLE:オープンモード 

オープンモードの値として指定できる値は、normal (通常)、accelerated (加速)、read-only (読み取り専用)、verify (確認)、exclusive (排他)です。 これらのオープンモードの詳細については、Btrieve のマニュアルを参照してください。

Xfh2btr 構成ファイルの例

[X2B-DEFAULTS]
output:accelerated
i-o-shareable:accelerated
i-o-exclusive:accelerated
btrpage:2048
btrmaxrec:2000
[test1.dat]
output:exclusive
i-o-shareable:normal
btrpage:4096

上記の Xfh2btr 構成ファイル例では、次の内容が指定されています。

  1. OUTPUT で開かれたファイルに対するデフォルトのオープンモードは accelerated です。
  2. 共有 I/O で開かれたファイルに対するデフォルトのオープンモードは accelerated です。
  3. 排他 I/O で開かれたファイルに対するデフォルトのオープンモードは accelerated です。
  4. ファイルの作成時に使用するデフォルトのページサイズは 2048 バイトです。
  5. デフォルトの最大レコード長は 2000 バイトです。
  6. OPEN OUTPUT で開かれた test1.dat に対するオープンモードは exclusive です。
  7. 共有 OPEN I/O で開かれた test1.dat に対するオープンモードは normal です。
  8. test1.dat 作成時に使用されるページサイズは 4096 バイトです。

トレースオプション

Xfh2btr トレースオプションを設定すると、Xfh2btr 呼び出し変換モジュールによって実行される各操作および Btrieve Record Manager によって返される各エラーコードを、画面に表示するかまたはトレースファイルに記録できます。

Btrieve Record Manager からエラーが返された場合は、Xfh2btr 呼び出し変換モジュールは Btrieve エラーを、プログラムに返す COBOL ファイル状態コードにマップします。 Btrieve エラーがマップされた COBOL ファイル状態コードも、トレースファイルに記録されます。

トレースで Btrieve エラーが示されないのに COBOL ファイル状態コードが返された場合には、このエラーは Xfh2btr 呼び出し変換モジュール内で生成されたものであることを意味します。 たとえば、入力用として開かれたファイルに書き込もうとすると、このようなエラーが生成されます。

トレースオプションに影響を与える属性として、TRACE-FILE と TRACE があります。

TRACE-FILE:ファイル名

これは、トレース情報を画面ではなくファイルに出力するように指定します。ファイル名が指定されない場合は、デフォルトのファイル名 xfh2btr.lst が使用されます。トレースファイルの属性は、[X2B-DEFAULTS] タグの下のみで指定できます。 複数のクライアントアプリケーションが同じトレースファイルにトレース情報を書き込んでいる場合には、ファイルにこの情報が記録される順序は特定できません。

注:トレースファイル名を指定しても、TRACE 機能はオンになりません。

TRACE

TRACE 属性はトレースをオンにします。これは [X2B-DEFAULTS] タグの下に指定するか (この場合すべてのファイル上の操作がトレースされます)、またはファイル名のタグの下に指定します (この場合そのファイル上の操作のみがトレースされます)。

Btrieve トレースオプションの設定例

Xfh2btr 構成ファイルで次のように指定すると、

[X2B-DEFAULTS]
trace-file:x2btrace.dat
trace:

すべてのファイルでトレースが行われ、トレース情報が x2btrace.dat ファイルに書き込まれます。

Xfh2btr 構成ファイルで次のように指定すると、

[X2B-DEFAULTS]
trace-file:
[test1.dat]
trace:

test1.dat ファイルでトレースが行われ、トレース情報が xfh2btr.lst (デフォルトのトレースファイル名) ファイルに書き込まれます。

トレース出力の例

次の例は、トレースオプションを使用するときに生成される出力例です。

                                                行
Input FA01 ifile1.tmp                            1
Output Btrieve Error=+0000 COBOL Error=0/0       2
Input FAF3 ifile1.tmp                            3
Output Btrieve Error=+0000 COBOL Error=0/0       4
Input FAF3 ifile1.tmp                            5
Output Btrieve Error=+0000 COBOL Error=0/0       6
Input FADC All Files                             7
Output Btrieve Error=+0000 COBOL Error=0/0       8
Input FA80 ifile1.tmp                            9
Output Btrieve Error=+0000 COBOL Error=0/0      10
Input FA02 ifile1.tmp                           11
Output Btrieve Error=+0000 COBOL Error=0/0      12
Input FAF5 ifile1.tmp                           13
Output Btrieve Error=+0000 COBOL Error=0/0      14
Input FAF5 ifile1.tmp                           15
Output Btrieve Error=+0000 COBOL Error=0/0      16
Input FAF5 ifile1.tmp                           17
Output Btrieve Error=+0009 COBOL Error=1/0      18
Input FA80 ifile1.tmp                           19
Output Btrieve Error=+0000 COBOL Error=0/0      20
Input FA01 test.dat                             21
Output Btrieve Error=+0029 COBOL Error=9/078    22
Input FA00 ifile1.tmp                           23
Output Btrieve Error=+0000 COBOL Error=0/0      24
Input FAF3 ifile1.tmp                           25
Output Btrieve Error=+0000 COBOL Error=4/8      26
Input FA80 ifile1.tmp                           27
Output Btrieve Error=+0000 COBOL Error=0/0      28

1 行目は、操作を実行する操作コードやファイル名などを入力する行の例です。

2 行目は、Btrieve エラー状態や COBOL アプリケーションに返されるエラーなどを出力する行の例です。

7 行目は、開いているすべてのファイルで実行される操作 (この場合は COMMIT) の例を示しています。

22 行目は、Btrieve ランタイムシステムから返されるエラー状態 29 が状態 9/078 として COBOL アプリケーションに返されることを示しています。 Btrieve エラー状態 29 の詳細については、関連する Btrieve マニュアルを参照してください。

26 行目は、Xfh2btr モジュール内で生成されるエラーを示します。 この場合は、INPUT で開かれたファイルに書き込まれたことを示しています。

Micro Focus ファイルハンドラと Xfh2btr の相違

Micro Focus ファイルハンドラによって行われる COBOL ファイル操作の大部分は、Btrieve ファイル上で Xfh2btr によって行われるのと同じ方法で実行されます。 ただし 2 つのシステムには相違があるため、動作が異なる場合があります。 動作の異なるものを次に示します。

注:ファイル内でレコードの書き込み、再書き込み、削除をした後で順読み操作を行う場合は、現行レコードポインタ (CRP) の位置付けに特に注意してください。

キー

キーについては、次のような相違があります。

ロックレコードの検出

この COBOL システムが他のユーザによってロックされているレコードを読み取ると、レコードデータが COBOL ファイル状態 9/068 (「レコードロック」) と一緒にプログラムに返されます。

Btrieve では、レコードがロックされている場合はデータが返されません。このため、ロックされたレコードの読み取りは Btrieve ランタイムシステムへの複数の呼び出しを必要とし、デフォルトレコードの読み取りは遅くなります。

読み取り操作の速度を向上させるには、次のような方法があります。

OPEN OUTPUT 操作

COBOL OPEN OUTPUT 操作は、ファイルを作成し、そのファイルを排他ロックで開きます。 これは、単一のオペレーティングシステム呼び出しで行われます。 Btrieve では、この操作は Btrieve ランタイムシステムへの 2 回の呼び出しを必要とします。最初の呼び出しでファイルを作成し、2 回目の呼び出しでファイルを排他ロックで開きます。 これらの 2 回の呼び出しの間には多少の時間差があるため、2 番目のユーザはファイルが作成され開かれるまでの間にファイルにアクセスできてしまいます。これが起こると、2 番目のユーザは空のファイルを見つけてファイルを読み取ろうとし、この結果「ファイル終了」エラーになります。OPEN OUTPUT を行うユーザは、排他 OPEN 呼び出しが失敗するため、「ファイルロック」エラーを受け取ります。

レコード長

Btrieve ファイルでは、可変長レコードは 2 つの部分、固定長部分と可変長部分から構成されます。 固定長レコードは、固定長部分のみから構成されます。

可変長レコードでは、レコードの固定長部分は通常、COBOL プログラムで定義した最小レコード長によって決まります。 ただし、重複を許可するキーの数と使用されるページサイズによって、Btrieve はレコードの固定部分の最大レコード長に制限を課します。 レコードの固定部分の最大長の決定方法は次の通りです。

p - 6 - ( 8 * k ) [- 4 可変長レコードの場合] [- 4 相対ファイルの場合]

パラメータの内容は、次のとおりです。

p ファイルのページサイズ
k 重複を許可するキーの数

注:

Btrieve レコード長の例

次の例では、1024 バイトのページサイズを使用します。

現行レコードポインタ (CRP)

この COBOL システムでは、現行レコードポインタ (CRP) は、ファイルで START、READ (順次またはランダム)、OPEN 操作が行われる場合のみに影響を受けます。

ただし、Btrieve ランタイムシステムでは、CRP は WRITE、REWRITE、DELETE 操作によって影響を受けます。 つまり、これらの操作に続いて Btrieve ファイル内の CRP を元の位置に戻し、順次 READ 文が影響を受けないようにする必要があります。

共有環境では、CRP の再位置付けは、再位置付けを行うレコードが他のユーザによって削除されている場合には失敗します。 このような場合は、順次 READ を実行しようとするとエラーが返されます。

以後に説明する CRP の再位置付けは、次の順次 READ 文のときではなく操作が完了した後で行われます。 これによって、レコードが削除される可能性は低くなり、CRP の再位置付けが成功する可能性は高くなります。

注:非 ANSI 規格モードの操作では、CRP を再位置付けしないために操作が非常に速くなります。

WRITE 操作後の順次 READ 操作

I/O で開いた共有ファイルが ANSI 準拠の操作モードが使用されているトランザクションにない場合、ファイルは実際に 2 回開かれます。 最初にファイルが開かれるのは、ファイルからレコードを読み取るときです。 2 回目にファイルが開かれるのは、ファイルにレコードを書き込むときです。 このため、読み取り位置は通常の WRITE 操作で影響を受けることがありません。 ただし、WRITELOCK 指令を使用した場合には、挿入したレコードはロックされて読み戻されなければならず、これによりファイル内の CRP が変更されます。

WRITE 操作後の Btrieve ファイル位置指示子の再位置付けは、WRITELOCK 指令が使用されファイルが共有の場合のみに失敗します。 WRITE 操作後に再位置付けが失敗した場合は、順次 READ が行われるときにエラーが返されます。

DELETE 操作後の順次 READ 操作

乱呼び出しまたは動的呼び出しの I/O で開いたファイルでは、Btrieve ファイル位置指示子を、削除するレコードの位置に移動されます。 DELETE 操作を行った後、ファイル位置指示子は元の位置に戻されますが、再位置付けするレコードが削除されている場合はこれが失敗することもあります。

この問題は順呼び出しのファイルには発生しません。ファイル位置指示子はすでに削除するレコード上にあり、再び位置付ける必要がないためです。

注:参照キーが重複を許可するキーにある場合は、順次 READ と DELETE 文を続けて行うことはできません。 これは、DELETE 操作の後で CRP を再び位置付けることができないためです。

REWRITE 操作後の順次 READ 操作

乱呼び出しまたは動的呼び出しの I/O で開いたファイルでは、Btrieve ファイル位置指示子は、変更するレコードの位置に移動されます。 REWRITE 操作を行った後、ファイル位置指示子は元の位置に戻されますが、再位置付けするレコードが削除されている場合はこれが失敗することもあります。

この問題は順呼び出しのファイルには発生しません。ファイル位置指示子はすでに再書き込みするレコード上にあり、再び位置付ける必要がないためです。

トランザクション処理

この COBOL システムでは、トランザクション処理は Fileshare を使用している場合のみに実行できますが、Btrieve ユーザは、トランザクション処理を実行するために Fileshare は必要ありません。

Fileshare を使ってトランザクション内のファイルにあるレコードを更新する場合は、ファイルにある個々のレコードはロックされ、他のユーザがレコードを読むことを防ぎます。 これはレコードがファイルから削除されたときに ROLLBACK 操作が行われる可能性があるためです。 ただし、トランザクション内から Xfh2btr を介して Btrieve ファイルにアクセスする場合は、他のユーザが同時にファイルにアクセスすることを防ぐために、ファイル全体に一時的な排他ロックがかけられます。 Btrieve v6.x 以降では、並行トランザクションが使用され、トランザクション内でファイルを共有できます。

Btrieve トランザクションは、処理中のトランザクションがなく ROLLBACK を使って開かれているファイルに対して、REWRITE 、WRITE、または DELETE 操作が行われるたびに開始されます。 この時点では、Btrieve はファイルに排他ロックをかけます。このファイルロックは並行トランザクションが使用中の場合を除いて、トランザクションが終了するまで残ります (Btrieve v6.x 以降)。

注:

CLOSE 操作は、トランザクションがアクティブでないときのみに Btrieve CLOSE 操作が行われるため、トランザクションを再開しません。

ファイルロックエラーは、ファイルが開かれたときに Xfh2btr によって返されます。これは、この COBOL システムが、ファイルを開くときのみにファイルロックエラーを返すためです。 Btrieve は、トランザクション内でファイルにアクセスするときにファイルロックエラーを返すことができます。ただし、このファイルロックエラーは、Xfh2btr によってレコードロックエラーに変換されます。これは、トランザクション内でファイルにアクセスするときにこの COBOL システムが正当にレコードロックエラーを返せるためです。

WRITELOCK コンパイラ指令

この COBOL システムでは、WRITELOCK コンパイラ指令を使って、ファイルにレコードを書き込み、書き込まれたレコードをロックできます。 ファイルに再度書き込まれたレコードにもロックをかけます。

Btrieve では、最初にレコードがファイルへ書き込みまたは再書き込みされ、その後にそのレコードをロックするために読み戻されます。 この操作には Btrieve ランタイムシステムへ何度もの呼び出しが必要で、呼び出しに多少の時間差があります。 このため最初のユーザによってレコードがロックのために読み戻される前に、2 番目のユーザがそのレコードを呼び出して最初のユーザが書き込んだレコードをロックする可能性があります。

非 ANSI モードでの Btrieve の呼び出し

Btrieve は通常、ANSI 規格に準拠しません。ただし、デフォルトでは、Xfh2btr 呼び出し変換モジュールは、ANSI 動作をエミュレートさせるために Btrieve ランタイムシステムに必要な呼び出しを行います。ただし、FILETYPE"6" へ FILETYPE コンパイラ指令を設定することにより、非 ANSI モードでの操作を選択できます。

このモードの操作では、各 Micro Focus ファイルハンドラの操作は最も近い Btrieve ランタイム呼び出しにマップされ、ANSI 規格の確認が行われなくなります。