Comments
Description
Transcript
ENSCRIBE プログラマーズ・ガイド
ENSCRIBE プログラマーズ・ガイド 概要 このマニュアルは、ENSCRIBE ソフトウェアがサポートする 5 種類の ディスク・ファイルを作成、アクセス、およびロードする方法を説明し ます。 製品バージョン ENSCRIBE D46 サポートするリリース このマニュアルは、新版の中で特記しない限り、D46.00 およびそれ以 降の D- シリーズすべてをサポートします。 マニュアル番号 137692J 発行 1998 年 9 月 コンパックコンピュータ株式会社 137692J -1 本書のプログラムを含むすべての内容は、著作権法上の保護を受けて おります。著者、発行者の許諾を得ず、無断で複写、複製をすること は禁じられております。 原 典 Document History Edition Part Number Product Version Earliest Supported Release Published First Second 114692 137692 Enscribe D40 Enscribe D46 December 1996 April 1998 New editions incorporate any updates issued since the previous edition. A plus sign(+) after a release ID indicates that this manual describes function added to the base release, either by an interim product modification(IPM) or by a new product version on a .99 site update tape(SUT). -2 Copyright Copyright© 1993 by Tandem Computers Incorporated. Printed in the U.S.A. All rights reserved. No part of this document may be reproduced in any form, including photocopying or translation to another language, without the prior written consent of Tandem Computers incorporated. Ordering Information For manual ordering information: domestic U.S. customers, call 1-800-243-6886; international customers, contact your local sales representative. Document Disclaimer Information contained in a manual is subject to change without notice. Please check with your authorized Tandem representative to make sure you have the most recent information. Export Statement Export of the information contained in this manual may require authorization from the U.S Department of Commerce. Examples Examples and sample programs are for illustration only and may not be suited for your particular purpose. Tandem does not warrant, guarantee, or make any representations regarding the use or the results of the use of any examples or sample program in any documentation. You should verify the applicability of any example or sample program before placing the software into productive use. U. S.Government Customers FOR U.S. GOVERNMENT CUSTOMERS REGARDING THIS DOCUMENTATION AND THE ASSOCIATED SOFTWARE; These notices shall be marked on any reproduction of this data, in whole or in part. NOTICE: Notwithstanding any other lease or license that may pertain to, or accompany the delivery of, this computer software, the rights of the Government regarding its use, reproduction and disclosure are as set forth in Section 52.227-19 of the FARS Computer Software-Restricted Rights clause. RESTRICTED RIGHTS NOTICE: Use, duplication or disclosure by the Government is subject to the restrictions as set forth in subparagraph(c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 52.227-7013. RESTRICTED RIGHTS LEGEND: Use, duplication or disclosure by the Government is subject to the restrictions as set forth in paragraph(b)(3)(B) of the Rights in Technical Data and Computer Software clause at DAR 7-104.9(a). This computer software is submitted with “restricted rights.” Use, duplication or disclosure is subject to the restrictions as set forth in NASA FAR SUP 18-52 227-79(April 1985) “Commercial Computer Software - Restricted Rights (April 1985).” If the contract contains the Clause at 18-52 227-74 “Rights in Data General” then the “Alternate III” clause applies. U. S Government Users Restricted Rights—Use, duplications or disclosure restricted by GSA ADP Schedule Contract. Unpublished—All rights reserved under the Copyright Laws of the United States. 137692J 目次 目次 新規情報 マニュアル情報 ................................................................................................................................. xi 概要 ......................................................................................................................................... xi 製品バージョン ...................................................................................................................... xi サポートするリリース ........................................................................................................... xi 改訂部分 ............................................................................................................................................. xi このマニュアルについて マニュアルの構成 ........................................................................................................................... xiii 関連マニュアル ............................................................................................................................... xiii コメントのお願い ........................................................................................................................... xiv 表記規約 ........................................................................................................................................... xiv 一般構文表記 ........................................................................................................................ xiv 第1章 ENSCRIBE レコード・マネージャの概要 用語 .................................................................................................................................................. 1-1 ディスク・ファイル構成 ................................................................................................................ 1-2 非構造化ファイル ................................................................................................................. 1-4 構造化ファイル .................................................................................................................... 1-4 パーティション(複数ボリューム)ファイル .............................................................................. 1-4 ファイル識別子 1-5 パーティション間での相違点.............................................................................................. 1-5 ファイル・ディレクトリ ................................................................................................................ 1-5 オーディットされたファイル ........................................................................................................ 1-6 協調アクセス ................................................................................................................................... 1-6 待ちあり、待ちなし I/O ................................................................................................................. 1-6 ファイルへの操作 ........................................................................................................................... 1-7 ファイルの作成 .................................................................................................................... 1-7 レコード形式の記述(データ定義言語)............................................................................ 1-7 426745-001J iii 目次 ファイルのロード ................................................................................................................ 1-7 レコード操作 ........................................................................................................................ 1-7 構造化ファイル特性の比較 ............................................................................................................ 1-8 第2章 構造化ファイル内の位置決め アクセス・パス ............................................................................................................................... 2-4 カレント・キーの指定子とカレント・アクセス・パス ................................................... 2-4 カレント・キーの値と現在位置 ......................................................................................... 2-6 位置決めモードと比較長..................................................................................................... 2-7 APPROXIMATE 位置設定 .................................................................................................. 2-8 GENERIC 位置設定 ............................................................................................................. 2-8 EXACT 位置設定 ................................................................................................................. 2-9 代替キー .......................................................................................................................................... 2-9 キー指定子 ......................................................................................................................... 2-11 キー・オフセット .............................................................................................................. 2-11 キーの自動メンテナンス................................................................................................... 2-12 代替キーの属性 .................................................................................................................. 2-12 キー順ファイルにおける代替キー ................................................................................... 2-13 入力順ファイルにおける代替キー ................................................................................... 2-13 相対ファイルにおける代替キー ....................................................................................... 2-13 代替キー・ファイル .......................................................................................................... 2-13 リレーショナル・アクセス ............................................................................................... 2-15 第3章 システム・プロシージャ ファイル・システム・プロシージャ ............................................................................................ 3-1 プロシージャ呼び出しの完了 ............................................................................................. 3-3 ファイル番号パラメータ..................................................................................................... 3-4 タグ・パラメータ ................................................................................................................ 3-4 バッファ・パラメータ ........................................................................................................ 3-4 トランスファ・カウント・パラメータ .............................................................................. 3-4 条件コード ........................................................................................................................... 3-5 エラー番号 ........................................................................................................................... 3-5 ファイル・アクセス権 ........................................................................................................ 3-6 iv 426745-001J 目次 外部宣言 ................................................................................................................................ 3-7 シーケンシャル I/O(SIO)プロシージャ .................................................................................... 3-7 第4章 ファイル作成とアクセスのための一般情報 ファイル作成 ................................................................................................................................... 4-1 ファイル・コード ................................................................................................................. 4-2 ディスク・エクステントのサイズ ...................................................................................... 4-2 サポートするファイル形式:形式 1 と形式 2.................................................................... 4-3 ファイル・サイズの制限 ..................................................................................................... 4-4 オーディット・チェックポイントの圧縮........................................................................... 4-5 書き込みの検証 .................................................................................................................... 4-7 ファイル・アクセス ........................................................................................................................ 4-8 ファイルのオープンとクローズ .......................................................................................... 4-8 パーティション・ファイルをオープンする ....................................................................... 4-9 構造化ファイルの逆方向読み出し ...................................................................................... 4-9 ファイルの有効期限 ........................................................................................................... 4-11 ファイル作成と最後にオープンされたタイムスタンプ .................................................. 4-11 CONTROL 27 によるディスク書き込みの検出 ............................................................... 4-11 キャッシュ・バッファリングまたはシーケンシャル・ブロック・バッファリングの使用 ..............................................................................................................................................4-12 ディスク・ファイルに適切な ACCESSTYPE パラメータを指定する .......................... 4-16 EOF ポインタの更新 .......................................................................................................... 4-17 データのパージ .................................................................................................................. 4-18 プログラムによるファイル・エクステント割り当て ..................................................... 4-19 プログラムによるファイル・エクステントの割り当て解除 .......................................... 4-19 第5章 非構造化ファイル 使用できるシステム・プロシージャ ............................................................................................. 5-1 アクセスのタイプ ........................................................................................................................... 5-1 非構造化ファイルの作成 ................................................................................................................ 5-2 バッファ・サイズ ................................................................................................................. 5-2 ディスク・エクステントのサイズ ...................................................................................... 5-3 例 1:非構造化ファイルの作成........................................................................................... 5-3 426745-001J v 目次 例 2: パーティション化された非構造化ファイルの作成 ................................................. 5-4 非構造化ファイルへのアクセス .................................................................................................... 5-7 ファイル・ポインタ ............................................................................................................ 5-7 シーケンシャル・アクセス ................................................................................................. 5-9 ランダム・アクセス .......................................................................................................... 5-11 ファイルの終わりへの追加 ............................................................................................... 5-12 第6章 キー順ファイル 使用できるシステム・プロシージャ ............................................................................................ 6-1 アクセスのタイプ ........................................................................................................................... 6-2 キー順ツリー構造 ........................................................................................................................... 6-2 キー順ファイルの作成 ................................................................................................................... 6-4 論理レコード ........................................................................................................................ 6-4 ブロック ............................................................................................................................... 6-4 ディスク・エクステントのサイズ ..................................................................................... 6-5 主キー ................................................................................................................................... 6-6 キー圧縮 ............................................................................................................................... 6-6 インデックス短縮 ................................................................................................................ 6-7 ファイルの作成例 ................................................................................................................ 6-8 例 5:パーティションされたキー順ファイルの作成 ...................................................... 6-16 キー順ファイルへのアクセス ...................................................................................................... 6-20 EOF(ファイルの終わり)ポインタ................................................................................ 6-20 シーケンシャル・アクセス ............................................................................................... 6-20 ランダム・アクセス .......................................................................................................... 6-20 レコード挿入 ...................................................................................................................... 6-21 レコード削除 ...................................................................................................................... 6-21 現在の主キー値 .................................................................................................................. 6-21 アクセス例 ......................................................................................................................... 6-22 第7章 キュー・ファイル 使用できるシステム・プロシージャ ............................................................................................ 7-1 アクセスのタイプ ........................................................................................................................... 7-2 キュー・ファイルの構造 ............................................................................................................... 7-2 vi 426745-001J 目次 主キー .................................................................................................................................... 7-2 キュー・ファイルの作成 ................................................................................................................ 7-3 キュー・ファイルの例 ......................................................................................................... 7-3 キュー・ファイルへのアクセス..................................................................................................... 7-6 同期深度の指定 .................................................................................................................... 7-6 レコードのキューイング ..................................................................................................... 7-6 レコードのデキューイング ................................................................................................. 7-7 レコードの検証 .................................................................................................................. 7-10 位置決めを伴うデキューイング ........................................................................................ 7-10 カレント・キーの使用 ....................................................................................................... 7-13 タイムアウト期間の指定 ................................................................................................... 7-13 レコードのロック ............................................................................................................... 7-14 ネットワーク対策 ............................................................................................................... 7-14 アクセス例 .......................................................................................................................... 7-14 通信パス・エラー ......................................................................................................................... 7-19 第8章 入力順ファイル 使用できるシステム・プロシージャ ............................................................................................. 8-1 アクセスのタイプ ........................................................................................................................... 8-1 入力順ファイルの作成 .................................................................................................................... 8-2 論理レコード ........................................................................................................................ 8-3 ブロック ................................................................................................................................ 8-3 ディスク・エクステント・サイズ ...................................................................................... 8-4 ファイルの作成例 ................................................................................................................. 8-4 入力順ファイルへのアクセス ...................................................................................................... 8-12 シーケンシャル・アクセス ............................................................................................... 8-12 ランダム・アクセス ........................................................................................................... 8-12 アクセス例 .......................................................................................................................... 8-13 第9章 相対ファイル 使用できるシステム・プロシージャ ............................................................................................. 9-3 アクセスのタイプ ........................................................................................................................... 9-3 相対ファイルの作成 ........................................................................................................................ 9-4 426745-001J vii 目次 論理レコード ........................................................................................................................ 9-5 ブロック ............................................................................................................................... 9-5 ディスク・エクステント・サイズ ..................................................................................... 9-7 ファイルの作成例 ................................................................................................................ 9-7 相対ファイルへのアクセス .......................................................................................................... 9-14 ファイル・ポインタ .......................................................................................................... 9-14 シーケンシャル・アクセス ............................................................................................... 9-16 ランダム・アクセス .......................................................................................................... 9-17 レコードの挿入 .................................................................................................................. 9-17 レコードの削除 .................................................................................................................. 9-18 ファイル・アクセスの例................................................................................................... 9-18 第 10 章 ファイルとレコードのロック ロック・モード ............................................................................................................................. 10-1 ファイルのロック ......................................................................................................................... 10-2 レコードのロック ......................................................................................................................... 10-3 包括ロック .................................................................................................................................... 10-4 ファイル・ロックとレコード・ロックの相互関係 ................................................................... 10-6 ロックの制限 ................................................................................................................................ 10-6 デッドロック ................................................................................................................................ 10-7 非構造化ファイルのファイル・ロックとレコード・ロック .................................................... 10-7 TMF ロックの考慮事項 ................................................................................................................ 10-8 オーディットされたファイルをオープンするときのエラー ....................................... 10-10 削除したレコードの読み出し ......................................................................................... 10-11 バッチ更新 ....................................................................................................................... 10-11 第 11 章 エラーとエラー回復処置 通信パス・エラー ......................................................................................................................... 11-1 データ・エラー ............................................................................................................................. 11-1 デバイス操作エラー ..................................................................................................................... 11-1 エクステント割り当てエラー ...................................................................................................... 11-2 エラーとパーティション・ファイル .......................................................................................... 11-3 プライマリ・アプリケーション・プロセスのエラー ................................................................ 11-3 viii 426745-001J 目次 第 12 章 ファイルのロード キー順ファイルのロード .............................................................................................................. 12-1 新しい代替キーの定義 .................................................................................................................. 12-2 代替キー・ファイルの作成 .......................................................................................................... 12-2 キー順ファイル・パーティションの再ロード ............................................................................ 12-3 パーティションされた代替キー・ファイルのロード ................................................................ 12-3 付録 A ASCII 文字セット 付録 B 構造化ファイルのブロック形式 付録 C カレント・キー、キー指定子、キー長の動作 変数定義 .......................................................................................................................................... C-1 関数定義 .......................................................................................................................................... C-2 擬似コードによる説明 ................................................................................................................... C-3 OPEN (FILE_OPEN_) ......................................................................................................... C-3 FILE_SETKEY_, KEYPOSITION:..................................................................................... C-3 FILE_SETPOSITION_, POSITION: ................................................................................... C-3 READ: .................................................................................................................................. C-3 READUPDATE: .................................................................................................................. C-4 WRITEUPDATE:................................................................................................................. C-4 WRITE: ................................................................................................................................ C-4 426745-001J ix 目次 x 426745-001J 新規情報 新規情報 マニュアル情報 概要 このマニュアルは、ENSCRIBE ソフトウェアがサポートする 5 種類のディスク・ファイルを作成、アク セス、およびロードする方法を説明します。 製品バージョン ENSCRIBE D46 サポートするリリース このマニュアルは、新版の中で特記しない限り、D46.00 およびそれ以降の D- シリーズすべてをサポー トします。 マニュアル番号 発行 137692 1998 年 9 月 改訂部分 □ ブロック・ファイル形式 2 が追加されました。 □ ファイル形式およびシステム・プロシージャ・コールの変更を反映して、技術上および編集上の改訂が 加えられました。 □ 新しいプログラミング例が形式 2 ファイルに加わりました。 □ 既存のプログラミング例がより一般的なものになりました。 137692J xi 新規情報 (空白ページ) xii 137692J このマニュアルについて このマニュアルは、ENSCRIBE データベース・レコード・マネージャを説明します。対象とする読者は、 プログラマ、データベース設計者、およびタンデム NonStop システム上で実行するデータベース・アプリ ケーションの設計、開発、保守を担当するアナリストです。 マニュアルの構成 □ 第 1 章 :ENSCRIBE の特徴を説明します。 □ 第 2 章 :主キーと代替キーを使用した構造化ファイル内の位置決め方法を説明します。 □ 第 3 章 :ENSCRIBE ファイルの作成と操作を行うシステム・プロシージャの使用方法を要約します。 □ 第 4 章 :ENSCRIBE ファイルの作成と操作を行うファイル生成とファイル・アクセス情報を説明しま す。 □ 第 5 章 :非構造ファイルの作成とアクセス方法を説明します。 □ 第 6 章 :キー順ファイルの作成とアクセス方法を説明します。 □ 第 7 章 :キュー・ファイルの作成とアクセス方法を説明します。 □ 第 8 章 :入力順ファイルの作成とアクセス方法を説明します。 □ 第 9 章 :相対ファイルの作成とアクセス方法を説明します。 □ 第 10 章:ファイル・ロック、レコード・ロック機能について説明します。 □ 第 11 章:ENSCRIBE 環境で発生するエラーの種類を説明します。 □ 第 12 章:実例を使用して種々のタイプの Enscirbe ファイルでデータを読み込む方法を説明します。 □ 付録 A :ASCII 文字セット一覧を示します。 □ 付録 B : ENSCRIBE 構造化ファイル形式 1、形式 2 のブロック形式を説明します(キー順、キュー、 入力順、および相対) 。 □ 付録 C :ファイルシステムの操作がファイルの通貨情報に与える影響を説明します。 関連マニュアル 次のタンデムマニュアルには、参考資料として有用な追加情報があります。 □『GURDIAN プロシージャ・コール・リファレンス・マニュアル』 □『GURDIAN プログラマーズ・ガイド』 □『GURDIAN ディスク / テープ・ユーティリティ・リファレンス・マニュアル』 137692J xiii コメントのお願い このマニュアルをご使用頂いた感想をコメントとしてお寄せください。 「読者コメント・カード」を返送 頂くか、またはインターネット・メールをお送りください。「読者コメント・カード」は印刷されたマニュ アルの巻末に添付され、また Tandem CD Read ディスクにも別ファイルとして添付されています。カード は FAX、または郵送でお送りください。FAX 番号、郵送先住所はカードに記載されています。 「読者コメント・カード」にはインターネット・メール・アドレスも記載されています。インターネット でメールをお送り頂くと、折り返し受信通知を送らせていただきます。メッセージの内容に対する詳細な 回答はできるだけ速やかに送らせていただきます。メッセージにはお名前、会社名、住所、電話番号を記 入いただくようお願いします。特定のマニュアルの具体的内容に関するコメントの場合は、該当マニュア ルの名称とパーツ番号もお知らせください。 お客様からのコメントをもとに、弊社はマニュアルの改善に努めております。更なる改善のためにご協 力を賜りますようお願い申し上げます。 表記規約 一般構文表記 このマニュアルで使用する構文表記規約の要約を以下に説明します。 大文字 大文字で表記された項目はキーワード、または予約語であることを示します。これらの項目は表記に従 い正確に入力しなければなりません。括弧で囲まれていない項目は省力できません。例: MAXATTACH 小文字イタリック(斜字体) 小文字のイタリックで表記された項目はユーザーが値を与える変数であることを示します。括弧で囲ま れていない項目は省力できません。例: file-name [ ] 角括弧 角括弧で囲まれた項目は省略可能です。例: TERM [\system-name.]$terminal-name INT[ERRUPTS] 角括弧内に複数項目が列挙されている場合は、その中から項目を選択できることを示します(選択しな くてもかまいません)。これらの列挙項目はリストの両側を括弧で囲って縦方向に改行して並べるか、また は、括弧内に縦線 ("|") で区切って横に並べられます。例: LIGHTS [ ON [ OFF ] ] [ SMOOTH [ num ] ] K [ X | D ] address-1 xiv 137692J { } 中括弧(ブレース) 中括弧内に複数項目が列挙されている場合は、その中から 1 個を選択しなければならないことを示しま す。これらの列挙項目はリストの両側を括弧で囲って縦方向に改行して並べるか、または、括弧内に縦線 ("|") で区切って横に並べられます。例 LISTOPENS PROCESS { $appl-mgr-name } { $process-name } ALLOWSU { ON | OFF } | 縦線 角括弧、または中括弧内に横に並べて列挙された選択項目を区切るために縦線が使われます。例: INSPECT { OFF | ON | SAVEABEND } .... 省略記号 角括弧、または中括弧の直後に続く省略記号(...)は構文に括弧で囲まれて示された要素を任意回数反 復できることを示します。例: M address-1 [ , new-value ]... [ - ] {0|1|2|3|4|5|6|7|8|9}... 単一の構文項目の直後に省略記号が続く場合は、その構文項目を任意回数反復できることを示します。 例: "s-char..." 区切り記号 小括弧(丸括弧)、カンマ、セミコロン等、ここまでに説明されていない記号は次の例に従って入力して ください。例: error := NEXTFILENAME ( file-name ) ; LISTOPENS SU $process-name.#su-name 角括弧や中括弧などの記号が引用記号で囲まれている場合は、その記号が省略できず、表記の通りに入 力しなければならないことを示します。例: "[" repetition-constant-list "]" 項目間のスペース 隣接する項目が括弧やカンマなどの区切り記号である場合を除き、項目の間には必ずスペースが必要で す。例: CALL STEPMOM ( process-id ) ; 2 つの項目間にスペースが付けられていない場合は、そこにスペースを挿入してはなりません。次に示 す例では、ピリオド記号とほかの項目間にスペースを入れることはできません。 $process-name.#su-name 137692J xv 行間スペース コマンドの構文が長すぎて一行に収まらない場合は、先行行と継続行の間に 1 行の空白行を設け、継続 行の先頭は 3 コマ分後寄せします。空白行の存在により、継続行を縦に並べて列挙した選択項目と区別す ることができます。例: ALTER [ / OUT file-spec / ] CONTROLLER [ , attribute-spec ]... !i と !o プロシージャ呼び出しにおいて、!i 表記は入力パラメータ(呼び出されるプロシージャに渡される)の 後に記入され、!o 表記は出力パラメータ(呼び出しプログラムに返すデータ)の後に記入されます。例: CALL CHECKRESIZESEGMENT ( segment-id , error !i ) ; !o !i,o プロシージャ呼び出しにおいて、入出力パラメータ(呼び出されるプロシージャに渡され、呼び出しプ ログラムへ返されるデータ)に続いて !i,o が記入されます。例: error := COMPRESSEDIT ( filenum ) ; !i,o !i:i プロシージャ呼び出しにおいて、文字列長さを指定するバイト数パラメータが添付される入力文字列パ ラメータに続いて !i:i が記入されます。例: error := FILENAME_COMPARE_ ( filename1:length , filename2:length ) ; !i:i !i:i !o:i プロシージャ呼び出しにおいて、最大出力バッファ長を規定するバイト数パラメータが添付される出力 バッファ・パラメータに続いて !o:i が記入されます。例: error := FILE_GETINFO_ ( filenum , [ filename:maxlen ] ) ; xvi !i !o:i 137692J 第 1 章 ENSCRIBE レコード・マネージャの概要 GURDIAN ファイル・システムがサポートする ENSCRIBE レコード・マネージャは、データベース内 のレコードへの高レベル・アクセスを実現します。複数のプロセッサに分散配置された ENSCRIBE ソフト ウェアは、プロセッサ・モジュール、I/O チャンネル、ディスク・ドライブなどに障害が発生した場合、 データの整合性を維持するのに役立ちます。 このマニュアルでは、DP2 ディスク・プロセスを使用した ENSCRIBE ソフトウェアの使用方法につい て説明します。 ENSCRIBE の主な特徴は以下のとおりです。 □ 5 種類のディスク・ファイル構造−非構造化、キー順、キュー、入力順、相対。 □ 2 種類のファイル形式−形式 1、形式 2 □ パーティション(複数ボリューム)ファイル □ 複数キーによるレコードへのアクセス □ ファイル間でのリレーションによるアクセス(1 つのファイル内のフィールド値をキーとしてほかの ファイルのデータ・レコードをアクセスする) □ すべてのキーの自動メンテナンス(オプション) □ キー順データ、インデックス・ブロックでのキー圧縮(オプション) □ TMF/MP(Transaction Management Facility)によるトランザクション・オーディットのサポート TMF は NonStop Transaction Manager/MP 製品の主要機能部品である。 □ オーディット・チェック・ポイント・レコードの圧縮(オプション) □ レコードとファイルのロック □ キャッシュ・バッファリング □ シーケンシャル・ブロックのバッファリング(オプション) 用語 ENSCRIBE ファイルを作成し、使用する前に、次に説明する用語を理解しておいてください。 □ ファイル−ディスク上の複数のエクステントに組織付けられた、関連するデータの集合体であり、 GUARDIAN ファイル名で参照できます。構造化ファイル(キー順、キュー、入力順、および相対ファ イル)はさらにレコード・ブロックに分割されます。 □ 形式 1、2 −形式はファイルの静的属性であり、ファイル作成時に決定されます。D46 リリース以降で 導入された形式 2 ファイルは、次の点で形式 1 と異なります。現行のフォーマット形式 1 のパーティ ションは 1MB ∼ 2GB で、形式 2 はこれより大きなパーティションとなります。また、相対ファイルお よび入力順ファイルでは、主キーと代替キー・レコードが形式 1 より大きくなります。 137692J 1-1 □ 論理レコード−ファイル・システムとアプリケーション・プログラム間での情報転送の単位。シーケン シャル・ブロック・バッファリングを使用していない場合は、論理レコードはファイル・システムと ディスク・プロセス間の情報転送の単位でもあります。論理レコードの最大サイズはバイト単位で指定 します。 □ セクタ−ディスク I/O、物理アドレス指定に使用する最小単位(現在サポートしているすべてのディス ク・ドライブでは 512 バイト) □ エクステント−ディスク上の連接する領域上にファイルを格納するための記憶割付単位。各エクステン トはそれぞれ指定された複数のページ(2048 バイト)から構成されます。 □ ブロック−物理 I/O の単位。1 ブロックは論理レコードと構造化ファイルの管理情報から構成されます。 シーケンシャル・ブロック・バッファリングを使用している場合は、ブロックがファイル・システムと ディスク・プロセス間の情報転送の単位になります。ブロックの大きさはバイト単位で指定されます。 現在サポートされているブロックのサイズは 512、1024、2048、4096 バイトです。 □ キー−レコードに関連付けられた値(レコード番号など)、またはレコード内に(フィールドの 1 つと して)存在する値であり、ファイル内のレコードやレコードのサブセットを指定するために使用します。 ディスク・ファイル構成 ディスク・ファイルはアクセス前に作成しておきます。ファイルを作成する場合は、FILE_CREATE プ ロシージャを呼び出すか、または File Utility Program(FUP)の CREATE コマンドを使用し、次にその ファイルがパーマネントであるか一時ファイルであるかを指定します。パーマネント・ファイルはアクセ ス終了後もシステム上に存在するのに対し、一時ファイルはすべての利用者がファイルを閉じた時点で削 除されます。また、ファイル作成時にはファイルの種類も指定します。キー順、キュー、入力順、および 相対ファイル・グループは構造化ファイルと呼ばれます。構造化ファイルに対して利用できる機能は、非 構造化ファイルに対して利用できる機能と大きく異なります。 ディスク・プロセスはファイルへの物理記憶領域をエクステントとして割り当てます。エクステントは ディスク上で数個の連接する 2048 バイト・ページとして構成されます。 キー順ファイルの場合を除いて、パーティション化された(複数のディスク・ボリュームにまたがって エクステントが存在する)ファイルのパーティションごとのエクステント数は 16 に制限されます。非パー ティション・ファイル、またはパーティション化されたキー順ファイルの持つことができる最大エクステ ント数はラベル・サイズの最大値により制限され、1 ファイルあたり(パーティションされたキー順ファ イルの場合はパーティションあたり)最大 978 までです。ラベル・サイズの最大値はさらにそのファイル に定義された代替キーとパーティションの数、ファイル形式、およびそのファイルが SMF ファイルである かどうかにより制限されます。この制限内であれば、非パーティション・ファイル(またはキー順ファイ ルのパーティション)に対して MAXEXTENTS 属性を使用して任意の制限値を設定できます。 注意:ファイルが形式 1 に属する場合、ディスク・プロセスは、すべての ENSCRIBE ファイル・タイプに対して、 パーティションのサイズが 2GB を超えないように MAXEXTENTS の使用範囲を制限します。 1-2 137692J 最初のエクステントは常にプライマリ・エクステントとして指定され、そのサイズは残りのセカンダリ・ エクステントとは異なるサイズにできます。これにより、大きなプライマリ・エクステントを持つファイ ルを作成して、すべてのデータを最初にそのプライマリ・エクステントに格納しておくことができます。 ファイルが大きくなったときにディスクの小さな領域にセカンダリ・エクステントを作成すれば、ディス クを効率的に使用できます。 CONTROL 21 プロシージャを使用して、アプリケーション・プロセスは、オープン・ファイルにエクス テントを割り当てることができます。不要となったエクステントを削除する場合も CONTROL プロシー ジャを使用します。 137692J 1-3 非構造化ファイル 非構造化ファイルは、基本的には大きなバイト配列です。多くの場合、非構造化ファイルはデータ・ファ イルとしてではなく、コード・ファイルや編集用ファイルとして利用されます。非構造化ディスク・ファ イルの構成(ファイル内のレコード長や位置)は、アプリケーション・プロセスが行います。 非構造化ファイルに格納されたデータのアドレス指定には相対バイト・アドレス(RBA)を使用します。 相対バイト・アドレスとはファイルの先頭バイトからのオフセット値であり、先頭バイトの RBA 値はゼロ になります。 構造化ファイル ENSCRIBE 製品には、キー順、キュー、入力順、相対という 4 種類の構造化ファイルがあります。アプ リケーション・プロセスと構造化ディスク・ファイルの間のデータ転送は論理レコードとレコード・キー により実行されます。 キー順ファイルにおける主キーは、ユーザーが各データ・レコード内に指定する特定のデータ・フィー ルドです。キュー・ファイルの場合、主キーはデータ・レコード中に存在し、8 バイトのタイムスタンプ とオプションのユーザー・キーで構成されます。入力順ファイルにおける主キーはデータ・レコード外部 に存在するブロック番号とレコード番号であり、これによりファイル内のレコード格納位置が指定されま す。相対ファイルの場合にも主キーはデータ・レコード外に存在する順序数であり、これがファイル内の レコード位置を示します。 主キーを使用してアクセスする方法以外に、キー順、入力順、相対ファイルの場合は代替キーを使用す ることも可能です。ただし、キュー・ファイルに代替キーはありません。 タンデムの提供するソフトウェア製品(DDL、Enform、Enable など)使って ENSCRIBE 構造化ファイ ルにアクセスできます。 パーティション(複数ボリューム)ファイル ファイル作成時に、そのファイルを単一ボリュームに格納するか、複数ボリュームに分割して格納する かを指定できます。さらに、個々のボリュームは同一システム内に存在する必要もなく、ファイルをネッ トワーク・ノードに分割して格納することも可能です。最大パーティション数は 16 で、各パーティション は最大 16 のエクステントを持つことができます。ただし、パーティション化されたキー順ファイルは例外 であり、16 を超えるエクステントを持つことができます。 パーティション・ファイルが作成されれば、アプリケーション・プログラムはそのファイルが複数ボ リュームあるいは複数ノードにまたがって存在するということを一切意識する必要はありません。プライ マリ・パーティション名を FILE_OPEN プロシージャに通知すれば、ファイル全体をオープンしてアクセ スすることができます。非構造化アクセスを指定しない限り、セカンダリ・パーティションをオープンし ようとしてもファイル・システムにより拒絶されます。 さまざまな理由から、パーティション・ファイルには大きな利用価値があります。最も大きな理由は、 ディスク・ドライブの物理的容量に制限されずにファイルを作成できることです。また、ファイルを複数 ボリュームに分割することにより、異なるパーティションにあるレコードへの同時並行アクセス機能を向 上させることができます。 1-4 137692J ファイルが同一コントローラにより管理される複数ボリュームにまたがって存在する場合は、オペレー ティング・システムはコントローラの多重シーク機能を活用できます。つまり、1 つのドライブが転送し ている間に、別のドライブがデータをシークできます。同一プロセッサ上にあって異なるコントローラに 管理されるドライブにまたがってファイルが存在する場合は、I/O チャンネルの帯域幅の限度までの重複転 送が可能です。異なるプロセッサ上のコントローラに接続されたボリュームにまたがってファイルが存在 する場合は、多重要求の処理と重複転送に対して、単一 I/O チャンネルの帯域幅による制限はありません。 パーティション・ファイルでは、より多くのロックを使用できるようになります。これは、ロックの制 限はファイル全体にではなく、各パーティションに適用されるものだからです。 パーティション・ファイルのレコードは複数のキャッシュに配置できるため、ディスク・アクセスの回 数を減少できます。 ファイル識別子 各パーティションは、配置されるボリューム上にディレクトリ・エントリを持っています。すべてのパー ティション上のファイル名は、ボリューム名が異なる以外はすべて共通です。 パーティション間での相違点 ファイルのパーティションは、すべて TMF でオーディットされるか、全くオーディットされないかの どちらかになります。混合することはありません。 同じパーティション・ファイルで、パーティションによってプライマリ・エクステントとセカンダリ・ エクステントのサイズが異なっていてもかまいません。また、キー順ファイルの場合は、MAXEXTENTS 値もパーティションごとに異なります。パーティションによって異なる属性値は、これらの値とボリュー ム名だけです。 ファイル・ディレクトリ ディスク・ボリュームのファイル・ディレクトリは、そのボリューム内に存在するすべてのファイル情 報を保持しています。ディレクトリのサイズを制御できるのはシステム生成中、または SCF(Subsystem Control Facility)を使用してディスクにラベルを付けるときです。このとき、各ディレクトリ・エクステン トがどれくらいの数のファイルを必要とするか予測しなければなりません。システムは、その情報からディ レクトリのサイズを概算して、ディレクトリ・ファイルを作成します。ファイルが必要とするファイル・ ラベルの大きさはファイル・タイプにより異なるため、あるディレクトリ・エクステントに実際登録でき るファイルの数は含まれるファイルの種類によって変わります。したがって、実際の容量は、ユーザーが 指定した値とは厳密には一致しません。 ディスク・プロセスの能力としては 987 までのディレクトリ・エクステントを作成できます。現在割り 付られているディレクトリ・エクステント・スペースにあまり多くのファイルを作成すると、ディスク・ プロセスは別のディレクトリ・エクステントの割り当てを行います。 注意:ファイル・ディレクトリに書き込みしないようにしてください。アプリケーション・プロセスがファイル・ ディレクトリの内容を変更しようすると、ディレクトリの破壊や DP2 停止発生の原因になります。 137692J 1-5 オーディットされたファイル TMF(Transaction Management Facility)を備えたシステムでは、任意のデータベース・ファイルをオー ディットされたファイルとして指定できます。データベースの整合性を保持するため、TMF はオーディッ トされたファイルと指定されたファイルが関与するすべてのトランザクションをオーディットします。す なわち、TMF はトランザクション実行により生じたデータベース上の変更個所イメージを(トレイル上に) 保持します。必要に応じ、TMF はオーディット・トレイルを使用して、失敗したトランザクションの取り 消しを行ったり、何らかのシステム障害により不整合が発生したオーディットされたファイルを修復しま す。 TMF は、レコード・ロック・メカニズムを利用してオーディットされたファイルの同時処理制御も実行 します。この機能により、あるトランザクションが変更されても、コミット、アボート、または取り消さ れるまで、同時処理されるほかのトランザクションからは認識されません。 協調アクセス 数個の異なるプロセスが同時に 1 つのファイルへアクセスする場合があります。同時アクセス間の協調 をとるため、ファイルをオープンする時点でそれぞれのプロセスはファイル使用の目的を明示しなければ なりません。すなわち、各プロセスはアクセス・モードと排他モードを指定する必要があります。 アクセス・モードにより、どのような操作が実行されるかを指定します。アクセス・モードにより読み 、または読み出し専用、書き込み専用アクセスのいずれ 出し / 書き込み(デフォルト・アクセス・モード) かを指定します。 排他モードは、ほかのプロセスからのアクセスをどれだけ許容するかを指定します。排他モードが指定 できるのは共有、排他、および保護アクセスのいずれかです。 アクセスと排他モードがファイルに機能するのは、そのファイルがオープンされた時点から、ファイル が閉じられるまでです。ディスク・ファイルへの短時間内での多重アクセスを排除するため、2 種類のメ カニズム(ファイル・ロックとレコード・ロック)が提供されています。TMF は、オーディットされたファ イルのための特別な規則にしたがってブロックします。 待ちあり、待ちなし I/O ENSCRIBE ソフトウェアでは、アプリケーション・プロセスは待ちなし I/O を使用して同時平行ファイ ル操作を実行できます。 デフォルトは待ちあり I/O です。この状態でファイル操作を実行すると、アプリケーション・プロセス はこの操作が完了するまで中断状態になります。 待ちなし I/O では、あるファイル操作を実行中であっても、アプリケーション・プロセスの処理は中断 されず、同時平行してファイル操作を実行できます。ただし、別のファイル・システムのプロシージャ呼 び出しでは、I/O 操作の完了まで待ち状態になります。 待ちあり I/O、待ちなし I/O については、 『GUARDIAN プログラマーズ・ガイド』に解説されています。 また、FILE_OPEN_、READ、AWAITIO プロシージャについては『GUARDIAN プロシージャ・コール・ リファレンス・マニュアル』を参照してください。 1-6 137692J ファイルへの操作 一般的なファイル操作には、ファイルの作成、記録方式の記述、ファイル読み出しとレコードへの操作 ENSCRIBE ファイルで一般的に使用されるレコード管理機能の一覧を示します。 などがあります。 表 1-1 に、 ファイルの作成 ディスク・ファイルを作成する場合は、FILE_CREATE システム・プロシージャを呼び出すか、または FUP コマンドを実行します。 □ プログラムからディスク・ファイルを作成する場合は、適切なパラメータを与えて FILE_CREATE_、 または FILE_CREATELIST_ プロシージャを呼び出します。 □ FUP コマンドである SET、RESET、SHOW を発行することにより、ファイルを実際に作成する前に ファイルの表示、修正、作成パラメータ(ファイル・タイプ、レコード長、キーの種類等)を指定する ことができます。必要に応じて、既存ファイルの作成パラメータをそのまま転用することもできます。 この状態で FUP CREATE コマンドを実行すると現在の設定パラメータを使用してファイルが作成され ます。ファイル作成後にパラメータを一部変更するには ALTER コマンドを使用します。FUP はオンラ イン・ターミナルからのコマンドを受け付けるほか、コマンド(OBEY)や IN ファイルからもコマン ドを受け付けます。 レコード形式の記述(データ定義言語) DDL(Data Definition Language:データ定義言語)はユーザーがレコード・アクセスに使用する言語の 種類に依存しない、統一的なレコード形式記述方法を提供してくれます。さらに、DDL はシステム全体に 適用されるレコード形式定義により、すべてのプログラムに共通な一貫性のあるレコード形式定義を与え てくれます。プログラム言語のソース・コード上ばかりでなく、DDL はデータベース・ファイル用の FUP ファイル生成コマンドを記述することができ、これらのコマンドは ENSCRIBE ソフトウェアからも呼び出 し可能です。 ファイルのロード FUP を使用すれば、既存の ENSCRIBE ファイルにデータをロードできます。ロードの対象となるレコー ド・セット、ファイルのデータ・ブロックおよびインデックス・ブロック・ロード・ファクタを指定しま す。このロード・ファクタはブロック内にどれだけの空きスペースを残すかを決定します。FUP は、同一 物理シリンダ上の関連するデータ・ブロックに合わせて最低レベルのインデックス・ブロックを置くこと によりヘッド移動距離を最低に押さえ、ファイルへの最適アクセスを実現しようとします。 レコード操作 ENSCRIBE ファイルのレコードを操作する場合は、ファイル・システム・プロシージャを呼び出します。 レコード管理機能と関連システム・プロシージャを表 1-1 にまとめてあります。 137692J 1-7 表 1-1 レコード管理機能 機 能 説 明 プロシージャ WRITEUPDATE 削除 主キーの持つ値に従い、キー順、キュー、相対ファイルのレ コードを削除します。 検索 FILE_SETPOSITION_, 現在位置、アクセス・パス、ファイルの位置決めモードを設 FILE_SETKEY_, KEYPOSITION, 定します。これにより、セットを順次読み出し順を予測して レコードのサブセット開始位置を指示することができ、また、 POSITION 順次更新のためレコードを指定できます。 挿入 主キーの値に従って新規レコードをファイルに挿入します。 WRITE ロック ファイル全体、現在レコード、または同一生成キーを持つレ コード・セットにロックを掛けます。 LOCKREC, LOCKFILE, READLOCK, READUPDATELOCK 読み出し レコードのサブセットを順次読み出します。 READ アンロック ファイル全体、ファイルの現在レコード、またはファイルの 全レコードからロックを解除します。 UNLOCKREC, UNLOCKFILE, WRITEUPDATEUNLOCK 更新 ファイル内部のランダムな位置にあるレコードを更新します。 READUPDATE, WRITEUPDATE 構造化ファイル特性の比較 ENSCRIBE 製品では、4 種類(キー順ファイル、キュー・ファイル、入力順ファイル、相対ファイル) の構造化ファイル形式を使用できます。表 1-2 に、これら 4 種類の構造化ファイルの特性の比較を示します。 表 1-2 構造化ファイルの比較 (1/2 ページ ) 1-8 キー順 キュー 入力順 相 対 レコードは主キー・フィー ルドの値に従って順序付け される。 レコードはまずユーザー・ キー(もしあれば)に従っ て順序付けされ、次にタイ ムスタンプに従って順序付 けされる。 レコードは入力順に従って 順序付けされる。 レコードは相対レコード番 号に従って順序付けされ る。 主キー、または代替キーに よるアクセス。 主キー(オプション・ユー ザー・キーとタイムスタン プで構成)によるアクセ ス。 レコード・アドレス、また は代替キーによるアクセス レコード番号、または代替 キーによるアクセス 主キーの長さは可変。キー はレコードの一部である。 主キーの長さは可変である が、タイムスタンプを保持 するために少なくとも 8 バ イト以上の長さが必要。 レコード・アドレスが主 キーとなる。8 バイト長固 定。 レコード番号が主キーとな る。8 バイト長固定。 137692J 表 1-2 構造化ファイルの比較 (2/2 ページ ) キー順 キュー 入力順 相 対 ENSCRIBE ソフトウェア は、レコード内に記録され ている主キーの位置を決定 するためにインデックス・ ブロックを使用する。 ENSCRIBE ソフトウェア は、レコード内に記録され ている主キーの位置を決定 するためにインデックス・ ブロックを使用する。 ENSCRIBE ソフトウェア は、レコード・アドレスを 使用してファイル内の物理 レコード位置を決定する。 ENSCRIBE ソフトウェア は、レコード番号を使用し てファイル内の物理レコー ド位置を計算する。 1 レコードが占有するス ペースは書き込み時に指定 した長さによる。 1 レコードが占有するス ペースは書き込み時に指定 した長さによる。 1 レコードが占有するス ペースは書き込み時に指定 した長さによる。 1 レコードに許容されるス ペースはファイル作成時に 指定される。 ブロック内、ファイルの終 わりの空きスペースをレ コード追加のために利用で きる。 ブロック内、ファイルの終 わりの空きスペースをレ コード追加のために利用で きる。 ファイルの終わりの空きス ペースをレコード追加のた めに利用できる。 ファイル内の空き位置をレ コード追加のために利用で きる。 レコードの削除のみ可能。 レコードの削除、短縮、拡 レコードの削除、短縮、 大はできない。 (指定された最大サイズの 範囲内で)拡大可能。 レコードの削除で解放され たスペースを再利用可能。 レコードの削除はできな い。しかし、そのスペース を同一サイズの別レコード のために利用可能。 レコードの削除、短縮、 (指定された最大サイズの 範囲内で)拡大可能。 レコードの削除、短縮で解 放されたスペースを再利用 可能。 137692J レコードの削除で解放され たスペースを再利用可能。 1-9 (空白ページ) 1-10 137692J 第 2 章 構造化ファイル内の位置決め ENSCRIBE 構造化ファイルのレコードは、図 2-1 のように、データ・フィールドから構成されます。 図 2-1 3 つのフィールドを持つ構造化ファイル・レコード 構造化ファイル内の各レコードは、その主キーによって同一ファイル内のほかのレコードと区別され、 一意に識別されます。4 種類の異なる構造化ファイル用の主キーを図 2-2 に示します。 □ キー順ファイルの主キーは各レコード内の特定データ・フィールドです。 □ キュー・ファイルの主キーは各レコード内のユーザー・キーとタイムスタンプから構成されます。 □ 入力順ファイルの主キーは、ENSCRIBE ソフトウェアが管理するレコード・アドレスです。 □ 相対ファイルの主キーは、ENSCRIBE ソフトウェアが管理するレコード番号です。 構造化内のレコードは主キーの値の昇順に従って格納されます。 137692J 2-1 図 2-2 構造化ファイルの主キー キュー・ファイルの場合を除き、構造化ファイルには最大 255 個の代替キー・フィールドがあります。 図 2-3 に示すように、代替キーとはレコードの中の指定されたデータ・フィールドであり、そのレコード の値は、実行中にファイル全体を論理的に意味のあるレコードのサブセットに分割するのに使用します。 従業員データベースを例にとると、レコード形式の 1 つのフィールドが地域コードとなります。このフィー ルドを代替キーとして定義すれば、ある特定の地域に住む従業員のデータ・レコードだけにアクセスでき ます。 図 2-4 に示すように、主キーは常に一意である必要がありますが、代替キーは異なるレコードが同じ値 を使用できます。 2-2 137692J 図 2-3 代替キー・フィールド ENSCRIBE ソフトウェアは、主キーを使用して同一ファイル内の一意のレコードをほかのレコードと区 別し、配置します。図 2-4 では、名前フィールドが主キーであり、主キーの値「JONES.J.A」によりこの 名前を持つ唯一のレコードの位置が決定します。 代替キーの値を使用する場合は、特定のデータ・フィールドに共通の値が入っているレコード・サブセッ トを抽出して処理を行います。図 2-4 で、REGION フィールドを代替キーと定義すれば、このフィールド の値が CENTRAL である 2 つのレコードにアクセスできます。 図 2-4 キーの値を使用したレコードの配置 137692J 2-3 アクセス・パス 構造化ファイルの各キーには、ファイル内のレコードによって別々のアクセス・パスが与えられます。あ るパス内のレコードは、キーの値の昇順に従ってアクセスされます。図 2-5 に示すのは、3 つの異なるキー・ フィールドを持ち、それにより 3 つのアクセス・パスを与えられている従業員ファイルです。代替キーが 重複した値を持つ場合には、同一パス内に同じキーの値を持つレコードは代替キー・ファイル内での出現 順にアクセスされます。 通常、値の重複する代替キー・レコードは、それに伴う主キーの昇順に従って代替キー・ファイルに格 納されます。ただし、代替キーファイルを作成するときに、代替キー・パラメータの配列を利用すれば、 代替キーの値が重複するレコードをファイルへの追加順に従って保存するようにも指定できます。 任意のプライマリ・データベース・ファイルに対応するすべての代替キー・ファイルは、重複キーを持 つレコードに対する順序付けと同じ規則を使用します。つまり、特定のプライマリ・ファイルに対応する 代替キー・ファイルが挿入順による重複キー・レコードを持っていれば、そのプライマリ・ファイルの代 替キー・ファイルも同じ規則に従わなければなりません。 挿入順による重複代替キー・レコードを使用または作成する読み出し、書き込み操作を実行すると、特 定のシステム・プロシージャ呼び出しが完了するたびにファイル・システムが警告エラー・コード(CCL コード 551)を返します。 カレント・キーの指定子とカレント・アクセス・パス 2 バイトで構成されるキー指定子はそれぞれのキー・フィールドを一意に特定し、位置決定のためのア クセス・パスとして使用できます。主キーに対応するキー指定子はバイナリ表現のゼロと定義されていま す(ASCII での NULNUL)。代替キー・フィールドの指定子はアプリケーションにより定義され、ファイ ル生成の時点で割り当てが行われます。図 2-6 は、主キーと 3 つの代替キーを持つ典型的なレコード構造 を示すものです。 カレント・キーの指定子はカレント・アクセス・パスを定義し、この値はファイル内でのレコードの順 序に影響します(図 2-5 参照)。ファイルをオープンする時点で、カレント・アクセス・パスは暗黙のうち にファイルの主キーに設定されます。入力順ファイルと相対ファイルの場合には、POSITION プロシージャ 呼び出しが行われた時点でも現行アクセス・パスがファイルの主キーに設定されます。アクセス・パスを 明示的に設定する場合は、KEYPOSITION プロシージャを呼び出します。 2-4 137692J 図 2-5 アクセス・パス 137692J 2-5 図 2-6 キー・フィールドとキー指定子 カレント・キーの値と現在位置 カレント・キーの値はファイルの現在位置を定義します。カレント・キーの値を明示的に設定する場合 は FILE_SETKEY_、FILE_SETPOSITION_、POSITION、または KEYPOSITION プロシージャを呼び出し ます。FILE_SETKEY_、KEYPOSITION は、キー順、およびキュー・ファイルでは主キーにより位置を設 定し、キー順、入力順、および相対ファイルでは代替キーにより位置を設定します。FILE_SETPOSITION_ と POSITION は、入力順および相対ファイルでは位置を主キーにより設定します。READ が呼び出された 後、カレント・キーの値は、暗黙のうちに直前に読み出されたレコードの中の現行アクセス・パスのキー 値に設定されます。図 2-7 はキー順ファイルに対して KEYPOSITION を使用する例を示します。 現在位置により、ロックされるレコード(LOCKREC 呼び出しにより)または、アクセスされるレコー ド(READ[LOCK]、READUPDATE[LOCK]、または WRITEUPDATE[LOCK] 呼び出しにより)が決定さ れます。現在位置に必ずしもレコードが存在する必要はありません。ファイルをオープンした時点では、 現在位置は、ファイルの主キーで指定されるファイルの先頭レコードの位置です。 2-6 137692J 図 2-7 現在位置 位置決めモードと比較長 指定アクセス・パスにあるレコードのサブセットは、位置決めモードとキーの値で記述できます。位置 決めモードには APPROXIMATE、GENERIC、EXACT の 3 種類があります。 APPROXIMATE モードは、アクセス・パスのキー値が与えられたキー値に等しいか、または大きなレ コードをすべて選択します。GENERIC モードは、アクセス・パスのキー値が与えられた部分値と一致す るすべてのレコードを選択します。EXACT モードは、アクセス・パスのキー値が与えられたキー値に厳 密に一致するレコードのみを選択します。図 2-8 は、それぞれの位置決めモードが返すサブセット例を示 しています。 KEYPOSITION プロシージャを呼び出して位置決めモード、比較長、カレント・キーの値を与えると、 アクセスしたいレコードのサブセットと、そのサブセットの最初のレコードを特定できます。現行アクセ ス・パスに属するレコードの該当サブセットはファイル内の全レコードで構成されることもあり、レコー ドの一部で構成されることもあり、あるいは全くレコードを含まないこともあります。 137692J 2-7 図 2-8 APPROXIMATE、GENERIC、EXACT サブセット FILE_SETKEY_、および KEYPOSITION プロシージャを使用すると位置決めモードと比較長(現在キー 指定子、カレント・キー値と併せて)は明示的に設定でき、FILE_OPEN_、FILE_SETPOSITION_、POSITION プロシージャを使用するとこれらの値は暗黙のうちに設定されます。ENSCRIBE ソフトウェアは次の 3 種 類の位置決めモードをサポートします。 □ APPROXIMATE □ GENERIC □ EXACT APPROXIMATE 位置設定 APPROXIMATE 位置設定で最初にアクセスされるレコードは、カレント・キーの指定子により指定さ れたキー・フィールドが、比較長が指定するバイト数に対応するカレント・キーの値と同じか、より大き な値を持つレコードです。APPROXIMATE 位置設定の実行後、ファイルの最後のレコードが読まれるまで READ を順次実行することにより、カレント・アクセス・パスのレコードが昇順で返され、最後に EOF 識 別子が返されます。ファイルをオープンした時点では、位置決めモードは APPROXIMATE モードに設定 され、比較長はゼロに設定されています。 GENERIC 位置設定 GENERIC 位置設定で最初にアクセスされるレコードは、カレント・キー指定子により指定されたキー・ フィールドが、比較長が指定するバイト数に対応するカレント・キーの値と同じ値を持つレコードです。 2-8 137692J GENERIC 位置設定の実行後、ファイルに対して READ を順次実行を実行することにより、(比較長に 対する)カレント・キー値に一致するキーを持つレコードが昇順に返されます。それ以上カレント・キー と一致するものが見つからなくなると EOF 識別子が返されます。 注意:入力順、相対ファイルでは、主キーによる GENERIC 位置設定は EXACT 位置設定と同じです。 EXACT 位置設定 EXACT 位置設定では、カレント・キー指定子により指定されたキー・フィルドが次の両方の条件を満 たす値を持つレコードだけがアクセスされます。 □ 指定された比較長と厳密に長さが一致する。 □ カレント・キーの値に等しい。 カレント・キーがそれ以上一致しなくなると、EOF 識別子が返されます。EXACT 位置設定がアクセス するレコードは 1 つだけです。 代替キー 複数の代替キーを持つファイルには、少なくとも 1 つの代替キー・ファイルがあります。代替キー・ファ イルの各レコードは次の要素で構成されます。 □ キー指定子のための 2 バイト □ 代替キーの値 □ プライマリ・ファイル内の対応するレコードが持つ主キー値 したがって、代替キーの長さをバイトで表現すると次のようになります。 2 バイト+代替キー・フィールドの長さ+主キーの長さ 図 2-9 は、代替キーの実装方法を示します。 137692J 2-9 図 2-9 代替キーの実装 (1/2) 2-10 137692J 図 2-9 代替キーの実装 (2/2) キー指定子 特定のデータ・フィールドを代替キー・アクセス・パスとして識別するために、2 バイトのキー指定子 (オンハンド・フィールドの OH のように)を割り当て、ほかのフィールドと区別します。2 バイトのキー 指定子は、プライマリ・ファイルを作成する時点でユーザーが与えます。 キー・オフセット プライマリ・ファイルの作成または特性の変更時には、それぞれの代替キーに対してレコードの先頭位 置からのオフセット(代替キー・フィールドの開始位置を示す)を指定します。 代替キー・フィールドのオフセットを選択する場合には次の事項を考慮してください。 □ 代替キー・フィールドはレコード内の任意のオフセット位置から開始できる。 □ 代替キー・フィールドは重複できる。 □ 代替キー・フィールドは固定長であるが、レコードの挿入、更新時に必ずしもデータ値を持っている必 。 要はない(つまり NULL 値でもよい) 137692J 2-11 □ レコードの挿入、更新時に、ある代替キー・フィールドのたとえ一部であっても変更部分に存在するな らば、必ずそのフィールド全体が変更部分に含まれるようにしなければならない。 □ キー・フィールドを STRING 型以外のデータ型として取り扱う可能性がある場合は、フィールドがワー ド境界と一致して始まるようにオフセットを設定しなければならない。 キーの自動メンテナンス ファイルに新規レコードを追加したり、代替キー・フィールドの値を変更すると、ENSCRIBE ソフト ウェアが自動的にレコードにインデックスを更新します(レコードの主キー値を変更することはできませ ん)。この操作は、アプリケーション・プログラムに対し完全にトランスペアレントになっています。 ファイル内の既存フィールドを再配置せずにキー・フィールドをファイルに追加した場合も、そのファ イルにアクセスする既存プログラムの書き換え、または再コンパイルは必要ありません。 代替キーの属性 代替キーを定義する場合は、次の属性を定義します。 □ Null 値 □ 一意の代替キー □ 自動更新の禁止 Null 値 どの代替キーにも Null 値を割り当てることができます。どの文字を Null 文字として使用するかは任意 。 に選択できます(一般に使われるのは ASCII のブランク(%40)とバイナリのゼロです) 1 つのレコードが挿入され、その代替キー・フィールドの 1 つが Null 値しか含まない場合は、代替キー・ ファイルへの代替キー参照は追加されません。レコードが更新され、その中の代替キー・フィールドの 1 つ が Null バイト以外を含まないように変更された場合には、代替キー・ファイルから該当する代替キーの参 照が削除されます。 代替キーを参照して構造化ファイルからの順次読み出しを行う場合、そのフィールドに Null 値を持つレ コードはすべて読み飛ばされます。続くレコードの中にその代替キー・フィールドに Null 以外の値を持つ ものがあれば、そのレコードが返されます。Null 値はバイト値であり、レコード挿入の過程で指定された キー・フィールドの任意の位置にその値が検出されると、そのフィールドに対応する代替キー・ファイル のエントリは省略されます。 一意の代替キー 代替キー・フィールドを指定して、レコード内での一意の値を要求できます。この指定を行うと、既存 レコードの一意に指定したキー・フィールドの値が重複するようなレコード挿入はエラー 10 により拒絶さ れます("record already exists")。一意でない代替キーを使用する場合は、上記のようなレ コード挿入も許されます。ファイルに一意の代替キーがある場合は、次の点に注意してください。 □ 各代替キー・フィールドが一意の長さを持つ場合は、個々に代替キー・ファイルを作成する必要がある。 □ 同じキー長を持つ一意の代替キーは、同じ代替キー・ファイルから参照できる。この例は、図 2-9 の代 替キー・ファイルのサンプルにあります。 2-12 137692J 自動更新の禁止 ユーザーは、代替キー・ファイルに記録された代替キーの値が変更しても、システムが代替キー・ファ イルを自動的に更新しないように指定できます。このような指定を行うのは次のような場合です。 □ フィールドには、最新の日付まで参照されないものもあります。このような場合は、バッチ処理(ワン パス)で更新したほうが効率的です。 □ フィールドに複数の Null 値がある場合があります。この場合、アプリケーションは個別に代替キー・ ファイルをオープンして、その都度フィールドが Null 値を持つかどうか判定しなければなりません。 Null 値が含まれない場合は、プログラムが代替キー・ファイルへ適当な代替キー参照を追加します。 キー順ファイルにおける代替キー レコードがベンダ名とパーツ番号から構成されるキー順ファイルに対して代替キーを使用する場合を考 えます。このファイルの主キーはパーツ番号になります(ベンダ名は一意ではないので、この場合不適切 です)。 ベンダが供給するすべてのパーツのレポートを作成する場合は、希望のベンダを指定して GENERIC 位置設定が実行されます。これにより、ベンダ名フィールドが希望のベンダと一致しなくなるまで(この ときシステムは EOF 識別子を返します)ファイルの順次読み出しが行われ、該当ベンダに関連するレコー ドがパーツ番号の昇順に返されます。 入力順ファイルにおける代替キー トランザクション・ログ・ファイル内の入力順ファイルに対して代替キーを使用する場合を考えます。 主キー(レコード・アドレス)はトランザクションが発生した順序を示します。代替キーとして、そのト ランザクションを開始したターミナルを使用できます。あるターミナルを指定し、発生順にトランザクショ ン一覧を出力するには、GENERIC 位置設定が指定のターミナルのフィールド値を使用しながらファイル の順次読み出しを実行します。 相対ファイルにおける代替キー 従業員データを格納した相対ファイルに代替キーを使用するとします。主キー(レコード番号)は従業 員番号です。この場合の代替キー・フィールドの 1 つとして、従業員名が利用されます。 代替キー・ファイル 代替キーを持つ各プライマリ・構造化ファイルに対し、ユーザーは対応する代替キー・ファイルを少な くとも 1 つ作成しなければなりません。代替キー・ファイルは、パーティションにより複数ボリュームに またがって作成できます。 代替キー・ファイルの各レコードが参照するのは 1 つの代替キーだけですが、ファイル自体は複数の代 替キーへの参照を含む場合があります。したがって、代替キーが 5 個存在するならば、代替キー・ファイ ルにはそれぞれのプライマリ・ファイル・レコードに対応する 5 個のレコードを持つことになります(プ ライマリ・ファイル・レコードは、どの代替キー・フィールドにも Null 値を全く含まないものとします) 。 137692J 2-13 プライマリ・ファイルに複数の代替キー・ファイルがある場合があります。たとえば、1 つの代替キー・ ファイルが 3 個の代替キーを参照し、2 番目の代替キー・ファイルがほかの 2 個の代替キーを参照すると いった場合です。 別々の複数の代替キー・ファイルを持つ理由は以下のとおりです。 □ 一意の代替キーは、長さの異なるほかのキーとファイルを共有できない。 □ 個々の代替キー・ファイルは一般に、数個の代替キー参照を行う組み合わせファイルよりもコンパクト である。 □ ある代替キーが頻繁に更新されるとファイルがフラグメント化される。個別ファイルにしておけば、フ ラグメント化が起こったとしても、ほかのキー参照には影響を与えない。 別々の代替キー・ファイルを作成しない方が良い理由は、以下のとおりです。 □ 代替キー・ファイルをオープンするたびに(つまり、プライマリ・ファイルをオープンするたびに)シ ステム・コントロール・ブロックへメモリの割り当てが行われる。 □ 代替キーを最初にオープンした時点で FCB(File Control Block)割り当てが行われる。 図 2-10 は代替キー・ファイルのレコード構造を示します。代替キー・ファイルのレコード長は次のとお りです。 キー指定子に対して 2 バイト +レコード内に存在する最長代替キーの長さ +関連する主キーの長さ キー順ファイルの場合は、ユーザーがデータ・ファイルの主キーの長さを定義します。データ・ファイ ルが相対、または入力順の場合は、形式 1 ファイルの主キーの長さは 4 であり、形式 2 ファイルの主キー の長さは 8 です。 図 2-10 代替キー・ファイルのレコード構造 主キー・ファイルがオーディットされている場合は、自動更新を禁止している場合を除いて、代替キー・ ファイルもオーディットの対象となります。データ・ファイル内の主キーとは異なり、代替キー・ファイ ルに登録された主キーの長さはファイルが一意のキー参照を持つかどうかによって異なります。キー参照 が一意ではない場合、このファイルの主キーはレコード全体になり、したがって主キーの長さはレコード の長さと同じになります。 2-14 137692J 代替キー・ファイルが 1 つだけの、非一意キーを持つ場合は、キーが次の長さを超えることはできません。 255 バイト (代替キー・ファイルの最長キー長さ) − 2 バイト (キー指定子ごと) − データ・ファイルの主キーの長さ したがって、データ・ファイルの主キーの長さが 33 バイトであれば、そのファイル内の非一意代替キー は 255 − 2 − 33 = 220 バイト以上の長さにはなりません。 代替キー・ファイルが一意のキー参照を含む場合、その主キーはキー指定子とその一意のキーから構成 されます。したがって、主キーの長さは次のようになります。 2 バイト (キー指定子ごと) + 一意の代替キー・フィールドの長さ したがって、一意の代替キー長さは、データ・ファイル中の主キーの長さには依存せず、最長で 255 − 2 = 253 バイトになります。 リレーショナル・アクセス データベース内の構造化ファイルへのリレーショナル・アクセスは、まず、1 つのファイルのレコード からフィールド値を取得し、次にそのフィールド値をキーとして別ファイルのレコードを検索するという 方法で実行します。 図 2-11 にリレーショナル・アクセスの例を示します。図に示す 4 個のファイルはいずれもプライマリ・ データ・ファイルです。図は、ユーザーが 10-17-95 に出されたすべての注文の情報を取り出すためのクエ リー操作を示しています。 ユーザーからのクエリー・コマンドに応答して、アプリケーション・プログラムは日付代替キー・フィー ルドを使用して 10-17-95 に置かれている注文ヘッダ・ファイル内の注文要約レコードを検索します。適用 可能なすべての注文要約レコードに対して、プログラムは次の処理を行います。 □ 注文要約レコードの名前フィールド値を EXACT 主キーとして、顧客ファイルから関連する顧客レコー ドを取り出します。 □ 注文要約レコードの注文番号フィールド値を一般主キーとして、注文詳細ファイルから関連する行項目 レコードを取り出します。 □ 行項目レコードのパーツ番号フィールド値を EXACT 主キーとして、在庫ファイルから関連する在庫レ コードを取り出します。 137692J 2-15 図 2-11 構造化ファイル間のリレーショナル・アクセス 2-16 137692J 第 3 章 システム・プロシージャ ENSCRIBE ファイルの作成、アクセスを実行するには、ファイル・システム・プロシージャを利用する 方法と、別に準備されているシーケンシャル I/O(SIO)プロシージャのセットを利用する方法があります。 2 つのプロシージャ・セットはどのファイルにアクセスする場合も相互に排他的であるため、どちらかの セットを選択する必要があります。 ファイル・システム・プロシージャ 利用可能なファイル・システム・プロシージャの機能を表 3-3 に示します。 表 3-3 ファイル・システム・プロシージャ (1/3 ページ ) プロシージャ 説 明 AWAITIO[X] オープン・ファイル上で継続中の I/O 操作の完了を待ちます。 CANCELREQ オープン・ファイル上で継続中の操作の中で一番古い(オプション・タグで識別される)も のをキャンセルします。 CONTROL オープン・ファイル上で、デバイスに依存する操作を実行します。 DISK_REFRESH ファイル・コントロール・ブロック(FCB)の情報(たとえば EOF ポインタ)を関連する 物理ディスク・ボリュームに書き込みます。REFRESH はこのプロシージャで置き換えられ ます。 FILE_ALTERLIST_ 通常ファイル作成時に設定されるファイル属性の一部(ファイル・タイプやファイル・コー ドなど)を変更します。ALTER プロシージャはこれにより置き換えられます。 FILE_CLOSE ファイルへのアクセスを終了し、ディスク上の一時ファイルを解放します。CLOSE はこの プロシージャで置き換えられます。 FILE_CREATE_ 構造化、または非構造化ディスク・ファイルを新規作成します。パーマネント・ファイル、 一時ファイルのどちらにも適用できます。CREATE はこのプロシージャで置き換えられま す。 FILE_CREATELIST 構造化、または非構造化ディスク・ファイルを新規作成し、代替キー情報、パーティション 情報、その他の属性を指定します。CREATE はこのプロシージャで置き換えられます。 FILE_GETINFO ファイル番号で識別できるファイルに関する限定された情報を提供します。FILEINFO、 FILEINQUIRE、FILERECINFO はこのプロシージャで置き換えられます。_ FILE_GETINFOBYNA ME ファイル名で識別されるファイルに関する限定された情報を提供します。FILEINFO、 FILEINQUIRE、FILERECINFO、DEVICEINFO、DEVICEINFO2 はこのプロシージャで置 き換えられます。 FILE_GETINFOLIST ファイル番号で識別されるファイルの詳細情報を提供します。_FILEINFO、FILEINQUIRE、 FILERECINFO はこのプロシージャで置き換えられます。 FILE_GETINFOLISTB YNAME ファイル名で識別されるファイルの詳細情報を提供します。_ FILEINFO、FILEINQUIRE、 FILERECINFO はこのプロシージャで置き換えられます。 137692J 3-1 表 3-3 ファイル・システム・プロシージャ (2/3 ページ ) プロシージャ 説 明 FILE_OPEN_ ファイルとの通信を確立し、ファイル番号を返します。OPEN はこのプロシージャで置き換 えられます。 FILE_PURGE オープンされていないファイルを消去します。PURGE はこのプロシージャで置き換えられ ます。 FILE_RENAME オープン・ファイルの名前を変更します。一時ファイルはこの操作によりパーマネント・ ファイルに変更されます。RENAME はこのプロシージャにより置き換えられます。 FILE_RESTORE_POSI TION_ FILE_SAVEPOSITION _ FILE_SETKEY 主キー、または代替キーにより、キー順ファイル、入力順ファイル、相対ファイル、 キュー・ファイル内の位置を設定します。これにより現在位置、アクセス・パス、位置決め モードが設定されてファイルのサブセットが定義され、以後のアクセスが可能になります。 このプロシージャを使用するためには、相対、入力順ファイルの主キーの長さが 8 バイトで なければなりません。KEYPOSITION はこのプロシージャで置き換えられます。 FILE_SETPOSITION_ 主キーにより、入力順、または相対ファイル内の位置を設定します。これにより現在位置、 アクセス・パス、位置決めモードが設定されてファイルのサブセットが定義され、以後のア クセスが可能になります。非構造ファイル内に新しい現在位置を指定することもできます。 このプロシージャは 8 バイト形式のレコード指定子を受け付けますから、形式 2 ファイルに も適用可能です。POSITION はこのプロシージャで置き換えられます。 FILEERROR 呼び出しに失敗した場合に、再試行するかどうかの判断に使用します。 FILENAME_FINDNEX 名前付き要素セットの中の次の名前を返します。このセットは FILENAME_FINDSTART_ T_ を呼び出すことにより定義されます。GETDEVNAME と NEXTFILENAME はこのプロシー ジャで置き換えられます。 3-2 FILENAME_FINDSTA RT_ 名前付き要素の検索をセットアップします。 FNAMECOLLAPSE 内部ファイル識別子を縮約して外部形式に変換します。 FNAMECOMPARE 2 つの内部ファイル識別子を比較し、両者が同一ファイル、または同一デバイスを指してい るかどうかを判別します。 FNAMEEXPAND 外部ファイル識別子を展開して内部形式に変換します。 KEYPOSITION 主キーにより、キー順、キュー・ファイル内の位置を設定します。または、代替キーによ り、キー順、入力順、相対ファイル内の位置を設定します。これにより現在位置、アクセ ス・パス、位置決めモードが設定されてファイルのサブセットが定義され、以後のアクセス が可能になります。このプロシージャを使用するには、相対、入力順ファイルの主キーの長 さは 4 バイトでなければなりません。 LOCKFILE オープンされたディスク・ファイルをロックし、ほかからアクセスできないようにします。 LOCKREC オープンされたディスク・ファイルのレコード(キー順ファイルで包括ロックが有効設定さ れている場合はレコードのセット)にロックを掛け、ほかのプロセスからアクセスできない ようにします。 137692J 表 3-3 ファイル・システム・プロシージャ (3/3 ページ ) プロシージャ 説 明 POSITION 主キーにより、入力順、または相対ファイル内の位置を設定します。これにより現在位置、ア クセス・パス、位置決めモードが設定されてファイルのサブセットが定義され、以後のアク セスが可能になります。非構造ファイル内に新しい現在位置を指定することもできます。この プロシージャは 4 バイト形式のレコード指定子を受け付けるため、4GB 以上のファイルへは 適用できません。 READ[X] 位置指定に従い、サブセットの先頭レコードを返します。それ以外の場合は、カレント・ア クセス・パスの次のレコードを返します。 READLOCK[X] READ[X] と同じ機能。ただし、読み出し前にレコードをロックします。 READUPDATE[X] カレント・キー値が指定するレコードを返します。READUPDATE[X] はオープン・ファイル からのランダム読み出しに使用します。 READUPDATELOCK[ READUPDATE[X] と同じ機能。ただし、読み出し前にレコードをロックします。 X] REPOSITION 以前実行した SAVEPOSITION 呼び出しにより保存されたファイル位置情報を呼び戻します。 SAVEPOSITION 現在のディスク・ファイル位置情報を保存します。保存された情報は後で REPOSIOTION に より呼び戻されます。 SETMODE オープン・ファイルにデバイス依存機能を設定します。 SETMODENOWAIT オープン・ファイルに、待ちなしでデバイス依存機能を設定します。 UNLOCKFILE 呼び出し側により現在ロックされているディスク・ファイルのロックを解除します。ディス ク・ファイルの中で、呼び出し側により現在ロックされているすべてのレコードのロックを 解除します。 UNLOCKREC 呼び出し側により現在ロックされているレコードのロックを解除します。包括ロックが有効 化されている場合は、UNLOCKREC 呼び出しは無視されます。 WRITE[X] オープンされたディスク・ファイルの中の、最新の READ[X] または READUPDATE[X] 呼 び出しにより指定された位置へレコードを新規挿入(追加)します。 WRITEUPDATE[X] オープン・ファイルのカレント・キー値が指定するレコードのデータをを入れ替え(更新)ま たは削除します。 WRITEUPDATEUNLO WRITEUPDATE[X] と同じ機能。ただし、レコードの内容が更新、削除された後でレコード CK[X] のロックを解除します。 プロシージャ呼び出しの完了 待ちなし I/O が指定された状態でファイルがオープンされた場合、以下に列挙するプロシージャ呼び出 しは対応する AWAITIO[X] 呼び出しで完了する必要があります。:CONTROL、LOCKFILE、LOCKREC、 READ[X] 、READLOCK[X] 、READUPDATE[X] 、READUPDATELOCK[X] 、UNLOCKFILE 、 UNLOCKREC、WRITE[X]、WRITEUPDATEUNLOCK[X]、SETMODENOWAIT。 137692J 3-3 待ちなし I/O が指定された状態でファイルがオープンされた場合、何らかの操作が継続中に以下のプロ シ ージ ャ呼 び出 しを 行う と、その 呼び 出し はエ ラー 2 7 によ り拒 絶さ れま す : F I L E _ R E N A M E 、 FILE_SETKEY 、FILE_SETPOSITION 、KEYPOSITION 、POSITION 、REPOSITION 、SETMODE 、 SETMODENOWAIT 。 待ちあり、待ちなし I/O のどちらの状態でファイルがオープンされているかにかかわらず、以下に列挙 す るプ ロシ ージ ャ呼 び出 しの 返り 値は 完了 表示 で終 了し ます。: C ANCEL REQ 、FI L E_CLOSE _ 、 FILE_CREATE_、FILE_GETINFO_、FILE_GETINFOBYNAME_、FILE_GETINFOLIST_、FILE_OPEN_ FILE_PURGE_、FILE_RENAME_、FILENAME_FINDNEXT_、 (オプション<1> = 1が指定された場合以外)、 KEYPOSITION、POSITION、SETMODE。 ファイル番号パラメータ DISK_REFRESH_、FILE_CREATE_、FILE_GETINFOBYNAME_、FILE_OPEN_、FILE_PURGE_ 、お よび FILENAME_FINDNEXT プロシージャを除き、呼び出しが参照するファイル名をファイル・システ ム・プロシージャが識別するには、ILE_OPEN_ プロシージャが返す filenum パラメータを使用します。 FILE_CREATE_、FILE_GETINFOBYNAME_、FILE_OPEN_、および FILE_PURGE_ プロシージャは filename パラメータによりファイルを参照します。LASTRECEIVE と REPLY プロシージャは常に $RECEIVE を参照します。パラメータとして filenum を持っている FILE_OPEN_ と AWAITIO[X] を除き、 プロシージャに対するファイル番号は INT(値パラメータ)です。 タグ・パラメータ アプリケーションが指定する倍精度整数(INT(32))タグは、I/O 操作(読み出し、または書き込み) が待ちなしファイルに対して開始された場合に限り、呼び出しパラメータとして渡すことができます。I/O 操作が完了すれば、AWAITIO[X] プロシージャを介してこのタグをアプリケーション・プロセスへ戻すこ とができます。このタグは個々のファイル操作を識別するのに有効で、アプリケーションに依存するエラー 回復ルーチンに利用できます。 バッファ・パラメータ ファイル・システム・プロシージャ呼び出しにおけるバッファ・パラメータはデータの読み出し、また は書き込みが行われる位置を示します。 READ、WRITE などの I/O 操作では、指定のバッファは整数(INT)、または倍精度整数(INT(32))タ イプでなければならず、ユーザーのデータ領域内(P 相対読み出し専用配列は使えません)に存在しなけ ればなりません。 READX、WRITEX などの拡張 I/O 操作では、指定バッファは INT、または INT(32)でなければなら ず、ユーザーのデータ領域、または拡張データ・セグメント内に存在します(P 相対読み出し専用配列は 使えません)。 トランスファ・カウント・パラメータ ファイル・システム・プロシージャ呼び出しにおける読み出しカウントと書き込みカウント・パラメー タは読み出し / 書き込みを実行するバイト数を示します。 SETMODE プロシージャを機能コード 141 を使用して呼び出すことにより、拡張データ・セグメント (またはデータ・スタックの上位 32K)と非構造化ファイル・アクセス用にオープンされた DP2 ディスク・ ファイル間のデータ・バルク転送の有効 / 無効設定を切り替えることができます。 3-4 137692J SETMODE 141 呼び出しを実行するためには、ファイルが非構造化アクセス用(open^flag の第 2 ビット が 1)、かつ排他アクセス(open^flag の第 10,11 ビットが 2)としてオープンされていなければなりません。 バルク転送機能を無効にしておくと、1 回の操作で転送可能なデータは 0 から 4096 バイトの範囲です。 バルク転送機能を有効にしておくと、最大 30K までのデータを 1 回の操作で転送可能になります。転送 されるデータ数は 2K バイトの倍数でなければなりません。バルク転送機能を有効設定した場合に使用可 能なデータ転送 I/O 操作は READX、READUPDATEX、WRITEX、および WRITEUPDATEX です。 条件コード ファイル・システム・プロシージャには操作の結果を示すために条件コードを返すものがあります。こ れらのプロシージャでは、ファイル・システム・プロシージャ呼び出し後には必ず条件コードをチェック し、数学演算操作を実行する前にもチェックするか、変数に値を割り当てます。一般に、条件コードには 次のような意味があります。 < (CCL) エラー発生(エラーの種類を判別するには、ファイル・システムの FILE_GETINFO_ プ ロシージャを呼び出す )。 > (CCG) 警告メッセージが発行された(代表例は EOF。ただし CCG の具体的な意味については 個々のプロシージャを参照するか、または FILE_GETINFO_ によりエラー番号をチェッ クすること) 。 = (CCE) 操作成功。 エラー番号 エラー番号はそれぞれの完了した呼び出しに付随します。表 3-4 に示すように、エラー番号は 3 種類の カテゴリに分類されます。完了した呼び出しに付随するエラーの一般カテゴリーは条件コード設定により 指定されます。 表 3-4 エラー番号のカテゴリ 1-9 137692J エラー番号 条件コード 0 = (CCE) > (CCG) カテゴリ エラー無し。操作は正常終了した。 警告。操作実行の結果、警告で示される例外が発 生した。警告 6(システム・メッセージ受信)の 場合は、データがアプリケーション・プロセス・ バッファに返される。 3-5 表 3-4 エラー番号のカテゴリ エラー番号 条件コード カテゴリ 10-255、 512-32767 < (CCL) エラー。操作実行中にアプリケーションが認識し なければならないエラー、または特殊条件(たと えば、オーディットされたファイルのトランザク ション中断)が発生した。データ転送操作の場合 は、データが全く転送されなかったか、一部のみ が転送された(データ通信エラー 165 は例外 : こ のエラーは操作の正常終了によりデータがアプリ ケーション・プロセス・バッファに返されたこと を示す) 。 300-511 < (CCL) アプリケーション定義エラー。この範囲のエラー 番号はアプリケーション・プロセスで利用するた めに予約されている。 オープン・ファイルへの操作に付随するエラー番号を取得するには、エラーの発生したファイル番号を 与えて FILE_GETINFO_ システム・コールを使用します。 status := FILE_GETINFO_( filenum, lasterror ); Xstatus に返される値により、FILE_GETINFO_ 呼び出しが成功したかどうが分かります。不適切な ファイル番号を与えるといったプログラム・エラーがなければ、通常この返り値は 0 です。これに先行し て実行された操作(READ、WRITE など)に付随するエラー値が 2 番目のパラメータ(lasterror) に返されます。 X ファイル番号として -1 を与えて FILE_GETINFO_ を使用することにより、任意のファイル上で先に実 行された AWAITIO[X] や待ちが入って失敗した FILE_OPEN_ に付随するエラー番号を取得できます。 status := FILE_GETINFO_( -1, lasterror ); FILE_OEPN_ プロシージャが失敗すると、filenum パラメータは -1 に設定されます。 同様に、先に実行して失敗した FIEL_CREATE_ や FILE_PURGE_ 操作のエラー番号も、filenum=-1 を 指定して FILE_GEOINFO_ を実行することにより取得できます。 ファイル・アクセス権 READ[X] や READLOCK[X]、READUPDATE[X]、READUPDATELOCK[X] 呼び出しが成功するため には、対象となるディスク・ファイルは読み出し、または読み出し / 書き込み操作に対してオープンされ ていなければなりません。オープンされていなければエラー 49(access violation)により操作 は拒絶されます。 CONTROL や WRITE[X]、WRITEUPDATE[X]、WRITEUPDATEUNLOCK[X] 呼び出しが成功するた めには、対象となるディスク・ファイルは読み出し、または読み出し / 書き込み操作に対してオープンさ れていなければなりません。オープンされていなければエラー 49(access violation)により操 作は拒絶されます。 FILE_PURGE_ や FILE_RENAME_ 呼び出しが成功するためには、呼び出し側がパージ・アクセスを 持っている必要があります。持っていなければエラー 48(security violation)により操作は拒 絶されます。 3-6 137692J 外部宣言 アプリケーション・プログラム内のほかのプロシージャと同様に、ファイル・システム・プロシージャ は呼び出しが実行される前に宣言されていなければなりません。 これらのプロシージャは、$SYSTEM.SYSTEM.EXTDECS0 という名前のファイルにより、アプリケー ション・プログラムの外部で宣言されています。次の例が示すように、プログラム・コードの中では外部 宣言文の後、最初のプロシージャ呼び出しが記述される前に SOURCE コンパイラ・コマンドを使用してこ のファイルを指定しておかなければなりません。 global-declarations ?SOURCE $SYSTEM.SYSTEM.EXTDECS0 (external-procedure, ...) procedure-declarations プログラム内で使用される外部プロシージャは SOURCE コマンドで指定します。たとえば、次の例では KEYPOSITION、WRITEUPDATE、FILE_OPEN、FILE_CLOSE、READ、WRITE、POSITION の外部宣 言のみがコンパイルされます。 ?SOURCE $SYSTEM.SYSTEM.EXTDECS0 ( KEYPOSITION, WRITEUPDATE, ? FILE_OPEN_, FILE_CLOSE, READ, WRITE, POSITION, ) シーケンシャル I/O(SIO)プロシージャ 表 3-5 のシーケンシャル I/O(SIO)プロシージャは、TAL(Transaction Application Language)プログ ラマに共通 I/O 操作を実行するための標準化されたプロシージャのセットを提供します。これらの操作に は、IN、OUT ファイルの読み出し / 書き込みやターミナルからの BREAK などが含まれます。これらのプ ロシージャは主としてシステム・プログラムやユーザーが作成するユーティリティ・プログラムでの使用 を想定しています。これらのプロシージャの利用により、異なるファイル・タイプを一貫性があり、結果 の予測がつく方法で取り扱えるという利点が得られます。 SIO プロシージャは DEFINE、LETERAL 文のセットを備えており、これによりコントロール・ブロッ クへのスペース割り振り、ファイルのオープン特性の指定、およびファイル転送特性の設定とチェックを 行います。 表 3-5 SIO プロシージャ プロシージャ 137692J 機 能 CHECK^BREAK BREAK キーが押されたかどうかをチェックします。 CHECK^FILE ファイル特性を読み出します。 CLOSE^FILE ファイルを閉じます。 GIVE^BREAK BREAK キーを使用できないようにします。 OPEN^FILE SIO プロシージャからのアクセスを可能にするため、ファイルをオープンします。 READ^FILE ファイルからの読み出しを行います。 SET^FILE ファイル特性を設定、変更します。 TAKE^BREAK BREAK キーを使用可能にします。 WAIT^FILE 継続中の I/O 操作終了を待ちます。 WRITE^FILE ファイルへ書き込みます。 3-7 SIO プロシージャには次の特性があります。 □ すべてのファイル・タイプを統一された方法でアクセスできます。アクセス・モードや排他モード、レ コード・サイズなどのファイル・アクセス特性はデバイス・タイプとアクセスの目的により選択されま す。最も一般的な利用法に合わせてデフォルト特性が設定されます。 □ エラーからの回復が自動的に行われます。致命的エラーが発生した場合は、概要を示すエラー・メッ セージが表示され、ファイルはすべてクローズされ、プログラムはアボートされます。プログラムがエ ラー処理を行う場合には、自動エラー処理とエラー・メッセージ表示をオフに設定することも可能です。 □ OPEN^FILE プロシージャを使用して、ファイルがオープンされたときの SIO 操作特性を変更できます。 また、SET^FILE プロシージャを使用すると、ファイルがオープンされる前、または後に特性を変更で きます。次のような特性がオプションとして利用できます。 ● レコードのブロックとブロック解除 ● ファイル複写機能。1 つのファイルから読まれたデータを自動的にほかのファイルに反映させます。 ● エラー・レポート・ファイル。すべてのエラー・メッセージの表示先になります。特定のファイル が指定されない場合は、ホームターミナルがエラー・レポート・ファイルになります □ INITIALIZER プロシージャと使用することにより、ランタイムでの変更が可能です。レコード長等の ファイル転送特性はオペレーティング・システムのコマンド・インタプリタが備える ASSIGN コマン ドで変更できます。 □ ファイル・コントロール・ブロック(FCB)内のファイル情報を保持します。オープン・ファイルには それぞれ 1 つの FCB を持ち、 これとは別にほかの FCB とリンクするための共通 FCB が 1 つ存在します。 SIO プロシージャの詳細については、『GUARDIAN プログラマーズ・ガイド』を参照してください。 3-8 137692J 第 4 章 ファイル作成とアクセスのための一般情報 この章で説明するファイル作成とアクセスのための一般情報は、すべてのタイプの ENSCRIBE ファイル に適用できます。 ファイル作成情報には次のような種類があります。 □ ファイル・コード □ ディスク・エクステントのサイズ □ オーディット・チェックポイントの圧縮 □ 書き込みの検証 □ 形式 1 と形式 2 ファイルの対比 アクセス情報には次のような種類があります。 □ ファイルのオープンとクローズ □ パーティション化されたファイルのオープン □ 構造化ファイルの逆読み込み □ ファイルの有効期限 □ ファイル作成と最後にファイルをオープンした日時のタイムスタンプ □ CONTROL27 によるディスク書き込み検出 □ コーチ・バッファリングとシーケンシャル・ブロック・バッファリングの使用 □ 適切なディスク・ファイル ACCESSTYPE の指定 □ EOF ポインタの更新 □ データのパージ □ プログラムによるファイル・エクステント割付 □ プログラムによるファイル・エクステントの割付解除 ファイル作成 ここでは、ENSCRIBE ファイル作成時にユーザーが指定できるパラメータと、ユーザーが有効 / 無効設 定できる機能について説明します。 137692J 4-1 ファイル・コード ENSCRIBE ディスク・ファイル作成時に、ユーザーはこのファイルに対して任意の数値ファイル・コー ドを割り当てることができます。一般的に、このコードは書き込まれた内容に従ってファイルをカテゴリー 分類するために使用されます。 100 から 999 までのファイル・コードは別の目的で予約されているので、この範囲の値を使用した場合 の結果は保証されません。 ファイル・コードを指定しなければ、デフォルト値として 0 が設定されます。 ディスク・エクステントのサイズ ENSCRIBE ファイルを作成する時点で、ユーザーはそのファイルに割り当てる物理ディスク・スペース の最大値を指定できます。物理スペースはエクステント単位で指定します。エクステントとは物理スペー スの連接したブロックであり、そのサイズは、形式 1 ファイルの場合は 1 ページ(2048 バイト)から 65,535 ページ(134,215,680 バイト) 、形式 2 ファイルの場合は 536,870,912 ページまでの範囲をとります。 デフォルト条件での ENSCRIBE ファイルとパーティションのエクステント数は 16 です。ただし、特定 の非パーティション・ファイルやキー順ファイルのパーティションに対してはこれを超える値を持つよう に指定できます。 最初のエクステントはプライマリ・エクステントとよばれ、それ以外のセカンダリ・エクステントとは 異なるサイズを指定できます。同一ファイルやパーティションに属するセカンダリ・エクステントはすべ て共通のサイズを持ちます。 ファイル作成時にプライマリ・エクステントおよびセカンダリ・エクステントのサイズを指定しなけれ ば、すべて 1 ページとしてデフォルト設定されます。 エクステントのサイズはバッファ・サイズの整数倍(非構造化ファイルの場合)か、またはブロック・ サイズの整数倍(構造化ファイルの場合)でなければならず、バッファ・サイズとブロック・サイズは 512,1024,2048、または 4096 のいずれかでなければなりません。この条件に準拠するため、ファイル・シ ステムは必要に応じてユーザーが指定したエクステント・サイズの端数を自動調整することがあります。 また、バッファ・サイズやブロック・サイズが 4096 の場合には、エクステントのサイズがページの奇数 倍で指定されるとファイル・システムがページ数を自動調整します。このため、奇数ページで構成される エクステントを持つファイルを作成するのであれば、バッファ・サイズとブロック・サイズは 2048 以下で なければなりません。 これ に加 え、ユー ザー は ファ イル に割 り当 てら れる 最大 エク ステ ント 数(16 以 上)を規 定す る MAXEXTENTS という値を指定できます。特に最大数を指定しなかった場合のデフォルト値は 16 です。 キー順ファイル以外のパーティション・ファイルでは、MAXEXTENTS の値は常にパーティションあた り 16 です。 パーティション化されていないファイルやパーティションされたキー順ファイルでは、プログラム実行 中に動的に MAXEXTENTS 値を変更できます。このためには、CONTROL92 プロシージャを呼び出すか、 または MAXEXTENTS パラメータを与えて FUP ALTER コマンドを実行します。 4-2 137692J サポートするファイル形式:形式 1 と形式 2 D46 リリースは従来よりも大きなパーティション数をサポートします。この変更により、ファイルとファ イル・パーティションは形式 1 のサイズである 2GB から、形式 2 のサイズである 1TB へ拡大されました 。 (ただし、実際のファイル・サイズはディスクの中で最大容量をもつ 1 つのディスクにより制限されます) 両方のファイル形式がサポートされていますが、通常、ユーザーはファイル形式を指定する必要はあり ません。特に指定がない場合は、形式 2 が必要とならない限り、形式 1 が選択されます。形式 2 が必要と なるのは次の場合です。 □ 非パーティション・ファイル(または、1 つのパーティション)が 1MB ∼ 2GB の範囲を超える最大サ イズを持つ □ 非キー順ファイルが 4GB、またはそれ以上(すべてのパーティションを含めて)の最大サイズを持つ □ エクステントのサイズが 65535 を超える場合。 形式 2 の特性が適している場合は、形式 2 を使用してください。 表 10-6 形式 1 ファイルと形式 2 ファイルの比較 (1/2 ページ ) ファイル属性、または プロシージャ呼び出し 形式 1 ファイル 形式 2 ファイル ブロック・サイズ 512 ∼ 4096 512 ∼ 4096** 後のリリースでは 32768 最大パーティション・ファイル・ サイズ(非キー順ファイル) 4GB ∼ 4KB 1024GB 最大非パーティション・ファイ ル・サイズ(単一パーティション) 2BG ∼ 1MB 1024GB 最大レコード・サイズ 入力順、相対 キー順 [ ブロック・サイズ -24] [ ブロック・サイズ -34] 最大レコード・サイズは形 式 2 ファイルよりも大きい [ ブロック・サイズ -48] [ ブロック・サイズ -56] 最大レコード・サイズは形式 1 ファイルよりも 小さくなる ブロックあたりの最大レコード数 511 ブロックとレコードのサイズにより制限される エクステント・サイズ(ページ) 64K-1 ページ(128MB) 新しい 32 ビット・フィールドにより、形式 1 ファイルよりも大きなエクステント・サイズを とる [ 最大サイズを持つ物理ディスクの容量により 制限される ] エクステントの最大数 同上(978 以下) 使用可能な値は形式 1 の制限以下(928 以下) EOF の値 従来と同じ 標準よりも大きい場合がある 137692J 4-3 表 10-6 形式 1 ファイルと形式 2 ファイルの比較 (2/2 ページ ) ファイル属性、または プロシージャ呼び出し 形式 1 ファイル 形式 2 ファイル パーティション数 16 パーティション 16 パーティション ファイル・タイプ 全タイプ キュー・ファイル不可 代替キー・レコード内の非キー順 主キー値 4 バイト(32 ビット)の 主キー値 8 バイト(64 ビット)の 主キー値 パーティションとファイル形式の互換性 ファイルの全パーティションは同一ファイル形式バージョン(形式 1、または形式 2)で作成されます。 非キー順ファイルの場合、独立に作成されるパーティションであってもファイル内のほかのパーティ ションと同一形式でなければなりません。同一形式パーティションでない場合は、そのパーティションは オープンすることができず、FEPARTFAIL 警告メッセージが表示されます。 混合パーティション形式を持つキー順ファイルはパーティションのオープンとアクセスが可能です(た だし、ほかの互換要件を満たす必要があります) 。大型の形式 1 パーティション・ファイルを大型の形式 2 パーティション・ファイルへ変換する場合はこの事実が役に立ちます。 注意:パーティションの互換性を満たすためには、すべてのパーティションのレコードとブロック・サイズが一致 しなければなりません。このことはある種のファイル・タイプに影響を及ぼします。特に、レコード / ブロッ クサイズが一部混合したキー順ファイルの場合には、パーティション間で混合形式を持てない場合がありま す。 ファイル・サイズの制限 取り扱うファイルのサイズが大きすぎると、アプリケーション側で問題が発生することがあります。以 下の項目では、異なる ENSCRIBE ファイルに対して課せられる制限と、考慮事項について説明します。 パーティションの制限 形式 1 の単一パーティション(または形式 1 の非パーティション・ファイル)は最大 1MB ∼ 1GB の範 囲に制限されます。ユーザーがエクステント・サイズや最大エクステント数がこの制限を超過する可能性 のあるファイルを作成しようとすると、 (デフォルトの形式選択方式が設定されていれば)形式 2 ファイル が作成されます。明示的に形式 1 ファイルが選択されているにもかかわらず、1MB ∼ 1GB の範囲を超過 する場合や、サイズが 1TB を超過する場合にはエラー 583 またはエラー 21 が返されます。 4-4 137692J キー順とキュー・ファイル キー順ファイルは最大 16 までのバーティションを持つことができ、可能な最大サイズは 32GB です。し かし、プログラムが 32 ビット・ファイル・システム属性を使用している場合は、2GB を超えるサイズの ファイルの取り扱いに問題が起こることがあります。特に EOF(End of File)と Maximum File Size 属性 、または 4GB(符号なし整数として)を超えるファイル は 32 ビット形式で約 2GB(符号付き整数として) を正しく表現できません。このような場合は 64 ビット形式を使用します。 キュー・ファイルはパーティションできません。 その他のファイル・タイプ 入力順、相対、および非構造化ファイルも最大 16 までのパーティションを持つことができます。しか し、これらの形式 1 ファイルに対しては、システムにより約 4GB(4GB-4KB)の制限が課せられます。こ の制限を越えた操作を行おうとするとシステムがエラー 21 を返します。 2GB から 4GB までの範囲のファイル 2GB から 4GB までのファイルの取り扱いでは、32 ビット符号付き整数が関与する演算処理においてプ ログラムに問題が発生する可能性があります。エラーを回避するためには、何種類かのファイル属性(た とえば EOF)が使用する 32 ビット値を、符号なし整数と解釈する必要があります。このようなケースで は 64 ビット形式の属性の使用を推奨します。 オーディット・チェックポイントの圧縮 ENSCRIBE ファイルが TMF によりオーディットされているか、または 0 以上の同期深度でオープンさ れたのならば、特定ファイルのレコード更新を実行すると、オーディット・チェックポイント(AC)レ コードが生成されます。更新の結果発生した変化を記述した AC レコードはバックアップ・ディスク・プロ セスへ送信されます。該当ファイルが TMF によるオーディットを現在受けているならば、AC レコードは オーディット・トレイルのディスク・プロセスへも送信され、最終的にオーディット・トレイルに書き込 まれます。 ファイルがオーディットされている場合、AC レコードは場所から場所へ数回にわたりコピーされます。 AC レコードはオーディット・トレイル・ファイル上に常設スペースを確保し、バックアップが更新レコー ドのディスクへの書き込みを確認するまでは、バックアップ・ディスク・プロセスにも常駐メモリが確保 されます。ファイルがオーディット対象外である場合は、AC レコードはチェックポイント・メッセージと してバックアップ・ディスク・プロセスへ送信され、もはや引き継ぎ回復の必要がなくなるまでそこで常 駐メモリを占有します。 AC レコードには次の内容が含まれます。 □ 約 64 バイト長のレコード・ヘッダ □ 更新前のレコードのコピー(事前イメージ) □ 更新後のレコードのコピー(事後イメージ) データ・レコード長が 1000 バイトの場合、その更新用 AC レコードは 2064 バイトの長さになります。 137692J 4-5 AC 圧縮は、データ・レコードの非変更部分を省略することにより、AC レコードの (2) と(3)の部分 を短縮します。AC レコードはレコード・キー(キー順、またはキュー・ファイル)、相対バイト・アドレ ス(非構造化、または入力順ファイル) 、またはレコード番号(相対ファイル)を必ず含みますが、それ以 外の非変更フィールドを含む必要はありません。たとえば、1000 バイトの長さを持つレコードの、2 個所 の 10 バイト・フィールドだけが更新されたとすれば、圧縮 AC レコードは 2064 バイトではなく、130 バ イトの長さになります。AC 圧縮により CPU サイクルをいくらか余分に消費することになりますが、これ により以下の利点が得られます。 □ 圧縮操作のためにいくらか余分の CUP サイクルが必要となるが、圧縮によりメッセージ転送に関わる CPU、メモリ・サイクルを減らすことができる。 □ バックアップ CPU に対する常駐メモリの必要量を減らすことができる。 □ ファイルがオーディットされている場合、オーディット・トレイルの消費量を減らすことができ、AC レコードがコンパクトになる結果、オーディット・ブロックの効率が向上する。 ファイルに対する AC 圧縮が有効化されていたとしても、全部の AC レコードが圧縮されるとは限りま せん。さらに、圧縮を記録するスペースが、省略される非変更部分よりも大きくなるのを防ぐためにいく つかの制限が課せられます。 □ レコードの長さがある制限下に収まる場合、ディスク・プロセスは圧縮を実行しません。この制限値は リリースにより異なります。 □ 更新に伴いレコード長が変更される場合、ディスク・プロセスは AC レコードを圧縮しません。 □ レコード内の変更個所が相互に非常に近い位置にある場合は、両者とその間に存在するバイトを一括し て 1 つの変更個所と見なします。 □ 変更個所の数がある一定の基準値を超える場合、レコードの残りの部分全体を一括して最後の部分と見 なします。 □ 変更個所が識別されると、圧縮後の AC レコードの予測サイズを計算して、これを圧縮しなかった場合 の値と比較します。圧縮による効果があまり得られない場合には非圧縮 AC レコードを使用します。 大きなキーを持つキー順、キュー・レコードでは AC 圧縮の効果はあまり得られません。キーは AC レ コードから省略できないからです。 FILE_CREATE_ プロシージャを使用してファイルを作成する場合、オプション・ビット 13 を 1、また は 0 にセットすることによりオーディット・チェックポイント圧縮をそれぞれ有効、無効に設定できます。 FUP によってファイルを作成する場合は、FUP CREATE コマンドの AUDITCOMPRESS、また NO AUDITCOMPRESS によりオーディット・チェックポイント圧縮をそれぞれ有効、無効に設定できます。 ファイルをオープンする時点では、ファイル作成時にどちらに設定されたかに従って、オーディット圧 縮機能が有効、または無効に設定されます。プログラム実行時には、次の方法によってこの機能を動的に 有効化 / 無効化できます。 □ AUDITCOMPRESS、または NO AUDITCOMPRESS のいずれかを指定して、FUP ALTER コマンドを 実行します。または、 4-6 137692J □ SETMODE94 プロシージャ呼び出しにおいて、それぞれ param1=1、または param1=0 を指定します。 ただし、このような動的変更が有効なのは、続く FUP ALTER コマンドや SETMODE94 呼び出しで指定 を逆転するか、または該当ファイルがクローズされるまでの間だけです。 書き込みの検証 ENSCRIBE ファイル作成時に、ユーザーは書き込み検証機能を有効化できます。この機能により、ファ イルへの以後の書き込み操作の整合性を保証することができます。書き込み検証を有効化しておくと、書 き込んだ直後のデータをディスクに読み戻して、CPU メモリ上の対応するデータと比較します。ただし、 この操作を実行するにはディスクを余分に回転させる必要があります。 FILE_CREATELIST_ プロシージャを使用してファイルを作成する場合、項目コード 73 を 1、または 0 に設定して書き込み検証をそれぞれ有効、無効に設定できます。FUP によってファイルを作成する場合は、 VERIFIEDWRITES または NO VERIFIEDWRITES を指定し、FUP CREATE コマンドを実行して、書き込 み検証をそれぞれ有効、無効に設定できます。 ファイルをオープンした時点で、ファイル作成時にどちらに指定されているかに従って書き込み検証が 有効、または無効に設定されます。プログラム実行時には、次の方法によってこの機能を動的に有効化 / 無 効化できます。 □ VERIFIEDWRITES、または NO VERIFIEDWRITES のいずれかを指定して FUP ALTER コマンドを実 行します。または、 □ SETMODE3 プロシージャ呼び出しにおいて、param1 パラメータのビット 15 をそれぞれ 1、または 0 に設定します。 ただし、このような動的変更が有効なのは、続く FUP ALTER コマンドや SETMODE94 呼び出しで指定 を逆転するか、または該当ファイルがクローズされるまでの間だけです。 137692J 4-7 ファイル・アクセス 以下の項目で、ENSCRIBE ファイルにアクセスするためのさまざまな方法を説明します。 ファイルのオープンとクローズ FILE_OPEN_ プロシージャを使用します。 パーマネント・ディスク・ファイルとの通信を確立する場合は、 LITERAL name^length = 23, syncdpth = 1; LITERAL usebigkeys = 1D; INT error; INT filenum; STRING .filename [0:22] := "$VOL1.MYSUBVOL.DATAFILE"; error := FILE_OPEN_(filename:name^length, filenum,,,,syncdpth, ! 読み出し / 書き込みアクセス ,,,,usebigkeys); ! 共有アクセス ! 待ちあり I/O, ! syncdepth = 1 ! 64- ビットの主キーを使用 注意: D46 のリリースに伴い、ユーザーは非構造化、相対、入力順ディスク・ファイルに対しても 32 ビット値で はなく、64 ビットの主キーを使用できるようになりました。デフォルト設定である 32 ビットキーを使用す る場合は、オープンできるファイルのサイズは最大 4GB までです。64 ビットを選択すれば任意のサイズの ファイルへアクセス可能になります。ただし、POSITION などの 32 ビット・インターフェイスは使用しな いようにしてください。 一度ファイルがオープンされると、ほかのファイル・システム・プロシージャは FILE_OPEN_ プロシー ジャが返すファイル番号(FIELNUM)を使用してこのファイルを識別できます。 ディスク・ファイルへのアクセスを終了するには、FILE_CLOSE_ プロシージャを使用します。 error := FILE_CLOSE_(filenum); 明示的にファイルをクローズしなかった場合は、プロセスが停止するまでそのファイルはオープンした ままになり、プロセス停止時点ですべてのファイルは自動的にクローズされます。 一時ファイルとの通信を確立するには、FIEL_CREATE_ プロシージャが返す一時ファイル名を使用します。 LITERAL temp^name^len = 256; INT namelen; INT error; INT temp^filenum; STRING .temp^filename [0:temp^name^len-1]; temp^filename ’:=’ "$VOL"; namelen := 4; error := FILE_CREATE_ (temp^filename:temp^name^len, namelen); error := FILE_OPEN_ (temp^filename:namelen, temp^filenum); 4-8 137692J FILE_CREATE_ が返すファイル名は、FILE_OPEN_ 呼び出しに使用できます。 一時ファイルは、それをクローズする時点でパージされます。一時ファイルのパージを避けたい場合は、 FILE_OPEN_ が返すファイル番号を利用して FILE_RENAME_ を呼び出し、一時ファイルをパーマネン ト・ファイルに変換します。 パーティション・ファイルをオープンする パーティション・ファイルのプライマリ(先頭) ・パーティションをオープンすると、付随するセカンダ リ・パーティションもすべて自動的にオープンします。セカンダリ・パーティションが開けない場合であっ てもファイルへのアクセスはそのまま許可されますが、FILE_OPEN_ プロシージャは警告コード 3 を返し、 操作の一部はうまく機能しない可能性があります。この場合、FILE_GETINFOLIST_ プロシージャを呼び 出せば、オープンしなかった中で最も大きな番号を持つパーティションを確認できます。 非構造化アクセスを宣言して FILE_OPEN_ 呼び出す場合を除き、個々のパーティションを個別にオープ ンすることはできません。 構造化ファイルの逆方向読み出し ENSCRIBE 構造化ファイル(キー順、キュー、入力順、相対ファイル)は、キー、またはレコード番号 の降順に従った順次読み出しが可能です。この機能を有効化するには、FILE_SETKEY_ のオプション・パ ラメータのビットを設定するか、または KEYPOSITION プロシージャ呼び出しの位置決めモード・パラ メータを設定します。 逆順読み出しと、最終位置指示機能 通常、KEYPOSITION プロシージャはファイル・ポインタをリセットして、ファイル・ポインタがキー 値、キー長、比較長、位置決めモード・パラメータなどの位置決め基準を満たす最初のレコード位置へ戻 します。しかし、逆順にファイルを読み出す場合には、位置決め基準を満たす最後のレコードをポイント する機能も必要になります。最後のレコードをポイントする機能は、KEYPOSITION プロシージャ呼び出 しの位置決めモード・パラメータの第 2 ビットを設定することで有効になります。 例として、次のレコード並びを考えてみます。 レコード番号 キー値 0 1 AAA ABA 2 3 ABB ABC キーの長さとして 2 を指定し、逆順読み出しを有効化して KEYPOSITION でキー値 AB に近接してから READ を呼び出すと、READ は例に示したレコードのセットの中からレコード番号 1 を返します。最終位 置指示機能を有効にして同じ KEYPOSITION を呼び出した場合には、READ 呼び出しが返すレコード番号 が 3 になります。 入力順と相対ファイルの主キーの場合、KEYPOSITION へ渡すキー値パラメータはダブルワードのレ コード番号を格納できる 4 バイト文字列です。 137692J 4-9 これらの種類のファイルに対して逆順読み出しと APPROXIMATE 位置設定を実行する場合、最初の位 置決めは、キー値として渡された値に等しいか、または小さいレコード番号を持つ最初のレコードに対し て実行されます。続く READ 呼び出しにより、レコード番号の降順に従ってレコードが返されます。すな わち、KEYPOSITION 操作に対する最終位置指示オプションは、入力順と相対ファイルのレコード数に厳 密に一致するだけ無視されます。 KEYPOSITION を使用してファイル内の最後のレコードを指示するには、キー長として 0 を指定し、位 置決めモード・パラメータに APPROXIMATE 位置設定、逆順読み出し、最終位置指示を指定します。こ の条件で KEYPOSITION を実行すると、それに続く READ はファイル内の最終レコードを返します。 逆順読み出しと SAVEPOSITION 逆順読み出し機能のため、SAVEPOSITION システム・プロシージャには 7 ワード長の位置決め・バッ ファを準備して代替キーを持たない入力順と相対ファイルの現在位置を保存しなければなりません。 順方向読み出しを行う場合は、この位置決め・バッファの 4 ワードのみが使用されます。 キー順ファイル、キュー・ファイル、代替キーを持つ入力順ファイル、および代替キーを持つ相対ファ イルの場合には、逆順読み出しによる位置決め・バッファのサイズへの影響はありません。 逆順読み出しとレコード・ポインタ 入力順ファイルと相対ファイルにおける、READ または WRITE 操作後の現在のレコードと次のレコー ド・ファイル・ポインタの状態は以下のようになっています。 カレント・レコード・ポインタ= 最後に読み出し / 書き込みが行われたレコードのレコード番号、または 次のレコード・ポインタ アドレス = カレント・レコード・ポインタに続くレコード番号、またはアドレス 入力順ファイルの場合にレコード・ポインタが格納するのはレコード・アドレスであり、相対ファイル の場合は相対レコード番号を格納します。FILE_GETINFOLIST_ システム・プロシージャを使用すると、 カレント・レコード・ポインタおよび次のレコード・ポインタの内容へアクセスすることが可能です。 逆順読み出しが有効設定されている場合は、READ 呼び出しが行われた後の次のレコード・ポインタに は現在のレコード番号、またはアドレスに先行するレコード番号、またはアドレスが格納されています。 逆順読み出しが有効設定されている場合のファイルの先頭レコード読み出し(カレント・レコード・ポ インタ =0)の直後は、これに先行するレコードは存在しませんから次のレコード・ポインタには無効レ コード番号またはアドレスが格納されています。この状態でさらに READ を呼び出すとファイル・システ ム・エラー 1 により CCG 完了が発生し、WRITE を呼び出すと(ファイルの先頭を超えて書き込もうとし ますから)ファイル・システム・エラー 550(illegal position)が発生します。 4-10 137692J ファイルの有効期限 それぞれのファイルに付随して 4 ワードのタイムスタンプとして有効期限が定義されています。パージ 操作を実行しようとする場合は、まずこの値が現在の日時と比較されます。有効期限が現在日時よりも後 に設定されているならば、パージ操作は許可されずに、エラー・コード 1091 が返されます。このチェック は通常のパージ権限チェックとは独立して、追加的に行われます。ファイルの有効期限を設定するには、 アイテム・コード 57 を渡して FILE_ALTERLIST_ システム・プロシージャを実行します。ファイル作成 時における有効期限初期値はゼロです。これは、はるか過去に溯った日付を表わしますから、有効期限に 関する限り、すべてのファイルは生成時にパージ可能に設定されることになります。 注意: C10 ソフトウェア・リリース以前にすでに存在していたすべての ENSCRIBE ファイルは有効期限ゼロを持 つと見なされます。 ファイルの有効期限を変更する場合、付随する代替キーファイルの日付は変更されませんが、パーティ ション・ファイルのセカンダリ パーティションの日付は変更されます(FILE_ALTERLIST_ 呼び出しに 。ファイルの有効期限を変更す よって partonly パラメータが 1 に設定されている場合はこの限りではない) るためには、そのファイルに対する読み出し / 書き込み権限を持っていなければなりません。また、一時 ファイルはクローズする時点で自動的にパージされますから、一時ファイルに有効期限を設定することは できません。 ファイル作成と最後にオープンされたタイムスタンプ それぞれのファイルに付随して作成日と最後にオープンされた日付が 4 ワードのタイムスタンプとして 記録されます。 ファイル作成日、最後にオープンされた日付を取得するには FILE_GETINFOLIST_ プロシージャを呼び 出します。 CONTROL 27 によるディスク書き込みの検出 非パーティション・ファイルの場合、ファイル番号で指定されたファイルに対する最後のディスク書き 込み操作(WRITE、WRITEUPDATE、WRITEUPDATEUNLOCK)がいつ完了したかを知るには機能コー ド 27 を渡して CONTROL システム・プロシージャを使用します。 同一データベース・ファイルに複数の異なるプロセスがアクセスするようなアプリケーション環境では、 ある重要レコードが変更されたかどうかを迅速に確認する必要があるため、このプロシージャ呼び出しが 役立ちます。 ただし、CONTROL27 呼び出しが完了したからといって、必ずしもファイルのデータが変更されたとは 限りません。確実なのはファイルのディスクへの書き込みが完了したことだけですが、このタイミングを 利用して重要レコードのデータが新しくなっているかをチェックできます。 あるレコードの更新をもれなく追跡するためには、まず 1 ファイルをオープンした状態でファイルに対 して待ちなし CONTROL27 呼び出しを実行し、別ファイルをオープンしてそのレコードを読み出し、次に CONTROL27 呼び出しの完了をチェックします。レコード読み出し後に CONTROL27 呼び出しを発行し たのであれば、読み出しと CONTROL27 呼び出しとの間に別プロセスによるディスク書き込みが起こった 可能性があります。 CONTROL27 要求の自動再送信は、キューの中で別プロセスからのディスク書き込み要求の後に挿入さ れた可能性があります(書き込みを見失う)。これを回避するには、CONTROL27 呼び出しによるファイ 137692J 4-11 ル・オープンが同期深度 0 を持っている必要があります。このようなケースでは、パス・エラー(200-211) とネットワーク・エラー(240-249)を処理成功のチェックマークと見なし、直ちに重要レコードが更新さ れているかを調べます。 キャッシュ・バッファリングまたはシーケンシャル・ブロック・バッファリングの使用 ENSCRIBE 製品では、キャッシュ・バッファリングとシーケンシャル・ブロック・バッファリングの 2 通りのバッファ管理オプションが用意されています。これをうまく利用すると I/O 操作の効率を向上でき ます。 キャッシュ・バッファリング キャッシュ(バッファ・プールとも呼ばれる)はディスクから読み出されたブロックのバッファリング 用にメイン・メモリ上に確保された領域です。キャッシュのサイズを指定するには、PUP SETCACHE コ マンドを使用します。 プロセスがレコードを読み出すと、ENSCRIBE ソフトウェアはまずそのレコードを含むブロックが キャッシュ上に存在するかをチェックします。ブロックがキャッシュにあれば、レコードはキャッシュか らアプリケーション・プロセスへと転送されます。キャッシュ上に該当ブロックが見つからなければ、ディ スクからそのブロックをキャッシュへ読み出し、それに続いて、要求されているレコードをアプリケーショ ン・プロセスへ転送します。 ブロックを読み出すときにキャッシュ上に利用可能なスペースが残っていない場合は、ほかのブロック のいずれかを選択して上書きする必要があります。キャッシュへのアクセス方法は、シーケンシャル・ア クセス、ランダム・アクセス、およびシステム管理の 3 種類から選択できます。 プロセスがレコードを書き込むときに何が起こるかは、ファイルをオープンするときに選択するオプ ションにより異なります。バッファ付きキャッシュ機能を使用しない場合は、レコードを保持するブロッ クが変更され、ただちにディスクへ書き込まれます。変更されるべきブロックがキャッシュに見つからな ければ、まずそれがディスクから読み出されます。 変更されたブロックは、バッファ・スペース確保のために上書きされるまで、そのままキャッシュ上に 残ります。この方式をライトスルー・キャッシュと呼びます。 バッファリングされたキャッシュを使用してファイルをオープンすることができます。この方法では キャッシュの内容のディスクへの書き込み、フラッシュの頻度を減らすことができます。キャッシュ内の 同一ブロック内で複数のレコードに変更が発生するような場合には、ディスク I/O の頻度が減少するため トランザクション時間が短縮されます。しかし、この方式では何らかの理由でキャッシュ・ブロックがフ ラッシュされるまで、データベースの変更は実際のディスク・ファイルへは反映されません。以下の状況 が発生するとブロックがフラッシュされます。 □ 任意の使用者によりファイルがクローズされる。 □ SETMODE プロシージャにより強制フラッシュが起こる。 □ TMF が強制フラッシュを行う。 □ 新しいブロックをキャッシュへ読み出すためにスペースが必要になる。ディスク・プロセスはアクセス 頻度が最も低いブロックを選択してフラッシュを行い、新しいブロックのためにスペースを空ける。 □ キャッシュ構成が変更される。 □ SETMODE プロシージャ呼び出しにより、非構造化ファイルのバッファ・サイズが変更され、その結 果該当ファイルのすべてのキャッシュ・バッファがフラッシュされる。 4-12 137692J □ ファイルに対して DISK_REFRESH プロシージャ、またはこれに相当するコマンドが実行される。 □ ディスク・プロセスが長い期間アイドリング状態になると、次の要求を受信するまでの期間を利用して 変更のあったキャッシュ・バッファをフラッシュする。 どのファイルもバッファ付き、ライトスルーのどちらでも選択できます。オーディットされたファイル のデフォルト設定はバッファ付きであり、オーディットされていないファイルのデフォルト設定はライト スルーです。 ライトスルー・キャッシュがオーディットされていないファイルのデフォルト設定である理由は、シス テム障害や予期せぬディスク・プロセスの引き継ぎ(同期深度 =0)によりバッファリングされた更新内容 が失われる可能性があり、アプリケーションがこれを検出して適切な処理を行えない場合があるからです。 バッファリングされた更新内容が失われた場合はエラー 122 が発生します。一方、バッファ付きキャッシュ がオーディットされたファイルのデフォルト設定になる理由は、システム障害によりコミット、またはバッ ファ上の更新内容が失われたとしても TMF により修復可能であるためです。 注意:非オーディット、バッファ付きファイルを同期深度(チェックポイントなし)と組み合わせて使用する場合 は注意が必要です。この組み合わせは更新操作の効率は高いですが、状況によってはデータの整合性に問題 が生じます。再スタート可能なアプリケーション(たとえば、古いマスターから新しいマスターへ)ならば 問題ありませんが、オンラインでのトランザクション処理アプリケーションでは、重大な CPU 障害が発生 するとキャッシュ上にバッファリングされた更新内容が失われる危険性があります。主 CPU からバックアッ プへの切換えスイッチが設定されている場合やコントローラのパス・エラーではこの問題は起こりません。 これは、プロセッサ障害が関与していないためです。主 CPU 障害によるディスク・プロセス・バックアップ の引き継ぎが生じ、ディスク・プロセスがそのファイルに対する次の任意の要求に対してエラー 122 を返し た場合は、バッファリングされた更新データが失われた可能性があります。 非オーディット・バッファ付きファイルを同期深度 0 で使用する場合、アプリケーションはファイルをクロー ズする前に SETMODE95 を利用してバッファリングされた更新内容をディスクにフラッシュしなければな りません。FILE_CLOSE_ はエラーを返しませんから、FILE_CLOSE の実行するフラッシュを当てにした 場合は、バッファリングされた更新内容に何らかの欠損(エラー 122)が発生していたとしても分からなく なります。 ディスク・プロセスは 4096 バイトのブロックを全部 1 つの領域にグループ化し、2048 バイトのブロッ クを別の領域にグループ化することによって、キャッシュ・メモリのフラグメント化を防止します。各ブ ロック・サイズに使用されるキャッシュ・メモリの量は PUP SETCACHE コマンドで設定します。システ ム・ディスクの場合は、システムの操作担当者がシステム設定の時点で各ブロック・サイズに割り当てる キャッシュ・メモリ量を設定します。 ディスク・プロセスのキャッシュ・マネージャはキャッシュ・ブロック一覧(キャッシュ・ブロックの サイズごとの 1 つ)を保持し、その一覧の先頭には最も頻繁に使用されたブロックが記入され、使用頻度 の一番小さなブロックが一番下に記入されています。新しいブロックが必要になると、キャッシュ・マネー ジャは対応するリストの一番下にあるエントリを使用します。ブロックが使用されると、そのエントリは 一覧の一番上へ移動され、使用された最新のブロックとして位置づけられます。ブロックの使用に従い、 一覧上のそれぞれのエントリは下へ向かって徐々に移動して行くことになります。 インデックス・ブロックとビットマップ・ブロックはほかのデータ・ブロックよりも長い期間キャッシュ 上に保持されます。キャッシュ・マネージャはデータ・ブロックのエントリがリストの一番下に達すると 常にこれを他に利用しますが、インデックスとビットマップ・ブロックの場合にはリスト上を 2 回移動す るのを待ってから利用します。 この手法はすべてのアプリケーション環境で有効になっているため、無効にすることはできません。 137692J 4-13 シーケンシャル・ブロック・バッファリング ファイルの順次読み出しを行う場合は、ファイルをオープンするときにシーケンシャル・ブロック・バッ ファリングを有効設定しておくことにより、システムのオーバーヘッドを減らすことができます。ただし、 これが有効なのは読み出し用アクセスの場合だけです。 シーケンシャル・ブロック・バッファリングが実質的に行う作業は、ディスク・プロセスのレコード非 ブロック化バッファをアプリケーションのプロセス・ファイル・セグメント(PFS)へ移動させることで す。この結果、ENSCRIBE ソフトウェアは PFS バッファを使用してファイル・レコードの非ブロック化を 実行します。 シーケンシャル・ブロック・バッファリングが使用できない場合、ファイル・システムはディスク・プ ロセスに対してレコード単位で個別に要求を発行しなければなりません。このためレコードごとにプロセ ス間メッセージを送信しなけらばならず、環境が変化することになります。シーケンシャル・ブロック・ バッファリングが有効であれば、ブロック全体がディスク・プロセスから返され、PFS バッファに保管さ れます。1 つのブロックが PFS バッファに登録されると、ブロック内のレコードに対する以後の読み出し アクセスは(ディスク・プロセスではなく)ファイル・システムにより行われ、その結果としてハードウェ ア・ディスクへのアクセスやディスク・プロセスとの通信、環境の変化は起こりません。 シーケンシャル・ブロック・バッファリングを使用する場合は、通常、ファイルを保護、または排他ア クセスを指定してオープンする必要があります。共有アクセスを利用することも可能ですが、ある種の問 題が生じる可能性があります。 次の事象が発生するまで、バッファリングされたデータの読み込みはディスク・プロセスを使用しませ ん。 □ ブロックが走査され、その時点でディスク・プロセスが別のブロックを取り出した。 □ 期間中に FILE_SETPOSITION_, FILE_SETKEY_, POSITION, または KEYPOSITION が実行された。こ の場合、次回の READ 要求により新しいブロックが取り出されます。 □ 許可されていない要求(たとえば、READUPDATELOCK、READLOCK、READUPDATE、LOCKREC や書き込み要求)が指定された。この場合、通常プロセスの場合と同じように要求のあった単一レコー ドのみがディスク・ファイルからユーザー・プロセスへ読み出され、バッファはクリアされます。 考慮事項 シーケンシャル・ブロック・バッファリングが意味を持つのは構造化ファイルからの複数レコード順次 読み出しに対してだけであることに注意してください。ランダム読み出しや書き込みに対してシーケン シャル・バッファを使用しても利益は得られません。実際、書き込み操作を実行すると(この操作には必 ずディスク・プロセスが関与しますから)バッファは自動的にクリアされます。 シーケンシャル・ブロック・バッファリングではブロック内のレコードにかけられているロックをすべ て無視します。しかし、シーケンシャル・ブロック・バッファリングがブロックを最初にディスク・プロ セスから取り出す場合にはファイルへのロックを読み飛ばすことはありません。 ブロック・バッファから読み出されたレコードを変更する場合は、まず先行して FILE_SETPOSITION_、 FILE_SETKEY、POSITION、KEYPOSITION、READLOCK、または READUPDATELOCK 操作を実行 し、レコードを取り出します。これを行う前に、以下を確認します。 □ ブロックが読み出されて以来、ほかのユーザーによってレコードの変更、削除が行われていないことを 確認します。 4-14 137692J □ そのレコードがほかのプロセスによってロックされていないことを確認します。 □ 更新しようとするレコードをロックして、ほかのプロセスからのアクセスを禁止します。 FILE_OPEN_ パラメータ FILE_OPEN プロシージャでは、sequential-block-buffer と buffer-length パラメータがバッファ生成を規 定します。 ファイル・システムはバッファ・スペースを PFS から割りつけ、このとき sequential-block-buffer パラ メータは単にバッファ識別用の数値として機能します。バッファ・スペースが共有されないのであれば、 このパラメータは省略可能です。 buffer-length パラメータは以下の理由により、非常に重要な意味を持ちます。 □ このパラメータがゼロ、指定されない、または PFS で利用可能なスペースよりも大きな値であると、 オープン自体は成功しますが警告 5(シーケンシャル・バッファリングの提供に失敗)が返され、ブ ロック・バッファリングは使用されません。 □ ファイルのブロック・サイズ以上の値が指定されると、指定されたサイズに従ってバッファが作成され ます。 □ ゼロ以外のファイルのブロック・サイズを超えない値が指定されると、バッファ・サイズはブロック・ サイズと同じになります。たとえば、ブロック・サイズ 4096 のファイルが buffer-length パラメータと して 128 を指定されてオープンすると、実際にはブロック・サイズ 4096 のバッファが作成されます。 代替キー・ファイル 代替キーのアクセス・パスを使用しようとする場合、代替キー・ファイルのブロック・サイズが主キー・ ファイルのブロック・サイズよりも大きければ、もっと大きな buffer-lenth パラメータを使用してプライマ リ・ファイルをオープンします。 プライマリ・ファイルへのアクセスにシーケンシャル・ブロック・バッファリングを使用する場合は、 付随する代替キー・レコードのアクセスにもこれが使用されます。 ゼロ以外のキー指定子を使用して、FILE_SETKEY、または KEYPOSITION を実行すると、ディスク・ プロセスはこれに続く READ 要求に応じて代替キーファイルからバッファ領域にデータ・ブロックを取り 出します。続いて、ディスク・プロセスは主データ・ファイルからバッファ内の代替キーの指定を参照し て 1 つのレコードを取り出します。したがって、シーケンシャル・ブロック・バッファリングの利点と制 限は代替キー・ファイルの I/O には適用されますが、プライマリ・ファイルの I/O には適用されません。 共有ファイル・アクセス シーケンシャル・ブロック・バッファリングを使用する場合、ファイルをオープンするには、通常、保 護または排他アクセスを指定します。シーケンシャル・ブロック・バッファリングを共有アクセスと組み 合わせることも許されていますが、この組み合わせにより同時処理に関する問題が発生することに注意し てください。 別プロセスがブロック・バッファにコピーされたデータを更新していても、このバッファを使用してい るプロセスからは認識できないことがあります。たとえば、プロセス B がディスク上のブロックに新しい レコードを挿入している間にプロセス A がバッファリングされたデータのブロックを読み出しているとし ます。この新規レコードはプロセス A が読み出しているバッファには存在しません。プロセス A のユー ザーはプロセス B が挿入したレコードも認識していると考えるかもしれませんが、プロセス A が再びこの ブロックを読み出さない限り、新規レコードはバッファ上には存在しないことになります。 137692J 4-15 共有バッファ・スペース 同じ sequential-block-buffer を指定して FILE_OPEN_ を実行することにより、同一バッファ・スペース を 2 つ以上のファイルで共有することができます。これにより、大幅なメモリ消費の節約を実現できるア プリケーションもあります。 しかし、この機能を使用する場合には、最初にオープンされるファイルが最大のブロック・サイズを持 つか、または以後オープンされる最大ファイルをカバーできるように十分大きなバッファ・スペースを指 定してオープンされなければなりません。不十分なブロック・サイズで、すでにオープンされているバッ ファを共有しようとすると、ファイルのオープン操作自体は成功しても、警告 5(シーケンシャル・バッ ファリングの提供に失敗)が返され、ブロック・バッファリングは使用されません。 数個のファイルからデータ・ブロック全体を読み出すような場合に共有バッファは有効ですが、単一レ コードを読み出したり、読み出しのたびにファイルを切り替えるような応用では効率が良くありません。 これは、新しいファイルやランダム・レコードを読み出すたびにバッファが再度書きかえられるためです。 NonStop オペレーティング・システム上のファイルをオープンするときに sequential-block-buffer パラ メータを省略すると、そのファイルはバッファを共有できません。 ディスク・ファイルに適切な ACCESSTYPE パラメータを指定する それぞれのディスク・ファイルに付随して ACCESSTYPE パラメータが定義されています。このパラメー タはディスク・プロセスに対して、ファイルからの読み出し、書き込み時のバッファとキャッシュ・スペー スの使用法を指定する働きをします。このパラメータの設定と設定内容のチェックには SETMODE91 呼び 出しを使用します。 それぞれのアプリケーションのファイルに対して最適な ACCESSTYPE パラメータを選択することによ り、ディスク・プロセスのタスク実行効率を高めることができます。アクセス・モードには次のようなタ イプがあります。 □ ランダム・アクセス。ランダム・アクセスを指定すると、ディスク・プロセスは最低使用頻度(LRU) 法を使用してキャッシュ・スペースを再利用しようとします。この方式は頻繁に使用されるブロックを キャッシュに保持し、必要となるたびにディスクから読み取る頻度をできるだけ減らそうとします。 □ シーケンシャル・アクセス。シーケンシャル・アクセスを指定すると、ランダム・アクセスの場合と実 質的に同じ LRU アルゴリズムを使用しますが、使用頻度の少ないデータブロックを前者に比較してよ り早くキャッシュから取り除こうとします。シーケンシャル・アクセスでの最低使用頻度データ・ブ ロックがキャッシュに存在できる期間はランダム・アクセスの約半分です。この方式により、再使用さ れる可能性の低いデータ・ブロック用にキャッシュ・メモリが消費されことを防ぐことができます。 このタイプのアクセス法が適しているのは、2 つの状況が考えられます。 1 つは真にシーケンシャル処 理を必要とする場合であり、もう 1 つはかなり大型のファイルにランダムにアクセスする場合です。 □ システム管理アクセス。システム管理アクセスを指定すると、ディスク・プロセスはそれまでの使用例 からランダム・アクセスかシーケンシャル・アクセスかを判断し、それに従って処理を最適化しようと します。これがデフォルトのアクセスのタイプとなっています。 4-16 137692J □ ダイレクト I/O。ダイレクト I/O を指定すると、ファイルがライトスルー、非構造化アクセスモード(排 他的読み出し / 書き込み、または保護付き読み出し専用モード)でオープンされるとディスク・プロセ スはキャッシュ・メモリを完全に無視してバイパスします。このタイプのアクセスが有効なのは、たと えば、高速非構造アクセスが要求され、キャッシュ・メモリの使用による実質的メリットが得られない 場合です。 EOF ポインタの更新 各ファイルの EOF(ファイルの終わり)ポインタはメイン・メモリのファイル・コントロール・ブロッ クに保持されます。パフォーマンスを最大限にするために、EOF ポインタは必要な場合にだけファイルの ディスク・ラベルに書き込まれます。 ファイルのディスク・ラベルの更新がシステム効率を向上させるのは、ごく限られた条件下でのみです が、いくつかの項目については考慮に入れておく必要があります。ただし、TMF のオーディット対象ファ イルでは EOF が自動ロールバック機能で回復されますから、ここでの考慮事項は適用されません。 □ オープン・ファイルのバックアップが作成された場合、テープ上のファイル・ラベルのコピーは実際の ファイルの状態を反映していません。このようなファイルを呼び戻そうとするとエラーの原因になりま す。 □ ファイルがオープンされている状態でシステムがシャットダウン(各プロセッサはリセット)される と、ディスク上のファイル・ラベルの EOF ポインタは実際のファイルの状態を反映していません。 □ ファイルがオープンしたままの状態でシステム全体がダウンした場合(たとえば、メモリ・バックアッ プ可能な時間を超えた停電)、ディスク上のファイル・ラベルの EOF ポインタは実際のファイルの状態 を反映していません。 ENSCRIBE ファイルには自動更新機能が装備されているため、FUP ALTER コマンドや FILE_CREATE_ システム・プロシージャによりユーザーが有効 / 無効設定を指定できます。このオプションが有効設定さ れると、ファイル・ラベルに変更が生じるたびに、EOF ポインタ・フィールドを含むディスク・ラベルが 更新されます。この自動更新機能はキー順、キュー・ファイルでは常時オンに設定されており、REFRESH 設定は無視されます。 REFRESH ON オプションにより発生する追加 I/O は、処理のスループットを大幅に低下させる場合があ ります。このようなオーバーヘッド発生を回避したいアプリケーションでは、定期的に DISK_REFRESH_ プロシージャを実行してディスク上のファイル・ラベルの EOF ポインタを実際のファイルの状態に合わせ ることができます。REFRESH を実行すると、FCB に含まれる情報を付随するディスク・ボリュームのファ イル・ラベルに書き込みます。 REFRESH オプション設定には、PUP REFRESH コマンドも使用できます。REFRESH コマンドは、常 時オープン・ファイル(たとえば常駐プログラム)のバックアップ前の使用に適しています。一日のうち、 比較的システムが空いている時間帯(トランザクション処理が行われていない)を選んでシステム内のす べてのボリュームに REFRESH コマンドを実行します。これに続いてファイルのバックアップが実施され ると、バックアップ・テープ上のファイル・ラベルは各ファイルの実際の状態を正しく反映したものにな ります。 システム管理者はシステム全体のシャットダウンを開始する前に REFRESH コマンドを実行し、ディス ク上のすべてのファイル・ラベルがファイルの実際の状態を表わすようにします。 REFRESH オプションの種々の状態にかかわらず、アイドリング状態のディスク・プロセスは変更のあっ た EOF ポインタをディスク上のファイル・ラベルに定期的に書き込んで更新します。 137692J 4-17 データのパージ FUP PURGEDATA コマンド、および CONTROL プロシージャのデータ・パージ機能は、ポインタを相 対バイト 0 へ巻き戻して、ファイルから論理的に(物理的にではなく)すべてのデータを消去します。ま た、FILE_PURGE_ プロシージャ、または FUP コマンドの PURGE を使用してディスク・ディレクトリか らファイルを消去できます。 ENSCRIBE ファイルから論理的にデータを消去する方法には次の 4 通りがあります。 1. FUP PURGE コマンド 2. FILE_PURGE システム・プロシージャ 3. FUP PURGEDATA コマンド 4. CONTROL 20 システム・プロシージャ これらの方法はいずれも物理的にデータを消去するものではありません。いずれの方法も何種類かのポ インタを操作します。 □ ファイルが存在しないようにする(FUP PURGE コマンド、FILE_PURGE_ システム・プロシージャ) □ ファイルは存在するが、データを含まない状態にする(FUP PURGEDATA コマンド、CONTROL 20 システム・プロシージャ) 第 1 のケースでは、空いたファイル スペースを別のファイルに割り当てると、新しいファイルの所有者 は論理的に消去されたデータを読み取ることができます。セキュリティ上の理由から、これは回避する必 要があります。この問題を回避するには、ファイルをパージする前に CLEARONPURGE オプションを有 効設定しておきます。CLEARONPURGE を有効化するには、SETMODE1 システム・プロシージャ、また は FUP SECURE コマンドを使用します。この設定をしておくと、パージが実行された時点でファイルのす べてのデータは物理的に消去(ゼロで上書き)されます。CLEARONPURGE は、FUP PURGEDATA コマ ンドの実行には何の影響も及ぼしません。 たとえば、次の TAL コードは特定のファイルの現在のレコード、次のレコード、EOF ポインタを相対 バイト 0 にリセットし、ディスク上のファイル・ラベルの EOF ポインタを更新します。 LITERAL purgedata = 20; CALL CONTROL ( filenum, purgedata ); IF < THEN... このファイルは物理的にはまだ存在していますが、論理的には全くデータを含んでいません。 4-18 137692J CONTROL20 と連携させて CONTROL21 システム・プロシージャ(エクステントの割り当て / 割り当て 解除)を使用しても、ファイル・データを論理的に消去し、そのすべてのエクステントを解放できます。 LITERAL purgedata = 20, alloc^op = 21, dealloc = 0; CALL IF < CALL IF < CONTROL ( filenum, purgedata ); THEN ... CONTROL ( filenum, alloc^op, dealloc ); THEN ... このファイルはまだ存在していますが、論理的にはデータは含まれておらず、エクステントは解放(割 り当て解除)されています。 EOF ポインタがゼロ以上の相対バイトを指していても、CONTROL21 を使用すれば EOF を超える範囲 のエクステント・スペースを割り当て解除できます。 プログラムによるファイル・エクステント割り当て オープンしたファイルに対して CONTROL21 システム・プロシージャを使用して、複数のファイル・エ クステントを割り当てることができます。 たとえば、新規作成ファイルに 16 個のエクステントを割り当てるには、ファイルをオープンしてから CONTROL21 プロシージャ呼び出しを実行します。 LITERAL alloc^op = 21, max^ext = 16; CALL CONTROL ( filenum, alloc^op, max^ext ); IF < THEN ... 注意:ファイル・ラベルが一杯のため全部のエクステント割り当てが出来なかった場合は、エラー 43 が返されます。 プログラムによるファイル・エクステントの割り当て解除 CONTROL21 システム・プロシージャを使用すれば、EOF ポインタが現在指している範囲を超えて、任 意のファイル・エクステントの割り当てを解除できます。たとえば、ファイルが含む任意に未使用エクス テントの割り当てを解除するには、まずファイルをオープンしてから CONTROL21 プロシージャ呼び出し を実行します。 LITERAL alloc^op = 21, dealloc = 0; CALL CONTROL ( filenum, alloc^op, dealloc ); このファイルはまだ存在していますが、EOF の範囲を超えるすべてのファイル・エクステントの割り当 てが解除されました。 137692J 4-19 (空白ページ) 4-20 137692J 第 5 章 非構造化ファイル ENSCRIBE の非構造化ファイルは、ディスク上に作成されたバイト配列と考えることができます。配列 はバイト・アドレスのゼロからスタートし、EOF(ファイルの終わり)ポインタで指定されるバイト・ア ドレスまで順番に、連続的にアドレスが増えて行きます。この形式のファイルに対しては、ファイル・シ ステムはこれ以上何の制約も設けていません。データがどのようにレコードとしてグループ化されるか、 あるいはファイルの中でレコードをどのように配置するか、といった問題はすべてアプリケーション・プ ロセスの責任になります。 EDIT または TEDIT ユーティリティで作成されるファイルは構造化されていません。これらのファイル の構造はユーティリティ自体が決定するもので、ENSCRIBE ソフトウェアは関与しません。このような ファイルは、EDITREAD プロシージャ、シーケンシャル I/O(SIO)ルーチン、または EDIT、TEDIT で 読み出しできます。EDIT および TEDIT で作成されたファイルはファイル・コード 101 を持つことで識別 されます。 アプリケーションの設計者が非構造化ファイルを使用する典型例は、シーケンシャル・アクセスされる 固定長データ・レコードの排他(非共有)中間ファイルです。 非構造化ファイル内の特定のデータにアクセスするには、ENSCRIBE ソフトウェアが保持する相対バイ ト・アドレス(RBA)、またはアプリケーション・プロセスが READ[X]、WRITE[X、READUPDATE[X] などのシステム・プロシージャ呼び出し時に与える read-count、write-count パラメータを使用します。 使用できるシステム・プロシージャ ENSCRIBE 非構造化ファイルの作成とアクセスには次のシステム・プロシージャを使用します。 □ FILE_CREATE_、FILE_CREATELIST_ □ FILE_OPEN_、FILE_CLOSE_、AWAITIO[X] □ LOCKFILE、LOCKREC、UNLOCKFILE、UNLOCKREC □ FILE_SETPOSITION_、FILE_SAVEPOSITION_、FILE_RESTOREPOSITION_ □ READ[X]、READLOCK[X]、READUPDATE[X]、READUPDATELOCK[X] □ WRITE[X]、WRITEUPDATE[X]、WRITEUPDATEUNLOCK[X] □ FILE_GETINFO_、FILE_GETINFOLIST_、FILE_GETINFOBYNAME_、FILE_GETINFOLISTBYNAME_ □ SETMODE、CONTROL アクセスのタイプ 非構造化ファイルに使用されるアクセスには、シーケンシャル・アクセス、ランダム・アクセス、ファ イルの終わりへの追加の 3 種類があります。 シーケンシャル・アクセスでは、READ[X]、READLOCK[X]、および WRITE[X] 呼び出しを順次反復 して順次、高位のデータ・ブロックを操作します。ランダム・アクセスでは、FILE_SETPOSITION_ シス テ ム・プロ シー ジャ を使 用し て current-record、next-record ポ イン タの 内容 を明 示的 に操 作し ます。 FILE_SETPOSITION_ を使用すれば、next-record ポインタの内容を EOF 位置に変更(ファイルの終わりに レコードを追加するため)することもできます。これを実行するには、RBA に -1 を指定します。 137692J 5-1 非構造化ファイルの作成 ENSCRIBE の非構造化ファイルは、FUP(File Utility Program)で作成するか、FILE_CREATE_ または FILE_CREATELIST_ プロシージャを呼び出して作成します。また、DDL(Data Definition Language) コン パイラが作成する FUP コマンド・ファイルを利用することもできます。この方法では、DDL のソースに 記述された手順に従ってファイルが生成されます。非構造化ファイル作成の際は、ユーザーはバッファ・ サイズとディスク・コンテントについて考慮する必要があります。 バッファ・サイズ バッファ・サイズ属性は、ディスク・プロセスが非構造化ファイルをアクセスするときに使用する内部 バッファ・サイズを定義します。バッファ・サイズ属性が取り得る値は 512、1024、2048、4096 バイトの いずれかです。 FILE_CREATE_ プロシージャを使用してファイルを作成する場合は、blocken パラメータで内部バッ ファ・サイズを指定します。FILE_CREATELIST_ プロシージャでファイルを作成する場合は、 item- list 内のアイテム・コードとして 44 を使用して内部バッファ・サイズを指定します。 FUP を使用してファイルを作成する場合は、BUFFERSIZE パラメータにより必要なバッファ・サイズを 指定します。 ファイルをオープンすると、バッファ・サイズは自動的にファイル作成時に指定された値に設定されま す。 FUP ALTER コマンドの BUFFERSIZE コマンドを指定するか、または SETMODE93 プログラム実行中は、 プロシージャ呼び出しの param1 により、動的にバッファ・サイズを変更できます。 FUP ALTER コマンドはディスク上のファイル・ラベルに書き込まれている BUFFERSIZE パラメータの SETMODE93 を利用できるのは、FUP ALTER コマンド、または別の SETMODE93 値も変更します。ただし、 システム・プロシージャで設定を変更するか、またはファイルがクローズされるまでの間だけです。 無効なバッファ・サイズを指定した場合には、それに次ぐ値を持つ有効バッファ・サイズが使用されま す。デフォルトのバッファ・サイズは最大値である 4096 です。異なるバッファ・サイズを指定しても、デー タ形式には何の影響もありません。 バッファ・サイズが実質的に定義付けるのはデータ転送の物理単位であるため、物理的にデータを転送 する場合、最も効率が良いのは、データの始点がバッファ・サイズの境界と一致し、読み出し / 書き込み のカウント数がバッファ・サイズの整数倍になる場合です。 ディスク・プロセスが固定長キャッシュ管理方式を最も効率よく利用できるのは、バッファ・サイズが 予測される転送サイズと厳密に一致する場合です。たとえば、アプリケーションがデータの読み出し / 書 き込みを 1024 バイト単位、1024 バイト境界(つまり、最初のデータ・ブロックの RBA が 0 であり、2 番 目、3 番目 .. のデータブロックが 1023、2047、.. と進む場合)で処理するのが妥当であるならば、1024 が 最適バッファ・サイズです。 5-2 137692J たとえば、ディスク・プロセスでデフォルトのバッファ・サイズである 4096 を使用し、アプリケーショ ン側ではより自分に適した 1024 バイトのブロックでデータ転送するとします。 このような設定では、1024 バイトを書き込もうとするとディスク・プロセスはまず 4096 バイトのブロッ クを読み出し、キャッシュ・メモリ上でその中の 1024 バイトを変更し、それから 4096 バイトのブロック をディスクに書き戻します。ファイルが TMF のオーディットを受けているか、またはゼロ以外の同期深度 値でオープンされていれば、この書き込み操作が 4096 バイト・レコードの部分更新と見なされ、オーディッ ト・チェックポイント(AC)レコードも大きなものが作成されます。 バッファ・サイズを 1024 に指定し、書き込み、読み出しをすべて 1024 バイトの整数倍単位で実行すれ ば、1024 バイト・キャッシュの書き込みのためにディスクからの読み出しは必要なく、単に 1024 バイト が書き込まれるだけであり、AC レコードは関与しません。 ここで例を挙げた 2 つのケースのパフォーマンスは驚くほど違います。非構造化ファイルの処理では、 できるだけ、常にバッファ・サイズでの読み出しと書き込みをバッファ・サイズ境界と一致させて行って ください。 ディスク・エクステントのサイズ ENSCRIBE ファイルの作成時に、プライマリ・エクステトとセカンダリ・エクステントのサイズを指定 できます(形式 1 ファイルでは、1 ぺージ 2048 バイトとして 1 ∼ 65,535 ぺージ) 。さらに、ファイルに割 り当てるエクステントの最大数(パーティションされていない非構造化ファイルでは 16 以上)も指定でき ます。エクステントのサイズを指定しないと、プライマリ・エクステント、セカンダリ・エクステントは デフォルトの 1 ページに設定されます。 エクステントの最大数を指定しないと、MAXEXTENTS はデフォルト値 16 に設定されます。 パーティションされない非構造化ファイルでは、プログラム実行中にも SETMODE92 システム・プロ シージャ、または FUP ALTER コマンドを使用して MAXEXTENTS を動的に変更できます。 例 1: 非構造化ファイルの作成 非構造化ディスク・ファイルにアクセスする最も効率の良い方法は、バッファ・サイズ境界を始点とし てバッファ・サイズで読み出し、書き込みを行うことです。 次の例で作成するファイルは、512 バイトの固定長論理レコードを格納するように設計されています。ア プリケーション・プログラムが常に 512 バイトの整数倍で読み出し、書き込みを実行(これによりバッ ファ・サイズ境界と合わせる)するならば、バッファ・サイズを 512 バイトに設定したときにディスク・ プロセスの効率が最高になります。プライマリ・エクステントのサイズを 6250 ページ、セカンダリ・エク ステントのサイズを 2500 ページに設定すると、プライマリ・エクステントとセカンダリ・エクステントは それぞれ 25,000、10,000 個の 512 バイト論理レコードを格納できます。16 のエクステント全部が使用され ると、ファイル全体では 175,000 個のレコードを格納します。 137692J 5-3 この例では、ファイルをコード 1234 で識別するものとします。次の FUP コマンドを使用すればファイ ルを作成できます。 > volume $volume1.subvol1 > fup -set type u -set code 1234 -set ext (6250,2500) -set buffersize 512 -show TYPE U CODE 1234 EXT ( 6250 PAGES, 2500 PAGES ) BUFFERSIZE 512 MAXEXTENTS 16 -create datafile CREATED - $VOLUME1.SUBVOL1.DATAFILE FILE_CREATE_ プロシージャを使用してもファイルを作成できます。この場合は、アプリケーション・ モジュールの 1 つに次の TAL コードを含めます。 LITERAL name^length = 25, pri^extent = 6250, file^code = 1234, sec^extent = 2500, file^type = 0, buffer^size = 512; ! file type = unstructured INT error; INT filenum; INT namelen; STRING .filename [0:name^length-1] := "$VOLUME1.SUBVOL1.DATAFILE"; namelen := name^length; error := FILE_CREATE_ (filename:name^length, namelen, file^code, pri^extent, sec^extent, , file^type, , , buffer^size); 例 2: パーティション化された非構造化ファイルの作成 この例は、例 1 に示したのと同じファイルを作成しますが、最後に 4 つのパーティションへまたがる設 定を可能にしています。このファイルは次の FUP コマンドで作成します。 > volume $volume1.subvol1 > fup -set type u -set code 1234 -set ext (6250,2500) 5-4 137692J -set part (1,$volume2,6250,2500) -set part (2,$volume3,6250,2500) -set part (3,$volume4,6250,2500) -set buffersize 512 -show TYPE U CODE 1234 EXT ( 6250 PAGES, 2500 PAGES ) PART ( 1, $VOLUME2, 6250, 2500 ) PART ( 2, $VOLUME3, 6250, 2500 ) PART ( 3, $VOLUME4, 6250, 2500 ) MAXEXTENTS 16 BUFFERSIZE 512 -create datafile CREATED - $VOLUME1.SUBVOL1.DATAFILE 個々のパーティションは異なるディスク・ボリューム上に作成するようにしてください。ただし、ボ リューム内ではすべてのサブボリュームとファイルの名前(この例では SUBVOL1.DATAFILE)は同じに します。 4 つのパーティションは同時に作成します。 プライマリ・パーティション(#0)の 16 個のエクステントがすべて使用されると、ファイル・システム は自動的にパーティション #1 の使用を開始します。パーティション #1 の 16 個のエクステントがすべて使 用されると、ファイル・システムは次のパーティション #2 の使用を開始し、これを使いきると、さらに次 のパーティションへと進みます。 次に示す TAL コードをアプリケーション・モジュールの 1 つに含めることにより、FILE_CREATELIST_ プロシージャを使用してファイルを作成することもできます。 item^list の配列に出てくる項目の値は、value^list の中にも含まれていることに注意してください。これ らの項目の出現順は item^list と value^list とで一致していなければなりません。 LITERAL name^length = 25, num^partitions = 3, item^list^len = 9; INT error; INT error2; INT namelen; STRING .filename [0:name^length-1] := "$VOLUME1.SUBVOL1.DATAFILE"; INT .item^list [0:item^list^len-1]; STRUCT value^list; BEGIN INT file^type; INT file^code; INT block^len; INT pri^extent; INT sec^extent; 137692J 5-5 INT partitions; STRUCT part^info [0:num^partitions-1]; BEGIN INT part^pri^extent; INT part^sec^extent; END; STRUCT vol^name^len [0:num^partitions-1]; BEGIN INT vol^name^act^len; END; STRING vol^names [0:23]; END; ?NOLIST ?SOURCE $SYSTEM.ZSYSDEFS.ZSYSTAL(FILESYSTEM^ITEMCODES) ?SOURCE $SYSTEM.SYSTEM.EXTDECS0(FILE_CLOSE_, ? FILE_OPEN_, ? FILE_CREATELIST_, ? READ) ?LIST PROC DO^THE^WORK MAIN; BEGIN namelen := name^length; item^list ’:=’ [ZSYS^VAL^FCREAT^FILETYPE, ZSYS^VAL^FCREAT^FILECODE, ZSYS^VAL^FCREAT^BLOCKLEN, ZSYS^VAL^FCREAT^PRIMEXTENTSIZE, ZSYS^VAL^FCREAT^SCNDEXTENTSIZE, ZSYS^VAL^FCREAT^NUMPRTNS, ZSYS^VAL^FCREAT^PRTNDESC, ZSYS^VAL^FCREAT^PRTNVOLLEN, ZSYS^VAL^FCREAT^PRTNVOLNAMES]; value^list.file^type := 0; value^list.file^code := 1234; value^list.block^len := 512; value^list.pri^extent := 6250; value^list.sec^extent := 2500; value^list.partitions := 3; value^list.part^info[0].part^pri^extent := 6250; value^list.part^info[0].part^sec^extent := 2500; value^list.part^info[1].part^pri^extent := 6250; value^list.part^info[1].part^sec^extent := 2500; value^list.part^info[2].part^pri^extent := 6250; value^list.part^info[2].part^sec^extent := 2500; value^list.vol^name^len.vol^name^act^len[0] := 8; value^list.vol^name^len.vol^name^act^len[1] := 8; value^list.vol^name^len.vol^name^act^len[2] := 8; value^list.vol^names ’:=’ "$VOLUME2$VOLUME3$VOLUME4"; ERROR := FILE_CREATELIST_ (filename:name^length,namelen, item^list, item^list^len, value^list, $LEN(value^list), error2); END; 5-6 137692J 非構造化ファイルへのアクセス ここでは、ポインタと、非構造化ファイルに特有のさまざまなアクセス方法を説明します。 ファイル・ポインタ ENSCRIBE の非構造化ファイルには 3 種類のポインタが使用されます。 Current-record ポインタ 最新の読み出し、書き込みが実行された位置の RBA を指定します。 Next-record ポインタ 読み出し、書き込みが実行される次の位置の RBA を指定します。 EOF ポインタ ファイルに奇数構造化オプションが設定されていない場合、ファイルの最終 データ・バイトに続く偶数番号バイトの RBA を指定します。奇数構造化オプ ションが設定されている場合は、それが偶数バイトであるか奇数バイトである かに関わらず、最新のデータ・バイトの直後のバイトを指定します。 非構造化ファイルをオープンした時点では、current-record ポインタと next-record ポインタの両方とも ファイルの先頭バイト(RBA 0)を指しています。 非構造化ファイルをオープンするたびに、それぞれ独立した current-record と next-record ポインタが関 連付けられ、同一ファイルを同時に複数回オープンしたとしても、論理的には相互に独立したアクセスと して処理されます。この current-record と next-record ポインタはアプリケーション・プロセス環境内でファ イルの ACB(Access Control Block)に存在します。 ただし、1 つの EOF ポインタだけは同一非構造化ファイルの複数のオープンに共通して関連付けられま す。これにより、複数の異なるアクセスを実行してもファイルの終わりにデータを追加できるようになり ます。 EOF ポインタはディスク I/O プロセス環境内でファイルの FCB(File Control Block)に存在します。あ るファイルの EOF ポインタ値はそのファイルがオープンされるとき(そして、すでにオープン済みではな いとき)にディスク上のファイル・ラベルからコピーされます。システムはファイルの EOF ポインタの作 業用コピーを、関連するディスク・ボリュームを管理する主プロセスとバックアップ・プロセスの両方に 存在する FCB 上に保持します。 アドレス -1 を指定して FILE_SETPOSITION_ を呼び出すことにより、next-record ポインタの値を明示 的に EOF ポインタの値に変更できます。ファイルへの追加を実行すると、ファイルの終わりへ新レコード が追加書き込みされるたびに EOF ポインタは自動的に進められます。ただし、パーティション・ファイル の場合は、EOF ポインタはデータの存在する最後のパーティションにだけ関連付けられます。 ファイルの EOF ポインタは、ディスク上のファイル・ラベルに変更が加えられるたびに自動的に書き戻 しされるわけではありません。非構造化ファイルの場合、以下に列挙する事象のいずれかが発生した場合 にだけディスクへ物理的に書き込まれます:(1)ファイル・ラベル・フィールドが変更され、自動更新オ プションが有効設定されている、 (2)ファイルに最後にアクセスしたユーザーがファイルをクローズした、 (4)ファイルのボリュームに対し (3)ファイルに対して DISK_REFRESH_ プロシージャが呼び出された、 て REFRESH コマンドが実行された。 137692J 5-7 FILE_CREATE_ システム・プロシージャを使用してファイルを作成するときに、オプション・パラメー タのビット 10 を 1、または 0 に設定することにより自動更新機能をそれぞれ有効、無効に設定できます。 FUP を使用してファイルを作成する場合は、FUP CREATE コマンドの REFRESH または NO REFRESH を指定して自動更新機能をそれぞれ有効、無効に設定できます。 ファイルをオープンするとき、自動更新機能はそのファイル作成時の指定に従って有効、または無効に 設定されます。プログラム実行中に動的にこの機能を変更するには、REFRESH、または NO REFRESH を 指定して FUP ALTER コマンドを実行します。ただし、動的に設定された内容が有効なのは、次回の FUP ALTER コマンドで変更されるか、またはファイルがクローズされるまでの期間だけです。 表 5-7 で、システム・プロシージャの結果、これらのポインタがどのように設定されるかを示します。 この表に記載されている、count は読み出し、書き込みプロシージャ呼び出しにより指定される転送カウ ントです。ファイルが奇数非構造化ファイルの場合、count は転送されるバイト数を示します。ファイルが 偶数非構造化ファイルの場合、count は転送実行前に偶数値にまとめて処理されます。 表 5-7 ファイル・ポインタの動作 (1/2 ページ ) システム・プロシージャ ポインタ値 CONTROL (EOF 書き込み ) EOF ポインタ := next-record ポインタ;ファイル・ラベルの EOF ポ インタ := EOF ポインタ CONTROL ( データのパージ ) current-record ポインタ := next-record ポインタ := EOF ポインタ := 0; ファイル・ラベルの EOF ポインタ := EOF ポインタ CONTROL ( エクステントの割り ファイル・ポインタは変化しない。 ファイル・ラベルの EOF ポインタ := EOF ポインタ 当て / 割り当て解除 ) 5-8 FILE_CLOSE_ ( 最後 ) ファイル・ラベルの EOF ポインタ := EOF ポインタ FILE_CREATE_ ファイル・ラベルの EOF ポインタ := 0; FILE_CREATELIST ファイル・ラベルの EOF ポインタ := 0; FILE_OPEN_ ( 最初 ) EOF ポインタ := ファイル・ラベルの EOF ポインタ ; FILE_OPEN_ ( 全部 ) current-record ポインタ := next-record ポインタ := 0; FILE_SETPOSITION current-record ポインタ := next-record ポインタ := 相対バイト・アド レス ; READ[X] または READLOCK[X] current-record ポインタ := next-record ポインタ ; next-record ポインタ := next-record ポインタ +$min (count, EOF ポ インタ - next-record ポインタ ); READUPDATE[X] ファイル・ポインタは変化しない。 READUPDATELOCK[X] ファイル・ポインタは変化しない。 137692J 表 5-7 ファイル・ポインタの動作 (2/2 ページ ) システム・プロシージャ ポインタ値 WRITE[X] if next-record pointer = -1 then begin current-record pointer := EOF pointer; EOF pointer := EOF pointer + count; end else begin current-record pointer := next-record pointer; next-record pointer := next-record pointer +count; EOF pointer:= $max(EOF pointer, next-record pointer); end; WRITEUPDATE[X] ファイル・ポインタは変化しない。 WRITEUPDATEUNLOCK[X] ファイル・ポインタは変化しない。 記号 := は、「次の値に設定される」の意味。 $max は指定された 2 つの値の大きい方を使用することを意味する。 $min は指定された 2 つの値の小さい方を使用することを意味する。 シーケンシャル・アクセス READ[X]、READLOCK[X]、および WRITE[X] 操作は転送されたバイト数だけ next-record ポインタを インクリメントし、ファイルへの順次アクセスを可能にします。 ファイルが奇数非構造化ファイルである場合は、転送されたバイト数とポインタがインクリメントされ た量は、write count または read count パラメータで指定されるバイト数と一致します。ファイルが偶数非 構造化ファイルである場合は、転送が実行される前に write count、read count パラメータの値は偶数値にま とめられ、ファイル・ポインタはまとめられた値に合わせてインクリメントされます。 例 次に示すシステム・プロシージャの呼び出し手順は、非構造化ディスク・ファイルへシーケンシャル・ アクセスする場合のファイル・ポインタの使用方法を示しています。これらの例は、ファイル・オープン 後の最初の操作であることを仮定しています。 CALL READ ( filenum, buffer, 512 ); CALL READ ( filenum, buffer, 512 ); CALL WRITEUPDATE ( filenum, buffer, 512 ); CALL READ ( filenum, buffer, 512 ); 最初の READ は、相対バイト 0 で始まる指定のバッファへ 512 バイトを転送します。この READ 操作 が完了すると、next-record ポインタは相対バイト 512 を指し、current-record ポインタは相対バイト 0 を指 します。 137692J 5-9 2 番目の READ は相対バイト 512 から始まるバッファ領域に 512 バイトを転送します。この READ 操作 が完了した時点では、next-record ポインタは相対バイト 1024 を指しており、current-record ポインタは相 対バイト 512 を指しています。 次に、WRITEUPDATE プロシージャが読み込んだばかりのデータを、同じディスク位置にある新規デー タに入れ替えます。ファイル・システムはバッファからファイルの current-record ポインタ(相対バイト 512)が指す位置へ 512 バイトを転送します。WRITEUPDATE 操作は next-record と current-record ポイン タを変更しません。 3 番目の READ は相対バイト 1024 で始まるバッファ領域(next-record の示すアドレス)に 512 バイト を転送します。この READ 操作が完了した時点では、next-record は相対バイト 1536 を指し、current-record は相対バイトは 1024 を指しています。 シーケンシャル読み出しの途中で EOF に遭遇した場合 非構造化ファイル読み出しの途中で EOF 境界に遭遇すると、EOF 位置に至るまでのデータが転送され ます。これに続いて読み込み要求が発生した場合には、EOF を表わす値(条件コード CCG)が返され、 EOF を超えた位置の読み出しは許可されません。FILE_SETPOSITION_ 呼び出しを実行してポインタの位 置を変更しない限り、以後のすべての読み出し要求には EOF が返されます。 例として、図 5-12 に示すような、EOF が相対バイト 4096 の位置にある非構造化ファイルを考えてみま す。アプリケーション・プログラムは次に示す順序で相対バイト 0 の位置から 512 バイトの読み出しを行 うとします。 file^eof := 0; WHILE NOT file^eof DO BEGIN CALL READ ( filenum, buffer, 512, num^read, .. ); IF > THEN file^eof := 1 ELSE IF = THEN BEGIN ...process the data... END ELSE ... ! error END; 図 5-12 EOF 遭遇の例 5-10 137692J 最初の 8 回の READ 呼び出しは 512 バイトを指定されたバッファへ転送し、num^read として 512 を返 し、CCE へ条件コード(操作成功)を設定します。 しかし、9 回目の READ は失敗し、バッファへのデータ転送は行われず、num^read として 0 が返され、 CCG には EOF との遭遇を表わす条件コードが返されます。 読み出しカウントを 512 から 400 へ変更すると、同じ読み出しループを実行した結果は少し異なり、図 5-13 に示す結果が得られます。 このケースでは、最初の 10 回の READ 呼び出しはそれぞれ指定のバッファ領域へ 400 バイトを転送し、 num^read として 400 を返し、CCE へ条件コード(操作成功)を設定します。11 回目の READ は 96 バイ トをバッファへ転送し、num^read として 96 が返され、CCE に条件コードを設定します。12 回目の READ は失敗して CCG へ条件コードを設定します。 図 5-13 EOF 遭遇の例 (Short READ) ランダム・アクセス 明示的にファイル・ポインタを設定したい場合は、POSITION システム・プロシージャの relative-byteaddress パラメータを使用して ENSCRIBE の非構造化ファイルにアクセスします。たとえば、非構造化ファ イル内の相対バイト・アドレス 81920 にあるデータを更新するには次の一連の操作を実行します。 CALL FILE_SETPOSITION_ ( filenum, 81920F ); CALL READUPDATE ( filenum, buffer, 512 ); CALL WRITEUPDATE ( filenum, buffer, 512 ); FILE_SETPOSITION_ 呼び出しは current-record と next-record ポインタの両方を相対バイト 81920 にセッ トします。 WRITEUPDATE 呼び出しにより、ディスク・ファイルの相対バイト位置 81920 から始まる 512 バイト が指定されたバッファへ転送されます。この読み出し操作によってポインタは変化しません。 WRITEUPDATE プロシージャは今読み出したデータをディスク上の同じ位置にある新しいデータと入 れ替えます。ファイル・システムはバッファからファイルの相対バイト 81920 の位置へ 512 バイトを転送 します。この書き込み操作により、ファイル・ポインタが変更されることはありません。 137692J 5-11 ファイルの終わりへの追加 非構造化ファイルの終わりにデータを追加する場合にも FILE_SETPOINT_ プロシージャを使用できま す。next-record ポインタを EOF 位置に合わせるため、FILE_SETPOSITION_ 呼び出しの相対バイト・アド レス・パラメータへ ×1 を渡します。 CALL FILE_SETPOSITION_ ( filenum, -1F ); これで、next-record ポインタには -1 が入りました。これは、ファイル・システムに対して以後の WRITE 呼び出しがファイルの終わりの位置への追加書き込み実行を指示したことになります。 続く WRITE 呼び出し(FILE_SETPOSITION_ -1 の直後とする)はファイルの終わりに 512 バイトを追 加します。 CALL WRITE ( filenum, buffer, 512, num^written ); ファイル・システムは、指定のバッファから EOF が指している相対バイト・アドレスに 512 バイトを転 送します。WRITE 操作が完了すると EOF は 512 だけインクリメントされ、current-record ポインタは元の EOF を指し、next-record ポインタは依然として -1 を保持しています。続いて実行される WRITE はファイ ルの終わりへの追加を実行します。 5-12 137692J 第 6 章 キー順ファイル ENSCRIBE のキー順ファイルは可変長レコードから構成され、指定されたキー・フィールドの値を参照 してアクセスします。キーには主キーと代替キーの 2 種類があります。主キーはキー順ファイルのすべて のレコードにありますが、代替キーの使用は任意です。 主キー・フィールドはキー順ファイル作成時に指定されます。データ・レコード内の任意の連接するバ イト列を主キーとして指定できます。キー順ファイルの中で、レコードは主キー・フィールドに書かれた 値の論理的昇順に従って格納されます。 レコードの長さは可変であり、1 バイトからファイル作成時に指定される最大レコード・サイズまでの 範囲を取ることができます。キー順ファイルの最大レコード・サイズはブロック・サイズから 32 を引いた 値です。レコードに対して割り当てられるバイト数は、そのレコードがファイルに挿入された時点で書き 込まれたバイト数と同じです。それぞれのレコードは長さ属性を持ち、レコード読み出し時に取り出すこ ともできます。レコード挿入後もサイズの変更は可能です。ただし、指定された最大レコード・サイズを 超えることはできません。キー順ファイルのレコードは削除できます。 各レコードが部品を表わしている在庫ファイルが、アプリケーション環境におけるキー順ファイルの良 い例となります。多くの場合、在庫ファイルの主キー・フィールドとしてパーツ番号が使用されるので、 ファイルはパーツ番号順に並べられます。ほかのフィールドに販売業者名や現在の在庫量などを入れて、 フィールドを代替キーに指定できます。ENSCRIBE ソフトウェアが関与するのは、キー・フィールドだけ です。つまり、レコード内のほかのフィールドの内容や位置関係はアプリケーション側の責任範囲になり ます。 使用できるシステム・プロシージャ ENSCRIBE のキー順ファイルを作成し、アクセスするには以下のシステム・プロシージャを使用します。 □ FILE_CREATE_、FILE_CREATELIST_ □ FILE_OPEN_、FILE_CLOSE_、AWAITIO[X] □ LOCKFILE、LOCKREC、UNLOCKFILE、UNLOCKREC □ FILE_SETKEYPOSITION_、FILE_SAVEPOSITION_、FILE_RESTOREPOSITION、KEYPOSITION、 SAVEPOSITION、REPOSITION □ READ[X]、READLOCK[X]、READUPDATE[X]、READUPDATELOCK[X] □ WRITE[X]、WRITEUPDATE[X]、WRITEUPDATEUNLOCK[X] □ FILE_GETINFO_、FILE_GETINFOLIST_、FILE_GETINFOBYNAME_、 FILE_GETINFOLISTBYNAME_ □ SETMODE、CONTROL 137692J 6-1 アクセスのタイプ キー順ファイルには、シーケンシャル・アクセスまたはランダム・アクセスを使用します。たとえば、 在庫ファイルに部品の全在庫量レポートを作成する場合には、シーケンシャル・アクセスが適しています。 特定の部品のベンダーを調べる場合には、ランダム・アクセスが適しています。 主キーを利用してキー順ファイルから読み出しを行う場合、1 回ごとの READ 操作により順次高位の主 キー値をもつレコードを取り出されます。同様に、代替キーを利用して読み出す場合も、それぞれの READ 操作により、指定された代替キーフィールド値が段々と大きくなる順に従ってそのキーを含むレコードを 取り出されます。 FILE_SETKEY、または KEYPOSITION システム・プロシージャは、ユーザーがどのアクセス・パス (主キー、または指定された代替キー)を利用し、どのフィールド値からスタートするかを指定します。 FILE_SETKEY_ や KEYPOSITION で指定しなければ、アクセスは主キーで実行され、ファイルの先頭 レコードからスタートします。 プログラム実行中に FILE_SETKEY_ や KEYPOSITION を実行して、アクセス・パスや現在レコード・ ポインタを動的に変更できます。 キー順ツリー構造 キー順ファイルはビットマップ・ブロック、およびインデックス・ブロックとデータ・ブロックの B ツ リー構造として物理的に構成されます。図 6-14 はキー順ファイルのツリー構造の例を示します。ファイル 内のビットマップ・ブロックは構造化ファイルの空きスペースを組織化して管理します。 個々のデータ・ブロックは 1 つのヘッダと 1 つまたは複数のデータ・レコードを含み、その数はレコー ド・サイズとデータブロック・サイズに依存します。個々のデータブロックにはインデックス・ブロック へのエントリがあり、その中にデータブロック内の先頭レコードのキー・フィールド値、およびそのデー タブロックのアドレスが含まれます。、 キー順ファイルに新規挿入されるレコードの位置は、その主キーの値で決定します。新規レコードを挿 入するブロックにスペースの余裕がなければ、ブロックの分割が行われます。これに伴い、ディスク・プ ロセスは新規データ・ブロックを割り当て、元のブロックからデータの一部を新しいブロックへ移動させ、 インデックス・ブロックへは新しいデータ・ブロックへのポインタを与えます。 インデックス・ブロックが一杯になった場合にも同じように分割が起こり、新規インデックス・ブロッ クが割り当てられてポインタの一部が元のインデックス・ブロックから新しいインデックス・ブロックに 移動します。ファイル内でこれが最初に起こると、ディスク・プロセスはインデックスに新しいレベルを 設けなければなりません。ディスク・プロセスはより高位のインデックス・ブロックを割り当てて、これ に低位キーと下の 2 レベルのインデックス・ブロックへのポインタを含めます。これらの下位ブロックは 順次さらに多くのデータ・ブロックを指示します。最高レベル・ブロックが分割されるたびに、ディスク・ プロセスはこの作業を繰り返さなければなりません。 ディスク・プロセスは 3 方向ブロック分割を行い、2 つの新規ブロックを作成して元のブロックのデー タ、またはポインタ(および、新規レコードやポインタ)を 3 つのブロック間で分配することがあります。 大きなレコード・サイズを使用する場合は、ブロック・サイズも大きな値を使用します。ブロック・サ イズが小さすぎて数個のレコードしか収容できない場合は、ブロック分割が頻繁に起こって、ディスク・ スペースの利用効率が悪くなり、パフォーマンスを低下させます。 6-2 137692J 一般的に、変更中のデータベースでは、ほとんどのブロックが任意の時点で 2/3 程度の占有率になりま す。FUP LOAD コマンドを使用してデータをキー順ファイルに読み込ませるときに、将来の拡張のために どの程度の空きスペースを与えるか指定できます。 図 6-14 キー順 B ツリー構造 ENSCRIBE のキー順ファイルではデータ・レコードの連鎖接続ができません。代わりに、ツリー構造の 平衡を動的に再調整することにより、ファイル内のすべてのレコードへ同じ回数の READ 操作でアクセス できるようにしてあります。READ 操作の必要回数はインデックスのレベル数にデータ・ブロック用に 1 を加えたものです。 137692J 6-3 キー順ファイルの作成 ENSCRIBE の入力順を作成するには、FUP(File Utility Program)を使用するか、または FILE_CREATE_ プロシージャや FILE_CREATELIST_ プロシージャを呼び出します。これに加えて、DDL(Data Definition Language) コンパイラを使用して FUP のコマンド・ファイルを作成し、これを実行して DDL ソースに記 述された方式に従ってファイルを作成できます。 FUP を使用して代替キー・フィールドを持つファイルを作成すれば、FUP は必要などの代替キー・ファ イルも自動的に作成します。しかし、プログラムによってファイルを作成しようとする場合は、必要とな る代替キー・ファイル(それぞれの代替キー・フィールドに対して 1 つ)をユーザー自身が作成しなけれ ばなりません。 キー順ファイルの作成では、最大論理レコード・サイズ、データ・ブロックの長さ、ディスク・エクス テントのサイズ、主キーのオフセットと長さ、キー圧縮、およびインデックス短縮を考慮する必要があり ます。 論理レコード 論理レコードはアプリケーション・プログラムとファイル・システム間の情報転送の単位です。 キー順ファイルを作成するときは、そのファイルに対する最大論理レコード長を指定します。ファイル 作成時に選択する最大レコード・サイズは、各アプリケーションの要求に依存します。 キー順形式 1 ファイル 論理レコードは、ブロック・サイズ -34 バイトまでの値を取ることができます。 キー順形式 2 ファイル 論理レコードは、ブロック・サイズ -56 バイトまでの値を取ることができます。 最大許容ブロック・サイズ 4096 を使用すると、キー順ファイルに許される論理レコード・サイズの絶対 最大値は 4062 バイトとなります。 キー順ファイルに書き込むデータ・レコードにはいろいろな長さのものがあります。しかし、どのレコー ドも、ファイル作成時に指定された最大論理レコード・サイズを超えることはできません。定義済みの最 大レコード長を超えた長さのレコードを書き込もうとすると、ファイル・システムは実行を拒絶し、エラー 21(illegal count)を返します。 ブロック ブロックはディスク・プロセスとディスク間(または、シーケンシャル・ブロック・バッファリングを 使用している場合は、ディスク・プロセスとプロセス・ファイル・セグメント間)で転送される情報の単 位です。ブロックは論理レコードにより構成され、キー順ファイルの場合はこれに制御情報が付随します。 システムが利用するこの制御情報は付録 B「構造化ファイルのブロック形式」にまとめられています。 6-4 137692J ENSCRIBE キー順ファイルのブロック・サイズは、512、1024、2048、または 4096 バイトのいずれか になります。 レコード長がどれくらいであるかにかかわらず、単一ブロックに保存できるレコードの最大数は、形式 1 ファイルの場合 511 までとなります。形式 2 ファイルの場合は、ブロックとレコードのサイズにより制 限を受けます。 1 つのレコードが複数のブロック境界にまたがることはできません。つまり、あるブロックで始まって 別のブロックで終了することはできません。したがって、キー順ファイルのブロック・サイズは少なくと も次の値を持ちます。 □ 形式 1 ファイル:レコード長 + 2 + 32 バイト □ 形式 2 ファイル:レコード長 + 4 + 52 バイト キー順ファイルでは、ディスク・プロセスはファイルのインデックス・ブロックのサイズ(FUP SET コ マンドの IBLOCK パラメータ)とデータ・ブロック(FUP SET コマンドの BLOCK パラメータ)が同じ であることを要求します。このため、IBLOCK にどのような値が設定されていたとしても、キー順ファイ ル作成時にディスク・プロセスはこの値を無視して代わりに BLOCK に設定された値(BLOCK、IBLOCK の共通値として)を使用します。 ブロック・サイズを選択する場合は、インデックス・ブロックを長くするとキャッシュ・バッファ上に より多くのスペースが必要になりますが、同時にインデックス付けレベルを減らすことができ、ディスク へのアクセス回数を減らすことができます。 キー順ファイルのブロック・サイズは、レコード・サイズとの関連、特にキー・サイズとの関連で大き く取り、レコードがファイルに挿入されて行ったときのブロック分割回数を減少させるようにします。ま た、データ・ブロックが大きいということは、ブロックあたりのデータ・レコード数が増えるため、イン デックス・レコードとインデックス・ブロックが少なくなることを意味します。 ディスク・エクステントのサイズ ENSCRIBE ファイル作成時に次の項目を指定できます。 □ プライマリ・エクステントとセカンダリ・エクステントのサイズ(形式 2 ファイルでは 1 ∼ 536,870,912 ページ、形式 1 では 1 ∼ 65,535 ページ。1 ページは 2048 バイト。) □ ファイルに割り当てるエクステントの最大数(キー順ファイル、およびその任意のパーティションに対 し 16 以上) □ 明示的に形式 2 ファイルを使用する場合は、FILE_CREATELIST_ item 195 を使用しなければなりませ ん。それ以外の場合にシステムが形式 2 ファイルを選択するのは、ブロック・サイズが 4K を超えるか、 またはパーティションのサイズが 1MB ∼ 2GB の範囲を超える場合だけです。 エクステント・サイズを指定しないと、プライマリ・エクステント、セカンダリ・エクステントはデフォ ルト設定で 1 ページになります。 エクステントの最大数を指定しないと、MAXEXTENTS はデフォルトで 16 になります。 キー順ファイルとその任意のパーティションでは、SETMODE92 システム・プロシージャまたは FUP ALTER コマンドを使用して、プログラム実行中に動的に MAXEXTENTS を変更できます。 137692J 6-5 主キー キー順ファイルでは、レコード内で主キー・フィールドが始まるオフセット位置とキー・フィールドの 長さを指定します。主キー・フィールドのオフセットを選択するときは、次の事項を考慮してください。 □ 主キー・フィールドはレコード内の任意の位置からスタートでき、次の条件を越えなければ長さも任意 となります。 □ $min( レコード長 - オフセット値 , 255) □ データ・ブロック内でキー圧縮を使用する場合、主キー・フィールドはレコードの先頭になるようにし ます。 □ 主キー・フィールドをレコードの最終フィールドに設定した場合は、キーは可変長になります。 □ キー・フィールドを文字列(STRING)以外のタイプのデータ型として取り扱うのであれば、オフセッ トがワード境界と一致するように設定します。 キー順ファイルでは、レコード配置用に使用する照合順序は ASCII コード(実際は符号なしバイナリ) によります。このため、キー・フィールドのデータ型がバイナリである場合は、符号ビットがあるために 負数であるべきデータが正数として処理されます。 キー圧縮 ファイル作成時に、データまたはインデックス・ブロック内でのキー圧縮の有無を指定できます。 ENSCRIBE ソフトウェアは、1 つのキーと次のキーで重複する先頭文字列を削除し、それに代えて重複 文字数を記入した 1 バイトを記入します。たとえば、データ圧縮を有効設定した状態で次の 3 個のレコー ドをファイルに挿入すると: JONES, JANE JONES, JOHN JONES, SAM 実際にディスクに書き込まれる内容は次のようになります。 0JONES, JANE 8OHN 7SAM 先頭文字(それぞれ 0,8,7)は先頭からの文字の中で、直前の主キーと一致する文字の数です。 FUP を使用してファイルを作成する場合は、DCOMPRESS、ICOMPRESS、および COMPRESS パラ メータを SET コマンドに与えることにより、キー圧縮が適用される範囲をそれぞれデータ・ブロック、イ ンデックス・ブロック、または両方に設定できます。FILE_CREATE_ プロシージャを使用してファイルを 作成する場合は、オプション・パラメータの第 11、第 12 ビットによりどのタイプのキー圧縮を使用する か(あるいはキー圧縮を使用しないか)を指定します。FILE_CERATELIST_ プロシージャを使用する場合 はアイテム・コード 68、69 によってキー圧縮を指定します。 6-6 137692J □ キー圧縮を使用する場合は、レコードあたり 1 バイト余分に必要となります。また、キー圧縮を使用す ると、圧縮されたレコードを展開するシステム処理が余分に必要になります。 □ キー圧縮を使用する場合は、主キー・フィールドは各レコード内のオフセット [0] から始まらなければ なりません。したがって、レコード全体が主キー・フィールドである場合を除き、可変長の主キーは使 用することはできません。 □ レコードの主キー値同士の類似性がかなり高い場合は、データ・ブロックのキー圧縮が有効です。 □ 連続するブロックの先頭レコードの主キー値の類似性が高い値を持つ場合に、レコード同士の類似性も 高いのであれば、インデックス・ブロックでのキー圧縮が有効です。 □ 代替キー・ファイルでは複数の代替キーが類似の値を持つ場合が多いので、データ・ブロックでのキー 圧縮が有効です。 インデックス短縮 キー圧縮の設定とは無関係に、すべてのインデックス・レコードをよりコンパクトにまとめるため、別 のメカニズムが自動的に使用されます。キーの先頭部分を圧縮するキー圧縮とは異なり、インデックス短 縮は類似レコードの終わりの部分を削除します。 キー順ファイルのインデックス・ブロックには、各ブロック(データ、またはインデックス)ごとに、 そのツリーの下側にインデックス・レコードが存在します。このインデックス・レコードは、そのブロッ クの最初の主キー値と直前のブロックの最後の主キー値を比較して作成します。2 個のキーの先頭 N バイ トが一致すれば、ブロック開始キーの先頭 N + 1 バイトをインデックス・レコードとして使用します。例 として次の 4 個のデータ・ブロックを考えてみます。 ALLEN, HARRYFRASER, IANJONES, JOHNLARIMER, JO ARKIN, ALANGAULT, WILLYKILMER, JOYCELORE, KEVIN :: : : EICHER, DAVEHAM, JACK LAINE, LOISMAILER, NORM FRANKLIN, BENJONES, JANELANSON, SAMMARNER, SID 実際にディスクに書き込まれるのは次の 3 個のインデックス・レコードです。 FRAS JONES, JO LAR 137692J 6-7 ファイルの作成例 以下に、コメント付きの例題で次のファイル作成方法を説明します。 1. キー順ファイル 2. 代替キーを持つキー順ファイル 3. 代替キーを持つ形式 2 のキー順ファイル 4. 代替キー・ファイル 5. パーティション化されたキー順ファイル 例 1: キー順ファイルの作成 この例は、個々のレコードに顧客名でアクセスするクレジット・ファイルの作成方法を示します。 レコード形式は次のとおりです。 レコード・サイズは 150 であるため、ブロック・サイズとして 2048 を選択すると、ブロックあたりの レコード数を示すブロック・ファクタは 13 になります。 N =(ブロック・サイズ− 32) / (レコード・サイズ+ 2) 13 =(2048 - 32) /(150 + 2) プライマリ・エクステント・サイズを 5000 ページ、セカンダリ・エクステント・サイズを 2000 に設定 すると、プライマリ・エクステントには 65,000 のクレジット・レコードが格納され、それぞれのセカンダ リ エクステントは 26,000 のクレジット・レコードを格納できます。すべてのエクステントを均等に利用す ると、ファイル全体では 455,000 個のクレジット・レコードを格納できます。 主キーの長さは 34 バイトです。 ファイルの識別にはファイル・コード 1000 を使用し、データブロックとインデックス・ブロック両方で のキー圧縮を有効にします。次の FUP コマンドを使用して、このファイルを作成できます。 > volume $store1.svol1 > fup -set type k -set code 1000 -set ext (5000,2000) -set rec 150 -set block 2048 -set compress -set keylen 34 6-8 137692J -show TYPE K CODE 1000 EXT ( 5000 PAGES, 2000 PAGES ) REC 150 BLOCK 2048 IBLOCK 2048 KEYLEN 34 KEYOFF 0 DCOMPRESS, ICOMPRESS -create myfile CREATED - $STORE1.SVOL1.MYFILE FILE_CREATE_ システム・プロシージャを使用すれば、次のような TAL コードをアプリケーション・ モジュールの 1 つに入れて、ファイルを作成できます。 このコードには、ボリューム名とノード名は指定されていません。FILE_CREATE_ はこれらの名前を =_DEFAULTS DEFINE の VOLUME 属性の現在値から取得します。=_DEFAULTS DEFINE の詳細につい ては、『TACL プログラミング・ガイド』を参照してください。 LITERAL name^length = 12, pri^extent = 5000, file^code = 1000, sec^extent = 2000, file^type = 3, options = %30, !data compression rec^len = 150, data^block^len = 2048, key^len = 34, key^offset = 0; INT error; INT namelen; STRING .filename [0:name^length-1] := "SVOL1.MYFILE"; namelen := name^length; error := FILE_CREATE_ (filename:name^length, namelen, file^code, pri^extent, sec^extent,, file^type, options, rec^len, data^block^len, key^len, key^offset); IF Error <> 0 THEN ... 137692J ! error 6-9 例 2: 代替キーを持つキー順ファイルの作成 この例は、キー順の在庫管理のファイルを作成する方法を説明しています。主キーはパーツ番号であり、 格納場所コードとベンダ番号を代替キーとして使用します。 このファイルを作成するには、次の FUP コマンドを使用します。 volume $store1.svol1 fup -set type k -set code 1001 -set ext (32,8) -set rec 54 -set block 4096 -set keylen 2 -set altkey ("LO",keyoff 42,keylen 4) -set altkey ("VN",keyoff 46,keylen 8) -set altfile (0,invalt) -show TYPE K CODE 1001 EXT ( 32 PAGES, 8 PAGES ) REC 54 BLOCK 4096 IBLOCK 4096 KEYLEN 2 KEYOFF 0 ALTKEY ( "LO", FILE 0, KEYOFF 42, KEYLEN 4 ) ALTKEY ( "VN", FILE 0, KEYOFF 46, KEYLEN 8 ) ALTFILE ( 0, $STORE1.SVOL1.INVALT ) ALTCREATE -create inv CREATED - $STORE1.SVOL1.INV CREATED - $STORE1.SVOL1.INVALT FILE_CREATELIST_ システム・プロシージャを使用すれば、次のような TAL コードをアプリケーショ ン・モジュールの 1 つに入れて、ファイルを作成できます。 プロシージャ呼び出しの中ではボリューム名、サブボリューム名、およびノード名を指定していません。 FILE_CREATELIST_はこれらの名前を =_DEFAULTS DEFINE のVOLUME 属性の現在値から取得します。 ?NOLIST ?SOURCE $SYSTEM.ZSYSDEFS.ZSYSTAL(FILESYSTEM^ITEMCODES) ?SOURCE $SYSTEM.SYSTEM.EXTDECS0(FILE_CLOSE_, 6-10 137692J ? ? ? ?LIST FILE_OPEN_, FILE_CREATELIST_, READ) PROC DO^THE^WORK MAIN; BEGIN LITERAL name^length = 3, num^altkeys = 2, num^altkey^files = 1, item^list^len = 13; INT error; INT error2; INT namelen; STRING .filename [0:name^length-1] := "INV"; INT .item^list [0:item^list^len-1]; STRUCT value^list; BEGIN INT file^type; INT file^code; INT rec^len; INT block^len; INT key^offset; INT key^length; INT pri^extent; INT sec^extent; INT altkeys; STRUCT altkey^descr [0:num^altkeys-1]; BEGIN STRING key^specifier [0:1]; INT key^length; INT key^offset; INT key^filenum; INT null^value; INT attributes; END; INT num^alt^key^files; STRUCT name^length^info [0:num^altkey^files-1]; BEGIN INT file^name^len; END; STRING file^names [0:5]; END; namelen := name^length; item^list ’:=’ [ZSYS^VAL^FCREAT^FILETYPE, ZSYS^VAL^FCREAT^FILECODE, ZSYS^VAL^FCREAT^LOGICALRECLEN, ZSYS^VAL^FCREAT^BLOCKLEN, 137692J 6-11 ZSYS^VAL^FCREAT^KEYOFFSET, ZSYS^VAL^FCREAT^KEYLEN, ZSYS^VAL^FCREAT^PRIMEXTENTSIZE, ZSYS^VAL^FCREAT^SCNDEXTENTSIZE, ZSYS^VAL^FCREAT^NUMALTKEYS, ZSYS^VAL^FCREAT^ALTKEYDESC, ZSYS^VAL^FCREAT^NUMALTKEYFILES, ZSYS^VAL^FCREAT^ALTFILELEN, ZSYS^VAL^FCREAT^ALTFILENAMES ]; value^list.file^type := 3; ! キー順 value^list.file^code := 1001; value^list.rec^len := 54; value^list.block^len := 4096; value^list.key^offset := 0; value^list.key^length := 2; value^list.pri^extent := 32; value^list.sec^extent := 8; value^list.altkeys := num^altkeys; value^list.altkey^descr[0].key^specifier ’:=’ "LO"; value^list.altkey^descr[0].key^length := 4; value^list.altkey^descr[0].key^offset := 42; value^list.altkey^descr[0].key^filenum := 0; value^list.altkey^descr[0].null^value := 0; value^list.altkey^descr[0].attributes := 0; value^list.altkey^descr[1].key^specifier ’:=’ "VN"; value^list.altkey^descr[1].key^length := 8; value^list.altkey^descr[1].key^offset := 46; value^list.altkey^descr[1].key^filenum := 0; value^list.altkey^descr[1].null^value := 0; value^list.altkey^descr[1].attributes := 0; value^list.num^alt^key^files := num^altkey^files; value^list.name^length^info[0].file^name^len := 6; value^list.file^names ’:=’ "INVALT"; ERROR := FILE_CREATELIST_ (filename:name^length,namelen, item^list, item^list^len, value^list, $LEN(value^list), error2); END; システム・プロシージャを使用してキー順ファイルを作成する場合は、代替キー・ファイルは別々に作 成します。この章後半の「キー順ファイルへのアクセス」を参照してください。 例 3: 代替キーを持つ形式 2 のキー順ファイル作成 この例で作成するファイルは例 2 と同じものですが、形式 2 ファイルとして作成する点が異なります。 このファイルを作成するには、次の FUP コマンドを使用します。 volume $store1.svol1 fup 6-12 137692J -set type k -set code 1001 -set ext (32,8) -set format 2 -set rec 54 -set block 4096 -set keylen 2 -set altkey ("LO",keyoff 42,keylen 4) -set altkey ("VN",keyoff 46,keylen 8) -set altfile (0,invalt) -show TYPE K FORMAT 2 CODE 1001 EXT ( 32 PAGES, 8 PAGES ) FORMAT 2 REC 54 BLOCK 4096 IBLOCK 4096 KEYLEN 2 KEYOFF 0 ALTKEY ( "LO", FILE 0, KEYOFF 42, KEYLEN 4 ) ALTKEY ( "VN", FILE 0, KEYOFF 46, KEYLEN 8 ) ALTFILE ( 0, $STORE1.SVOL1.INVALT ) ALTCREATE -create inv CREATED - $STORE1.SVOL1.INV CREATED - $STORE1.SVOL1.INVALT FILE_CREATELIST_ システム・プロシージャを使用すれば、次のような TAL コードをアプリケーショ ン・モジュールの 1 つに入れて、ファイルを作成できます。 プロシージャ呼び出しの中ではボリューム名、サブボリューム名、およびノード名を指定していません。 FILE_CREATELIST_はこれらの名前を =_DEFAULTS DEFINE のVOLUME属性の現在値から取得します。 ?NOLIST ?SOURCE $SYSTEM.ZSYSDEFS.ZSYSTAL(FILESYSTEM^ITEMCODES) ?SOURCE $SYSTEM.SYSTEM.EXTDECS0(FILE_CLOSE_, ? FILE_OPEN_, ? FILE_CREATELIST_, ? READ) ?LIST PROC DO^THE^WORK MAIN; BEGIN LITERAL name^length = 3, num^altkeys = 2, num^altkey^files = 1, item^list^len = 14; INT error; INT error2; 137692J 6-13 INT namelen; STRING .filename [0:name^length-1] := "INV"; INT .item^list [0:item^list^len-1]; STRUCT value^list; BEGIN INT file^type; INT file^code; INT rec^len; INT block^len; INT key^offset; INT key^length; INT pri^extent; INT sec^extent; INT fileformat; !format 2 INT altkeys; STRUCT altkey^descr [0:num^altkeys-1]; BEGIN STRING key^specifier [0:1]; INT key^length; INT key^offset; INT key^filenum; INT null^value; INT attributes; END; INT num^alt^key^files; STRUCT name^length^info [0:num^altkey^files-1]; BEGIN INT file^name^len; END; STRING file^names [0:5]; END; namelen := name^length; item^list ’:=’ [ZSYS^VAL^FCREAT^FILETYPE, ZSYS^VAL^FCREAT^FILECODE, ZSYS^VAL^FCREAT^LOGICALRECLEN, ZSYS^VAL^FCREAT^BLOCKLEN, ZSYS^VAL^FCREAT^KEYOFFSET, ZSYS^VAL^FCREAT^KEYLEN, ZSYS^VAL^FCREAT^PRIMEXTENTSIZE, ZSYS^VAL^FCREAT^SCNDEXTENTSIZE, ZSYS^VAL^FCREAT^FILEFORMAT, !format 2 ZSYS^VAL^FCREAT^NUMALTKEYS, ZSYS^VAL^FCREAT^ALTKEYDESC, ZSYS^VAL^FCREAT^NUMALTKEYFILES, ZSYS^VAL^FCREAT^ALTFILELEN, ZSYS^VAL^FCREAT^ALTFILENAMES ]; value^list.file^type := 3; value^list.file^code := 1001; value^list.rec^len := 54; 6-14 ! キー順 137692J value^list.block^len := 4096; value^list.key^offset := 0; value^list.key^length := 2; value^list.pri^extent := 32; value^list.sec^extent := 8; value^list.fileformat := 2; ! 形式 2 value^list.altkeys := num^altkeys; value^list.altkey^descr[0].key^specifier ’:=’ "LO"; value^list.altkey^descr[0].key^length := 4; value^list.altkey^descr[0].key^offset := 42; value^list.altkey^descr[0].key^filenum := 0; value^list.altkey^descr[0].null^value := 0; value^list.altkey^descr[0].attributes := 0; value^list.altkey^descr[1].key^specifier ’:=’ "VN"; value^list.altkey^descr[1].key^length := 8; value^list.altkey^descr[1].key^offset := 46; value^list.altkey^descr[1].key^filenum := 0; value^list.altkey^descr[1].null^value := 0; value^list.altkey^descr[1].attributes := 0; value^list.num^alt^key^files := num^altkey^files; value^list.name^length^info[0].file^name^len := 6; value^list.file^names ’:=’ "INVALT"; ERROR := FILE_CREATELIST_ (filename:name^length,namelen, item^list, item^list^len, value^list, $LEN(value^list), error2); END; システム・プロシージャを使用してキー順ファイルを作成する場合は、代替キー・ファイルは別々に作 成しなければなりません。この章後半の「キー順ファイルへのアクセス」を参照してください。 137692J 6-15 例 4: 代替キー・ファイルの作成 FUP でプライマリ・ファイルを作成すると、FUP は必要な代替キー・ファイルもすべて自動的に作成し てくれます。しかし、プログラムでプライマリ・ファイルを作成する場合は、ほかの操作で自分で代替 キー・ファイルを作成する必要があります。 例 2 の代替キー・ファイルは、次の TAL コードをアプリケーション・モジュールの 1 つに入れて作成で きます。 プロシージャ呼び出しの中ではボリューム名、サブボリューム名、およびノード名を指定していません。 FILE_CREATE_ はこれらの名前を =_DEFAULTS DEFINE の VOLUME 属性の現在値から取得します。 LITERAL name^length = 6, pri^extent = 32, file^code = 1002, sec^extent = 8, file^type = 3, rec^len = 12, data^block^len = 4096, options = %10, ! データ圧縮 key^len = 12, ! 最大代替キー長 ! + 主キー長 ! + 2 key^offset = 0; INT error; INT namelen; STRING .filename [0:name^length-1] := "INVALT"; namelen := name^length; error := FILE_CREATE_(filename:name^length, namelen, file^code, pri^extent, sec^extent,, file^type, options, rec^len, data^block^len, key^len, key^offset); IF Error <> 0 THEN ... ! エラー 例 5: パーティションされたキー順ファイルの作成 この例は、6 個のパーティションにまたがるキー順ファイルの作成方法を説明します。レコード形式は 例 1 の場合と同様です。 6-16 137692J このファイルは 6 個のボリューム上にあり、次の方法でパーティションされています。 先頭の 文字は次の Names 2Whose First Two Letters are in the Range: 範囲にある名前: 次のボリューム上 Reside On: に存在する: 00 . . $PART0 DA . . $PART1 HA . . $PART2 LA . . $PART3 PA . . $PART4 TA . . $PART5 616 FUP を使用してファイルを作成する場合は、パーティション作成を記述するために SET PART コマンド を含めます。 > volume $part0.svol1 > fup -set type k -set code 1000 -set ext (50,20) -set rec 150 -set block 4096 -set keylen 34 -set part (1,$part1,50,20,"DA") -set part (2,$part2,50,20,"HA") -set part (3,$part3,50,20,"LA") -set part (4,$part4,50,20,"PA") -set part (5,$part5,50,20,"TA") -show TYPE K CODE 1000 EXT ( 50 PAGES, 20 PAGES ) PART ( 1, $PART1, 50 PAGES, PART ( 2, $PART2, 50 PAGES, PART ( 3, $PART3, 50 PAGES, PART ( 4, $PART4, 50 PAGES, PART ( 5, $PART5, 50 PAGES, 137692J 20 20 20 20 20 PAGES, PAGES, PAGES, PAGES, PAGES, "DA") "HA") "LA") "PA") "TA") 6-17 REC 150 BLOCK 2048 IBLOCK 2048 KEYLEN 34 KEYOFF 0 -create custfile CREATED - $PART0.SVOL1.CUSTFILE FILE_CREATELIST_ システム・プロシージャを使用しているときにパーティションを作成する場合は、 パーティション情報を値配列に置いてください。アイテム・リストには適切な値コードをセットします。 次の TAL コードは 6 個のボリュームにまたがるキー順ファイルを作成します。 ?NOLIST ?SOURCE $SYSTEM.ZSYSDEFS.ZSYSTAL(FILESYSTEM^ITEMCODES) ?SOURCE $SYSTEM.SYSTEM.EXTDECS0(FILE_CLOSE_, ? FILE_OPEN_, ? FILE_CREATELIST_, ? READ) ?LIST PROC DO^THE^WORK MAIN; BEGIN LITERAL name^length = 26, num^partitions = 5, item^list^len = 14; INT error; INT error2; INT namelen; STRING .filename[0:name^length-1]:= "\SYS.$PART0.SVOL1.CUSTFILE"; INT .item^list [0:item^list^len-1]; STRUCT value^list; BEGIN INT file^type; INT file^code; INT rec^len; INT block^len; INT key^offset; INT key^length; INT pri^extent; INT sec^extent; INT partitions; STRUCT part^info [0:num^partitions-1]; BEGIN INT part^pri^extent; INT part^sec^extent; END; STRUCT vol^name^len [0:num^partitions-1]; BEGIN 6-18 137692J INT vol^name^act^len; END; STRING vol^names [0:29]; INT part^part^key^len; STRING part^part^key^val [0:9]; END; namelen := name^length; item^list ’:=’ [ZSYS^VAL^FCREAT^FILETYPE, ZSYS^VAL^FCREAT^FILECODE, ZSYS^VAL^FCREAT^LOGICALRECLEN, ZSYS^VAL^FCREAT^BLOCKLEN, ZSYS^VAL^FCREAT^KEYOFFSET, ZSYS^VAL^FCREAT^KEYLEN, ZSYS^VAL^FCREAT^PRIMEXTENTSIZE, ZSYS^VAL^FCREAT^SCNDEXTENTSIZE, ZSYS^VAL^FCREAT^NUMPRTNS, ZSYS^VAL^FCREAT^PRTNDESC, ZSYS^VAL^FCREAT^PRTNVOLLEN, ZSYS^VAL^FCREAT^PRTNVOLNAMES, ZSYS^VAL^FCREAT^PRTNPARTKEYLEN, ZSYS^VAL^FCREAT^PRTNPARTKEYVAL ]; value^list.file^type := 3; value^list.file^code := 1000; value^list.rec^len := 150; value^list.block^len := 4096; value^list.key^offset := 0; value^list.key^length := 34; value^list.pri^extent := 50; value^list.sec^extent := 20; value^list.partitions := 5; value^list.part^info[0].part^pri^extent := 50; value^list.part^info[0].part^sec^extent := 20; value^list.part^info[1].part^pri^extent := 50; value^list.part^info[1].part^sec^extent := 20; value^list.part^info[2].part^pri^extent := 50; value^list.part^info[2].part^sec^extent := 20; value^list.part^info[3].part^pri^extent := 50; value^list.part^info[3].part^sec^extent := 20; value^list.part^info[4].part^pri^extent := 50; value^list.part^info[4].part^sec^extent := 20; value^list.vol^name^len.vol^name^act^len[0] := 6; value^list.vol^name^len.vol^name^act^len[1] := 6; value^list.vol^name^len.vol^name^act^len[2] := 6; value^list.vol^name^len.vol^name^act^len[3] := 6; value^list.vol^name^len.vol^name^act^len[4] := 6; value^list.vol^names ’:=’ "$PART1$PART2$PART3$PART4$PART5"; value^list.part^part^key^len := 2; value^list.part^part^key^val ’:=’ "DAHALAPATA"; ERROR := FILE_CREATELIST_ (filename:name^length,namelen, item^list, item^list^len, value^list, $LEN(value^list), error2); END; 137692J 6-19 値配列のバイト・カウントについては、『システム・プロシージャ・コール・リファレンス・マニュア ル』を参照してください。 キー順ファイルへのアクセス 以下の項目では、EOF(ファイルの終わり)ポインタと ENSCRIBE キー順ファイルにアクセスする方法 について説明します。 EOF(ファイルの終わり)ポインタ EOF ポインタはそれぞれのファイルのディスク・ファイルに付随し、ファイルを多重オープンすると共 有されます。キー順ファイルの場合には、このポインタは現在データを格納している最後(最上位アドレ ス)のブロックに続くバイトの相対バイト・アドレスを保持しています。キー順ファイルでは、利用され ているブロックに挟まれて空白ブロックも存在します。キー順ファイルにデータを追加する場合は、間に 空白ブロックは存在しないため、EOF はブロック追加のたびにインクリメントされます。 システムは関連するディスク・ボリュームを管理するプライマリ・プロセスとバックアップ・システム・ プロセスの両方に存在するファイル・コントロール・ブロック(FCB)に該当ファイルの EOF ポインタの 作業コピーを保持します。ENSCRIBE キー順ファイルの場合、次のいずれかの事象が発生すると、EOF ポ インタは物理的にディスクに書き込まれます。 ● ファイル・ラベル・フィールドが変更された。 ● 最後のアクセスによってファイルがクローズされた。 ● ファイルに対して DISK_REFRESH_ システム・プロシージャが呼び出されるか、またはファイルの ボリュームに対して REFRESH コマンドが実行された。 シーケンシャル・アクセス シーケンシャル処理を実行するには、READ と READLOCK システム・プロシージャを使用します。こ の処理では、レコードの関連するサブセットをカレント・アクセス・パス内の昇順に従って読み出します。 サブセットを構成するレコードは、ファイルの位置決めモード(APPROXIMATE、GENERIC、EXACT) の現在の設定に従って指定されます。サブセットはファイルの全部、または一部であり、場合によっては 空白であることもあります。サブセット内の最後のレコードを超えて読み出しを実行しようとした場合、 および空白サブセットを読み出そうとすると EOF 指示が返されます。 ファイルのオープンや位置決め操作に続いて行われる最初の READ や READLOCK 呼び出しは、現在位 置のレコード(存在する場合)を読み出します。これ以降(途中で位置決めすることなしに)READ や READLOCK を呼び出すと指定されたサブセットの後続レコード(もし存在すれば)が順次読み出されて 返されます。 それぞれの READ や READLOCK の実行後は、返されたレコードの位置が現在位置になります。 ランダム・アクセス ランダム・アクセス処理を実行するには、READUPDATE、WRITEUPDATE、READUPDATELOCK、 および WRITEUPDATEUNLOCK システム・プロシージャを使用します。更新操作は現在位置が指定する レコード内で発生します。ランダム処理が可能であるためには、更新の対象となるレコードが必ず存在し なければなりません。現在位置に全くレコードが存在しない場合(この場合にはカレント・キー値がカレ ント・キー指定子が指定するキー・フィールドの値と完全に一致します)には、ファイル・システムはエ ラー 11(record not found)を返します。 6-20 137692J WRITEUPDATE と WRITEUPDATEUNLOCK のどちらを使用してもレコードの主キーを変更すること はできません。主キーを変更したい場合は、まず該当レコードを削除してから、新しいキー値を持つレコー ドを(WRITE 呼び出しにより)再挿入します。 FILE_SETKEY_ や KEYPOSITION 呼び出しの直後に(一意でない代替キーが設定されている状態で) 更新やロック設定を実行しようとすると、更新やロックは失敗してエラー 46(invalid key)が返されます。 しかし、操作の途中で READ や READLOCK を実行しておけば、更新やロック操作は許されます。 レコード挿入 レコード挿入を行うには、WRITE システム・プロシージャを使用します。挿入実行のためには、挿入操 作が実行されている期間中に同じ主キー値を持つレコードがほかにあってはなりません。したがって、そ のようなレコードがある場合、エラー 10(duplicate record)により操作が失敗します。 ある代替キーが一意であると宣言されているにもかかわらず、その代替キー・フィールドに重複した値 を持つレコードを挿入しようとすると、エラー 10(duplicate record)により操作が失敗します。 キー順ファイルでは、空白レコードの挿入(WRITE 呼び出しにおける書き込みカウントパラメータがゼ ロ)は無効となります。 挿入しようとするレコードの長さは、ファイルに対して定義されているレコード長以下でなければなり ません。超えた場合は、エラー 21(invalid count)により失敗します。 レコード削除 レコードを削除するには、書き込みカウントをゼロとして WRITEUPDATE、または WRITEUPDATEUNLOCK システム・プロシージャを使用します。レコードの削除は、常にファイルの現 在位置に対して実行されます。 現在の主キー値 キー順ファイルの現在の主キー値は、実行された最新の READ や READLOCK 操作、あるいは、主キー を利用して実行する FIEL_SETKEY_ や KEYPOSITION 操作に付随する主キーから取得されます。 キー順ファイルをオープンした後で、最初の読み出し操作や FILE_SETKEY_、KEYPOSITION 呼び出 しの前であるならば、主キーの値はファイルの先頭レコードの主キー値に一致します。 137692J 6-21 アクセス例 ここからのアクセス例は、次の顧客レコード定義を使用します。 TAL が使用する顧客レコード宣言は次のとおりです。 LITERAL name^len = 34, address^len = 100, region^len = 2; STRUCT customer^record (*); BEGIN STRING cust^name [0:name^len - 1]; ! 名前 STRING cust^address [0:address^len - 1]; ! アドレス STRING cust^region [0:region^len - 1]; ! 地域 ! NO = 北 ! SO = 南 ! EA = 東 ! WE = 西 FIXED (2) cust^curbal; ! 現在の借り入れ残高 FIXED (2) cust^limit; ! 上限金額 END; STRUCT .cust^rec (customer^record); 6-22 137692J CUSTOMER ファイルの内容は次のとおりです。 例 1: 現在位置の動作 次の TAL コード例は主キー値 ROGERS によって位置決めする方法を示します。 ! キーを空白にセット key ’:=’ " "; key[1] ’:=’ key FOR name^len - 1 BYTES; key ’:=’ "ROGERS"; CALL KEYPOSITION ( cust^filenum, key); 137692J 6-23 読み出し操作を順次呼び出すことにより、次図の影を施さないレコードが次に示す順序でアクセスされ ます。 次に示す TAL コードは、RG アクセス・パス内の代替キー値 NO による位置決めの方法を示します。 ! キーを空白にセット key ’:=’ " "; key[1] ’:=’ key FOR name^len - 1 BYTES; key ’:=’ "NO"; CALL KEYPOSITION ( cust^filenum, key, "RG"); 6-24 137692J 読み出し操作を順次呼び出すことで、次の図のグレーになっていない部分のレコードが次に示す順序で アクセスされます。 例 2: オープン後の主キーによる APPROXIMATE サブセット 次に示す TAL コードはプライマリ・データ・ファイルをオープンし、 続いて読み出しループを実行します。 INT error; INT .cust^filename[0:11], cust^filenum; error := FILE_OPEN_(cust^filename:name^length, cust^filenum); cust^eof := 0; WHILE NOT cust^eof DO BEGIN ! 読み出しループ CALL READ (cust^filenum, cust^rec, $LEN(cust^rec) ); IF > THEN cust^eof := 1 ELSE IF < THEN ... ! エラー ELSE BEGIN ! レコードを処理する ... 137692J 6-25 END; END; ! 読み出しループ OPEN 呼び出しからループ実行の間で位置決めが行われていないため、アクセスは主キー値に従って、 ファイルの先頭レコードから行われます。サンプル・ファイルには 11 個のレコードが格納されています。 読み出しループは 12 回反復されます。初めの 11 回はレコードを返し、条件コードに処理の成功を意味す る CCE をセットします。12 回目の読み出しでは、レコードは返されずに、EOF との遭遇を意味する CCG を条件コードにセットします。 次の図は、ループ内で実行される読み出し操作の結果を分かりやすく図示してあります。 6-26 137692J 例 3: 代替キーによる APPROXIMATE サブセット 次に示す TAL コードは、RG アクセス・パス内の代替キー値 EA による APPROXIMATE 位置設定の方 法を示します。 ! キーを空白にセット key ’:=’ " "; key[1] ’:=’ key FOR name^len - 1 BYTES; ! 地域フィールドに EA を含む最初のレコードに位置決め key ’:=’ "EA"; CALL KEYPOSITION ( cust^filenum, key, "RG" ); cust^eof := 0; WHILE NOT cust^eof DO BEGIN ! 読み出しループ CALL READ (cust^filenum, cust^rec, $LEN(cust^rec) ); IF > THEN cust^eof := 1 ELSE IF < THEN ... ! エラー ELSE BEGIN ! レコードの処理 ... END; END; ! 読み出しループ KEYPOSITION 呼び出しは現在位置をプライマリ・データ・ファイルの先頭レコードに設定します。そ のレコードの地域(RG)フィールドの値は EA です。代替キー・アクセス・パス RG に従ってアクセスを 実行します。 読み出しループの中では、プライマリ・データ・ファイルの中で RG フィールドに EA、またはそれ以降 の値を持つすべてのレコードをアクセスします。RG フィールドに同じ値を持つレコードが複数存在する場 合、これらのレコードは主キー値の昇順に従ってアクセスされます。各読み出し操作の呼び出しでは、デー タ・レコードを返すことに加えて、操作成功を意味する CCE を条件コードにセットしています。 137692J 6-27 読み出しループの最終回では、データは返されずに、EOF との遭遇を意味する CCG を条件コードにセッ トしています。次の図は、ループ内で実行される読み出し操作の結果を分かりやすく図示してあります。 6-28 137692J 例 4: 主キーによる GENERIC サブセット 次に示す TAL コードは、主キー値 BROWN を使用して GENERIC 位置設定を実行する方法を示します。 ! キーに空白をセット key ’:=’ " "; key[1] ’:=’ key FOR name^len - 1 BYTES; key ’:=’ "BROWN"; compare^len := 5; generic = 1; CALL KEYPOSITION ( cust^filenum , key , , compare^len , generic ); cust^eof := 0; WHILE NOT cust^eof DO BEGIN ! 読み出しループ CALL READ (cust^filenum, cust^rec, $LEN(cust^rec) ); IF > THEN cust^eof := 1 ! ファイル終わり ELSE IF < THEN ... ! エラー ELSE BEGIN ! レコードの処理 : END; END; ! 読み出しループ KEYPOSITION 呼び出しは現在位置をプライマリ・データ・ファイルの先頭レコードに設定します。そ の主キー・フィールドの先頭 5 文字は BROWN という値を持っています。アクセスは主キー・アクセス・ パスに従って実行されます。 読み出しループの中では、プライマリ・データ・ファイルの中で主キー・フィールドの先頭 5 文字が BROWN に一致するすべてのレコードに順次アクセスします。この GENERIC サブセットの中では、主キー 値の昇順に従ってレコードがアクセスされます。各読み出し操作の呼び出しでは、データ・レコードを返 すことに加えて、操作成功を意味する CCE を条件コードにセットしています。 読み出しループの最終回では、データは返されずに、EOF との遭遇を意味する CCG を条件コードにセッ トしています。次の図は、ループ内で実行される読み出し操作の結果を分かりやすく図示してあります。 137692J 6-29 例 5: 主キーによる EXACT サブセット 次に示す TAL コードは、主キー値 SMITH を使用して EXACT 位置設定を実行する方法を示します。 ! キーに空白をセット key ’:=’ " "; key[1] ’:=’ key FOR name^len - 1 BYTES; key ’:=’ "SMITH"; exact = 2; CALL KEYPOSITION ( cust^filenum, key, , , exact ); cust^eof := 0; WHILE NOT cust^eof DO BEGIN ! 読み出しループ CALL READ (cust^filenum, cust^rec, $LEN(cust^rec) ); IF > THEN cust^eof := 1 ! ファイル終わり ELSE IF < THEN ... ! エラー ELSE BEGIN ! レコードの処理 : END; END; ! 読み出しループ KEYPOSITION 呼び出しは現在位置をプライマリ・データ・ファイルの先頭レコードに設定します。そ の主キー・フィールドの先頭 5 文字は SMITH という値を持っています。アクセスは主キー・アクセス・パ スに従って実行されます。 主キー値による EXACT 位置設定では、プライマリ・データ・ファイルの中でアクセスされるレコード は、KEYPOSITION 呼び出し後の現在位置にあるレコードの 1 つだけです。 読み出しループは 2 回しか実行されません。第 1 回目のループでは、読み出し操作は指定のデータ・レ コードを読み出し、それと同時に操作成功を意味する CCE を条件コードにセットします。第 2 回目のルー プではデータは返されずに、EOF との遭遇を意味する CCG を条件コードにセットします。 次の図は、ループ内で実行される読み出し操作の結果を分かりやすく図示してあります。 6-30 137692J 例 6: 非エンティティ代替キーによる GENERIC サブセット 次に示す TAL コードは、RG アクセス・パス内の代替キー値 NO を使用して GENERIC 位置設定を実行 する方法を示します。 ! キーに空白をセット key ’:=’ " "; key[1] ’:=’ key FOR name^len - 1 BYTES; key ’:=’ "NO"; generic = 1; CALL KEYPOSITION ( cust^filenum, key, "RG",, generic ); cust^eof := 0; WHILE NOT cust^eof DO BEGIN ! 読み出しループ CALL READ (cust^filenum, cust^rec, $LEN(cust^rec) ); IF > THEN cust^eof := 1 ! ファイル終わり ELSE IF < THEN ... ! エラー ELSE BEGIN ! レコードの処理 : END; END; ! 読み出しループ KEYPOSITION 呼び出しは現在位置をプライマリ・データ・ファイルの先頭レコードに設定します。そ の地域(RG)フィールドの先頭 2 文字は NO という値を持っています。アクセスは代替キー・アクセス・ パス RG に従って実行されます。 読み出しループの中では、プライマリ・データ・ファイルの中で RG フィールドの先頭 2 文字が NO に 一致するすべてのレコードをアクセスします。この GENERIC サブセットの中では、レコードは主キー値 の昇順に従ってアクセスされます。各読み出し操作の呼び出しでは、データ・レコードを返すことに加え て、操作成功を意味する CCE を条件コードにセットしています。 読み出しループの最終回では、データは返されずに、EOF との遭遇を意味する CCG を条件コードにセッ トしています。次の図は、ループ内で実行される読み出し操作の結果を分かりやすく図示してあります。 137692J 6-31 例 7: キー順ファイルへのレコード挿入 次に示す TAL コードは、キー順のプライマリ・データ・ファイルにレコードを挿入する方法を示します。 ! 顧客レコードの消去 cust^rec ’:=’ " " & cust^rec FOR $LEN(cust^rec) -1 BYTES; ! 新データを cust^rec へ代入 cust^rec.cust^name ’:=’ "HEATHCLIFF"; cust^rec.cust^address ’:=’ "PORTLAND, OR."; cust^rec.cust^region ’:=’ "WE"; cust^rec.cust^curbal := 0.00F; cust^rec.cust^limit := 500.00F; ! 新レコードをディスクへ書き込む CALL WRITE (cust^filenum, cust^rec, $LEN(cust^rec) ); IF <> THEN ... ! エラー 挿入後の customer ファイルは次のようになります。 6-32 137692J 例 8: ランダム更新 次の例は、1 つのレコードを選択して、そのレコード内の 1 つのフィールドを変更する方法を示します。 KEYPOSITION 呼び出しは主キー・フィールドの値が HARTLEY であるレコードに現在位置をセットし ます。READUPDATE 呼び出しはデータ・レコードをアプリケーションのバッファに読み出しますが、こ のときファイル・ポインタは変化しません。 ! キーを空白にセット key ’:=’ " "; key[1] ’:=’ key FOR name^len - 1 BYTES; key ’:=’ "HARTLEY"; CALL KEYPOSITION (cust^filenum, key); IF <> THEN ... CALL READUPDATE (cust^filenum, cust^rec, $LEN(cust^rec) ); IF <> THEN ... ディスクから読み出されてアプリケーション・バッファに書かれたデータ・レコードの内容は次のとお りです。 次の TAL コード例はアプリケーション・バッファに書かれた現在の収支バランス・フィールドを変更 し、更新されたレコードをディスクに書き込みます。このときファイル・ポインタは変更されません。 : cust^rec.cust^curbal := cust^rec.cust^curbal + 30.00F : CALL WRITEUPDATE (cust^filenum, cust^rec, $LEN(cust^rec) ); IF <> THEN ... アプリケーション・バッファからディスク・ファイルへ書き込まれた内容は次のとおりです。 137692J 6-33 例 9: 存在しないレコードのランダム更新 この例では存在しないレコードを更新します。KEYPOSITION プロシージャはインデックス検索を実行 しませんから、存在しないレコードへのアクセスは次に READUPDATE 呼び出しを実行するまで認識され ません。 プライマリ・データ・ファイルの最初の 4 個のレコードは次のとおりです。 次に示す TAL コード例は、現在位置を主キー・フィールドの値が BROWN.C を含むデータ・レコード に設定し、次の更新操作のためにそのレコードをアプリケーション・バッファに読み出そうとします。 ! キーに空白をセット key ’:=’ " "; key[1] ’:=’ key FOR name^len - 1 BYTES; key ’:=’ "BROWN,C"; exact := 2; CALL KEYPOSITION (cust^filenum, key, , , exact ); IF <> THEN ... CALL READUPDATE (cust^filenum, cust^rec, $LEN(cust^rec) ); IF < THEN BEGIN status := FILE_GETINFO_ (cust^filenum, error); IF error = 11 THEN ... ! レコードが見つからない : END; 存在しないレコードを読み出そうとすると、条件コード CCL とファイル・システム・エラー・コード 11 により失敗します。 6-34 137692J 例 10: 主キーによるシーケンシャル読み出しと更新 次の TAL コード例は、現在の limit フィールドの値が >=1000.00 かつ < 2000.00 であるあらゆるレコー ドを検索し、limit フィールドの値を 2000.00 に変更します。 ! 主キーにより、最初のレコードに位置決め compare^len := 0; CALL KEYPOSITION ( cust^filenum, key, , compare^len); cust^eof := 0; WHILE NOT cust^eof DO BEGIN ! 読み出しループ CALL READ ( cust^filenum, cust^rec, $LEN(cust^rec) ); IF > THEN cust^eof := 1 ! ファイル終わり ELSE IF < THEN ... ! エラー ELSE BEGIN ! レコードの処理 IF cust^rec.cust^limit >= 1000.00F AND cust^rec.cust^limit < 2000.00F THEN BEGIN cust^rec.cust^limit := 2000.00F; CALL WRITEUPDATE (cust^filenum, cust^rec, $LEN(cust^rec) ); IF < THEN ... ! エラー END; END; END; ! 読み出しループ 137692J 6-35 次の図は、該当するフィールドがすべて更新された状態の顧客ファイルを示します。 6-36 137692J 例 11: レコード削除 次の例は、主キーの値が EVANS であるデータ・レコードを検索して削除する方法を示します。 次の図は顧客ファイル内の該当部分の削除実行前を示します。 ! キーに空白をセット key ’:=’ " "; key[1] ’:=’ key FOR name^len - 1 BYTES; key ’:=’ "EVANS"; CALL KEYPOSITION (cust^filenum, key); CALL WRITEUPDATE (cust^filenum, cust^rec , 0); IF <> THEN ... ! エラー 次の図は顧客ファイル内の該当部分の削除実行後を示します。 137692J 6-37 例 12: 主キーを使用したシーケンシャル読み出しと削除 次の TAL コード例は、 主キーの値に従って顧客ファイルを読み出し、その中で現在の借り入れ残高フィー ルドの値が 0.00 であるレコードをすべて削除します。 ! 主キーにより、先頭レコードに位置決め compare^len := 0; CALL KEYPOSITION ( cust^filenum, key, , compare^len); cust^eof := 0; WHILE NOT cust^eof DO BEGIN ! 読み出しループ CALL READ ( cust^filenum, cust^rec, $LEN(cust^rec) ); IF > THEN cust^eof := 1 ! ファイル終わり ELSE IF < THEN ... ! エラー ELSE BEGIN ! レコードの処理 IF cust^rec.cust^curbal = 0.00F THEN BEGIN CALL WRITEUPDATE ( cust^filenum, cust^rec, 0 ); IF < THEN ... ! エラー : END; END; END; ! 読み出しループ 次の図は、該当するレコードがすべて削除された後の顧客ファイルの内容を示します。 6-38 137692J 例 13: リレーショナル処理 次の例は、あるファイルのレコードの中のフィールド値を使用して別のファイルのレコードにアクセス する、リレーション処理を示します。 この例は次の 4 個のファイルを使用します。 1. 例 1 から例 12 で使用した customer ファイル 2. 注文ファイル 3. 注文詳細ファイル 4. 在庫ファイル 注文レコードの形式は次のとおりです。 TAL が使用する注文レコードの定義は次のとおりです。 LITERAL name^len = 36, date^len = 8; STRUCT order^struct (*); BEGIN FIXED(2) order^orderno; STRING order^name [0:name^len - 1]; STRING order^date [0:date^len - 1]; FIXED(2) order^total; ! 注文レコード ! ! ! ! 注文番号 名前 日付 total = 0 は次のことを 意味する: END; ! ! total ! ! 注文分未補充; <> 0 は次のことを意味する: 注文分補充済み、ただし 未出荷 STRUCT .order (order^struct); 137692J 6-39 注文ファイルの内容は次のとおりです。 注文詳細レコードの形式は次のとおりです。 TAL が使用する注文詳細レコードの定義は次のとおりです。 STRUCT order^detail^struct (*); BEGIN FIXED(2) orderdet^orderno; FIXED(2) orderdet^itemno; FIXED(2) orderdet^partno; FIXED(2) orderdet^itemtot; ! 注文詳細レコード ! ! ! ! 注文番号 項目番号 パーツ番号 total=0 は該当項目が手に 入らないことを示す END; STRUCT .orderdet (order^detail^struct); 6-40 137692J 注文詳細ファイルの内容は次のとおりです。 在庫レコードの形式は次のとおりです。 TAL が使用する在庫レコードの定義は次のとおりです。 LITERAL descr^len = 30, loc^len = 4, vendor^len = 8; STRUCT inventory^struct (*); BEGIN FIXED(2) inv^partno; 137692J ! 在庫レコード ! パーツ番号 6-41 STRING inv^descr [0:descr^len - 1]; ! FIXED(2) inv^price; ! FIXED(2) inv^availqty; ! STRING inv^loc [0:loc^len - 1]; ! STRING inv^vendor [0:vendor^len - 1];! END; 説明 価格 在庫数 格納場所 ベンダ名 STRUCT .inv (inventory^struct); 在庫ファイルの内容は次のとおりです。 後で示すこの例の TAL コードは1ヶ月以上経過しているすべての注文を洗い出し、これらの注文を補充 します。コードはこの作業を次の 5 つのステップで実行します。 1. 日付代替キー・フィールドを使用して、注文ファイルからレコードを読み出します。読み出しループ は、日付フィールドの値が order^limit に指定されている日付と同じかそれ以降のレコードに遭遇する と終了します。 2. 注文レコードの名前を使用して顧客ファイルから該当する顧客レコードを読み出します。注文レ コ ー ドと顧客レコードからの情報を抽出して、注文番号、顧客名、顧客住所を含む注文ヘッダを印刷します。 3. 注文レコードの注文番号を使用し、注文詳細ファイルから関連するGENERICサブセットを読み出します。 6-42 137692J 4. 注文詳細ファイルの各レコードはそれぞれ 1 つの行項目を表わします。 該当する GENERIC サブセットの 各行項目のために、注文詳細レコードのパーツ番号を使用して在庫ファイル内の該当する在庫レコード を読み出し、更新します。次に注文詳細レコードを更新して行項目を印刷します。 5. 現在の注文に対するすべての行項目の処理が終了したら、注文レコードの合計フィールドを注文の合計 を反映するように更新します。注文レコードの名前を使用して、該当する顧客レコードの現在の借り入 れ残高フィールドを更新します。注文の合計を印刷します。 TAL コード例を次に示します。 ! 日付フィールドによりファイルの先頭へ位置決め compare^len := 0; CALL KEYPOSITION (order^filenum, key, "DT", compare^len); order^eof := 0; WHILE NOT order^eof DO BEGIN ! 日付フィールドを介して注文ファイル読み出し CALL READ (order^filenum, order, $LEN(order) ); IF > OR order.order^date >= limit^date THEN order^eof :=1 ELSE BEGIN ! 注文補充 ! 顧客ファイル読み出し CALL KEYPOSITION (cust^filenum, order.order^name); CALL READUPDATE (cust^filenum,cust^rec, $LEN(cust^rec) ); ! 注文ヘッダ印刷 ! 注文詳細ファイルから現在の注文読み出し compare^len := 2; generic := 1; CALL KEYPOSITION (orderdet^filenum, order.order^orderno, , compare^len, generic); orderdet^eof := 0; WHILE NOT orderdet^eof DO BEGIN ! 行項目読み出し CALL READ (orderdet^filenum, orderdet, $LEN(orderdet) ); IF > THEN orderdet^eof := 1 ELSE BEGIN CALL KEYPOSITION (inv^filenum, orderdet.orderdet^partno); CALL READUPDATE (inv^filenum, inv, $LEN(inv) ); : ! 在庫レコード更新 CALL WRITEUPDATE (inv^filenum, inv, $LEN(inv) ); : ! 注文詳細レコード更新 CALL WRITEUPDATE (orderdet^filenum, orderdet, $LEN(orderdet) ); ! 行項目印刷 END; END; 137692J 6-43 : ! 注文レコード更新 CALL WRITEUPDATE (order^filenum, order, $LEN(order) ); : ! 顧客レコード更新 CALL WRITEUPDATE (cust^filenum, cust^rec, $LEN(cust^rec) ); : ! 補充注文の合計印刷 END; END; ! 日付フィールドを介して注文ファイル読み出し 最初の注文を補充するために使用するレコードを次に示します。 注文ファイルから: 顧客ファイルから: 注文詳細ファイルから: 在庫ファイルから: 6-44 137692J 同じレコードの最初の注文補充後の内容を次に示します。 注文ファイル: 顧客ファイル: 注文詳細ファイル: 在庫ファイル: 137692J 6-45 (空白ページ) 6-46 137692J 第 7 章 キュー・ファイル 第 7 章 キュー・ファイル ENSCRIBE のキュー・ファイルはキー順ファイルの中でも特別なディスク・ファイルであり、キューと して機能します。プロセスはキュー・ファイルに対してレコードのキューまたはデキューを実行できます。 キュー・ファイルは可変長レコードを含み、このレコードは指定されたキュー・フィールドの値を参照 してアクセスされます。ほかのキー順ファイルとは異なり、キュー・ファイルには主キーはありますが、 代替キーはありません。キュー・ファイルの主キーは 8 バイトのタイムスタンプを含み、必要に応じてユー ザー・キーを追加できます。タイムスタンプは、ファイルへのレコード挿入時にディスク・プロセスが挿 入し、それ以降のファイル操作に連動してタイムスタンプの内容を管理します。 キュー・ファイルには次のような特徴があります。 □ 複数のサーバーやデキューイング・プロセスと同時に、複数のリクエスタやキューイング・プロセスか らのアクセスが可能です。キュー・ファイルは、複数の書き込みプロセスと 1 つの読み出しプロセスに 共有され、処理量の小さい作業にも使用されます。 □ NonStop TMF(Transaction Management Facility)によりデータ損失が起きないよう保護されています。 TMF は TM/MP 製品の主要機能コンポーネントです。 □ レコードの配列と選択に柔軟性があります。アプリケーションの必要に応じて優先度付け、クラス分 け、グループ化が可能です。デフォルトでのレコード配列のほとんどは、タイムスタンプを主キーとし て使用するファーストイン・ファーストアウト方式です。 □ 不完全なレコードがアクセスされるのを防止し、特定レコードへのデキュー操作を 1 つのリーダーに限 定するため、レコード・レベルでのロックが可能です。 □ ファイルに新規データが追加されときに、通知する機能があります。 キュー・ファイルの使用にあたり、次の制限が伴います。 □ キュー・ファイルは SQL オブジェクトにはなりません。 □ キュー・ファイルには代替キーやパーティションを定義できません。 この章の最初の部分は、キュー・ファイルの構造とアクセス方法を説明します。残りの部分はキュー・ ファイルの作成、オープン、アクセス方法を示す例を挙げます。 使用できるシステム・プロシージャ ENSCRIBE のキー順ファイルを作成し、アクセスするには以下のシステム・プロシージャを使用します。 □ FILE_CREATE_、FILE_CREATELIST_、CREATE □ FILE_OPEN_、FILE_CLOSE_、AWAITIO[X] □ LOCKFILE、UNLOCKFILE □ FILE_SETKEY 、FILE_SAVEPOSITION_ 、FILE_RESTOREPOSITION_ 、KEYPOSITION 、 SAVEPOSITION、REPOSITION □ READ[X]、READLOCK[X]、READUPDATE[X]、READUPDATELOCK[X] 137692J 7-1 第 7 章 キュー・ファイル □ WRITE[X] □ FILE_GETINFO_、FILE_GETINFOLIST_、FILE_GETINFOBYNAME_、 FILE_GETINFOLISTBYNAME_ アクセスのタイプ キー順ファイルと同様に、アプリケーションはキュー・ファイルに対してシーケンシャル・アクセスと ランダム・アクセスを実行できます。 キュー・ファイルの構造 キュー・ファイルは、ビットマップ・ブロックと、インデックスとデータ・ブロックの B ツリー構造で 物 理的 に構 成さ れま す。構成 方法 は第 6 章「キ ー順 ファ イル」と 同じ です。キ ュー・フ ァイ ルは、 FILE_GETINFOLIST_ プロシージャのアイテム 48 が 1 にセットされることによって、ほかのキー順ファ イルと区別されます。キュー・ファイルの場合は、FILEINFO プロシージャ(現在はほかのプロシージャ で置き換えられている)の file-type ワードのビット 9 がセットされます。 主キー キュー・ファイル内の各レコードは主キーとデータで構成されます。主キーの最小構成は 8 バイトのタ イムスタンプで、このタイムスタンプはファイルへのレコード挿入時にディスク・プロセスが作成します。 また、ユーザーがは主キー内でタイムスタンプに先行するユーザー・キーを定義できます。 ディスク・プロセスはレコードの一部としてこのタイムスタンプを管理します。これにより各レコード が一意のキーを持つことが保証され、レコードの挿入、削除のためにアプリケーション定義キーを使用す る必要がなくなります。キュー・ファイルからレコードを読み出すと、返り値の一部にタイムスタンプが 含まれます。レコードを書き込む場合には、ディスク・プロセスがキーの下位 8 バイトにタイムスタンプ を書き込み、この部分に存在した情報は上書きされます。 キーのタイムスタンプ部分はユーザーが管理、使用する必要はありませんが、ファイル作成時にはユー ザーがこの 8 バイトを確保しなければなりません。したがって、すべてのキー長は少なくとも 8 バイトま たはそれ以上に定義する必要があります。ユーザー・キーを定義しないと、第 8 バイトからデータが始ま ります。ユーザー・キーを使用する場合、ユーザー・キーはタイムスタンプの前の位置に置かれます。し (詳細については、 「キュー・ たがって、データはユーザー・キーの長さ+ 8 バイトの位置から始まります。 ファイルの作成」を参照してください。) 図 7-15 は、各物理レコードの形式を示します。 図 7-15 キュー・ファイルのレコード形式 7-2 137692J 第 7 章 キュー・ファイル キュー・ファイルの作成 キュー・ファイルを作成するには、FUP(File Utility Program)を使用するか、または FILE_CREATE_ プロシージャや FILE_CREATELIST_ プロシージャを呼び出します。キュー・ファイルにはパーティショ ンや代替キーを定義することはできません。 キュー・ファイルを作成するときは、キーの中にタイムスタンプ用に 8 バイトの領域を残すようにして ください。ユーザー・キーを使用する必要がなければ、ファイルのキー長として 8 バイトを指定します。 ユーザー・キーを使用する場合は、ユーザー・キーの長さ+ 8 バイトを指定します。さらに、レコード長 定義でもキー用に 8 バイトを確保しておきます。 キーのオフセット値は、必ずゼロにします。キー指定子の指定を省略することはできますが、キーを設 定する場合は、必ずゼロにします。 キュー・ファイルの例 次の例は、キュー・ファイルを作成する 3 種類の方法を示します。 例 1: FUP を使用してキュー・ファイルを作成する FUP を使用してキュー・ファイルを作成する方法を説明します。 10> FUP - SET TYPE K - SET CODE 1001 - SET QUEUEFILE - SET EXT (20,10) - SET MAXEXTENTS 64 - SET KEYLEN 10 - SET REC 100 - SET AUDIT - CREATE QFILE - EXIT > 137692J 7-3 第 7 章 キュー・ファイル 例 2: FILE_CREATE_ プロシージャを使用してキュー・ファイルを作成する 次に示す TAL の例は、FILE_CREATE_ プロシージャを使用してキュー・ファイルを作成します。プロ シージャ呼び出しではノード名を指定していないため、FILE_CREATE_ はノード名を =_DEFAULTS DEFINE の VOLUME 属性の現在値から取得します。=_DEFAULTS DEFINE の詳細については『TACL プ ログラミング・ガイド』を参照してください。 STRING .QF^Name[0:33] := "$spool.lst.qfile"; ! ファイル名 LITERAL QF^NameLength = 16; ! バイト単位 ! で表わしたファイル名の長さ INT QF^NameLen; LITERAL Key^Length = 8; ! キー長 ! 必ず 8 以上 INT Key^Len; STRING .Key[0:Key^Length - 8]; ! アプリケーション・キー LITERAL Rec^Len = 100; ! レコード長 INT Error; ! 返されたエラー・コード ?SOURCE $SYSTEM.SYSTEM.EXTDECS0 (FILE_CREATE_,FILE_CREATELIST_) QF^NameLen := QF^NameLength; Key^Len := Key^Length; Error := FILE_CREATE_( QF^Name:34, QF^NameLen, 1001, 20, 10, 64, 3, %000102, Rec^Len, 4096, Key^Len, 0); IF Error <> 0 THEN ... ! ! ! ! ! ! ! ! ! ! ! ! ファイル名:最大長 ファイル名長 ファイルコード プライマリ・エクステント・サイズ セカンダリ・エクステント・サイズ 最大エクステント ファイル・タイプ(キー順) オプション(オーディットされたキュー・ファイル) レコード長 ブロック長 キー長 キー・オフセット(必ずゼロ) ! エラー 例 3: FILE_CREATELIST_ プロシージャを使用してキュー・ファイルを作成する FILE_CREATELIST_ プロシージャを使用してキュー・ファイルを作成します。 ! FILE_CREATELIST_ を使用してキュー・ファイルを作成 STRING .QF^Name[0:33] := "$spool.lst.qfile"; ! ファイル名 LITERAL QF^NameLength = 16; ! バイト単位で表わした ! ファイル名の長さ INT QF^NameLen; LITERAL Key^Length = 8; ! キー長 7-4 137692J 第 7 章 キュー・ファイル ! 必ず 8 以上 INT Key^Len; STRING .Key[0:Key^Length - 8]; ! アプリケーション・キー LITERAL Rec^Len = 100; ! レコード長 INT Items[0:20]; ! 属性番号 INT Value[0:40]; ! 属性値 INT Error; ! 返されたエラー・コード INT Error^Item; ! 返されたエラー項目 ?SOURCE $SYSTEM.SYSTEM.EXTDECS0 (FILE_CREATE_,FILE_CREATELIST_) QF^NameLen := QF^NameLength; Key^Len := Key^Length; Items[ 0] := 41; ! ファイル・タイプ Value[ 0] := 3; ! = キー順 Items[ 1] := 42; ! ファイルコード Value[ 1] := 1001; ! = 1001 Items[ 2] := 43; ! 論理レコード長 Value[ 2] := Rec^Len; ! = Rec^Len Items[ 3] := 44; ! ブロック長 Value[ 3] := 4096; ! = 4K Items[ 4] := 45; ! キー・オフセット Value[ 4] := 0; ! = 0 ( キュー・ファイルでは必ずゼロ ) Items[ 5] := 46; ! キー長 Value[ 5] := Key^Len; ! = Key^Len Items[ 6] := 48; ! キュー・ファイル・オプション ( #71 でも良い ) Value[ 6] := 1; ! = キュー・ファイル Items[ 7] := 50; ! プライマリ・エクステント・サイズ Value[ 7] := 20; ! = 20 ページ Items[ 8] := 51; ! セカンダリ・エクステント・サイズ Value[ 8] := 10; ! = 10 ぺージ Items[ 9] := 52; ! 最大エクステント数 Value[ 9] := 64; ! = 64 エクステント Items[10] := 66; ! オーディットされたファイル Value[10] := 1; ! = このファイルをオーディットする Items[11] := 67; ! オーディット圧縮 Value[11] := 1; ! = オーディット圧縮 (0 でも良い ) Items[12] := 68; ! データ圧縮 Value[12] := 0; ! = データ圧縮を行わない (1 でも良い ) Items[13] := 69; ! インデックス圧縮 Value[13] := 0; ! = インデックス圧縮は行わない (1 でも良い ) Error := FILE_CREATELIST_( QF^Name:34, ! ファイル名:最大長 QF^NameLen, ! ファイル名長 Items, ! アイテム・リスト 14, ! アイテム数 Value, ! 値 28, ! 値のバイト長 Error^Item); ! 返されたエラー・アイテム IF Error <> 0 THEN ... ! エラー 137692J 7-5 第 7 章 キュー・ファイル キュー・ファイルへのアクセス キュー・ファイルからの読み出しとキュー・ファイルへの書き込み方法は、ほかのキー順ファイルとは 異なります。書き込み操作はキューイング操作と呼ばれます。キュー・ファイルへアクセスする場合、読 み出し操作を行うと、同時にファイルからレコードを削除します。この操作をデキューイング操作と呼び ます。レコードのデキューを行うには READUPDATELOCK[X] プロシージャを使用します。 同期深度の指定 キュー・ファイルをオープンするときに、ファイルの同期深度を指定できます。デキューイング以外の 操作には、ゼロ以外の同期深度がサポートされています(デキューイング操作の同期深度はゼロです)。 デキューイング以外の操作にゼロ以外の同期深度を指定すると、ファイル・システムはパスに関連した エラー(200, 201, 210, および 211)を修復しようとします。同期深度をゼロに指定すると、パス関連の修 復が実行されません。この場合、アプリケーションがエラーに対応することになります。 同期深度をゼロ以外の値に指定すればエラーから保護されるため、デキューイング以外の操作では、同 期深度に 1 を設定することを推奨します。これは、ゼロ以外の同期深度値が必要なキューイングやデキュー イング操作に対し、同じプロセスが同時に使用するキュー・ファイルには、多重オープンする必要がある ことを示します。キュー・ファイルで再試行可能なエラーからの回復作業については、この章の「通信パ ス・エラー」を参照してください。 レコードのキューイング レコードをキューイングするには、WRITE[X] プロシージャを呼び出してファイルにレコードを書き込 みます。ディスク・プロセスはキーの中にタイムスタンプ・フィールドを設定し、これにより同一の高位 ユーザー・キーをもつ、ほかの既存レコードに対する位置決めが行われます。 ファイルがオーディットされている場合、書き込み操作に関連したトランザクションがコミットすると、 新規レコードの読み出しが可能になります。トランザクションが中断終了した場合、そのレコードは読み 出し不可能になります。 ファイルがオーディットされていない場合、書き込み操作が正常終了すれば、すぐにそのレコードを利 用できます。 ほかのキー順ファイルとは異なり、キュー・ファイルへの書き込み操作でエラー 10(duplicate record) が発生することはありません。これは、キュー・ファイルのすべてのレコードには一意のキーが作成され るからです。 特別「ダミー」レコード キュー・ファイルに最初のレコードが書き込まれると、ディスク・プロセスはゼロだけを含んだ特別な ダミー・レコードをファイルの先頭に挿入します。このレコードがあることで、ファイルが完全に空にな ることはなく、最終レコードがキューから削除された場合のファイルの折りたたみと展開に伴うオーバー ヘッド発生を回避できます。 7-6 137692J 第 7 章 キュー・ファイル このダミー・レコードは READUPDATELOCK[X] によってキューから除かれることはありません。し かし、次のような場合にはレコードが外から見える状態になります。 □ READ[X] や READLOCK[X] 操作がダミー・レコードを返した場合 □ FUP INFO filename, STAT コマンドがこのレコードの存在を示した場合 □ FUP COPY filename, newfile コマンドによって、ダミー・レコードが READUPDATELOCK[X] によるキューからの削除が可能になった場合。このような結果をもたらす FUP COPY コマンドの キュー・ファイルへの使用には注意が必要です。 FUP DUP コマンドではこのようなことはおこらず、キュー・ファイルで自由に使用できます。 レコードのデキューイング レコードをデキューイングするには、READUPDATELOCK[X] プロシージャを使用します。読み出し操 作が成功すると、ディスク・プロセスはそのレコードをファイルから削除します。ファイルが空のために ディスク・プロセスがレコードを返せない場合、ディスク・プロセスは要求に合致したレコードがファイ ルに追加されるまで、その要求を保持し続けます。READUPDATELOCK¢X] プロシージャを使用してレ コードを読み出すためには、次の条件が満たされなければなりません。 □ アプリケーションがそのファイルへの書き込み許可を持つ。 □ 同期深度がゼロである。 □ レコードが非ロック状態である。 □ レコードが先行する KEYPOSITION プロシージャ呼び出しで定義されたキー比較規則を満たしている 。 (位置決めの詳細については、この章後半の「位置決めを伴うデキューイング」を参照してください) ディスク・プロセスは実行した最新の KEYPOSITION 呼び出しにより、指定されたレコード選択規則に 従ってレコードを選択します。アプリケーションが KEYPOSITION を呼び出さなかった場合は、ディス ク・プロセスはファイルの最初のレコードを選択します。 ユーザー・キーが要求されたキー長に合致しているレコードは、タイムスタンプ(通常は挿入された順 序)に従って抽出されます。ユーザー・キーが合致しないレコードは、キーの相対値に従って、最小値を 持つレコードから順に抽出されます。逆の順でキューから取り除くためには、位置決めモード値をそれに 合わせて設定する必要があります。(位置決めモードの詳細については『GURDIAN プロシージャ・コー ル・リファレンス・マニュアル』を参照してください。) KEYPOSITION 操 作を R E A D U P D A T E L O C K [ X ] に 先行 して 実行 して いな い場 合は、 READUPDATELOCK[X] 操作はファイルの最初のロックされていないレコードを返します。レコード削除 は読み出し後に実行されるため、これ以降の READUPDATELOCK[X] 呼び出しはファイルの先頭から順 番にレコードを取得することになります。 READUPDATELOCK[X] 操作は現在の主キー値を変更しません。 137692J 7-7 第 7 章 キュー・ファイル 例 図 7-16 は、2 つのプロセスがキュー・ファイルへアクセスする方法を示しています。ファイルが空であ るのに、プロセス A がレコードをキューから削除しようとすると、レコードが存在するようになるまでプ ロセス A は待機状態になります。 図 7-16 レコードのデキューイング 新規レコードの挿入によってプロセス A が待機状態から起こされ、新規レコードが与えられます。 オーディットされたファイルからのデキューイング キュー・ファイルがオーディットされている場合、READUPDATELOCK[X] プロシージャはトランザク ション内から呼び出されなければなりません。READUPDATELOCK[X] 操作はファイルからレコードを消 去してしまうため、アプリケーションはファイルから抽出したデータの処理が完了してからトランザク ションをコミットさせなければなりません。 デキュー要求に関連したトランザクションが途中で中止された場合、ディスク・プロセスはレコードを 取り出したときと同じ論理位置にそのレコードを再挿入します。中断操作はまた、ファイルからのレコー ドをデキューするために待機状態にあるプロセスを呼び起こします。 ファイルが空であるか、またはすべてのレコードがロックされているために読み出し操作が成功しない 場合は、次のいずれかの事象が発生するまで、要求を保持します。 □ ディスク・プロセスはレコード挿入操作を含むトランザクションの完了を待つ。新しいレコードが利用 可能になると、ディスク・プロセスは READUPDATELOCK[X] 操作を再試行する。レコードは次の 2 つの操作のいずれかにより利用可能になる。 7-8 ● レコード挿入後にトランザクションがコミットする。 ● レコードをキューから削除後にトランザクションがアボートされる。 137692J 第 7 章 キュー・ファイル ● 読み出し操作におけるキュー・ファイルの特別なタイムアウトの期限が切れると、ディスク・プロ セスは要求プロセスにエラー 162(operation timed out)を返します。 例外であるのは、EXACT 位置設定を使用することです。アプリケーションが EXACT 位置設定を要求し たときにファイルが空であるか、または該当レコードが存在しないと、READUPDATELOCK[X] 操作はエ ラー 11(record not found)を受け取り、要求をキューに追加しません。 一般に、READUPDATELOCK[X] 操作に対するエラー(操作のタイムアウトを除く)は通常の書き込み 操作に対するエラーと同じような処理が行われる必要があります。つまり、トランザクションをアボート する必要があります。 レコードの影響により発生するエラー オーディットされたキュー・ファイルを使用する場合は、エラー処理のために考慮しなければならない 項目が加わります。デキューイング操作により、間違った内容のレコードが返され、アプリケーションが トランザクションをアボートしても、間違ったレコードはそのままファイルに再挿入されます。 トランザクションが開始して 1 つのレコードのデキュー操作が行われ、返されたデータ(プログラムに よるアボートまたはプロセス障害)によってアプリケーションがそのトランザクションをアボートとした とします。このアボートにより、間違ったレコードが再びキュー・ファイルに再挿入されます。アプリケー ションがまたデキュー操作を行うと同じレコードが読み出され、再度アボートされます。 これによって問題が生じないこともありますが、そのアプリケーションは間違ったレコードの先の処理 には進めなくなります。この状況を回避するため、データ処理の前にレコードの内容を検証します。 この問題で影響を受けるのはオーディットされたファイルだけです。オーディットされていないファイ ルでは間違ったレコードはファイルに再挿入されず、単に失われます。 レコードのデキューイングと待ちなし I/O キュー・ファイルが待ちなし I/O のためにオープンされた場合は、レコードのデキューイングに注意が 必要です。Timelimit>0D を設定して AWAITIO[X] を呼び出すと、タイムアウト・エラーが返され、この 結果として対応する I/O 操作がキャンセルされることがあります。この操作が READUPDATELOCK[X] で あったとすると、デキューイング操作が実際に実行されてしまいますが、レコードはアプリケーションに 返されず、最終的に失われてしまいます。この問題は特にキュー・ファイルの場合に深刻です。これは、 要求に合致するレコードがファイル中に存在するまで、デキュー操作が遅延される可能性があるからです。 オーディットされたキュー・ファイルに限定すれば、アプリケーションは ABORTTRANSACTION プロ シージャを呼び出してデキューされたレコードをファイルに再挿入することにより、タイムアウト・エラー からの回復できます。対応するトランザクションはその後で再起動する必要があります。 注意:オーディットされていないキュー・ファイルの場合、READUPDATELOCK[X] が待機状態にあるときは決し て OD 以上の時間制限で AWAITIO[X] を呼び出さないでください。上で説明した回復手続きはオーディット されていないキュー・ファイルには機能しません。 137692J 7-9 第 7 章 キュー・ファイル オーディットされていないファイルからのデキューイング ファイルが空、またはすべてのレコードがロックされているために読み出し操作が成功しない場合、次 のいずれかの事象が発生するまでの間、読み出しは待機状態になります。 □ ディスク・プロセスは WRITE[X] 操作が正常終了するまで待機します。 □ 読み出し操作に対するキュー・ファイルの特別なタイムアウトを超過した場合、ディスク・プロセスは エラー 162(operation timed out)を要求発生元のプロセスに返します。 オーディットされたファイルと同様に、EXACT 位置設定を使用した場合は例外です。アプリケーショ ンが EXACT 位置設定を要求し、ファイルが空であるか、または該当するレコードが存在しない場合は、 READUPDATELOCK[X] 操作はエラー 11(record not found)を受け取り、要求をキューに追加 しません。 レコードの検証 削除なしにレコードを読み出すには、READ[X] または READLOCK[X] プロシージャを使用します。こ れらのプロシージャは、キー順ファイルのために呼び出されたときと全く同じように動作します。ただし、 READ[X] と READLOCK[X] は次の点で READUPDATELOCK[X] と異なります。 ディスク・プロセスはレコードの読み出し後にそれを削除しない。 使用できるレコードが存在しない場合でも要求は保持されず、ディスク・プロセスはエラー 1(EOF)を 返します。 読み出し操作は、8 バイトのタイムスタンプを含むレコード全体を返します。検証後にレコードを削除 する場合は、EXACT 位置設定を使用して、その後に READUPDATELOCK[X] プロシージャを呼び出しま す。 位置決めを伴うデキューイング アクセス・パスと位置決めを動的に変更する場合は、KEYPOSITION プロシージャ呼び出しを先行させ て READUPDATELOCK[X] 呼び出しを使用できます。KEYPOSITION を使用することにより、アプリケー ションはファイル内のランダムな位置に移動することができ、ユーザー・キーの値にしたがってレコード のサブセットを作成してそれを取得する、あるいはファイルを逆方向へトラバースすることを示すことが できます。 KEYPOSITION を呼び出してキュー・ファイルの先頭位置へ APPROXIMATE 位置設定する場合のデ キューイング操作は、KEYPOSITION を使用しなかった場合と同じです。READUPDATELOCK[X] 操作 はファイル内の最初のロックされていないレコードを返します。レコードは読み出し後に削除されますか ら、以降の READUPDATELOCK[X] 呼び出しはファイルの先頭から順番にレコードを取得することにな ります。 7-10 137692J 第 7 章 キュー・ファイル APPROXIMATE 位置設定 図 7-17 は、次の KEYPOSITION 呼び出しが次のパラメータを与えられたときに、APPROXIMATE 位置 設定がどのように動作するかを示します。 キー値 比較長 キー長 = "MA" 省略 = 2 このキュー・ファイルは 10 バイトのキー長を持っていますから、ユーザー・キーの長さは 2 バイトとな ります。 図 7-17 キュー・ファイルに APPROXIMATE 位置設定を使用する この例は、標準キー順ファイルと比較してキュー・ファイルが持つ 2 つの特別な動作を示しています。 □ 2 回目の READUPDATELOCK 呼び出しは 1 回目の呼び出しで取り出したレコードのキー値よりも小さ なキーを持つレコードを取り出しています。この動作は標準のキー順ファイルの場合と異なります。 □ ファイルに対する 2 回目の挿入(キー ="AA")ではプロセス A は呼び起こされません。この理由は、 挿入レコードのキーが KEYPOSITION 呼び出しが設定した選択規則に合致していないためです。 137692J 7-11 第 7 章 キュー・ファイル GENERIC 位置設定 図 7-18 は、KEYPOSITION 呼び出しが次のパラメータを与えられたときに、GENERIC 位置設定がどの ように動作するかを示します。 キー値 = "TA" 比較長 = 2 = 2 位置決めモード = 1 キー長 このキュー・ファイルは 10 バイトのキー長を持っていますから、ユーザー・キーの長さは 2 バイトとな ります。 図 7-18 キュー・ファイルに GENERIC 位置設定を使用する 新規レコードのユーザー・キーがキー選択規則を満たしていないため、2 回目の挿入はプロセス A を呼 び起こしていません。しかし、3 回目の挿入は選択規則を満たしているため、ディスク・プロセスはレコー ドをプロセス A に返し、プロセス A を再度呼び起こします。 7-12 137692J 第 7 章 キュー・ファイル この例は、同一ファイルから呼び出すためには、アプリケーションが複数サーバーやデキューイング・ プロセスをどのように使用するかも示しています。各サーバーは、主キーの高位のフィールド(このケー スでは、高位のキーに「TA」を持つレコードがプロセス A によってデキューイングされている)で指定さ れるファイルのサブセットにアクセスできます。 この方法により、高位のキー・ファイルを使用することによってファイルを複数のサーバーにパーティ ションできます。 高位のキー・フィールドは、キューに追加されたレコードの相対優先度を指定するために使うこともで きます。小さな値のキーを持つレコードは、大きな値を持つレコードよりも前方に位置決めされます。し たがって、常にファイルの先頭から読み出すサーバーは、キーの昇順に従ってレコードのデキューイング を行います。これによって、キュー・ファイル内での優先度付けが可能になります。 EXACT 位置設定 アプリケーションは通常、EXACT キーを使用せずに特別な順序にしたがってキュー・ファイルにアク セスします。このため、キュー・ファイルで EXACT 位置設定を使用するのはそれほど一般的ではありま せんが、使用することもできます。たとえば、キュー・ファイル内での並び順を変えずに、ファイル内の 特定のレコードに READ[X] プロシージャを使ってアクセスし、レコードの検証後に削除することもでき ます。 カレント・キーの使用 キュー・ファイルにおけるカレント・キーは、READ[X] 操作の実行後にだけ意味を持ちます。標準の キー順ファイルとは異なり、READUPDATELOCK 操作実行後、カレント・キーが正確であると仮定する ことはできません。 カレント・キーの動作は、FILE_GETINFOLIST_ と FILERECINFO 操作の働きにも影響を与えます。 WRITE[X] や READUPDATELOCK[X] 操作を実行すると、その後の FILE_GETINFOLIST_ は意味のある 値を返しません。しかし、READ[X] 操作の実行後はカレント・キーの値を返します。FILERECINFO プロ シージャはキュー・ファイルに対してはカレント・キー値を返しません。 タイムアウト期間の指定 キュー・ファイルからの読み出し操作に対してタイムアウト期間を指定する場合は、SETMODE 機能 128 を使用します。これを実行しない場合は、デフォルト・タイムアウト値である 60 秒が適用されます。タイ ムアウト期間を設定する目的は、オーディットされたファイルに対する、デキューイング操作に消費され る時間を限定することにあります。タイムアウト期間中に読み出し操作が完了しないと、エラー 162 (operation timed out)が返されます。 SETMODE 機能 128 は次のパラメータを持ちます。 param1 = タイムアウト値の上位ワード(100 分の 1 秒単位) param2 = タイムアウト値の下位ワード(100 分の 1 秒単位) この 2 つのワードを組み合わせた 32 ビット整数でタイムアウト値を指定します。次の値が予約されてい ます。 -2D = デフォルト・タイムアウト期間 (60 秒 ) -1D = 無限タイムアウト期間(タイムアウト・エラーを返さない) 0D = タイムアウト期間を設定しない(レコードが読み出せない場合は直ちにエラーを返す) 137692J 7-13 第 7 章 キュー・ファイル 注意: READUPDATELOCK[X] 操作を完了させるために AWAITIO[X] のタイムアウト・オプションを使用しない でください。タイムアウトの有効期限後にキャンセル操作を行うと、レコードがファイルからデキューイン グされたかも知れないという事実が隠されます。 レコードのロック レコードをロックするには、READLOCK[X] 操作を使用します。オーディットされたファイルではコ ミットされていないトランザクションに関連するレコードは、すべてロックされていると見なします。 ネットワーク対策 D20 以前のオペレーティング・システムを実行しているシステムからキュー・ファイルへアクセスする ことはできません。 アクセス例 次の例は、キュー・ファイルへのアクセス方法を示しています。簡単に説明するため、例に示すタイム )に短縮しています。例で使用されるキーの長さが 8 スタンプは 4 バイトの数字文字列(たとえば「1001」 バイトを超える場合には、キーを <user-key><timestamp> のように表示します(たとえば 「AB1001」 )。 例 1: キュー・ファイルのオープン 次の TAL コード例はキュー・ファイルをオープンします。 INT QF^Num; ! キュー・ファイル番号 STRING .QF^Name[0:33] := "$spool.lkp.qfile"; ! ファイル名 LITERAL QF^NameLength = 16; ! バイト単位のファイル名長さ INT Error; ! 返されたエラー・コード ?SOURCE $SYSTEM.SYSTEM.EXTDECS0 (FILE_OPEN_) ! ! キュー・ファイルをオープンする !Key^Len := Key^Length; Error := FILE_OPEN_( QF^Name:QF^NameLength, QF^Num, ! 0, ! 0, ! 0, ! 0); ! ! 7-14 ! キュー・ファイル名:長さ ファイル番号 アクセス = 読み取り/書き込み(0 より大きくてもよい) 排他 = 共有(0 より大きくてもよい) 待ちなし深度 = 0(0 より大きくてもよい) 同期深度(READUPPATELOCK が 使用されている場合、必ず 0) 137692J 第 7 章 キュー・ファイル 例 2: レコードをキューに追加 次の例は、レコードをキュー・ファイルに挿入するための TAL のプロシージャを示します。 INT QF^Num; ! キュー・ファイル番号 STRING .QF^Name[0:33] := "$spool.lkp.qfile"; ! ファイル名 LITERAL QF^NameLength = 16; ! バイトで表わしたファイル名の長さ INT QF^NameLen; LITERAL Key^Length = 8; ! キー長 (8 以上でなければならない ) INT Key^Len; STRING .Key[0:Key^Length - 8]; ! アプリケーション・キー LITERAL Rec^Len = 100; ! レコード長 INT Byte^Count; ! 読み出し / 書き込みされたバイト数 INT Error; ! 返されたエラー・コード FIXED Trans^Tag; ! トランザクション ID STRING .Buffer[0:Rec^Len - 1]; ! レコード・バッファ STRING .Data[0:Rec^Len - Key^Length - 1]; ! データ ?SOURCE $SYSTEM.SYSTEM.EXTDECS0 (WRITE, BEGINTRANSACTION) ?SOURCE $SYSTEM.SYSTEM.EXTDECS0 (ENDTRANSACTION) ! キュー・ファイルのキューにレコード追加 INT PROC ENQUEUE(Error); INT .Error; BEGIN Buffer[0] ’:=’ Key FOR Key^Len - 8; ! エラー・コード ! キーをバッファの前へ移動 ! 前へ移動 Buffer[Key^Len] ’:=’ Data FOR Rec^Len - Key^Len; ! データ・レコードを ! バッファ内へ移動 Error := BEGINTRANSACTION(Trans^Tag);! トランザクション開始 CALL WRITE(QF^Num, Buffer, Rec^Len, Byte^Count); ! レコード書き込み IF = THEN Error := 0 ! エラー・コードをクリア ELSE CALL FILEINFO(QF^Num, Error); ! エラー・コード取得 CALL ENDTRANSACTION; ! トランザクション終了 RETURN Error <> 0; END; 137692J 7-15 第 7 章 キュー・ファイル 例 3: レコードのデキューイング 次の TAL コード例は、キュー・ファイルの最初のレコードのデキューイングを行います。この手続きを 呼び出す前に、キュー・ファイルはオープンされていなければなりません。 INT QF^Num; ! キュー・ファイル番号 STRING .QF^Name[0:33] := "$spool.lkp.qfile"; ! ファイル名 LITERAL QF^NameLength = 16; ! バイト単位で表わしたファイル名の長さ INT QF^NameLen; LITERAL Key^Length = 8; ! キー長 (8 バイト以上でなければならない ) INT Key^Len; STRING .Key[0:Key^Length - 8]; ! アプリケーション・キー LITERAL Rec^Len = 100; ! レコード長 INT Byte^Count; ! 読み出し / 書き込みされたバイト数 INT Error; ! 返されたエラー・コード FIXED Trans^Tag; ! トランザクション識別子 STRING .Buffer[0:Rec^Len-1]; ! レコード・バッファ STRING .Data[0:Rec^Len - Key^Length - 1]; ! デキューイングされたデータ ?SOURCE $SYSTEM.SYSTEM.EXTDECS0 (KEYPOSITION, ? ABORTTRANSACTION, ? BEGINTRANSACTION, ? ENDTRANSACTION, ? FILEINFO, ? READUPDATELOCK) ! ! Dequeue the first record from a Queue File ! INT PROC DEQUEUE(Error); ! キュー・エントリのバイト数、 ! または戻されたエラー・コード INT .Error; ! (または 0)を返す。 BEGIN ! エラー・発生の場合は -1。 Error := 0; ! エラー・コードをクリア ! Position to beginning of file CALL KEYPOSITION( QF^Num, ! filenum Key, ! key-value (not used) , ! key-specifier (not needed) 0, ! length-word = zero (position to start) 0); ! positioning-mode = approximate DO BEGIN Error := BEGINTRANSACTION(Trans^Tag); ! Start trans. CALL READUPDATELOCK(QF^Num, Buffer, Rec^Len, Byte^Count); ! 最初のレコード読み出し IF = THEN ! エラー・チェック BEGIN ! エラー発生なし Data[0] ’:=’ Buffer[Key^Len] FOR Byte^Count - Key^Len; RETURN Byte^Count; ! データを抽出してリターン ! 注:現在のキュー・レコードが処理されたところで ! ENDTRANSACTION 呼び出しを実行しなければならない 。 END; 7-16 137692J 第 7 章 キュー・ファイル ! ! READUPDATELOCK エラーの処理 ! ! どのエラーが発生したかを判別 status := FILE_GETINFO_ (QF^Num, Error); IF Error = 162 then ! タイムアウト発生 BEGIN status := ENDTRANSACTION; ! トランザクション解放 END ELSE ! 別種エラー BEGIN status := ABORTTRANSACTION; ! トランザクションのアボート RETURN -1; END; END ! デキューイング操作を 1 つ実行 UNTIL 0; END; 例 4: KEYPOSITION を使用した GENERIC 位置設定 この例では、キュー・ファイルのキー長が 10 バイトであるため、ユーザー・キーは 2 バイトの長さとな ります。キュー・ファイルをオープンしたら、GET^GENERIC 呼び出しの前にキーの範囲を指定してくだ さい。 INT QF^Num; ! キュー・ファイル番号 STRING .QF^Name[0:33] := "$pub1.spl1111.qfile"; ! ファイル名 LITERAL QF^NameLength = 19; ! バイトで表わしたファイル名の長さ INT QF^NameLen; LITERAL Key^Length = 10; ! キー長(8 バイト以上でなければならない) INT Key^Len; STRING .Key[0:Key^Length - 9]; ! アプリケーション・キー LITERAL Rec^Len = 100; ! レコード長 INT Byte^Count; ! 読み出し / 書き込みされたバイト数 INT Length^Word; ! KEYPOSITION へ渡す ! ワード長パラメータ INT Error; ! 返されたエラー・コード INT Error^Item; ! 返されたエラー発生アイテム FIXED Trans^Tag; ! トランザクション識別子 STRING .Buffer[0:Rec^Len - 1]; ! レコード・バッファ STRING .Data[0:Rec^Len - Key^Length - 1]; ! キューへ追加 / 削除されているデータ ! ?SOURCE $SYSTEM.SYSTEM.EXTDECS0 (FILE_OPEN_, ? READ, ? WRITE, ? KEYPOSITION ? FILE_CREATE_, ? FILE_CREATELIST_ ? ABORTTRANSACTION, ? BEGINTRANSACTION, ? ENDTRANSACTION ? FILEINFO, ? READUPDATELOCK, 137692J 7-17 第 7 章 キュー・ファイル ? MYTERM, ? STOP, ? DEBUG ? OPEN, ? CLOSE); ! ! 一般キー・レンジ内でレコードのデキューイングを行う ! INT PROC GET^GENERIC(Error); ! キュー・エントリ内の ! バイト数、返されたエラー・コード INT .Error; ! 、ゼロ、 BEGIN ! エラー発生時には -1 を返す。 Error := 0; ! エラー・コードをクリア Length^Word := 2; ! キー長 = 2, および 比較長 = 2 を選択 . Length^Word.<0:7> := 2; ! CALL KEYPOSITION( QF^Num, Key, 0, Length^Word, 1); ! ! ! ! ! キュー・ファイル名 キー値 キー指定子(0 でなければならない) ワード長 位置決めモード = GENERIC ! 注:実際には、キー・レンジ確定のためには KEYPOSITION を ! 1 回だけ呼び出せばよい。 DO BEGIN Error := BEGINTRANSACTION(Trans^Tag); ! トランザクション開始 CALL READUPDATELOCK(QF^Num, Buffer, Rec^Len, Byte^Count); ! 次のレコード読み出し IF = THEN ! エラー・チェック BEGIN ! エラー発生なし Data[0] ’:=’ Buffer[Key^Len] FOR Byte^Count - Key^Len; RETURN Byte^Count; ! データを抽出してリターン ! 注:現在のキュー・レコードが処理されたところで ! ENDTRANSACTION 呼び出しを実行することに注意。 END; ! ! READUPDATELOCK エラーの処理 ! ! どのエラーが発生したか判別 status := FILE_GETINFO_ (QF^Num, Error); IF Error = 162 then ! タイムアウト発生 BEGIN status := ENDTRANSACTION; ! トランザクション解放 END ELSE ! 別種エラー status := ABORTTRANSACTION; ! トランザクションのアボート RETURN -1; END ! デキューイング操作実行 UNTIL 0; END; ! PROC Get^Generic 7-18 137692J 第 7 章 キュー・ファイル 通信パス・エラー 200 から 211 までの範囲のキュー・ファイル・エラー(パス喪失、引き継ぎ、CPU 障害)、および 246 か ら 249 までの範囲のネットワーク・パス・エラーに対して、ファイル・システムはオープンされたファイ ルの同期深度がゼロ以外に設定されている場合にだけエラー修復を試行します。ところが、デキューイン グ操作(READUPDATELOCK[X] 呼び出し)はゼロの同期深度を要求するため、ファイル・システムはパ スに関連したデキューイング障害の回復操作を実行できません。 キュー・ファイルへの書き込みだけを行う(デキューイングは行わない)プロセスでは 1 以上(何個ま での WRITE[X] 操作を未完了状態で使用するかによる)の同期深度値を設定することでエラー回復処理を 実行できます。 オーディットされたファイルの場合は、同期深度値がゼロであってもアプリケーションが継続中のトラ ンザクションをアボートすることにより、パス喪失条件から回復できます。 オーディット・キュー・ファイルからのデキューイング(READUPDATELOCK[X] 呼び出し)を行うプ ロセスは、ABORTTRANSACTION を呼び出してから READUPDATELOCK[X] 操作を再試行できます。 これにより、障害発生前にレコードが削除された場合には、そのレコードが再挿入されることが保証され ます。ただし、現在のトランザクションに関連して変更されたレコードがすべて元に戻されます。したがっ て、アプリケーションはアボートされたトランザクションを最初に戻って再実行する機能を備えておく必 要があります。 非オーディット・キュー・ファイルにアクセスするプロセスでは、パス関連のエラーを回復する手段は ほとんどありません。レコード喪失や余分なレコードを発生させる原因となり得るエラー条件には次の 2 つがあります。 □ READUPDATELOCK[X] 操作はレコードが削除された後でパス関連のエラーに遭遇する可能性があり ます。この場合、レコードの内容は失われます。 □ パス関連のエラーに遭遇した WRITE[X] はすでにファイルへのレコード挿入に成功している可能性が あります。このとき同じ WRITE[X] 操作を再試行すると、同一レコードを異なる一意のキー値(異な るタイムスタンプ)で 2 回挿入することになります。 つまり、パス喪失条件からの保護が必要であるときは、オーディットされたファイルを使用します。 137692J 7-19 第 7 章 キュー・ファイル (空白ページ) 7-20 137692J 第 8 章 入力順ファイル 第 8 章 入力順ファイル ENSCRIBE の入力順ファイルはシーケンシャル・アクセス用に設計されています。このファイルは常に ファイルの終わりに追加される可変長レコードで構成されます。したがって、ファイル内のレコードはファ イルに追加された順序にしたがって物理的に配置されています。 図 8-19 は入力順ファイルの構造例を示します。 入力順ファイルの主キーはデータ・レコードの外部に存在する 4 バイトのレコード・アドレスであり、 ブロック番号とブロック内レコード番号で構成されます。一般的に、このアドレスはファイル・システム に よ っ て 内 部 処 理 さ れ る た め、ユ ー ザ ー が こ の 値 を 知 っ て お く 必 要 は あ り ま せ ん。し か し、 FILE_GETINFOLIST_ プロシージャを利用すれば、直前に読み出し / 書き込みされたレコードのアドレス を取得することができます。 使用できるシステム・プロシージャ ENSCRIBE の入力順ファイルを作成、アクセスするには、次のシステム・プロシージャを使用します。 □ FILE_CREATE_、FILE_CREATELIST_ □ FILE_OPEN_、FILE_CLOSE_、AWAITIO[X] □ LOCKFILE、UNLOCKFILE、LOCKREC、UNLOCKREC □ READ[X]、READLOCK[X]、READUPDATE[X]、READUPDATELOCK[X] □ WRITE[X]、WRITEUPDATE[X]、WRITEUPDATEUNLOCK[X] □ FILE_SETKEY、FILE_SAVEPOSITION_、KEYPOSITION、POSITION □ FILE_GETINFO_、FILE_GETINFOLIST_、FILE_GETINFOLISTBYNAME_、 FILE_GETINFOBYNAME_ □ SETMODE、CONTROL アクセスのタイプ ファイルの作成後、ユーザーが実行できる操作は次の 3 種類です。 1. WRITE 呼び出しによりファイルの終わりに新規レコードを追加する。 2. READ 呼び出しによりファイルからレコードを取得する。 3. FILE_SETLEY または KEYPOSITION 呼び出しを使用して代替キー・アクセス・パスを指定し、次に READ 呼 び出しによって指定の代替キー値を持つレコードを取り出す。 ファ イル とレ コー ドの ロッ ク用 シス テム・プ ロシ ージ ャで ある L O C K F I L E 、U N L O C K F I L E 、 READLOCK、LOCKREC、および UNLOCKREC を使用することもできます。 137692J 8-1 第 8 章 入力順ファイル ENSCRIBE の入力順ファイルはランダム・アクセス用には設計されていません。ただし、データ・レ コードが一意の代替キー値を持つ場合に限り、KEYPOSITION を READ や READLOCK と組み合わせて 使用することで、レコードのランダム・アクセスが可能になります。 注意:代替キー・ファイルへのレコード挿入の途中でエラーが発生すると、プライマリ入力順ファイルに長さゼロ のレコードが作成される可能性があります。オーディット入力順ファイルへレコードを挿入したトランザク ションがアボートされた場合も、このようなレコードが発生することがあります。TMF BACKOUT 実行の 過程で長さゼロ・レコードは、挿入されたレコードによって置き換えられます。 図 8-19 入力順ファイルの構造 入力順ファイルの作成 ENSCRIBE 入力順ファイルを作成するには、FUP(File Utility Program)を使用するか、または FILE _ CREATE_ や FILE_CREATELIST_ システム・プロシージャを呼び出します。明示的に形式 2 のキー順ファ イルを作成するのであれば、アイテム・コード 195 を使用して FILE_CREATELIST_ プロシージャ呼び出 しを実行します。さらに、DDL(Data Definition Language)コンパイラを使用して FUP のコマンド・ファ イルを作成し、これを実行して DDL ソースに記述された方式に従ってファイルを作成することができます。 パーティションされた(マルチ・ボリューム)ファイルを作成する場合、最初のパーティションが作成 された時点でファイル・システムが自動的にそのファイルのすべてのパーティションを作成します。 システム・プロシージャで入力順ファイルを作成し、そのファイルに代替キー・フィールドが含まれる 場合は、ユーザー自身がほかの代替キー・ファイルを作成します。ただし、FUP で主キー・ファイルを作 成する場合は、FUP が必要なすべての代替キー・ファイルを作成してくれます。 8-2 137692J 第 8 章 入力順ファイル 入力順ファイルを作成するにあたって、ユーザーは最大論理レコード・サイズ、データ・ブロック長、 ディスク・エクステント・サイズを考慮に入れる必要があります。 注意:入力順ファイルの主キーは形式 2 ファイルの方が大きくなるため、これに応じて代替キー・レコードのサイ ズも大きくなります。これにより代替キー・ファイルを作成するコードが影響を受け、また、代替キー・ファ イルから直接内容を読み取るプログラムも影響を受ける可能性があります。 論理レコード レコードとはアプリケーション・プログラムとファイル・システム間の情報転送の単位です。 入力順ファイルを作成する場合、そのファイルの最大論理レコードのサイズを指定しなければなりませ ん。ファイル作成時に選択する最大レコード・サイズは、アプリケーションからの特定の要求に依存します。 入力順ファイルにおける論理レコードの最大の長さは、ブロック・サイズから 24 バイト(形式 2 ファイ ルの場合は 48 バイト)を引いた値です。許容される最大ブロック・サイズである 4096 を使用するとすれ ば、入力順ファイルに許容される論理レコードの絶対最大値は 4072 バイトになります。 入力順ファイルに書き込むデータ・レコードは可変長ですが、ファイル作成時に指定した最大論理レコー ド・サイズを超えることはできません。定義済みの最大レコード長を超える長さのレコードを書き込もう とすると、ファイル・システムは操作の実行を拒絶し、エラー 21(illegal count)を返します。 ブロック ブロックはディスク・プロセスとディスク間で転送される情報の単位です。ブロックには論理レコード が含まれ、キー順ファイルには関連するコントロール情報も含まれます。コントロール情報(システムだ けにより使用される)の内容については、付録 B「構造化ファイルのブロック形式」を参照してください。 ENSCRIBE 入力順ファイルのブロック・サイズは 512、1024、2048、または 4096 バイトのいずれかに なります。 、または 44 バイト(形式 2 ファ ブロック・サイズには 1 ブロックあたり 22 バイト(形式 1 ファイル) イル)のブロック・コントロール情報が含まれ、また、レコードあたり 2、または 4 バイトのレコード・コ ントロール情報が含まれます。したがって、1 つのブロックに格納可能なレコード数の最大値は次のよう になります。 形式 1 ファイル N =(ブロック・サイズ− 22) / (レコード・サイズ+ 2) 形式 2 ファイル N =(ブロック・サイズ− 44) / (レコード・サイズ+ 4) レコードが可変長である場合、N はブロックあたりの平均レコード数、レコード・サイズは平均レコー ド長です。 137692J 8-3 第 8 章 入力順ファイル 形式 1 では、1 つのブロックに収容できるレコードの最大数は 511 で、レコード長には依存しません。 1 つのレコードが複数のブロックにまたがることはできません(つまり、あるブロックで開始し、別の ブロックで終了することはありません)。したがって、入力順ファイルにおけるブロック・サイズは、形式 1 ファイルでは少なくともレコード長+ 2 + 22 バイト以上で、形式 2 ファイルではレコード長+ 4 + 44 バイト以上になります。 ディスク・エクステント・サイズ ENSCRIBE ファイルの作成時に、次の項目を指定できます。 □ プライマリ・エクステント、およびセカンダリ・エクステントのサイズ(形式 1 ファイルでは 1 ∼ 65,535 ページ。1 ページは 2048 バイト) □ ファイルに割り当てるエクステントの最大数(非パーティション入力順ファイルでは 16 以上) エクステント・サイズを指定しなければ、プライマリ・エクステント、セカンダリ・エクステントの両 方が 1 ページとしてデフォルト設定されます。 エクステントの最大数を指定しなければ、MEXEXTENTS は 16 にデフォルト設定されます。 非パーティション入力順ファイルでは、プログラム実行中であっても SETMODE92 システム・プロシー ジャ、または FUP ALTER コマンドを実行することにより MAXEXTENTS 値を動的に変更できます。 ファイルの作成例 以下に次のファイルの作成例をコメントを付けて説明します。 1. 入力順ファイル 2. 代替キーを持つ入力順ファイル 3. 代替キーファイル 4. パーティションされた入力順ファイル 例 1:入力順ファイルの作成 この例では、財務トランザクションの発生順にその要約レコードのログを収集するファイルの作成法を 示します。レコードはその発生順に従ってシーケンシャルにファイルに書き込まれるため、このようなレ コードを保存するには入力順ファイルが適しています。 8-4 137692J 第 8 章 入力順ファイル あるレコードが次の形式を持つとします。 レコード・サイズは 60 ですから、ブロック・サイズとして 4096 を選択するとブロック・ファクタは下 式のように 1 ブロックあたり 65 レコードになります。 N =(B − 22)/(R + 2) 65 =(4096 − 22)/(60 + 2) プライマリ・エクステントのサイズを 1000 ページ、セカンダリ・エクステント・サイズを 500 ページ とすると、プライマリ・エクステントには 32,500 個のトランザクション要約が格納され、それぞれのセカ ンダリ・エクステントには 16,250 トランザクション要約レコードが格納できます。16 個すべてのエクステ ントが均一に使用されると、ファイル全体では合計 276,250 のトランザクション要約レコードが保存され ます。 ファイルを作成するには、次の FUP コマンドを使用します。 >volume $store1.svol1 >fup -set type e -set ext (1000,500) -set rec 60 -set block 4096 -show TYPE E EXT ( 1000 PAGES, 500 PAGES ) REC 60 BLOCK 4096 -create tranfile CREATED - $STORE1.SVOL1.TRANFILE FILE_CREATE_ システム・プロシージャを使用すると、次のような TAL コードをアプリケーション・ モジュールの 1 つに入れて、ファイルを作成できます。 LITERAL name^length = 22, pri^extent = 1000, sec^extent = 500, rec^len = 60, data^block^len = 4096, 137692J 8-5 第 8 章 入力順ファイル file^type = 2; ! 入力順 INT filenum; INT error; INT namelen; STRING .filename [0:21] := "$STORE1.SVOL1.TRANFILE"; ?NOLIST ?SOURCE $SYSTEM.SYSTEM.EXTDECS0(FILE_CLOSE_, ? FILE_OPEN_, ? FILE_CREATE_, ? READ) ?LIST PROC DO^THE^WORK MAIN; BEGIN namelen := name^length; ERROR := FILE_CREATE_ (filename:name^length,namelen,, pri^extent, sec^extent,, file^type,, rec^len, data^block^len); ERROR := FILE_OPEN_ (filename:name^length, filenum); ERROR := FILE_CLOSE_ (filenum); END; 例 2: 代替キーを持つ入力順ファイルの作成 この例は、例 1 と同じファイルの作成方法を説明します。異なる点は、ターミナル番号を代替キーとし て定義していることです。 ファイルを作成するには、次の FUP コマンドを使用します。 >volume $store1.svol1 >fup -set type e -set ext (1000,500) -set rec 60 -set block 4096 -set altkey ("tn",keyoff 55,keylen 5) -set altfile (0,alttran) 8-6 137692J 第 8 章 入力順ファイル -show TYPE E EXT ( 1000 PAGES, 500 PAGES ) REC 60 BLOCK 4096 ALTKEY ( "TN", FILE 0, KEYOFF 55, KEYLEN 5 ) ALTFILE ( 0, $STORE1.SVOL1.ALTTRAN ) ALTCREATE -create tranfile CREATED - $STORE1.SVOL1.TRANFILE CREATED - $STORE1.SVOL1.ALTTRAN FILE_CREATE_ システム・プロシージャを使用すると、次のような TAL コードをアプリケーション・ モジュールの 1 つに入れることで、ファイルが作成できます。 LITERAL name^length = 22, num^altkeys = 1, num^altkey^files = 1, item^list^len = 10; INT error; INT error2; INT namelen; STRING .filename [0:name^length-1] := "$STORE1.SVOL1.TRANFILE"; INT .item^list [0:item^list^len-1]; STRUCT value^list; BEGIN INT file^type; INT logical^reclen; INT block^length; INT pri^extent; INT sec^extent; INT altkeys; STRUCT altkey^descr [0:num^altkeys-1]; BEGIN STRING key^specifier [0:1]; INT key^length; INT key^offset; INT key^filenum; INT null^value; INT attributes; END; INT num^alt^key^files; STRUCT name^length^info [0:num^altkey^files-1]; BEGIN INT file^name^len; END; STRING file^names [0:20]; END; ?NOLIST ?SOURCE $SYSTEM.ZSYSDEFS.ZSYSTAL(FILESYSTEM^ITEMCODES) ?SOURCE $SYSTEM.SYSTEM.EXTDECS0(FILE_CLOSE_, 137692J 8-7 第 8 章 入力順ファイル ? FILE_OPEN_, ? FILE_CREATELIST_, ? READ) ?LIST PROC DO^THE^WORK MAIN; BEGIN namelen := name^length; item^list ’:=’ [ZSYS^VAL^FCREAT^FILETYPE, ZSYS^VAL^FCREAT^LOGICALRECLEN, ZSYS^VAL^FCREAT^BLOCKLEN, ZSYS^VAL^FCREAT^PRIMEXTENTSIZE, ZSYS^VAL^FCREAT^SCNDEXTENTSIZE, ZSYS^VAL^FCREAT^NUMALTKEYS, ZSYS^VAL^FCREAT^ALTKEYDESC, ZSYS^VAL^FCREAT^NUMALTKEYFILES, ZSYS^VAL^FCREAT^ALTFILELEN, ZSYS^VAL^FCREAT^ALTFILENAMES ]; value^list.file^type := 2; ! 入力順 value^list.logical^reclen := 60; value^list.block^length := 4096; value^list.pri^extent := 1000; value^list.sec^extent := 500; value^list.altkeys := num^altkeys; value^list.altkey^descr[0].key^specifier ’:=’ "TN"; value^list.altkey^descr[0].key^length := 5; value^list.altkey^descr[0].key^offset := 55; value^list.altkey^descr[0].key^filenum := 0; value^list.altkey^descr[0].null^value := 0; value^list.altkey^descr[0].attributes := 0; value^list.num^alt^key^files := num^altkey^files; value^list.name^length^info[0].file^name^len := 21; value^list.file^names ’:=’ "$STORE1.SVOL1.ALTTRAN"; ERROR := FILE_CREATELIST_ (filename:name^length,namelen, item^list, item^list^len, value^list, $LEN(value^list), error2); END; システム・プロシージャで入力順ファイルを作成する場合、次の例のように代替キー・ファイルを別に 作成する必要があります。 例 3: プログラムによる代替キー・ファイル作成 FUP でプライマリ・ファイルを作成する場合、必要となるすべての代替キー・ファイルを FUP が自動的 に作成してくれます。しかし、プログラムで主キーを作成する場合には、ユーザ自身が別の操作により代 替キー・ファイルを作成しなければなりません。 次のような TAL コードをアプリケーション・モジュールの 1 つに入れて、例 2 で使用するための代替 キー・ファイルを作成できます。 LITERAL name^length = 21, pri^extent = 30, 8-8 137692J 第 8 章 入力順ファイル sec^extent = 15, file^type = 3, rec^len = 11, data^block^len = 4096, key^length = 11, ! 最大代替キー長 ! + 大きなファイルの主キー長 ! + 2 key^offset = 0; INT error; INT namelen; STRING .filename [0:name^length-1] := "$STORE1.SVOL1.ALTTRAN"; namelen := name^length; error := FILE_CREATE_(filename:name^length, namelen,, pri^extent, sec^extent,, file^type,, rec^len, data^block^len, key^length, key^offset); IF Error <> 0 THEN ... 137692J ! エラー 8-9 第 8 章 入力順ファイル 例 4: パーティションされた入力順ファイルの作成 この例は、例 1 に示されたファイルの作成方法を示しますが、これにより、このファイルを根本的に 4 つのパーティションにまたがせることができます。 次の FUP コマンドを使用してファイルを作成できます。 >volume $store1.svol1 >fup -set type e -set ext (1000,500) -set rec 60 -set block 4096 -set part (1,$store2,1000,500) -set part (2,$store3,1000,500) -set part (3,$store4,1000,500) -show TYPE E EXT ( 1000 PAGES, 500 PAGES ) REC 60 BLOCK 4096 PART ( 1, $STORE2, 1000, 500 ) PART ( 2, $STORE3, 1000, 500 ) PART ( 3, $STORE4, 1000, 500 ) -create tranfile CREATED - $STORE1.SVOL1.TRANFILE 各パーティションは、個別のディスク・ボリュームに分かれています。しかし、これらのボリュームに 分かれたパーティションは、すべて同じサブボリューム名とファイル名(この例では、SVOL1.TRANSFILE) を持ちます。4 個のすべてのパーティションは同時に作成されます。 プライマリ・パーティション(#0)の 16 個のエクステントを使い切ると、ファイル・システムは自動的 にパーティション #1 を使い始めます。さらに、この 16 個すべてのエクステントを使い切ると、ファイル・ システムはパーティション #2 を使い始め、以後この順でパーティションを進めて行きます。 FILE_CREATELIST_ システム・プロシージャを使用すると、次のような TAL コードをアプリケーショ ン・モジュールの 1 つに入れて、ファイルを作成できます。 LITERAL name^length = 22, num^partitions = 3, item^list^len = 9; INT error; INT error2; INT namelen; STRING .filename [0:name^length-1] := "$STORE1.SVOL1.TRANFILE"; INT .item^list [0:item^list^len-1]; STRUCT value^list; BEGIN 8-10 137692J 第 8 章 入力順ファイル INT file^type; INT logical^reclen; INT block^length; INT pri^extent; INT sec^extent; INT partitions; STRUCT part^info [0:num^partitions-1]; BEGIN INT part^pri^extent; INT part^sec^extent; END; STRUCT vol^name^len [0:num^partitions-1]; BEGIN INT vol^name^act^len; END; STRING vol^names [0:21]; END; ?NOLIST ?SOURCE $SYSTEM.ZSYSDEFS.ZSYSTAL(FILESYSTEM^ITEMCODES) ?SOURCE $SYSTEM.SYSTEM.EXTDECS0(FILE_CLOSE_, ? FILE_OPEN_, ? FILE_CREATELIST_, ? READ) ?LIST PROC DO^THE^WORK MAIN; BEGIN namelen := name^length; item^list ’:=’ [ZSYS^VAL^FCREAT^FILETYPE, ZSYS^VAL^FCREAT^LOGICALRECLEN, ZSYS^VAL^FCREAT^BLOCKLEN, ZSYS^VAL^FCREAT^PRIMEXTENTSIZE, ZSYS^VAL^FCREAT^SCNDEXTENTSIZE, ZSYS^VAL^FCREAT^NUMPRTNS, ZSYS^VAL^FCREAT^PRTNDESC, ZSYS^VAL^FCREAT^PRTNVOLLEN, ZSYS^VAL^FCREAT^PRTNVOLNAMES]; value^list.file^type := 2; ! 入力順 value^list.logical^reclen := 60; value^list.block^length := 4096; value^list.pri^extent := 1000; value^list.sec^extent := 500; value^list.partitions := 3; value^list.part^info[0].part^pri^extent := 1000; value^list.part^info[0].part^sec^extent := 500; value^list.part^info[1].part^pri^extent := 1000; value^list.part^info[1].part^sec^extent := 500; value^list.part^info[2].part^pri^extent := 1000; value^list.part^info[2].part^sec^extent := 500; value^list.vol^name^len.vol^name^act^len[0] := 7; value^list.vol^name^len.vol^name^act^len[1] := 7; value^list.vol^name^len.vol^name^act^len[2] := 7; value^list.vol^names ’:=’ "$STORE2$STORE3$STORE4"; 137692J 8-11 第 8 章 入力順ファイル ERROR := FILE_CREATELIST_ (filename:name^length,namelen, item^list, item^list^len, value^list, $LEN(value^list), error2); END; 入力順ファイルへのアクセス 入力順ファイルに対して実行できる基本操作は、次の 3 種類です。 1. ファイルの終わりにレコードを追加する(WRITE)。 2. 主キー、または指定された代替キー値に従ってシーケンシャルにレコードを読み出す (READ または READLOCK)。 3. 使用したい代替キー・アクセス・パスを指定する (FILE_SETKEY_ または KEYPOSITION)。 さらに、FILE_GETINFOLIST_ を使用すると直前に読み出し / 書き込みを実行したレコードのアドレス を取得できます。また、FILE_SETKEY_ または KEYPOSITION を一意の代替キー値と組み合わせて使用 することにより個々のレコードをランダムに読み出すことができます。 シーケンシャル・アクセス ENSCRIBE の入力順ファイルは、シーケンシャル・アクセス用に設計されており、新規レコードは WRITE システム・プロシージャを使用してファイルの終わりに追加します。 入力順ファイルを読み出す場合、一般的には主キーを使用する(ファイル内の全レコード)か、または 特定の代替キー値(指定フィールドに指定値を持つファイル内の全レコード)によりシーケンシャルに読 み出しを実行します。 フ ァ イ ル を オ ー プ ン す る 時 点 で は、ア ク セ ス・パ ス は 主 キ ー に 設 定 さ れ て い ま す。し か し、 FILE_SETKEY_ または KEYPOSITION システム・プロシージャを使用すればアクセス・パスを主キーか ら特定の代替キーへ、またはある代替キーから別の代替キーに切り替えできます。また、特定の代替キー によりデータ・レコードを読み出した後、キー指定子とキー値 0 を与えて FILE_SETKEY_ または KEYPOSITION を使用することで、アクセス・パスを主キー(ファイル先頭から再スタート)に戻すこと もできます。 データ・レコードが可変長である場合、最大レコード長を呼び出しカウント・パラメータとして与えて READ または READLOCK プロシージャを呼び出します。ファイル・システムはディスクの終わりの物理 レコードを認識し、読み出しカウント・パラメータとして実際のデータ・レコード長を返します。 ランダム・アクセス 入力順ファイルにおいて、すべてのレコードの特定のフィールドが一意の代替キー値を持っていれば、 FILE_SETKEY_ と KEYPOSITION を、READ と READLOCK と連携させて使用することにより個々の データ・レコードをランダムに読み出すこともできます。 たとえば、ファイルがトランザクション要約レコードを格納しており、各データ・レコードのあるフィー ルドが一意のトランザクション番号を保持しているとすれば、このフィールドを代替キーとして希望のト ランザクション・レコードを任意に検索できます。 8-12 137692J 第 8 章 入力順ファイル アクセス例 この章の残りの部分では、コメント付きの例題を使用して、ENSCRIBE 入力順ファイルへの最も一般的 なアクセス方法について説明します。 例 1. 入力順ファイルへの書き込み 任意の入力順ファイルの終わりに新規データ・レコードを追加するには、WRITE または WRITEX を使 用してファイルにデータ・レコードを追加します。 CALL WRITE (filenum, buffer, write^count); IF <> THEN ... ! エラー 新規に追加したデータ・レコードの実際のレコード・アドレスが必要な場合は、FILE_GETINFOLIST_ を使用してそのアドレスを取得できます。 error := FILE_GETINFOLIST_ (filenum, itemlist, 1, result); ここで、itemlist は次のように定義されています。 itemlist := 12 ! カレント・レコードのアドレスを返す 例 2. 主キーによるシーケンシャル読み出し 操作の対象としている、可変長トランザクション要約レコードを格納した入力順ファイルにおいて、レ コードの最大長が 200 バイトであるとします。このファイル全体をシーケンシャルに読み出すには、ファ イルをオープンし、次に READ システム・プロシージャを EOF に遭遇するまで反復して呼び出します。 error := FILE_OPEN_ (filename:length, filenum, ... ); read^count := 200; eof := 0; WHILE NOT eof DO BEGIN ! read loop CALL READ (filenum, buffer, read^count, count^read); IF > THEN eof := 1 ELSE IF < THEN ... ! エラー ELSE BEGIN . ! レコードの処理(返された <count-read> . ! パラメータはレコード長をバイト単位 ! で示してくれます) END; END; ! 読み出しループ 137692J 8-13 第 8 章 入力順ファイル 例 3. 代替キーによるシーケンシャル読み出し ファイル作成時に代替キーとして指定したデータ・フィールドで、ターミナル番号 ATM37 を含むレコー ドだけを読み出したいとします。また、そのフィールドに対するキー指定子が TN であるとします。TN を キー指定子、および ATM37 をキー値として指定するには KEYPOSITION を使用します。次に読み出し ループを実行します。KEYPOSITION 呼び出しの結果として、ENSCRIBE は TN に関係付けられた代替 キー・ファイルでプライマリ・ファイル内の希望のレコードにアクセスします。読み出しループは代替 キー・ファイルで EOF に遭遇した時点で終了します。 STRING value [0:4]; INT specifier, compare^length; error := FILE_OPEN_ (filename:length, filenum, ... ); specifier := "TN"; value ’:=’ "ATM37"; compare^length := 5; generic := 1; CALL KEYPOSITION (filenum, value, specifier, compare^length, generic); read^count := 200; eof := 0; WHILE NOT eof DO BEGIN ! read loop CALL READ (filenum, buffer, read^count, count^read); IF > THEN eof := 1 ELSE IF < THEN ... ! エラー ELSE BEGIN . ! レコードの処理(返された <count-read> . ! パラメータは実際のレコード長を ! バイト単位で示してくれます) END; END; ! 読み出しループ 8-14 137692J 第 8 章 入力順ファイル 例 4. 代替キーによるランダム読み出し ある入力順ファイルがトランザクション要約レコードを格納し、各レコードの中の定義済み代替キー・ フィールドの 1 つが一意のトランザクション番号を含むものとします。さらに、そのフィールドのキー指 定子は TX であるとします。トランザクション番号 AB0829 に対応するデータ・レコードを読み出したい とすれば、EXACT 位置設定を指定して FIEL_SETKEY_ によりレコード位置を検索し、次に READ を使 用して該当レコードを読み出します。 STRING value [0:5]; INT specifier, value^length; error := FILE_OPEN_ (filename:length, filenum, ... ); specifier := "TX"; value ’:=’ "AB0829"; value^length := 6; exact := 2; error := FILE_SETKEY_ (filenum, value:value^length,specifier,exact); read^count := 200; ! maximum data record size CALL READ (filenum, buffer, read^count, count^read); ! ! 137692J 返された <count-read> パラメータは実際のレコード長を バイト単位で示しています。 8-15 第 8 章 入力順ファイル (空白ページ) 8-16 137692J 第 9 章 相対ファイル 第 9 章 相対ファイル ENSCRIBE の相対ファイルは、ディスク上の固定長物理レコードにより構成され、相対レコード番号に よりアクセスされます。レコード番号は順序数であり、ディレクトリとファイル内のレコード位置を対応 づけます。先頭レコードはレコード番号ゼロであり、それ以後のレコードは増分 1 で順次増加するレコー ド番号で識別します。 図 9-20 は相対ファイルの構造を示します。 相対ファイル内の各物理レコードの位置は一定量のスペースを占有し、それぞれに 1 つの可変長データ・ レコード(論理レコード)が含まれます。論理レコードのサイズはゼロ(空白レコード)からファイル作 成時に指定される最大許容値までの任意の値をとることができます。ファイルに書き込みした後もレコー ドの論理長は変更できますが、ファイル内の論理レコードの長さが物理レコードに固定された長さを超え ることできません。各論理レコードには長さ属性があり、レコード読み出し時に取得することができます。 相対ファイル内の論理レコードは、長さゼロを指定した書き込み操作により論理的に削除できます。 ファイルを作成して、そのファイルに 1 つのデータ・レコードの書き込みを行うと、先行する物理レコー ドも同時に作成され、中が空であっても実際にディスク・スペースを占有します。たとえば、相対ファイ ルを作成してレコード番号 135 にデータ・レコードを書き込んだとすると、その時点でレコード番号 0 か ら 134 までがディスク上に物理的に作成されます。ただし、これらの論理レコード・サイズはゼロです。 このような特性は、相対ファイルの使用を考える場合の制限因子になるため、これを考慮して相対ファ イルを使用するかを判断してください。 137692J 9-1 第 9 章 相対ファイル 図 9-20 相対ファイルの構造 相対 ファ イル に新 規レ コ ード を挿 入す る場 合の E X A C T 位置 設定 は、レコ ード 番号 を F I L E _ SETPOSITION_ プロシージャに与えることにより行います。別の方法として、レコードをファイルに挿入 する前に FILE_SETPOSITION_ にレコード番号 -2 を与えて、空いている任意の位置にレコードを挿入さ せることもできます。また、レコード番号 ×1 を FILE_POSITION_ プロシージャに与えることにより、以 後のレコードをファイルの終わりに追加することもできます。 たとえば、レコード番号 10 だけが実際にデータを格納している相対ファイルにおいて、空き位置(たと えば、レコード番号 5)を指定して WRITE プロシージャを使用することによって、その位置へ新しいレ コードを挿入できます。レコード番号 -2 を指定すると、レコードは空いているどこかの場所(必ずしも最 小番号位置とは限らない)に書き込まれます。空いている位置を指定した後に READUPDATE プロシー ジャを使用すると、ファイル・システム・エラー 11(record not in file)が返されます。また、同じ位置を 指定して READ プロシージャを実行すると、空白ではない次のレコードを読み出します。 -2 または -1 を指定して相対ファイルにレコードを挿入した場合、新しいレコードが実際にどのレコード 番号に格納されているかを確認するには、FILE_GETINFOLIST_ プロシージャを使用します。 相対ファイルが最も適しているアプリケーションは、固定長レコードにはランダム・アクセスが適して おり、レコード番号がそれぞれの論理レコード内のデータと意味のある相関関係を持つような場合です。 たとえば、在庫ファイルを相対ファイルで作成し、パーツ番号をレコード番号として利用するのがこの例 です。しかし、このような使い方をすればディスク・スペースの大変な無駄使いになる可能性があります。 パーツ番号付け方式を行うと全体の番号シーケンスに大きなギャップがでるため、割り当てが行われても、 実際には使われないレコードが多数発生します。 9-2 137692J 第 9 章 相対ファイル インボイス番号をレコード番号として使用するインボイス・ファイルの方が相対ファイルの利用に向い ています。インボイス番号の番号付けには、大きなギャップはありません。後者の場合、インボイス番号 は 10000 のような大きな数字であることが多いので、何らかのアドレス変換方式を使用してゼロから始ま る順序数を発生させてレコード番号とし、実際のインボイス番号はレコード内のフィールドの 1 つに格納 することになります。 使用できるシステム・プロシージャ ENSCRIBE 相対ファイルの作成とアクセスには、次のシステム・プロシージャを使用します。 □ FILE_CREATE_、FILE_CREATELIST_ □ FILE_OPEN_、FILE_CLOSE_、AWAITIO[X] □ LOCKFILE、LOCKREC、UNLOCKFILE、UNLOCKREC □ FILE_SETKEY_、FILE_SETPOSITION_、POSITION、KEYPOSITION、SAVEPOSITION、 REPOSITION □ READ[X]、READLOCK[X]、READUPDATE[X]、READUPDATELOCK[X] □ WRITE[X]、WRITEUPDATE[X]、WRITEUPDATEUNLOCK[X] □ FILE_GETINFO_、FILE_GETINFOLIST_、FILE_GETINFOBYNAME_、 FILE_GETINFOLISTBYNAME_ アクセスのタイプ 相対ファイル内の特定のレコードを参照するには、主キー(相対レコード番号)を使用するか、または 代替キー・フィールド(たとえば従業員ファイルにおける所属部署番号や郵便番号)を使用します。 ENSCRIBE の相対ファイルで使用する主なポインタには次の 3 種類があります。 Current-record ポインタ:読み出し / 書き込みが行われた最新の物理レコードを指定します。 Next-record ポインタ :読み出し / 書き込みが行われる次の物理レコードを指定します。 EOF ポインタ : 現在データを保持しているレコードの中の最高位アドレス・レコードの次のバイ トを指定します。あるファイルを多重オープンすると、EOF ポインタは共有さ れます。 137692J 9-3 第 9 章 相対ファイル 相対ファイル内のデータ・レコードに代替キー・フィールドがある場合、代替キー・フィールドでポイ ンタを操作するときに以下の 2 つの値を使用できます。 カレント・キー指定子 :ファイル内のレコードにアクセスするには、どの代替キー・フィールドが使用さ れるかを示します。カレント・アクセス・パスが主キーであれば、カレント・ キーの指定子はゼロです。 カレント・キー値 :カレント・アクセス・パスで実際に使用されている特定の代替キー値を示します。 カレント・アクセス・パスが主キーであれば、カレント・キー値は読み出し / 書 き込みされた最新の物理レコードのアドレスです。 相対ファイルをオープンした時点では、current-record と next-record ポインタは共にファイルの先頭レ コードを指し、アクセス・パスは主キーに設定されます。 アクセス・パスは、FILE_SETKEY_、FILE_SETPOSITION_、KEYPOSITION、および POSITION シス テム・プロシージャを使用すれば、任意のタイミングで切り替えできます。主キー・フィールドから代替 キー・フィールドへ、ある代替キー・フィールドから別の代替キーへ、または主キーへ戻すといった変更 も可能となります。主キーによるアクセス・パスを使用する場合、READ、READLOCK、および WRITE を順次呼び出して行くことにより、ファイル内の高位にある物理レコードに順番にアクセスして行きます。 FILE_SETPOSITION_ プロシージャを使用すると、任意のタイミングで next-record ポインタの値を変更し てファイル内の任意のレコードにアクセスできます。また、FILE_SETPOSITION_ を利用して next-record ポインタの内容が EOF 位置(ファイルの終わりへの追加)、あるいは次の空白レコードを指示するように 変更できます。 特定の代替キーがアクセス・パスである場合、READ や READLOCK システム・プロシージャの順次呼 び出しにより、該当フィールドに特定の値(または部分値)を含む高位の物理レコードに順次アクセスし ます。FILE_SETKEY_ システム・プロシージャを使用して、任意のタイミングでカレント・キー指定子と カレント・キー値を変更し、これにより next-record ポインタの内容を変更して、任意の代替キー・フィー ルドに指定の値(または部分値)を持つファイルの先頭レコードを指示できます。 FILE_SETPOSITION_ は、常にアクセス・パスを主キーに設定します。 FILE_SETOSITION_ によりアクセス・パスを代替キー・フィールドから主キーへ戻せますが、これを実 行すると next-record ポインタは再度ファイルの先頭レコード(相対レコード番号 0)を指します。 相対ファイルの作成 ENSCRIBE の 相対 ファ イル を作 成す るに は、FUP (File Utility Program)を 使用 する か、また は FILE_CREATE_ プロシージャや FILE_CREATELIST_ プロシージャを呼び出します。さらに、DDL(Data Definition Language)コンパイラで FUP のコマンド・ファイルを作成し、これを実行して DDL ソースに 記述された方式に従ってファイルを作成できます。 パーティション化された(マルチボリューム)ファイルを作成する場合は、最初のパーティションを作 成した時点で、ファイル・システムが該当ファイルのすべてのパーティションを自動作成してくれます。 システム・プロシージャを使用して相対ファイルを作成し、ファイルが代替キー・フィールドを持って いる場合は、ユーザー自身が代替キー・ファイルを作成します。 9-4 137692J 第 9 章 相対ファイル ただし、FUP で主キー・ファイルを作成している場合は、FUP により必要な代替キー・ファイルが自動 作成されます。 相対ファイル作成にあたり、ユーザーは論理レコードの最大サイズ、データ・ブロック長、およびエク ステント・サイズを考慮する必要があります。 論理レコード 論理レコードはアプリケーション・プログラムとファイル・システム間の情報転送の単位になります。 相対ファイルを作成する時点で、そのファイルに対する最大論理レコード長を指定する必要があります。 このパラメータはディスク上の固定長物理レコードのサイズを定義します。 ファイル作成時に選択するその最大レコード・サイズは、アプリケーションそれぞれの独自の要求に依 存します。 形式 1 ファイル 形式 1 の相対ファイルにおける論理レコードの最大長は、ブロック・サイズから 24 バイトを引いた値で す。最大許容ブロック・サイズである 4096 を使用した場合、相対ファイルに許可される論理レコード・サ イズの絶対最大値は 4072 バイトになります。 形式 2 ファイル 形式 2 の相対ファイルにおける論理レコードの最大長は、ブロック・サイズから 48 バイトを引いた値で す。最大許容ブロック・サイズである 4096 を使用した場合、相対ファイルに許可される論理レコード・サ イズの絶対最大値は 4048 バイトになります。レコード・サイズが利用できる制限を超えるとエラー 579 が 返されます。 相対ファイルに書き込むレコードは可変長ですが、ファイル作成時に指定した論理レコード・サイズ最 大値を超えることはできません。定義済みの最大レコード長を超えた長さのレコードを書き込もうとする と、ファイル・システムは挿入実行を拒絶し、エラー 21(illegal count)を返します ブロック ブロックはディスク・プロセスとディスク間で転送される情報の単位です。ブロックには論理レコード が含まれ、相対ファイルには関連するコントロール情報も含まれます。コントロール情報(システムだけ により使用される)の内容については、付録 B「構造化ファイルのブロック形式」を参照してください。 ENSCRIBE 相対ファイルのブロック・サイズは 512、1024、2048、または 4096 バイトのいずれかにな ります。 ブロック・サイズには、1 ブロックあたり 22 または 44 バイトのブロック・コントロール情報、および 1 レコードあたり 2 または 4 バイトのレコード・コントロール情報が含まれます。したがって、1 つのブ ロックに格納可能なレコード数の最大値は次のようになります。 形式 1 ファイル: N =(ブロック・サイズ− 22)/(レコード・サイズ+ 2) 形式 2 ファイル: N =(ブロック・サイズ− 44)/(レコード・サイズ+ 4) 1 つのブロックに格納できる最大レコード数はレコード長には依存せず、それぞれ形式 1 ファイルの場 合は 511、形式 2 ファイルの場合は 32767 個です。 137692J 9-5 第 9 章 相対ファイル 1 つのレコードが複数のブロックにまたがることはできません(つまり、あるブロックで開始し、別の ブロックで終了することはありません)。したがって、相対ファイルにおけるブロック・サイズは、形式 1 ファイルでは少なくともレコード長+ 2 + 22 バイト以上であり、形式 2 ファイルではレコード長+ 4 + 44 バイト以上になります。 9-6 137692J 第 9 章 相対ファイル ディスク・エクステント・サイズ ENSCRIBE ファイル作成時に、次の項目を指定できます。 □ プライマリ・エクステント、およびセカンダリ・エクステントのサイズ(形式 1 ファイルでは 1 ∼ 65,535 ページ。1 ページは 2048 バイト) □ ファイルに割り当てるエクステントの最大数(非パーティション相対ファイルでは 16 以上) エクステント・サイズを指定しなければ、プライマリ・エクステント、セカンダリ・エクステントの両 方が 1 ページとしてデフォルト設定されます。 エクステントの最大数を指定しなければ、MEXEXTENTS は 16 にデフォルト設定されます。 非パーティション相対ファイルでは、プログラム実行中であっても SETMODE92 システム・プロシー ジャ、または FUP ALTER コマンドを実行することにより MAXEXTENTS 値を動的に変更できます。 ファイルの作成例 以下に、相対ファイル、代替キーを持つ相対ファイル、代替キー・ファイル、およびパーティションさ れた相対ファイルの作成例を示します。 例 1: 相対ファイルの作成 この例は従業員データ・ファイルの作成方法を示します。このファイルの各レコードには従業員番号で アクセスします。従業員番号が 0 または 1(従業員第 1 号)で始まり、増分 1 で順番に増加していく場合 は、相対ファイルが適しています。 レコード形式を次にします。 従業員番号はレコード内のデータとして保持されますが、実際にレコードにアクセスするのに使用する のは、相対レコード番号です。 137692J 9-7 第 9 章 相対ファイル レコード・サイズ 112 の形式 1 ファイルを使用し、ブロック・サイズとして 4096 を選択すれば、下の 式により 1 ブロックあたりのブロック・ファクタは 35 レコードになります。 N =(B − 22)/(R + 2) 35 =(4096 − 22)/(112 + 2) プライマリ・エクステントのサイズを 60 ページとし、セカンダリ・エクステント・サイズを 30 ページ とすればプライマリ・エクステントには 1050 人分の従業員レコードが格納され、それぞれのセカンダリ・ エクステントには 525 人分のレコードが格納できます。16 個すべてのエクステントが使用されると、ファ イル全体では合計 8925 個の従業員レコードが保存されます。 ファイルを作成するには次の FUP コマンドを使用します。 >volume $store1.svol1 >fup -set type r -set ext (60,30) -set rec 112 -set block 4096 -show TYPE R EXT ( 60 PAGES, 30 PAGES ) REC 112 BLOCK 4096 MAXEXTENTS 16 -create empfile CREATED - $STORE1.SVOL1.EMPFILE FILE_CREATE_ システム・プロシージャを使用すると、次のような TAL コードをアプリケーション・ モ ジ ュ ー ル に 入 れ て、フ ァ イ ル を 作 成 で き ま す。こ の コ ー ド は ノ ー ド 名 を 指 定 し て い な い た め、 FILE_CREATE_ は ノー ド名 を =_DEFAULTS DEFINE の VOLUME 属 性の 現在 値か ら取 得し ます。 =_DEFAULTS DEFINE の詳細については、『TACL プログラミング・ガイド』を参照してください。 LITERAL name^length = 21, pri^extent = 60, sec^extent = 30, file^type = 1, rec^len = 112, data^block^len = 4096; INT namelen; INT error; STRING .filename [0:name^length-1] := "$STORE1.SVOL1.EMPFILE"; namelen := name^length; error := FILE_CREATE_ (filename:name^length, namelen,, pri^extent, sec^extent,, file^type,, rec^len, data^block^len); IF error <> 0 THEN ... 9-8 ! エラー 137692J 第 9 章 相対ファイル 例 2: 代替キーを持つ相対ファイルの作成 この例は、例 1 と同じファイルの作成方法を説明します。異なる点は、部門別コード・フィールドを代 替キーとして定義していることです。 ファイルを作成するには、次の FUP コマンドを使用します。 >volume.$store1.svol1 >fup -set type r -set ext (60,30) -set rec 112 -set block 4096 -set altkey ("DP",keyoff 80,keylen 5) -set altfile (0,dept) -show TYPE R EXT ( 60 PAGES, 30 PAGES ) REC 112 BLOCK 4096 ALTKEY ( "DP", FILE 0, KEYOFF 80, KEYLEN 5 ) ALTFILE ( 0, $STORE1.SVOL1.DEPT ) ALTCREATE -create empfile CREATED - $STORE1.SVOL1.EMPFILE CREATED - $STORE1.SVOL1.DEPT CREATE_ プロシージャを使用すると、次のような TAL コードをアプリケーション・モジュールの 1 つ に入れることで、ファイルが作成できます。 新規作成ファイルのノード名とボリューム名は =_DEFAULTS DEFINE の VOLUME 属性の現在値から 取得します。 LITERAL name^length = 13, num^altkeys = 1, num^altkey^files = 1, item^list^len = 10; INT error; INT error2; 137692J 9-9 第 9 章 相対ファイル INT namelen; STRING .filename [0:name^length-1] := "SVOL1.EMPFILE"; INT .item^list [0:item^list^len-1]; STRUCT value^list; BEGIN INT file^type; INT logical^reclen; INT block^length; INT pri^extent; INT sec^extent; INT altkeys; STRUCT altkey^descr [ 0:num^altkeys-1]; BEGIN STRING key^specifier [0:1]; INT key^length; INT key^offset; INT key^filenum; INT null^value; INT attributes; END; INT num^alt^key^files; STRUCT name^length^info [ 0:num^altkey^files-1]; BEGIN INT file^name^len; END; STRING file^names [0:9]; END; ?NOLIST ?SOURCE $SYSTEM.ZSYSDEFS.ZSYSTAL(FILESYSTEM^ITEMCODES) ?SOURCE $SYSTEM.SYSTEM.EXTDECS0(FILE_CLOSE_, ? FILE_OPEN_, ? FILE_CREATELIST_, ? READ) ?LIST PROC DO^THE^WORK MAIN; BEGIN namelen := name^length; item^list ’:=’ [ZSYS^VAL^FCREAT^FILETYPE, ZSYS^VAL^FCREAT^LOGICALRECLEN, ZSYS^VAL^FCREAT^BLOCKLEN, ZSYS^VAL^FCREAT^PRIMEXTENTSIZE, ZSYS^VAL^FCREAT^SCNDEXTENTSIZE, ZSYS^VAL^FCREAT^NUMALTKEYS, ZSYS^VAL^FCREAT^ALTKEYDESC, ZSYS^VAL^FCREAT^NUMALTKEYFILES, ZSYS^VAL^FCREAT^ALTFILELEN, ZSYS^VAL^FCREAT^ALTFILENAMES ]; value^list.file^type := 1; ! 相対 value^list.logical^reclen := 112; value^list.block^length := 4096; 9-10 137692J 第 9 章 相対ファイル value^list.pri^extent := 60; value^list.sec^extent := 30; value^list.altkeys := num^altkeys; value^list.altkey^descr[0].key^specifier ’:=’ "DP"; value^list.altkey^descr[0].key^length := 5; value^list.altkey^descr[0].key^offset := 80; value^list.altkey^descr[0].key^filenum := 0; value^list.altkey^descr[0].null^value := 0; value^list.altkey^descr[0].attributes := 0; value^list.num^alt^key^files := num^altkey^files; value^list.name^length^info[0].file^name^len := 10; value^list.file^names ’:=’ "SVOL1.DEPT"; ERROR := FILE_CREATELIST_ (filename:name^length,namelen, item^list, item^list^len, value^list, $LEN(value^list), error2); END; 代替キー・ファイルは、別に作成する必要があります(例 3 参照) 。 例 3: 代替キー・ファイルの作成 FUP でプライマリ・ファイルを作成する場合は、必要な代替キー・ファイルを FUP が自動的に作成しま す。プログラムで主キーを作成する場合には、ユーザ自身が別の操作により代替キー・ファイルを作成し ます。この例は、形式 1 ファイルの使用を仮定しています。形式 2 ファイルとの相違点については、例 3 「代替キーを持つ形式 2 のキー順ファイル作成」を参照してください。 次のような TAL コードをアプリケーション・モジュールの 1 つに入れて、例 2 の用の代替キー・ファイ ルを作成できます。ここでも、=_DEFAULTS DEFINE の VOLUME 属性現在値からノード名を取得します。 LITERAL name^length = 20, pri^extent = 30, sec^extent = 15, file^type = 3, rec^len = 11, data^block^len = 4096, 最大代替キー長 key^length = 11, ! ! + 主キー長 ! + 2 key^offset = 0; INT namelen; INT error; STRING .filename [0:name^length-1] := "$STORE1.SVOL1.INVALT"; namelen := name^length; error := FILE_CREATE_(filename:name^length, namelen,, pri^extent, sec^extent,, file^type,, rec^len, data^block^len, key^length, key^offset); IF error <> 0 THEN ... 137692J ! エラー 9-11 第 9 章 相対ファイル 例 4: パーティションされた相対ファイルの作成 この例は例 1 と同じファイルの作成方法を説明しますが、このファイルは 4 つまでのパーティションに またがることができます。 次の FUP コマンドで、このファイルを作成できます。 volume $part1.svol1 >fup -set type r -set ext (60,30) -set rec 112 -set block 4096 -set part (1,$part2,60,30) -set part (2,$part3,60,30) -set part (3,$part4,60,30) -show TYPE R EXT ( 60 PAGES, 30 PAGES ) REC 112 BLOCK 4096 PART ( 1, $PART2, 60, 30 ) PART ( 2, $PART3, 60, 30 ) PART ( 3, $PART4, 60, 30 ) -create empfile CREATED - $PART1.SVOL1.EMPFILE 各パーティションは、それぞれディスク・ボリュームに分かれています。これらのボリュームに分かれ たパーティションは、同じサブボリューム名とファイル名(この例では、SVOL1.EMPFILE)を持ちます。 4 個のパーティションは同時に作成されます。 プライマリ・パーティション(#0)の 16 個のエクステントを使い切ると、ファイル・システムは自動的 にパーティション #1 を使い始めます。さらに、この 16 個すべてのエクステントを使い切ると、ファイル・ システムはパーティション #2 を使い始め、以後この順でパーティションを進めて行きます。 FILE_CREATELIST_ システム・プロシージャを使用すると、次のような TAL コードをアプリケーショ ン・モジュールの 1 つに入れて、同じファイルを作成できます。このコードはノード名を指定していない ため、FILE_CREATELIST_ プロシージャはノード名を =_DEFAULTS DEFINE の VOLUME 属性の現在 値から取得します。 LITERAL name^length = 20, num^partitions = 3, item^list^len = 9; INT error; INT error2; INT namelen; STRING .filename [0:name^length-1] := "$PART1.SVOL1.EMPFILE"; INT .item^list [0:item^list^len-1]; STRUCT value^list; BEGIN INT file^type; INT logical^reclen; INT block^length; INT pri^extent; 9-12 137692J 第 9 章 相対ファイル INT sec^extent; INT partitions; STRUCT part^info [0:num^partitions-1]; BEGIN INT part^pri^extent; INT part^sec^extent; END; STRUCT vol^name^len [0:num^partitions-1]; BEGIN INT vol^name^act^len; END; STRING vol^names [0:18]; END; ?NOLIST ?SOURCE $SYSTEM.ZSYSDEFS.ZSYSTAL(FILESYSTEM^ITEMCODES) ?SOURCE $SYSTEM.SYSTEM.EXTDECS0(FILE_CLOSE_, ? FILE_OPEN_, ? FILE_CREATELIST_, ? READ) ?LIST PROC DO^THE^WORK MAIN; BEGIN namelen := name^length; item^list ’:=’ [ZSYS^VAL^FCREAT^FILETYPE, ZSYS^VAL^FCREAT^LOGICALRECLEN, ZSYS^VAL^FCREAT^BLOCKLEN, ZSYS^VAL^FCREAT^PRIMEXTENTSIZE, ZSYS^VAL^FCREAT^SCNDEXTENTSIZE, ZSYS^VAL^FCREAT^NUMPRTNS, ZSYS^VAL^FCREAT^PRTNDESC, ZSYS^VAL^FCREAT^PRTNVOLLEN, ZSYS^VAL^FCREAT^PRTNVOLNAMES]; value^list.file^type := 1; ! 相対 value^list.logical^reclen := 112; value^list.block^length := 4096; value^list.pri^extent := 60; value^list.sec^extent := 30; value^list.partitions := 3; value^list.part^info[0].part^pri^extent := 60; value^list.part^info[0].part^sec^extent := 30; value^list.part^info[1].part^pri^extent := 60; value^list.part^info[1].part^sec^extent := 30; value^list.part^info[2].part^pri^extent := 60; value^list.part^info[2].part^sec^extent := 30; value^list.vol^name^len.vol^name^act^len[0] := 6; value^list.vol^name^len.vol^name^act^len[1] := 6; value^list.vol^name^len.vol^name^act^len[2] := 6; value^list.vol^names ’:=’ "$PART2$PART3$PART4"; error := FILE_CREATELIST_ (filename:name^length,namelen, item^list, item^list^len, value^list, $LEN(value^list), error2); END; 137692J 9-13 第 9 章 相対ファイル 相対ファイルへのアクセス 以下は、ファイル・ポインタと ENSCRIBE 相対ファイルへのアクセス方法を説明します。 ファイル・ポインタ 相対ディスク・ファイルをオープンするたびに、next-record ポインタと current-record ポインタが定義さ れます。したがって、同一ファイルを同時に多重オープンしても、論理的にはそれぞれを独立したファイ ルとしてアクセスすることができます。next-record ポインタと current-record ポインタは、アプリケーショ ン・プロセス環境にあるファイルの ACB(アクセス・コントロール・ブロック)に保持されます。 しかし、EOF ポインタの場合はディスク相対ファイルのすべてのオープンに対して 1 つのポインタが関 連付けられます。これにより、複数の異なるアクセスによるファイルの終わりへのデータ追加が可能にな ります。EOF ポインタはディスク -I/O- プロセス環境の FCB(ファイル・コントロール・ブロック)が保 持します。あるファイルがオープンされ、そのファイルが既にオープンされていなければ、EOF ポインタ 値がディスク上のファイル・ラベルからコピーされます。 POSITION、または FILE_SETPOSITION_ 呼び出しにアドレスとして -1 を与えることで、next-record ポ インタの内容を明示的に EOF ポインタ値に変更できます。 ファイルへの追加を実行すると、ファイル内のデータの終わりへ新規ブロックが追加されるたびに EOF ポインタは自動的に進められます。パーティションされたファイルの場合は、EOF ポインタがデータを持っ ている最終パーティションにだけに関係します。 ファイルの EOF ポインタは、変更の度にディスクのファイル・ラベルにライトスルーされる訳ではあり ません。相対ファイルの場合、EOF ポインタは次の事象のいずれかが発生した場合だけにディスク上に物 理的に書き込まれます。 ● ファイル・ラベル・フィールドが変更され、自動更新オプションが有効設定されている。 ● 最後のアクセス元がファイルをクローズした。 ● そのファイルに対して DISK_REFRESH_ プロシージャが呼び出された。 ● そのファイルのボリュームに対して REFRESH コマンドが実行された。 FILE_CREATE_ プロシージャを使用していれば、オプション・ビット 13 を 1 にセットして自動更新オ プションを有効化できます。FUP を使用していれば、SET REFRESH コマンドを実行してこのオプション が有効設定されます。 自動更新オプションが無効になっている状態で作成されたファイルには、REFRESH ON パラメータを与 えて FUP ALTER コマンドを実行すると自動更新を順次変更できます。 9-14 137692J 第 9 章 相対ファイル ファイル・システム・プロシージャ実行によるポインタの変化 以下の項目は、使用できるシステム・プロシージャを実行した場合にカレント・アクセス・パス、currentrecord ポインタ、next-record ポインタがどのように変化するかを説明します。 FILE_OPEN_ カレント・アクセス・パスを主キー・フィールドに設定します。 current-record ポインタと next-record ポインタがレコード番号 0 を指示するように値を変更します。 FILE_SETPOSITION,POSITION カレント・アクセス・パスを主キー・フィールドに設定します。 current-record ポインタと next-record ポインタの両者が指定されたレコード番号のレコードをを指示 するように値を変更します。 レコード番号 -1 が与えられると、両者は EOF 位置にリセットされます。 レコード番号 -2 が与えられると、両者は利用可能な空白レコードのいずれかを指示するようにリセッ トされます。 FILE_SETKEY_, KEYPOSITION カレント・アクセス・パスを指定されたキー・フィールドに設定します。 ● 一意でない代替キーの場合:current-record ポインタと next-record ポインタの両者が、指定され た代替キー・フィールドが指定された値(または、部分キー値)を持つファイル内の最初(最下位) のレコードを指示するように変更します。 ● 一意の代替キーの場合:current-record ポインタと next-record ポインタの両者が、指定された代 替キー・フィールドが指定された値を持つファイル内の特定のレコードを指示するように変更しま す。 READ または READLOCK next-record ポインタが指示するレコードの内容を返します。主キーを使用して読み出す場合、READ と READLOCK は空白レコードを読み飛ばします。 操作が完了すると、READ と READLOCK はポインタを次のように変更します。 ● current-record ポインタ = next-record ポインタ ● next-record ポインタ = カレント・アクセス・パス上の次の高位レコード・アドレス READ や READLOCK が空白レコードを 1 つ読み飛ばすごとに、ポインタもそれに応じて 1 つ増分 され、常に正しい値を保ちます。 WRITE next-record ポインタが指示するレコードへ書き込みます。書き込み先レコードは空白でなければな りません。空白でない場合、操作は、エラー 10(record already exists)により失敗します。 操作が完了すると、WRITE はポインタを次のように変更します。 137692J 9-15 第 9 章 相対ファイル ● current-record ポインタ = next-record ポインタ ● next-record ポインタ = カレント・アクセス・パス上の次の高位レコード・アドレス 以下のプロシージャでは、ポインタは変化しません。 FILE_GETINFOLIST_ current-record ポインタと next-record ポインタの値を返します。 READUPDATE or READUPDATELOCK current-record ポインタが指示するレコードの内容を返します。このレコードにはデータが存在しな ければなりません。空白レコードであった場合は、エラー 11(record not in file)によって操作が失敗 します。 WRITEUPDATE または WRITEUPDATEUNLOCK current-record ポインタが指示するレコードへ書き込みます。このレコードにはデータが存在してい なければなりません。空白レコードであった場合は、エラー 11(record not in file)によって操作が失 敗します。 シーケンシャル・アクセス ENSCRIBE 相対ファイルへのシーケンシャル・アクセスは、READ、READLOCK、WRITE システム・ プロシージャで実現されます。 カレント・アクセス・パスが主キーである場合、READ または READLOCK の順次呼び出しは、ファイ ル内のより高位にある物理レコードのデータを順番に取得します(空白レコードは読み飛ばし)。 カレント・アクセス・パスが代替キー・フィールドの 1 つである場合、READ または READLOCK の順 次呼び出しは、指定されたアクセス・パス内のより高位にある物理レコードのデータを順番に取得します (つまりカレント・キー指定子が指定する代替キー・フィールドの値がカレント・キー値である物理レコー ド)。 どちらの方法でも、最終レコードを超えて読み出そうとすると EOF を返します。 データ・レコードの書き込み操作中は、WRITE の順次呼び出しによりファイル内のより高位にある物理 レコードに順番に書き込みが実行されます。ただし、WRITE は空白物理レコードに対する書き込みだけを 行うことに注意してください。データが存在する物理レコードに WRITE を使用すると、エラー 10(record already exists)により操作が失敗します。 READ、READLOCK、または WRITE 呼び出しが完了するごとに、next-record ポインタの現在値が current-record ポインタにセットされ(これにより、直前に読み出し / 書き込みされたレコードを指示しま す)、next-record ポインタはインクリメントされてカレント・アクセス・パス上で次に高位に位置する物理 レコードを指示します。 主キーによってシーケンシャル読み出し / 書き込みを行う場合、物理レコードの異なるサブセットにア クセスするには、FILE_SETPOSITION_ または POSITION システム・プロシージャを呼び出します。 9-16 137692J 第 9 章 相対ファイル FILE_SETPOSITION_ または POSITION 呼び出しにより位置を指定し、READ、READLOCK または WRITE を呼び出すと、指定された物理レコードにアクセスします。以後の READ、READLOCK または WRITE 呼び出しはファイル内のより高位にある物理レコードに順番にアクセスします。 ある代替キーを使用してシーケンシャル読み出し / 書き込みを実行している場合、FILE_SETKEY_ シス テ ム・プ ロ シ ー ジ ャ 呼 び 出 し を 行 え ば、新 し い 代 替 キ ー・ア ク セ ス・パ ス に 位 置 変 更 で き ま す。 FILE_SETKEY_ 呼び出しを実行すると、これに続く READ や READLOCK 呼び出しは代替キー・フィー ルドにキー指定子が指定する特定の値を持つファイルの先頭(最下位)物理レコードを取り出します。 ランダム・アクセス FILE_SETPOSITION_ と関 連付 けて READUPDATE 、WRITEUPDATE、READUPDATELOCK 、 WRITEUPDATEUNLOCK などのデータ更新用プロシージャを使用すると、ENSCRIBE 相対ファイルへの ランダム・アクセスが可能になります。更新操作の対象となるのは、現在 current-record ポインタが指示し ているレコードです。ランダム処理では、更新の対象となるレコードがある状態でなければなりません。 current-record ポインタが指示する物理レコードが空白である場合は、その操作はエラー 11(record not found)により失敗します。 WRITEUPDATE または WRITEUPDATEUNLOCK で、レコードの主キーを変更することはできません。 変更が必要な場合は、書き込みカウント値ゼロを指定し、WRITEUPDATE を呼び出してレコードを削除 し、FILE_SETPOSITION_ と WRITE 呼び出しによって対象の物理レコードにレコードを挿入します。 一意でない代替キーが選択された状態で FILE_SETKEY_ 呼び出しの直後にデータを更新しようとする と、その操作はエラー 46(invalid key)により失敗します。しかし、途中で READ または READLOCK 呼 び出しを実行しておけば、更新操作が許可されます。 レコードの挿入 相対ファイルへのデータ・レコード挿入には、WRITE システム・プロシージャを使用します。データ・ レコードが書き込まれる先は next-record ポインタが指示する物理レコードです。相対ファイルでは、挿入 先として参照された物理レコードが空でなければなりません。空でない場合には、書き込み操作がエラー 10(duplicate record)により失敗します。 代替キーが一意であると宣言されているにもかかわらず、このような代替キー・フィールドに重複する 値を持つレコードを書き込もうとすると、その操作はエラー 10(diplicate record)により失敗します。 相対ファイルでは空白レコード(write-count=0)の挿入は許されません。 挿入されるレコードの長さは、ファイルに定義されたレコード長以下でなければなりません。これに違 反すると、その操作はエラー 21(invalid count)により失敗します。 137692J 9-17 第 9 章 相対ファイル レコードの削除 レコ ード を削 除す るに は、 w r i t e - c o u n t = 0 WRITEUPDATE を指 定し て ま たは WRITEUPDATEUNLOCK を呼び出します。削除の対象となるのは、current-record ポインタが指示する物 理レコードです。 ファイル・アクセスの例 ここからは、コメント付きの例を使用して、ENSCRIBE 相対ファイルへの一般的なアクセス方法を説明 します。 例のほとんどが図 9-21 に示す相対ファイル例を使用しています。 図 9-21 相対ファイル例 名前 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 アドレス nnnnnnnnnnnn 部門コード(DP) aaaaaaaaaaaaa 職種コード 給与 地域コード(RG) 56 jjj ssssss 3 60 60 56 56 34 60 34 60 60 56 jjj jjj jjj jjj jjj jjj jjj jjj jjj jjj ssssss ssssss ssssss ssssss ssssss ssssss ssssss ssssss ssssss ssssss 4 2 3 3 3 4 3 4 2 6 46 46 jjj jjj ssssss ssssss 5 1 60 34 46 jjj jjj jjj ssssss ssssss ssssss 1 3 4 (空白) nnnnnnnnnnnn nnnnnnnnnnnn nnnnnnnnnnnn nnnnnnnnnnnn nnnnnnnnnnnn nnnnnnnnnnnn nnnnnnnnnnnn nnnnnnnnnnnn nnnnnnnnnnnn nnnnnnnnnnnn aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa (空白) (空白) nnnnnnnnnnnn nnnnnnnnnnnn aaaaaaaaaaaaa aaaaaaaaaaaaa (空白) nnnnnnnnnnnn nnnnnnnnnnnn nnnnnnnnnnnn aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa 主キーによるシーケンシャル読み出し 図 9-21 に示すサンプル・ファイルを使用し、ファイルのオープン後直ちに下記の READ 呼び出し並び を実行すると、レコード 0, 2, 3, 4, 5 がそれぞれ読み出されます。 CALL CALL CALL CALL CALL 9-18 READ READ READ READ READ (filenum, buffer, read^count); (filenum, buffer, read^count); (filenum, buffer, read^count); (filenum, buffer, read^count); (filenum, buffer, read^count); ! ! ! ! ! レコード 0 の読み出し レコード 2 の読み出し レコード 3 の読み出し レコード 4 の読み出し レコード 5 の読み出し 137692J 第 9 章 相対ファイル このシーケンスは空白レコード(サンプル・ファイルのレコード 1)を読み飛ばします。 ファイル内のある位置を指定して、主キーによるシーケンシャル読み出しを行うには、次のようなシー ケンスを使用できます。 CALL FILE_SETPOSITION_(filenum,10F); ! アクセス・パス = 0 に設定 ! (主キー) および ! next-record ポインタ = 10 CALL READ (filenum, buffer, read^count); ! レコード 10 の読み出し CALL READ (filenum, buffer, read^count); ! レコード 11 の読み出し CALL READ (filenum, buffer, read^count); ! レコード 14 の読み出し CALL READ (filenum, buffer, read^count); ! レコード 15 の読み出し CALL READ (filenum, buffer, read^count); ! レコード 17 の読み出し このシーケンスは空白レコード(サンプル・ファイルのレコード 12,13,16)を読み飛ばします。 代替キーによるシーケンシャル読み出し 次のシーケンスは対象のキー値を 60、キー指定子を DP(部門コード) 、比較長とキー長をそれぞれ 2、 および EXACT 位置設定(2)を定義しています。 key^value := "60"; CALL FILE_SETKEY_(filenum, key^value:2,"DP",2); これらの指定により、例 9-2 のサンプル・ファイルを処理すると、次の 5 つの READ 呼び出しはファイ ル内のレコードに次のようにアクセスします。 CALL CALL CALL CALL CALL READ READ READ READ READ (filenum, buffer, read^count); (filenum, buffer, read^count); (filenum, buffer, read^count); (filenum, buffer, read^count); (filenum, buffer, read^count); ! ! ! ! ! レコード 2 読み出し レコード 3 読み出し レコード 7 読み出し レコード 9 読み出し レコード 10 読み出し 主キーによるシーケンシャル書き込み 相対ファイルでは、WRITE プロシージャ呼び出しによって空白物理レコードへの書き込みを行います。 カレント・アクセス・パスは主キー・フィールドでなければなりません。これは、ファイル・オープン時 のデフォルト設定です。 レコード 0 から 4 までが現在空白であるとすれば、ファイルをオープンした直後に発行された 5 つの WRITE 呼び出しは次の操作を行います。 error := FILE_OPEN_ (filename:length, filenum) ! アクセス・パス = 0 に設定 ! (主キー) および ! next-record ポインタ = 0 CALL WRITE (filenum, buffer, write^count); ! レコード 0 へ書き込み CALL WRITE (filenum, buffer, write^count); ! レコード 1 へ書き込み CALL WRITE (filenum, buffer, write^count); ! レコード 2 へ書き込み CALL WRITE (filenum, buffer, write^count); ! レコード 3 へ書き込み CALL WRITE (filenum, buffer, write^count); ! レコード 4 へ書き込み 137692J 9-19 第 9 章 相対ファイル WRITE 操作はエラー10(duplicate record)により失敗します。 空白ではないレコードへ書き込みを行うと、 相対ファイルの終わりに新規レコードを追加するには、FILE_SETPOSITION_ プロシージャを使用して 現在の EOF 位置を指示してから、WRITE を順次呼び出しします。EOF ポインタの現在地が 260 であると すれば、次の呼び出しシーケンスは 5 個のレコードを相対ファイルの終わりに追加書き込みします。 CALL FILE_SETPOSITION_(filenum,-1F);! sets next-rec.ptr. = -1 CALL CALL CALL CALL CALL WRITE WRITE WRITE WRITE WRITE (filenum, buffer, write^count);! レコード 260 へ書き込み (filenum, buffer, write^count);! レコード 261 へ書き込み (filenum, buffer, write^count);! レコード 262 へ書き込み (filenum, buffer, write^count);! レコード 263 へ書き込み (filenum, buffer, write^count);! レコード 264 へ書き込み このシーケンスの実行により、EOF ポインタもそれに合わせてインクリメントされます。 任意の書き込み操作後に、新規追加されたレコードのアドレスを取得するには次の手続きを実行します。 item := 202; error := FILE_GETINFOLIST_ (filenum, item, 1, primary^key, 8); -2 を与えて FILE_SETPOSITION_ 新規データ・レコードを空白物理レコードのいずれかに書き込むには、 を呼び出してから、WRITE を実行します。 CALL FILE_SETPOSITION_ (filenum, -2F); CALL WRITE (filenum, buffer, write^count); この操作の実行後に、実際に使用された書き込み先物理レコードのアドレスを取得するには次の手続き を実行します。 item := 202; error := FILE_GETINFOLIST_ (filenum, item, 1, primary^key, 8); 主キーによるランダム・アクセス 相対ファイル内の個々のレコードをランダムにアクセスする場合は、FILE_SETPOSITION_ 呼び出しを 使用して目的とするレコードを主キーにより明示的に指定します(相対レコード番号)。 CALL FILE_SETPOSITION_ (filenum,38F); ! next-rec.ptr= 38 に設定 CALL WRITE (filenum, buffer, write^count); ! レコード 38 に書き込み このシーケンスでは、レコード 38 が空白であると仮定しています。空白でないレコードにデータを書き 込もうとすると、WRITE 操作はエラー 10(file/record already exists)により失敗します。 CALL FILE_SETPOSITION_ (filenum, 76F); !next-rec ptr = 76 に設定 CALL READ (filenum, buffer, read^count); ! レコード 76 読み出し このシーケンスはレコード 76 が実際にデータを含んでいると仮定しています。レコード 76 が空白の場 合は、READ 呼び出しは 76 よりも高位にあり、データの存在する次のレコードにアクセスします。 9-20 137692J 第 9 章 相対ファイル レコードの更新 レコードを更新する場合、アクセスする物理レコードにはデータがなければなりません。WRITE では、 す でに デー タが ある 物理 レコ ード に書 き込 みす るこ とは でき ませ んが、逆 に WRITEUPDATE と WRITEUPDATEUNLOCK は空白の物理レコードに書き込みすることはできません。 更新したいレコードへ位置決めした後で、READUPDATE または READUPDATELOCK を使用してその レコードにデータが存在することを確認します。 READ と READLOCK は常に、カレント・アクセス・パス上で次に高位にある空白ではないレコードに アクセスします(空白レコードは読み飛ばします) 。したがって、位置決めしたレコードにアクセスすると は限りません。 一方、READUPDATE と READUPDATELOCK は、current-record ポインタが示すレコードにアクセス します。したがって、READ や READLOCK ではなく、これらのプロシージャを使用することにより、位 置決めした特定のレコードに対し、データの有無に関わらずその内容を検査できます。 対象のレコードにデータがあることが確認できたら、アプリケーション・バッファの対象データ・フィー ルドを書き換え、変更後のレコードを WRITEUPDATE または WRITEUPDATEUNLOCK を使用してディ スクに書き戻します。 次に示す TAL 構文シーケンスは、図 9-21 に示すサンプル・データ・ファイルを参照しながら、レコー ド 18 の内容を更新します。 CALL FILE_SETPOSITION_ (filenum, 18F); ! next-record ! ポインタ = 18 に設定 CALL READUPDATE (filenum, buffer, read^count, count^read); IF count^read > 0 THEN BEGIN buffer := changed^record; CALL WRITEUPDATE (filenum, buffer, write^count); END ELSE ... ! 指定のレコードは空白 更新を行わない ! 137692J 9-21 第 9 章 相対ファイル (空白ページ) 9-22 137692J 第 10 章 ファイルとレコードのロック 第 10 章 ファイルとレコードのロック 共有可能な ENSCRIBE ファイルに 2 つ以上のプロセスからアクセスする場合は、ファイル・ロックとレ コード・ロックにより協調を図ります。 ファイルはオーディットされたファイルであってもオーディットされていないファイルであってもかま いません。オーディットされたファイルとは TMF の管理下でアクセスされるファイルです。 オーディットされていないファイルの場合、ロックはファイル・オープンを基準として与えられます。 つまり、個々の FILE_OPEN_ システム・プロシージャが実行されると、その呼び出しに使用するファイル 番号に関連してロックの要求が出され、ロックが与えられます。1 つのファイル番号を基準にファイルや レコードがロックされるため、同一プロセス内であっても、該当するファイルやレコードをほかのファイ ル番号でアクセスすることはできません。 オーディットされたファイルの場合、ロックはトランザクションを基準として与えられます。つまり、 ロック要求と許可は、個々のトランザクション識別子(transid)を基準として、アプリケーション・モ ジュール内の個々の BEGINTRANSACTION-ENDTRANSACTION ステートメント・ペアに関連して発行 されます。 1 つの transid を基準にファイルやレコードがロックされるため、同一プロセス内であっても、該当ファ イルやレコードにほかの tansid を使用してアクセスすることはできません。 ロック・モード 使用できるロック・モードは 6 種類あります。その内容を次の表にまとめます。 表 10-8 ロック・モード (1 / 2) モード 137692J 説 明 ノーマル・モード 別のファイル番号や transid で既にロックされているファイルをロックし たり、レコードを読み出したりロックしようとしても、現在のロックが解 除されるまで保留されます。これがデフォルト・ロック・モードです。 リジェクト・モード 別のファイル番号や transid で既にロックされているファイルをロックし たり、レコードを読み出したりロックしようとしても、ファイル・システ ム・エラー 73(file/record is locked)により拒絶され、データは返されま せん。 リードスルー・ ノーマル・モード READ と READUPDATE 要求はレコードとファイルに対する既存のロッ クを無視します。すなわち、ロックが存在しても読み出しは遅れずに実行 されます。LOCKFILE、LOCKREC、READLOCK、および READUPDATELOCK はノーマル・モードと同じ扱いを受けます。 10-1 第 10 章 ファイルとレコードのロック 表 10-8 ロック・モード (2 / 2) モード 説 明 リードスルー / リジェクト・モード READ と READUPDATE 要求はレコードとファイルの既存のロックを無 視します。すなわち、ロックが掛かっていても遅れずにレコード読み出し が実行されます。LOCKFILE, LOCKREC, READLOCK および READUPDATELOCK はノーマル・ロックと取り扱いを受けます。 リードワーニング / ノーマル・モード READ と READUPDATE 要求はレコードとファイルの既存のロックを無 視します。ロックにより読み出し操作ができなくなることはありません が、操作は警告コード 9 により CCG 完了します。LOCKFILE、 LOCKREC、READLOCK、および READUPDATELOCK はノーマル・ モードと同じ扱いを受けます。 リードワーニング / リジェクト・モード READ と READUPDATE 要求はレコードとファイルの既存のロックを無 視します。ロックにより読み出し操作ができなくなることはありません が、操作は警告コード 9 により CCG 完了します。LOCKFILE、 LOCKREC、READLOCK、および READUPDATELOCK はリジェクト・ モードと同じ扱いを受けます。 対象のロック・モードを有効化するには、SETMODE4 プロシージャ呼び出しを使用します。選択する ロック・モードの種類により、ロックがかかったファイルやレコードに対するロック、読み出し操作に対 してどのような動作が取られるかが決定します。 対象となるファイル、またはその中のレコードが異なるファイル番号、または transid によりロックされ ているときに CONTROL または WRITE を発行すると、ロック・モードの種類に関わらず、エラー 73(file/ record is locked)により要求が拒絶されます。 ファイルのロック ENSCR IBE デ ィス ク・ファ イル をロ ック、ま たは ロッ クを 解除 する には、LOC KFI LE また は UNLOCKFILE 呼び出しを使用します。 指定されたファイルとその内部のすべてのレコードがロックされていない(または現在のロックがすべ て自分自身に属する)状態で LOCKFILE を呼び出すと、ロックが許可され、アプリケーション・プロセス はそのまま処理を継続します。 指定されたファイル、またはその内部のレコードのどちらかが、別のファイル番号または transid によっ てロックされた状態で LOCKFILE を呼び出すと、次の動作はその時点で選択されているロック・モードに より異なります。 ファイルをクローズすると、そのファイルで所有しているロックはすぐに解除されます。ただし、オー ディットされたファイルの場合は例外で、自分のトランザクションがすべてコミットするか、またはアボー トによりバックアウトされるまでロックは解除されません。 注意: LOCKFILE 呼び出しとファイル内の全レコードにロックをかけることは同じではありません。すべてのレ コードを個別にロックしても、ほかのユーザーは新規レコードを挿入できますが、ファイルをロックしてし まうと、これもできなくなります。 10-2 137692J 第 10 章 ファイルとレコードのロック レコードのロック レコードのロックはファイルのロックと似ていますが、レコードのロックでは、1 つのファイルに対す る同時アクセスの許容範囲が広がります。 ファイル内のレコードをロックするには、次のプロシージャを使用します。 □ LOCKREC は、ファイルに対する最新の操作で決定した形で、カレント・レコードをロックします。 □ READLOCK と READUPDATELOCK は、これから読み出しするレコードを、読み出し実行前にロッ クします。 □ オーディットされたファイルの場合、現在挿入実行中のレコードを WRITE がロックします。 キー順ファイルに対して包括ロックが有効になると、LOCKREC プロシージャは参照レコードと同じ文 字シーケンスで始まるキーを持つファイル内のすべてのレコードを同時にロックします。包括ロックが適 用されるのは、キー順ファイルのみです。LOCKREC、READLOCK、または READUPDATELOCK を呼 び出した時点で、参照先レコードとファイルの両方のロックが解除されている(または、存在するロック は自分が掛けたものである)場合は、ロックが与えられ、アプリケーション・プロセスは処理を継続します。 LOCKREC、READLOCK、または READUPDATELOCK を呼び出した時点で、参照先レコードまたは ファイルのどちらかが別のファイル番号や transid によってロックされている場合、どのような動作が実行 されるかはその時点で実施されているロック・モードに依存します。 ファイル内のレコードのロックを解除するには、次のプロシージャを使用します。 □ UNLOCKREC は、ファイルに対する最新の操作で決定した形で、カレント・レコードのロックを解除 します。 □ UNLOCKFILE は、この UNLOCKFILE 呼び出しに与えられたファイル番号や transid に関わるファイ ル内のすべてのレコード・ロックを解除します。ファイル自体が同じファイル番号や transid によりロッ クされている場合、UNLOCKFILE はこのファイル・ロックも解除します。 □ オーディットされていないファイルの場合、WRITEUPDATEUNLOCK はレコードの書き込み、または 削除実行後にそのレコードのロックを解除します。 □ オーディットされたファイルの場合、ENDTRANSACTION はトランザクションのコミットまたはア ボートに伴うバックアウトが完了した時点で、そのトランザクションがかけたレコード・ロックを解除 します。 □ オーディットされていないファイルの場合、FILE_CLOSE_ はその呼び出しのファイル番号で指定され るレコードのロックを解除します。 キー順ファイルに包括ロックが設定されていれば、UNLOCKREC プロシージャは無視されます。 137692J 10-3 第 10 章 ファイルとレコードのロック オーディットされていないファイルからレコードを削除すると、レコードのロックは解除されます。し かし、オーディットされたファイルからのレコード削除では、トランザクションがコミットまたはアボー トされてバックアウトされるまで、ロックは解除されません。 レコード・ロックはファイルの内容の論理的整合性を保ちながら、ファイルへの同時アクセスに対する 最大限の許容度を提供します。しかし、多数のレコードが関与する複雑な更新操作においては、レコード・ ロックに伴う多くのシステム処理が必要となり、ロックに多量のメモリを消費するため、デッドロック発 生の可能性が増大します。このような場合は、ファイル・ロックを選択します。 包括ロック ファイル全体、またはファイル内の個々のレコードをロックする方法に加えて、キー順ファイル内の、 キーが同じ文字シーケンスで始まるレコードをまとめてロックするという方法があります。この方式を包 括ロックと呼びます。 包括ロックを有効化するには、SETMODE123 プロシージャを呼び出します。このプロシージャは包括 ロックのキー長を定義するものですが、この長さはそのファイルに定義されたキー長を超えないようにし ます。包括ロックを無効化する場合も SETMODE123 を使用し、包括ロックのキー長をゼロにするか、ま たはそのファイルに本来設定されているキー長に一致させます。 包括ロックが無効設定されると、LOCKREC ファイル・システム・プロシージャが取得するレコード・ ロックは、レコードの特定のキー参照して 1 個のレコードだけをロックします。 包括ロックが有効設定されていると、LOCKREC ファイル・システム・プロシージャが取得するレコー ド・ロックは、同一バイト文字列で始まるキーを持つすべてのレコードをロックします。 あるファイルに対して包括ロックを有効設定しておくと、そのロックは該当ファイルのすべてのオープ ンに対して適用されます。 包括ロックの指定するキー長はキー全体の長さよりも小さくなければなりません。2 種類のキー長が出 てきたことに注意してください:1 つはファイル作成時に定義される全体キー長であり、1 つは包括ロック のキー長です。いずれもファイルごとに定義されます。 次の例を考えてみます。 ファイル X は、キー長として 6 が定義されているキー順ファイルです。このファイルは、次のキーを持 つレコードを格納しています。 Aabcde A1aabb A2bbbb A21ccc A27def B4dddd B5abcd C9dddd 包括ロックがロックのキー長が 2 として有効設定されると、レコード A2bbb に対して LOCKREC プロ シージャを呼び出すと、次に示すレコード・サブセットがロックされます。 10-4 137692J 第 10 章 ファイルとレコードのロック A2bbbb A21ccc A27def キー値として A21ccc と A27def を持つレコードがロックされたのは、レコード・キーの先頭 2 バイトが ロックされたレコードの持つ値(A2bbb)と一致したためです。一方、キー値として Aabcde と A1aabb を 持つレコードは、レコード・キーの先頭 2 バイトがロックされたレコードの値と一致しないため、ロック の対象にはなりません。 包括ロックのキー長はファイル・ラベルに保存され、SETMODE123 プロシージャ呼び出しで変更でき ます。 現在の包括ロック・キー長をプログラムで取得するには、FILE_GETINFOLIST_ システム・プロシー ジャを使用します。この値は FUP(File Utility Program)の INFO コマンドにより対話的に読み出すことが でき、また、FUP ALTER コマンドを使用すれば対話的に変更できます。 包括ロックは、包括ロックのキー長がゼロではなく、ファイルに定義されたキー長以下に設定されると いつでもアクティブになります。包括ロックのキー長は、ファイルに定義されたキー長に合わせて初期化 されるため、包括ロックの初期設定は非アクティブ状態になっています。 1 つのファイル上で、任意の時点で使用できる包括キー・ロックの長さは一定値でなければなりません。 つまり、あるロックが有効である間は、包括ロックのキー長は変更できません。 包括ロックがアクティブである間は、UNLOCKREC プロシージャ呼び出しは無視されます。したがっ て、包括ロックがアクティブである間は、全レコードまたは各レコードのロック解除はできません。しか し、UNLOCKFILE プロシージャを使用すれば、ファイル内の全レコードを一括して解除できます。 包括キー・ロックを使用するかどうかの判断は、ファイル単位で決定する必要があります。その結果は そのファイルのレコードをロックするすべてのプロセスに適用されます。したがって、そのファイルを使 用するアプリケーション・プログラムを細かく分析し、あるアプリケーションで包括ロックを使用したと きのメリットが、別のアプリケーションにとってのデメリットで相殺されないようにします。 包括ロックにより最も大きな利益を得るのは、一般サブセットを形成するレコード・セットを同時にロッ クするタイプのアプリケーションです。1 つの包括ロックが数百、数千の個別レコード・ロックの機能を 果たす場合もあります。あるアプリケーション環境では、包括ロックを使用することで、ロックの割り当 て、解除、検索用のロック・マネージャ呼び出しが減少するため、パフォーマンスが向上し、またロック の数が少なくなるため、メモリ使用量が減少します。 包括ロックが適していないアプリケーションは、互いに関連しない個別のレコード・ロックが必要とな るタイプです。 1 つのプロセスがレコードのサブセットに対して包括ロックを所有しており、第 2 のプロセスがそのサ ブセットにレコードを挿入しようとすると、挿入操作はレコードが実際存在するかどうかには関わらず失 敗し、第 2 のプロセスはエラー 73(file/record is locked)を受け取ります。 キー長として 4 が定義された空白キー順ファイルを仮定し、包括ロックのキー長として 2 が選択された 状態で包括ロックが有効設定されているとします。プロセス #1 がキー値 AAaa を持つレコードを挿入し、 このプロセスがバイト列 AA を指定した包括ロックを所有するとします。ここで、もしプロセス #2 がキー AAcc を持つレコードを挿入しようとすると、CCL とエラー 73 により拒絶されます。 137692J 10-5 第 10 章 ファイルとレコードのロック ファイル・ロックとレコード・ロックの相互関係 以下の説明は、デフォルト・ロック・モードが有効である場合にだけ適用されます。 ファイル・ロックはレコード・ロックよりも優先します。あるファイルをロックしてから、ファイル内 の個々のレコードをロックしようとすると、レコード・ロックは無視されて何の結果も生じません。 ファイルに対するファイル・ロック要求が保留されていると、その要求はキューに追加されます。さら に、ロックされたファイルへアクセスしようとする読み出し要求も保留されたロック要求に併せてキュー に追加されます。ここで現在のロックが解除されると、システムはファイル・ロック・キューの先頭に登 録されている要求に許可を与えます。この要求がファイル・ロック要求であればロックが与えられ、要求 が読み出し要求であるならば、読み出し操作が実行されます。 同じように、保留されているレコード・ロック要求を持つレコードにも、これらの要求はキューに追加 されます。ロックされたレコードへの読み出し要求も保留されたレコード・ロック要求と合わせてキュー に追加されます。ここで現在のロックが解除されると、システムはレコードのキューの先頭に登録された 要求に許可を与えます。その要求がレコード・ロック要求、または READUPDATELOCK 要求であれば ロックを許可し、要求が読み出し要求であれば読み出し操作が実行されます。 ロック要求は、同じファイル番号や transid によってロックが行われるまで待ち状態になることはありま せん。あるファイル番号または transid がレコード・ロックを所有し、その後でファイル・ロックの要求を 出すと、別のファイル番号や transid でそのファイルやファイル内のレコードに対するロックが保留状態に なっていなければ、そのレコード・ロックは失効してファイル・ロックに置き換わります。 ロックの制限 ディスク・プロセスは SYSGEN により指定されるロックの制限を執行します。オーディットされていな いファイルの場合、各ファイル番号に許されるロックのデフォルト数はボリュームあたり 5000 で、オー ディットされたファイルでは 1 つの transid に許されるロックのデフォルト数は、ボリュームあたり 5000 です。パーティション・ファイルでは、これらの条件はパーティションあたり 5000 個のロックと解釈され ます。 この制限は、いつでも最大許容数のロックを取得できるということではありません。メモリ・スペース が物理的に不足する場合、ロックを作成する内部バッファ・スペースが不足することも考えられます。 最大数に達した後に、ロックを追加しようとすると、その要求はエラー 35(unable to obtain I/O process control block)により拒絶されます。ディスク・プロセスは、2 つの原因に対しては別のエラー・コードを 返します。利用できる物理メモリが不足した場合は、 エラー37 (I/O process is unable to lock physical memory) を返し、バッファが一杯、またはフラグメント化され過ぎている場合はエラー 33(I/O process unable to obtain I/O segment space)を返します。 プロセスがシーケンシャル・ブロック・バッファリングでオープンされたファイルから読み出す場合は、 ディスク・プロセスはレコード・ロックを無視します(ファイル・ロックは無視しません) 。FUP COPY コ マンドはシーケンシャル・ブロック・バッファリングを使用するため、ロックされたレコードでも読み出 しできます。 10-6 137692J 第 10 章 ファイルとレコードのロック デッドロック 複数のプロセスが複数のレコード・ロックやファイル・ロックを必要とするときに発生する可能性があ る問題が、デッドロック条件です。次にデッドロックの例を示します。 プロセス A LOCKREC: レコード 1 . . LOCKREC: レコード 2 プロセス B LOCKREC: レコード 2 . . LOCKREC: レコード 1 ここで、プロセス A はレコード 1 をロックした後にレコード 2 のロックを要求しているのに対し、プロ セス B はレコード 2 をロックした後にレコード 1 のロックを要求しています。 デッドロックを回避する方法の 1 つは、常に同じ順序でレコードをロックすることです。各プロセスが 最初にレコード 1 のロックを要求し、その後でレコード 2 のロックを要求すれば、この例に示した状況は 起こり得ません。 しかし、アプリケーション・プログラムから見れば、ロックしなければならないレコードにどのような 順序で遭遇するかを知ることができない場合もありますから、次に示す方式を検討してみる価値がありま す。ファイル内の単一レコードを更新するのであれば、特別な処理は必要ありません。2 つ以上のレコー ドが関与する更新での解決策は、最初に共通レコードを指定してロックし、次に必要なデータ・レコード をロックすることです。この方法により複数レコードを必要とするプロセス間のデッドロック発生を防止 できます。これは、各プロセスが最初に共通レコードにアクセスする必要があるからです。この方法によ り処理の同時性を最大限に保証し、1 つのレコードにアクセスする側のオーバーヘッドを最小限にできま す。 非構造化ファイルのファイル・ロックとレコード・ロック 非構造化ファイルをロックまたはロック解除する方法は実質的に構造化ファイルの場合と同じです。 READLOCK、 非構造化ファイルでは、 ロックするレコードを相対バイトで位置決めしてから LOCKREC、 または READUPDATELOCK プロシージャを呼び出します。このアドレスで始まるレコードにアクセスし ようとすると、ほかのユーザーはこのアドレスがロックされていることを認識します。ロックがあること で、どのような動作が実行されるかはその時点でのロック・モードに依存します。 注意:相対バイトで指定される始点のみがロックされます。相対バイトでレコード内のほかの部分を指定すれば別 のプロセスでアクセスできます。 137692J 10-7 第 10 章 ファイルとレコードのロック TMF ロックの考慮事項 TMF の管理下でアプリケーションを実行する場合は、どのトランザクションも、更新または削除するす べてのレコードをロックする必要があります。ロックするには、ファイル・ロックとレコード・ロックの どちらかを使用します。 プロセスがオーディット・データベースを変更する場合、ディスク・プロセスが次の制約をして、ほか のトランザクションがコミットされていない変更を読み出したり、競合が起こるような操作を実行しない ようにします。 □ トランザクションがオーディットされたファイルに新規レコードを挿入する場合は、ディスク・プロセ スが自動的に挿入レコードの主キー値にもとづくロックを取得します。これにより、ほかのトランザク ションがこの新規レコードと同じ主キー値を持つレコードを挿入するのを防止し、その新規レコードか らの読み出し、ロック、更新、削除を禁止します。 □ トランザクションがオーディットされたファイルの既存レコードを更新、削除しようとする場合は、必 ずその前に該当レコードまたはそれを含むファイルをロックする必要があります。トランザクションが これを実行しなければ、レコード更新、削除操作はエラー 79 により拒絶されます。 □ ディスク・プロセスは操作に関連するトランザクションがコミットまたはアボートされてバックアウト されるまで、オーディットされたファイル上の挿入、更新、削除されたレコードのロックを保持しま す。ただし、READLOCK 呼び出しに続いて UNLOCKREC が呼び出された場合はロックを解除します。 □ トランザクションは出力作成のために読み出したすべてのレコードを、データ変更の有無に関わらず、 ロックしなければなりません。これにより、トランザクションがコミットまたはアボートされてバック アウトされるまで、トランザクションが依存するデータが変更されないことが保証されます。 オーディット・データベースに対して厳重な処置を実行するため、アプリケーション・プロセスには多 数のロックが発生し、別のプロセスとのデッドロックが発生する可能性が増大します。このため、アプリ ケーションを設計するときは、同一データベースにアクセスするプロセス間で、ファイル・ロックを協調 して使用したり、包括レコード・ロックを使用するようにします。 TMF トランザクションは BEGINTRANSACTION 呼び出しによって開始され、ENDTRANSACTION 呼 び出しによって終了します。 図 10-22 は、プロセスがロックを取得してオーディットされたファイルを更新する方法と、ディスク・ プロセスがロックを解除する時期を示します。 現在アクティブになっているトランザクションが多くのロックを要求する場合には、エラー 33、35 また は 37 により拒絶されます。 ファイル・ロックとレコード・ロックは、そのロック要求を発行しているプロセスの transid が所有しま す。1 つのトランザクションは数個のサーバーに要求を送信し、複数の要求を同一サーバー・クラスに送 信できます。このような状況では、いくつかのプロセスが同じ transid を共有し、ロックは同じ transid が所 有するため、そのトランザクションに関わるプロセス間でロックは衝突しません。 10-8 137692J 第 10 章 ファイルとレコードのロック 図 10-22 TME のレコード・ロック 図 10-23 は、以下に説明する原則を示しています。 □ ターミナル・コントロール・プロセス (TCP) は BEGINTRANSACTION を解釈し、サーバーにデータ ベース動作を要求する前に transid を取得します。 □ transid は、要求メッセージの一部としてサーバーに送信され、サーバー側で実行されるディスク動作は すべてこの transid に関連付けられます。 □ 特定の transid がロックを所有します。このため、同じ transid に対し動作するすべてのサーバーが、オー ディットされたファイル内のレコードに対して読み出し、ロック、追加、削除および変更操作を実行で きます。サーバー A、B が同じ transid に対し動作していれば、サーバー A が読み出しやロックができ るレコードには、サーバー B からも読み出しや変更ができます。 137692J 10-9 第 10 章 ファイルとレコードのロック 図 10-23 Transid によるレコード・ロック オーディットされたファイルをオープンするときのエラー TMF を使用すると、ファイルをオープンしたプロセスよりもロックが長くなることがあります。これ は、ロックを所有するのがファイルをオープンしたプロセス自体ではなく、transid であるためです。この ため、ファイルをオープンした全部のプロセスがそのファイルをクローズした後も、ファイル内にロック を所有するすべてのプロセスがコミットまたはアボートされてバックアウトするまで、ディスク・プロセ スがそのファイルを実質的にオープン状態に保つことがあります。 継続中のトランザクションのロックを含むファイルでは、次のようなエラーが発生する可能性がありま す。 □ オーディットされたファイルを排他アクセスによりオープンしようとすると(ファイルをオープンした プロセスが存続しているかどうかには関わりなく)、エラー 12(file in use)により失敗します。 □ PURGE や PURGEDATA のような排他アクセスを必要とする FUP 操作は失敗します。PURGE はエラー 12(file in use)により失敗し、PURGEDATA はエラー 80(invalid operation on audited file)により失 敗します。 OPEN 呼び出しが非構造化アクセスを指定し、構造化オーディット対象ファイルをオープンしようした 場合も、エラー 80 が返されます。 10-10 137692J 第 10 章 ファイルとレコードのロック 削除したレコードの読み出し トランザクション T1 があるレコードを削除し、別のトランザクション T2 が、T1 の存続中にこのレコー ドを読み出そうとすると以下のようになります。 □ T2 が EXACT 位置設定後に READ 呼び出しを要求した場合、この要求はエラー 1(end-of-file)により 失敗します。 □ T2 が READUPDATE 呼び出しを要求した場合、リジェクト・ロック・モードが設定されているならば この要求はエラー 73(file/record is locked)により失敗し、ノーマル・ロック・モードが設定されてい る場合は T1 が完了するのを待ちます。 バッチ更新 オーディットされたファイルのバッチ更新プログラムを作成する場合、トランザクションが LOCKFILE プロシージャによってファイル全体に一時にロックをかけるようにするか、所有するロックの数を厳密に 追跡します。LOCKFILE を使用しなければ、ディスク・プロセスが次のように暗黙のうちにロックを設定 します。 □ オーディットされたファイルに新規レコードが挿入されると、ディスク・プロセスは暗黙のうちにこの レコードをロックします。 □ オーディットされたファイルからレコードが削除されると、ディスク・プロセスは暗黙のうちにそのレ コードのロックを保持します。 これらのロックは、トランザクションがコミットまたはアボートされてバックアウトされるまで解除さ れません。したがって、多数のレコードの削除、更新、挿入を伴うトランザクションがオーディットされ たファイルをバッチ更新する場合は、必要とするロックの数が大きくなる過ぎることがあります。1 つの トランザクションが所有できるロックの最大数は 5000 に制限されています。この上限値を超えてロックを 取得しようとすると、エラー 33、35、または 37 が発生します。 TMF トランザクションがプライマリ・ファイル用に LOCKFILE を呼び出すと、LOCKFILE は付随する すべての代替キー・ファイルにも自動的に適用されます。これにより、プライマリ・ファイルの更新が原 因で代替キー・ファイルによるレコード・ロック取得が発生するのを防止します。 137692J 10-11 第 10 章 ファイルとレコードのロック (空白ページ) 10-12 137692J 第 11 章 エラーとエラー回復処置 第 11 章 エラーとエラー回復処置 ファイル・システムには、エラーや特別な条件の発生を知らせる多数のメッセージがあります。システ ム・プロシージャを利用するプログラム・モジュールを実行すると、これらのメッセージが表示されます。 システム・プロシージャ呼び出しが完了すると、条件コードとエラー番号が与えられます。操作が正常 終了した場合の条件コードは CCE で、エラー番号は 0 です。 エラー番号は、次の 3 種類の一般カテゴリに分類できます。 1. ファイル・システムが発行する警告(1 から 9) 2. 標準ファイル・システム操作の過程で発生するエラー(10 から 255) 3. アプリケーション用に予約されたエラー番号(300 から 511) ファイル・システムの大部分のエラー番号はプログラムのエラーによるものです(無効パラメータを渡 した、無効な操作を始めようとしたなど)。これ以外のエラー・メッセージは、システムが正常動作してい ないことを示します。さらに、特定のデバイスに関連した問題発生を通知する情報メッセージもあります。 通信パス・エラー 通信パスのエラーは、ディスク・ユニットへの主な経路の一部であるプロセッサ・モジュール、I/O チャ ンネル、またはディスク・コントローラで発生する障害です。このタイプのエラーでは、特定のファイル をオープンするときに、ユーザーが同期深度にゼロ以外の値を指定しようとした場合、ファイル・システ ムが別のパスに切り替えて I/O 操作を完了しようとします。 200 から 211 までの範囲のエラー番号は、再試行可能な操作であることを示します。キュー・ファイル に関わる通信パス・エラーの詳細については、第 7 章「キュー・ファイル」を参照してください。 データ・エラー データ・エラーが発生した場合は、ファイルの全体または一部が無効になったことが考えられます。デー タ・エラーは、エラー番号 50 から 59、120 から 139、190 から 199 の範囲です。 デバイス操作エラー エラー番号 60 から 69、および 103 はデバイス操作エラーを表わします。これらのエラー条件が発生し ても、ファイル・システムは失敗した操作の再試行を行いません。 137692J 11-1 第 11 章 エラーとエラー回復処置 エラー番号 60 から 69 は、デバイスを意図的にアクセスできない状態にしたことを表わすので、これに 関連した操作を再試行しないでください。 エラー 103 はシステム全体が停電し、ディスクが稼動状態になろうとしていることを表わします。この 場合には、失敗した操作を定期的に再試行してください。 エクステント割り当てエラー プログラムでエクステントを割り当てようとしたときに発生するエラーには 43(unable to obtain disk space for file extent)と 45(file is full)の 2 種類があります。 次の例(図 11-24 も参照)は、両方のタイプのエラーを示します。 エクステント・サイズとして 2048 バイトを指定したファイルを作成し、そのファイルに対して 400 バ イト単位で WRITE 操作を反復実行します。 loop: CALL WRITE ( filenum, buffer, 400, number^written ); IF < THEN BEGIN status := FILE_GETINFO_ ( filenum, error );. ... END ELSE GOTO loop; 最初の 5 回の WRITE は成功 (number^written = 400) しますが、6 回目はバッファからディスクに 48 バ イトを転送 (number^written = 48) したところで操作に失敗します。 デ ィ ス ク・ス ペ ー ス が 不 十 分 な た め、別 の エ ク ス テ ン ト を 割 り 当 て る こ と が で き な い 場 合 は、 FILE_GETINFO_ はエラー番号 43(unable to obtain disk space for file extent)を返します。 現 在 ア ク セ ス し て い る エ ク ス テ ン ト が フ ァ イ ル に 許 容 さ れ る 最 後 の エ ク ス テ ン ト で あ る 場 合、 FILE_GETINFO_ はエラー番号 45(file is full)を返します。発生したエラーが 45 であれば、SETMODE92 呼び出しでエクステントの許容最大値を動的に変更すれば、エラーから回復できる可能性があります。 ファイル・ラベルが一杯であるためにエクステントの割り当てができない場合は、FILE_GETINFO_ は エラー番号 43(unable to obtain disk space for file extent)を返します。この場合、技術的にはファイルが一 杯ではないのでエラー番号 45 は返しません。 CONTROL21 プロシージャ呼び出しによりエクステントを割り当てる場合もエラー 43 が発生すること があります。 11-2 137692J 第 11 章 エラーとエラー回復処置 図 11-24 エクステント割り当てエラーの例 エラーとパーティション・ファイル ファイルの各パーティションは、同じファイルのほかのパーティションとは無関係にエラーが生じる場 合があります。このことは、ディスク・スペースの割り当てに関連するエラー 42 から 45 にとって重要と なります。42 から 45 までのエラーが発生した場合は、FUP を使用しエラーの発生したパーティションの パーティション・サイズ特性を変更することによりエラー状態から回復できます。 どちらの場合でも、CCL または CCG が返された後で FILE_GETINFO_ プロシージャを呼び出せば、エ ラー番号を取得でき、FILE_GETINFOLIST_ プロシージャによりエラーの発生したパーティション番号が わかります。エラーの発生したパーティションを含むボリューム名を取得するには、プログラム、または FUP によりファイルのパーティション・パラメータ配列を確認します。 プライマリ・アプリケーション・プロセスのエラー プライマリ・アプリケーション・プロセスに起こるエラーは、プライマリ・プロセスとバックアップ・ プロセスのペアのうち、プライマリ・プロセスが実行されるプロセッサ・モジュールの障害です。このよ うな障害に関連した操作は、バックアップ・プロセスに切り替わった時点でバックアップ・アプリケーショ ンで再試行する必要があります。このようなエラーの回復処置の詳細については、『GURDIAN プログラ マーズ・ガイド』のチェックポイントの項を参照してください。 137692J 11-3 第 11 章 エラーとエラー回復処置 (空白ページ) 11-4 137692J 第 12 章 ファイルのロード 第 12 章 ファイルのロード 既存ファイルへデータをロードするには、FUP(File Utility Program)の LOAD と LOADALTFILE を使 用します。 LOAD コマンドは既存の構造化ファイルにデータをロードしますが、このコマンドは付随する代替キー・ ファイルに影響を与えるものではありません。ファイル内の既存のデータは失われます。キー順ファイル へデータをロードする場合、入力レコードをソートしてロードするか、ソートしないでロードするかを選 択できます。SORTED オプションが指定されなければ、非ソート入力が前提となります。キー順ファイル では、あとでデータを挿入できるように、スラック・スペースを残すように指定できます(データとイン デックス・ブロック・スペースの % 値で指定)。 LOADALTFILE コマンドは、指定された主キー・ファイルから代替キー・レコードを生成し、このレ コードを代替キーの値に従って昇順にソートしてから、ソート済みレコードを指定の代替キー・ファイル にロードします。この場合もスラック・スペースを指定できます。システムのディスク・スペースに余裕 がなく、ファイルをロードするときにソート作業を同時に実施できない場合は、2 つの作業を切り離して 別々に実行できます。別々に作業する場合は、FUP BUILDKEYRECORDS コマンドでソートを実行し、そ の結果を磁気テープに格納しておきます。次に、FUP COPY または LOAD コマンドでソートされたレコー ドを、中間ファイルから目的の代替キー・ファイルへロードします。 この章では、FUP コマンドのシーケンスを必要とするファイルのロードの例を示します。 キー順ファイルのロード この例で使用するファイル $VOL1.SVOL.PARTFILE は、3 つのパーティションを持つキー順ファイル です。1 つ目のセカンダリ・パーティションは $VOL2、2 つ目のセカンダリ・パーティションは $VOL3 です。 主キー値としてゼロ以上、HA 未満の値を持つレコードはプライマリ・パーティションに置きます。主 キー値が HA 以上、RA 未満のレコードは $VOL2 に置きます。そして主キー値が RA 以上であるレコード を $VOL3 に置きます。 ファイルにロードするデータの長さは 128 バイトで、ソートされない状態で 1 ブロックあたり 1 レコー ドが書かれています。 この操作を実行する FUP コマンドは次のとおりです。 -VOLUME $vol1.svol -LOAD $TAPE, partfile LOAD はテープ・ドライブ$TAPE からレコードを読み出し、SORT プロセスへ送ります。全部のレコー ドが読み出されるとソートが始まります。ソートが終了すると、レコードは SORT プロセスから読み取ら れ、ファイルの partial-key-value 仕様に従ってファイルにロードされます。ここではデータと インデックス・ブロックのスラック・スペースを 0% に設定してあります。 137692J 12-1 第 12 章 ファイルのロード 新しい代替キーの定義 この例では、プライマリ・ファイル $VOL1.SVOL.PRIFILE に新しい代替キー・フィールドを定義しま す(現在の代替キー・ファイルは $VOL1.SVOL.ALTFILE)。新しいキー・フィールド用の代替キー・レ コードが ALTFILE ファイルに追加されます。 新しいキーのキー指定子は NM であり、レコードのキー・オフセットは 4、キー長を 20、そして新しい キー・フィールドには Null 値 ""(空白)を指定します。 この操作を実行する FUP コマンドは次のとおりです。 -VOLUME $vol1.svol -ALTER prifile, ALTKEY ( "NM", KEYOFF 4, KEYLEN 20, NULL " ") -LOADALTFILE 0, prifile, ISLACK 10 LOADALTFILE コマンドは、キー指定子 NM とキー・ファイル・ゼロ用に定義された代替キー用の代替 キーと共に、PRIFILE のキー・ファイル 0($VOL1.SVOL.ALTFILE) をロードします。インデックス・ブ ロックのスラック・スペースとして 10% が指定されています。 代替キー・ファイルの作成 この例は、プライマリ・ファイル $VOL1.SVOL.FILEA(入力順ファイル)用の代替キー・ファイルを 作成します。新しい代替キー・ファイルには$VOL1.SVOL.FILEB という名前を付けます。新しいキー・ フィールド用の代替キー・レコードは FILEB に追加されます。 新しいキーのキー指定子は XY、レコード内のキー・オフセットは 0、およびキー長は 10 です。 この操作を実行する FUP コマンドは次のとおりです。 -VOLUME $vol1.svol -CREATE fileb, type K, rec 16, keylen 16 -ALTER filea, ALTFILE ( 0, fileb ), ALTKEY ( "XY", KEYLEN 10) -LOADALTFILE 0, filea CREATE コマンドは代替キー・ファイル $VOL1.SVOL.FILEB を作成します。レコード長とキー長は 16 バイトに指定します(キー指定子に 2 バイト+代替キー・フィールド長として 10 バイト+主キー長として 4 バイト)。 ALTER コマンドは FILEA のファイル・ラベルを変更し、このファイル・ラベルが FILEB を代替キー・ ファイル 0 として参照し、キー指定子 XY で定義されるキー・フィールド定義を含むようにします。 LOADALTFILE コマンドは、キー指定子 XY の代替キー・レコードと併せて FILEA のキー・ファイル 0($VOL1.SVOL.FILEB) をロードします。インデックス・ブロックのスラック・スペースのパーセンテー ジは暗黙のうちに 0 と見なされます。 12-2 137692J 第 12 章 ファイルのロード キー順ファイル・パーティションの再ロード この例では、パーティション・ファイルのプライマリ・パーティションは $VOL1.SVOL.PARTFILE で す。最初のセカンダリ・パーティションは $VOL2 に置かれ、2 番目のセカンダリ・パーティションは $VOL3 上にあります。$VOL2 上のセカンダリ・パーティションは再ロードしなければなりません。 この操作を実行する FUP コマンドは次のとおりです。 -VOLUME $vol1.svol -SET LIKE $vol2.partfile -SET NO PARTONLY -CREATE temp -DUP $vol2.partfile, temp, OLD, PARTONLY -LOAD temp, $vol2.partfile, SORTED, PARTOF $vol1 -PURGE temp SET と CREATE コマンドは $VOL2.SVOL.PARTFILE と同じファイルを作成しますが、このファイルは NO RARTONLY により非パーティション・ファイルとして指定されている点が異なります。 DUP コマンドはセカンダリ・パーティション ($VOL2.SVOL.PARTFILE) のデータの複製を作り、 $VOL1.SVOL.TEMP にコピーします。 LOAD $VOL1.SVOL.TEMP コ マン ドは ファ イル から セカ ンダ リ・パー ティ ショ ン $VOL2.SVOL.PARTFILE を再ロードします。TEMP ファイルのレコードはソートされているため、LOAD コマンドには SORTED オプションを指定します。 パーティションされた代替キー・ファイルのロード この例では、プライマリ・ファイル $VOL1.SVOL.PRIFILE は、10 バイトの主キー・フィールドを持つ キー順ファイルです。このファイルには、キー指定子 F1、F2、F3 で指定される 3 つの代替キー・フィー ルドがあります。代替キー・フィールドの長さは 10 バイトです。 代替キー・レコードは 1 つの代替キー・ファイルに格納され、このファイルは 3 つのボリュームにまた がってパーティションされています。それぞれのボリュームは 1 つの代替キー・フィールドに対応する代 替キー・レコードを含みます。それぞれの代替キー・フィールド用のキー指定子は、対応するセカンダリ・ パーティションの部分キー値でもあります。 この代替キー・ファイルのプライマリ・パーティションは、$VOL1.SVOL.ALTFILE です。このパーティ ションはキー指定子 F1 用の代替キー・レコードを格納します。1 つ目のセカンダリ・パーティション $VOL2.SVOL.ALTFILE はキー指定子 F2 用の代替キー・レコードを格納し、2 つ目のセカンダリ・パー ティション $VOL3.SVOL.ALTFILE は、キー指定子 F3 用の代替キー・レコードを格納します。 キー指定子 F2 用の代替キー・レコードを $VOL2.SVOL.ALTFILE にロードするコマンドは、次のよう になります。 137692J 12-3 第 12 章 ファイルのロード >FUP -VOLUME $vol1.svol -CREATE sortin, ext 30 -CREATE sortout, ext 30 -BUILDKEYRECORDS prifile,sortin,"F2",RECOUT 22,BLOCKOUT 2200 -EXIT >SORT <FROM sortin, RECORD 22 <TO sortout <ASC 1:22 <RUN <EXIT >FUP -VOLUME $vol1.svol -LOAD sortout, $vol2.altfile, SORTED, PARTOF $vol1, RECIN 22, BLOCKIN 2200 -PURGE ! sortin, sortout CREATE コマンドは、BUILDKEYRECORDS(SORT の出力先でもある)の出力先として使用される ディスク・ファイルを作成し、SORT の出力先ディスク・ファイルを作成します。 BUILDKEYRECORDS コマンドは、PRIFILE のキー指定子 F のための代替キー・レコードを生成し、こ のレコードを SORTIN に書き込みます。ディスク書き込みの効率を上げるには、レコード・ブロックを使 用します。 SORT プログラムは、代替キー・レコードをソートします。ソート用のキー・フィールド長は、代替 キー・レコードの長さと同じです(22:キー指定子として 2 バイト+代替キー・フィール長として 10 バイ 。ソート処理の出力ファイルは SORTOUT です。 ト+主キー・フィールド長として 10 バイト) LOAD コマンドは、キー指定子 F2 の代替キー・レコードと同時にセカンダリ・パーティション $VOL2.SVOL.ALTFILE をロードします。レコード・ブロックは BUILDKEYRECORDS に使用されたもの の補足的なものとして使用されています。 12-4 137692J 付録 A ASCII 文字セット 付録 A ASCII 文字セット 表 A-9 では、ASCII(American Standard Code for Information Interchange)文字セットとそのコード値を 8 進法で示します。 表 A-9 ASCII 文字セット (1 / 5) 文 字 8 進法表記(左バイト) 8 進法表記(右バイト) 意 味 NUL 000000 000000 空文字 SOH 000400 000001 ヘッディング開始 STX 001000 000002 テキスト開始 ETX 001400 000003 テキスト終了 EOT 002000 000004 伝送の終了 ENQ 002400 000005 問い合わせ ACK 003000 000006 肯定応答 BEL 003400 000007 ベル BS 004000 000010 後退文字 HT 004400 000011 水平タブ LF 005000 000012 改行 VT 005400 000013 垂直タブ FF 006000 000014 書式文字 CR 006400 000015 改行復帰 SO 007000 000016 シフト・アウト SI 007400 000017 シフト・イン DLE 010000 000020 伝送制御拡張文字 DC1 010400 000021 装置制御 1 DC2 011000 000022 装置制御 2 DC3 011400 000023 装置制御 3 DC4 012000 000024 装置制御 4 NAK 012400 000025 否定応答 SYN 013000 000026 同期信号文字 ETB 013400 000027 伝送ブロック終了文字 CAN 014000 000030 キャンセル EM 014400 000031 媒体終端文字 SUB 015000 000032 置換文字 ESC 015400 000033 拡張文字 137692J A-1 付録 A ASCII 文字セット 表 A-9 ASCII 文字セット (2 / 5) 文 A-2 字 8 進法表記(左バイト) 8 進法表記(右バイト) 意 味 FS 016000 000034 ファイル分離文字 GS 016400 000035 グループ分離文字 RS 017000 000036 レコード分離文字 US 017400 000037 ユニット分離文字 SP 020000 000040 スペース ! 020400 000041 感嘆符 " 021000 000042 # 021400 000043 数値記号 $ 022000 000044 ドル記号 % 022400 000045 パーセント記号 & 023000 000046 アンパサンド ’ 023400 000047 アポストロフィ ( 024000 000050 左丸カッコ ) 024400 000051 右丸カッコ * 025000 000052 アスタリスク + 025400 000053 プラス記号 , 026000 000054 カンマ - 026400 000055 ハイフン(マイナス記号) . 027000 000056 ピリオド(小数点) / 027400 000057 スラッシュ 0 030000 000060 数字 0 1 030400 000061 数字 1 2 031000 000062 数字 2 3 031400 000063 数字 3 4 032000 000064 数字 4 5 032400 000065 数字 5 6 033000 000066 数字 6 7 033400 000067 数字 7 8 034000 000070 数字 8 9 034400 000071 数字 9 : 035000 000072 コロン ; 035400 000073 セミコロン (二重)引用符 137692J 付録 A ASCII 文字セット 表 A-9 ASCII 文字セット (3 / 5) 文 字 8 進法表記(左バイト) 8 進法表記(右バイト) 意 味 < 036000 000074 不等号(小なり) = 036400 000075 等号 > 037000 000076 不等号(大なり) ? 037400 000077 疑問符 @ 040000 000100 商用記号 "at" A 040400 000101 大文字 A B 041000 000102 大文字 B C 041400 000103 大文字 C D 042000 000104 大文字 D E 042400 000105 大文字 E F 043000 000106 大文字 F G 043400 000107 大文字 G H 044000 000110 大文字 H I 044400 000111 大文字 I J 045000 000112 大文字 J K 045400 000113 大文字 K L 046000 000114 大文字 L M 046400 000115 大文字 M N 047000 000116 大文字 N O 047400 000117 大文字 O P 050000 000120 大文字 P Q 050400 000121 大文字 Q R 051000 000122 大文字 R S 051400 000123 大文字 S T 052000 000124 大文字 T U 052400 000125 大文字 U V 053000 000126 大文字 V W 053400 000127 大文字 W X 054000 000130 大文字 X Y 054400 000131 大文字 Y Z 055000 000132 大文字 Z [ 055400 000133 左大カッコ 137692J A-3 付録 A ASCII 文字セット 表 A-9 ASCII 文字セット (4 / 5) 文 A-4 字 8 進法表記(左バイト) 8 進法表記(右バイト) 意 味 バックスラッシュ (円記号) \ 056000 000134 ] 056400 000135 右大カッコ ^ 057000 000136 挿入記号(カレット) _ 057400 000137 アンダースコア ‘ 060000 000140 アクセント記号 a 060400 000141 小文字 a b 061000 000142 小文字 b c 061400 000143 小文字 c d 062000 000144 小文字 d e 062400 000145 小文字 e f 063000 000146 小文字 f g 063400 000147 小文字 g h 064000 000150 小文字 h i 064400 000151 小文字 i j 065000 000152 小文字 j k 065400 000153 小文字 k l 066000 000154 小文字 l m 066400 000155 小文字 m n 067000 000156 小文字 n o 067400 000157 小文字 o p 070000 000160 小文字 p q 070400 000161 小文字 q r 071000 000162 小文字 r s 071400 000163 小文字 s t 072000 000164 小文字 t u 072400 000165 小文字 u v 073000 000166 小文字 v w 073400 000167 小文字 w x 074000 000170 小文字 x y 074400 000171 小文字 y z 075000 000172 小文字 z 137692J 付録 A ASCII 文字セット 表 A-9 ASCII 文字セット (5 / 5) 文 字 8 進法表記(左バイト) 8 進法表記(右バイト) 意 { 075400 000173 左中カッコ | 076000 000174 垂直線 } 076400 000175 右中カッコ ~ 077000 000176 チルド DEL 077400 000177 削除 137692J 味 A-5 付録 A ASCII 文字セット (空白ページ) A-6 137692J 付録 B 構造化ファイルのブロック形式 付録 B 構造化ファイルのブロック形式 この付録は、キー順、キュー、入力順、相対ファイルのブロック形式を説明します。構造化ファイルの ブロックは、ヘッダ、レコード・エリア、および両方のレコードのブロック先頭からのオフセットを示す マップから構成されます。 図 B-25 は形式 1 ブロック、図 B-32 は形式 2 ブロックを示します。 キー順、キュー・ファイルのデータ・エリアは、どのデータとインデックス・ブロックが使用されるか を示すビットマップ・ブロックから始まります。第 2 のブロックはファイルのルート(最高レベル)イン デックス・ブロックです。3 番目のブロックは第 2 レベル・インデックス・ブロックであるか、または最 初のデータ・ブロックです。 入力順ファイルでは、データ・エリアのすべてのブロックがデータ・ブロックとなります。 137692J B-1 付録 B 構造化ファイルのブロック形式 図 B-25 形式 1 構造化ファイルのブロック形式 図 B-25 のフィールドの定義は以下のとおりです。 B-2 137692J 付録 B 構造化ファイルのブロック形式 アイ・キャッチャ 現在は、> を使用しますが、将来変更する可能性があります。 相対セクタ番号 ファイル内の相対 512 バイト・セクタを識別します。 フラグ : ブロックが壊れた(不整合が生じた)場合、1 に設定されます。 : この 2 つのビットは圧縮からの展開用に予約されており、SQL 圧縮ロジック用に内 部で使用されます。 ビット 3 から 5 : これら 3 個のビットは次の形式でファイル・タイプを示します。 ビット 0 ビット 1、2 000 ( 予約 ) 001 相対ファイル 010 入力順ファイル 011 キー順、またはキュー・ファイル 100 ( 予約 ) 101 ( 予約 ) 110 ( 予約 ) 111 ディレクトリ ビット 6、7:この 2 つのビットは次の形式でブロック・タイプを示します。 00 データ、またはインデックス 01 ビット・マップ(キー順、キュー、相対ファイルでなければならない) 10 フリー(キー順、またはキュー・ファイルでなければならない) 11 ( 予約 ) インデックス・レベル ブロックのツリー・レベル情報を含みます。ブロックがインデックス・ブロック以外であれば level = 0。 ボリューム・シーケンス番号 構造化ブロックの最新の更新を識別します。この番号はブロックに変更が生じるたび、ディスクにその ブロックが書き込まれるかどうかには関係なく値を増やしていきます。オーディットされたファイルの場 合は、ボリューム・シーケンス番号はオーディット・チェックポイント(AC)レコードに含まれます。自 動ロールバックや引き継ぎの際にブロック・ヘッダの番号が AC レコードの番号と比較され、AC レコード を適用するかどうかが決定されます。オーディットされていないファイルの場合には、ボリューム・シー ケンス番号はチェックポイント AC レコードに含まれます。 チェックサム ブロック全体のソフトウェア・チェックサムです。 タイプ依存ブロック・ヘッダ ブロック・ヘッダ・エリアであり、ファイルのタイプにより異なります。ブロック・ヘッダのそれぞれ のタイプについては、図 B-26 から図 B-30 を参照してください。図 B-31 はキー順、キュー、および相対 ファイル内のビットマップ・ブロックの配置を示します。 137692J B-3 付録 B 構造化ファイルのブロック形式 レコード データ・レコードの場合とインデックス・レコードの場合があります。キー順、キュー、および入力順 ファイルのレコード長 N は次のように表わせます。 offset-to-record N + 1 - offset-to-record N レコードは、1 つのブロックのレコード・エリアに入っていなければなりません。このため、キー順と キューファイルの最大レコード長はブロック・サイズから 34 バイトを引いた値です(ヘッダが 30 バイト であり、4 バイトは最小可能オフセット・マップ)。 インデックス・レコードは次のような形式になります。 インデックス・レコード内の relative-sector-number フィールドは 、このキーに付随する ブロックの開始位置を指示します。KEYLEN=0 の場合のキー値はヌルであり、これが起こるのはインデッ クス・レコードがインデックス・ブロック、または最初のデータ・レコードを指示する場合です。 図 B-26 キー順、キュー・ファイルのインデックス・ブロック・ヘッダ 図 B-26 の各フィールドの定義は次のとおりです。 共通ブロック・ヘッダ 図 B-25 に示された 14 バイトの共通ブロック・ヘッダです。 B-4 137692J 付録 B 構造化ファイルのブロック形式 割り当てられたレコード数 ブロック内に割り当てられているレコード数を示します。 図 B-27 キー順、キュー・ファイルのデータ・ブロック・ヘッダ 図 B-27 に示すフィールドの定義は次のとおりです。 共通ブロック・ヘッダ 図 B-25 に示された 14 バイトの共通ブロック・ヘッダです。 割り当てられたレコード数 ブロック内に割り当てられているレコード数を示します。 次のデータ・ブロックの相対セクタ番号 次の論理ブロックへのリンクです。カレント・ブロックの relative-sector-number が共通ブ ロック・ヘッダに与えられます。 前のデータ・ブロックの相対セクタ番号 前の論理ブロックへのリンクです。 137692J B-5 付録 B 構造化ファイルのブロック形式 図 B-28 入力順データ・ブロックのヘッダ 図 B-28 のフィールドの定義は,次のとおりです。 共通ブロック・ヘッダ 図 B-25 に示された 14 バイトの共通ブロック・ヘッダです。 割り当てられたレコード数 ブロック内に割り当てられているレコード数を示します。 図 B-29 相対データ・ブロックのヘッダ 図 B-29 のフィールドの定義は次のとおりです。 共通ブロック・ヘッダ 図 B-25 に示された 14 バイトの共通ブロック・ヘッダです。 B-6 137692J 付録 B 構造化ファイルのブロック形式 割り当てられたレコード数 ブロック内に割り当てられているレコード数を示します。 割り当てられたレコード数 ブロック内に存在しているレコード数を示します。 図 B-30 ビットマップ・ブロックのヘッダ 図 B-32 のフィールドの定義は次のとおりです。 共通ブロック・ヘッダ 図 B-25 に示された 14 バイトの共通ブロック・ヘッダです。 フリー・ビットの数 キー順とキュー・ファイルの場合、ビットマップ・識別ブロック内のフリー(空白)ビット数を示しま す。相対ファイルでは、識別ブロック内でまだ書き込まれていないビット数を示します。 ビット・マップ ビットマップはインデックス・ブロックとデータ・ブロックの利用可能性を示すビット配列です。キー 順またはキュー・ファイルでは、対応するブロックがフリー(0)であるか使用中(1)であるかを示しま す。相対ファイルでは、対応するブロックにレコードを追加できるスペースがあるかどうかを示します。 空のビットマップは (8 * (block-size - 18) ) 個のフリー・ビットを持ちます たとえば、1024 バイト・ブロックでは、マップの利用可能なビット数は 8048 です。 137692J B-7 付録 B 構造化ファイルのブロック形式 図 B-31 ビットマップ・ブロックの配置 B-8 137692J 付録 B 構造化ファイルのブロック形式 図 B-32 形式 2 構造化ファイルのブロック形式 図 B-32 のフィールドの定義は次のとおりです。 相対ブロック番号 ファイル内の相対ブロック数を示します。 137692J B-9 付録 B 構造化ファイルのブロック形式 フラグ ビット 0:ブロックが壊れた(不整合が生じた)場合に 1 にセットされます。 ビット 1、2: この 2 つのビットは圧縮からの展開用に予約されており、SQL 圧縮ロジックのために内 部使用されます。 ビット 3 から 5:これら 3 個のビットは次の形式でファイル・タイプを示します。 000 ( 予約 ) 001 相対ファイル 010 入力順ファイル 011 キー順、キュー・ファイル 100 ( 予約 ) 101 ( 予約 ) 110 ( 予約 ) 111 ディレクトリ ビット 6、7:この 2 つのビットは次の形式でブロック・タイプを示します。 00 データ、またはインデックス 01 ビットマップ(キー順、キュー、相対ファイルでなければならない) 10 フリー(キー順、またはキュー・ファイルでなければならない) 11 ( 予約 ) ブロック・レベル ブロックの 3 レベルを示します。 ラージ・ブロック・フラグ ビット 0: チェックサムが有効であれば 1 にセットされます。 ビット 1: 32 ビット・チェックサムが有効であれば 1 にセットされます。 ビット 2: 部分チェックサムが有効であれば 1 にセットされます。 チェックサム ブロック全体のソフトウェア・チェックサム。 ブロックのバージョン ブロックが使用している形式(1 または 2)を示します。 ボリューム・シーケンス番号 構造化ブロックの最新の更新を識別します。この番号はブロックに変更が生じるたび、ディスクにその ブロックが書き込まれるかどうかには関係なく値を増やしていきます。オーディットされたファイルの場 合は、ボリューム・シーケンス番号はオーディット・チェックポイント(AC)レコードに含まれます。自 動ロールバックや引き継ぎの際にブロック・ヘッダの番号が AC レコードの番号と比較され、AC レコード を適用するかどうかが決定されます。オーディットされていないファイルの場合には、ボリューム・シー ケンス番号はチェックポイント AC レコードに含まれます。 B-10 137692J 付録 B 構造化ファイルのブロック形式 32 ビット・チェックサム 将来のための予約フィールド。現在は使用されていません。 レコード データ・レコードの場合とインデックス・レコードの場合があります。キー順、キュー、および入力順 ファイルのレコード長 N は次のように表わせます。 offset-to-record N + 1 - offset-to-record N レコードは 1 つのブロックのレコード・エリアに収まらなければなりません。このため、キー順とキュー ファイルの最大レコード長はブロック・サイズから 56 バイトを引いた値です(ヘッダが 40 バイト、8 は トレーラ、8 バイトは最小可能オフセット・マップ)。 インデックス・レコードは次の形式になります。 インデックス・レコード内の relative-block-number フィールドは 、このキーに付随するブ ロックの開始位置を指示します。KEYLEN=0 の場合のキー値はヌルであり、インデックス・ブロックの先 頭レコードに対してこれが起こります。 図 B-33 形式 2 のキー順、キュー・ファイルのインデックス・ブロック・ヘッダ 図 B-33 のフィールドの定義は次のとおりです。 137692J B-11 付録 B 構造化ファイルのブロック形式 共通ブロック・ヘッダ 図 B-32 に示された 28 バイトの共通ブロック・ヘッダです。 割り当てられたレコード数 ブロック内に割り当てられているレコード数を示します。 図 B-34 形式 2 のキー順、キュー・ファイルのデータ・ブロック・ヘッダ 図 B-34 のフィールドの定義は次のとおりです。 共通ブロック・ヘッダ 図 B-32 に示された 28 バイトの共通ブロック・ヘッダです。 割り当てられたレコード数 ブロック内に割り当てられているレコード数を示します。 次のデータ・ブロックの相対ブロック番号 次の論理ブロックへのリンクです。カレント・ブロックの相対ブロック番号は共通ブロック・ヘッダ内 にあります。 前のデータ・ブロックの相対ブロック番号 前の論理ブロックへのリンクです。 B-12 137692J 付録 B 構造化ファイルのブロック形式 図 B-35 形式 2 の入力順データ・ブロック用ヘッダ 図 B-35 のフィールドの定義は次のとおりです。 共通ブロック・ヘッダ 図 B-32 に示された 28 バイトの共通ブロック・ヘッダです。 割り当てられたレコード数 ブロック内に割り当てられているレコード数を示します。 図 B-36 形式 2 の相対データ・ブロック用ヘッダ 図 B-36 のフィールドの定義は次のとおりです。 共通ブロック・ヘッダ 図 B-32 に示された 28 バイトの共通ブロック・ヘッダです。 137692J B-13 付録 B 構造化ファイルのブロック形式 割り当てられたレコード数 ブロック内に割り当てられているレコード数を示します。 現在のレコード数 ブロック内に存在するレコード数を示します。 図 B-37 ビットマップ・ブロックのヘッダ 図 B-37 のフィールドの定義は次のとおりです。 共通ブロック・ヘッダ 図 B-32 に示された 28 バイトの共通ブロック・ヘッダです。 フリー・ビット数 キー順とキュー・ファイルの場合、ビットマップ識別ブロック内のフリー(空白)ビット数を示します。 相対ファイルでは、識別ブロック内でまだ書き込まれていないビット数を示します。 ビットマップ ビットマップはインデックス・ブロックとデータ・ブロックの利用可能性を示すビット配列です。キー 順またはキュー・ファイルでは、対応するブロックがフリー(0)であるか使用中(1)であるかを示しま す。相対ファイルでは、対応するブロックにレコードを追加できるスペースがあるかを示します。 )個のフリー・ビットを持ちます。 空のビットマップには、(8 * (block-size −(32 + 8)) たとえば、1024 バイト・ブロックでは、マップの利用可能なビット数は 7872 です。 B-14 137692J 付録 C カレント・キー、キー指定子、キー長の動作 付録 C カレント・キー、キー指定子、キー長の動作 この付録は、ファイル・システムの基本的な動作を擬似コードを使用して説明し、これらの動作とファ イルの現在状態を示す情報との関連を示します。最初に、擬似コードが使用する変数と関数を定義します。 擬似コードを解析すれば、カレント・キー、キー指定子、キー長がさまざまなファイル・システムの操作 に対してどのように変化するかが分かります。 変数定義 擬似コードの説明では、以下の変数を使用します。 137692J CKV CKS CKL = current key value(カレント・キーの値) = current key specifier(カレント・キー指定子) = current key length(カレント・キー長) CMPL MODE REVERSE primary next rip present keyseq entryseq relative = comparison length(比較長) = 位置決めモード:(APPROXIMATE = 0、GENERIC = 1、EXACT = 2) = 降順を適用するかどうかを示します。 =0 = シーケンスの次のレコードを参照する場合、True = ファイル内の相対挿入位置 = パラメータが与えられた場合、True = ファイル・タイプ 3 ( キー順、およびキュー・ファイル ) = ファイル・タイプ 2 = ファイル・タイプ 1 C-1 付録 C カレント・キー、キー指定子、キー長の動作 関数定義 擬似コードの説明では、次の関数を使用します。 □ keyfield (record, specifier) レコード内の specifier が指定したフィールド値を返します。ファイルがキー順ではなく、specifier = 0 であれば、レコード番号またはレコード・アドレスが返されます。 □ keylength (record, specifier) レコード内の specifier が指定したキー・フィールドの長さを返します。record=0 であれば、定義さ れているキー・フィールド長を返します。 □ find (mode, specifier, key value, comparison length, direction) mode、specifier、key value、comparison length、および direction の指定に合致するファイル内の 最初のレコード位置を返します。 ● mode = 0 (APPROXIMATE) の場合、key specifier が指定するキー・フィールドの値が key value 以 上である最初のレコード位置を検索します。該当レコードが見つからなければ EOF を返します。 ● mode = 1 (GENERIC) の場合、key specifier が指定するキー・フィールドの comparison length バ イトの値が key に一致する最初のレコード位置を検索します。 該当レコードが見つからなければ EOF を返します。 ● mode = 2 (EXACT) の場合、 key specifier が指定するキー・フィールドが、 厳密に comparison length が指定するバイト数を持ち、その値が key に一致する最初のレコード位置を検索します。該当レコー ドが見つからなければ EOF を返します。 □ find^next (mode, specifier, key value, comparison length, direction) mode、specifier、key value、comparison length、および direction の指定に合致するファイル内の 次のレコード位置を返します。 ● mode = 0 (APPROXIMATE) の場合、次のレコードを検索します。 ● mode = 1 (GENERIC) の場合、次のレコードを検索します。key specifier が指定するキー・フィー ルドの値の comparison length バイトが key に一致しなければ EOF を返します。 ● mode = 2 (EXACT) の場合、EOF を返します。 □ insert (key value, key length) 指定された key value と key length に従って、レコードを追加する位置を返します。追加する位置に レコードが存在すれば、"duplicate record" を返します。相対と入力順ファイルでは、key value とし て "-1" が与えられると EOF を返し、"-2" が与えられると使用可能な最初のレコード位置を返します。 C-2 137692J 付録 C カレント・キー、キー指定子、キー長の動作 擬似コードによる説明 以下の擬似コードは、OPEN、KEYPOSITION、POSITION、READ、READUPDATE、WRITEUPDATE、 および WRITE プロシージャの動作を説明したものです。 OPEN (FILE_OPEN_) CKS := primary if keyseq then CKL := CMPL := 0 else begin if format I file format CKL := 4 else CKL := 8; CKV := rip := 0; end; MODE := approx; next := false; REVERSE := false; FILE_SETKEY_, KEYPOSITION: CKV := rip := key if position-to-last then pad out CKV with %hFF CKS := if present then key specifier else primary; CKL := CMPL := if present then comparison length else keylength (0, CKS); MODE := if present then positioning mode else approx; next := false; REVERSE := reverse; FILE_SETPOSITION_, POSITION: CKV := rip := record specifier; CKS := primary if format I file format then CMPL := CKL := 4 else CMPL := CKL := 8; MODE := approx; next := false; REVERSE := false; READ: position := if next then find^next (MODE, CKS, CKV, CMPL, REVERSE) else find (MODE, CKS, CKV, CMPL, REVERSE); if error then return; record := file[position]; CKV := rip := keyfield (record, CKS); CKL := keylength (record, CKS); next := true; 137692J C-3 付録 C カレント・キー、キー指定子、キー長の動作 READUPDATE: position := find (exact, CKS, CKV, CKL, REVERSE); if error = 1 then error := 11; if error then return; record := file[position]; WRITEUPDATE: position := find (exact, CKS, CKV, CKL, REVERSE); if error = 1 then error := 11; if error then return; if write count = 0 then if entryseq then begin error := 21; return; end; else delete the record else file[position] := record; WRITE: if keyseq then begin position := insert (keyfield (record, primary), keylength (record, primary)); if error then return; file[keyposition] := record; end; if relative then begin if CKS then begin error := 46; return; end; if rip <> -2 and rip <> -1 and next then rip := rip +1; position := insert (rip, 4); if error then return; file[position] := record; CKV := keyfield (record, primary); next := true; end; if entryseq then begin if CKS then begin error := 46; return; end; position := insert (-1,4); ! end-of-file file[position] := record; CKV := keyfield (record, primary); next := true; end; C-4 137692J 索引 索引 A 更新 ..................................................................4-17, 5-7 シーケンシャル・アクセスの途中で遭遇 ............ 5-10 APPROXIMATE位置指定モード ................................2-8 相対ファイル ............................................................ 9-3 非構造化ファイル .................................................... 5-7 B F BUFFERSIZE属性 .........................................................5-2 FCB .......................................................................5-7, 9-14 C FILE_OPEN_プロシージャ 動作 .......................................................................... C-3 COMPRESSパラメータ ................................................6-6 FILE_RENAME_プロシージャ 未完了操作に対するエラー 27 ................................ 3-4 CONTROLプロシージャ エクステントの割り当て ...................... 1-3, 4-19, 11-2 FUP エクステントの割り当て解除 ............................... 4-19 ALTERコマンド ..............................................5-8, 9-14 対象となる書き込み操作 ......................................... 3-6 BUILDKEYRECORDSコマンド ........................... 12-1 データのパージ ...................................................... 4-18 COMPRESSパラメータ ........................................... 6-6 待ちなしI/Oに必要なAWAITIO .............................3-4 DCOMPRESSパラメータ ........................................ 6-6 ICOMPRESSパラメータ .......................................... 6-6 CREATEプロシージャ 圧縮の有効化 ............................................................6-6 LOADALTFILEコマンド ...................................... 12-1 自動更新オプションの設定 ............................5-8, 9-14 LOADコマンド ...................................................... 12-1 PURGEDATAコマンド ......................................... 4-18 D SETコマンド ...................................................6-6, 9-14 自動更新オプションの設定と変更 ................5-8, 9-14 DCOMPRESSパラメータ .............................................6-6 DDL .......................................................... 5-2, 6-4, 8-2, 9-4 G E GENERIC位置指定モード ............................................ 2-8 EDITREADプロシージャ .............................................5-1 I EDITファイル EDITが作成する構造 ............................................... 5-1 ICOMPRESSパラメータ .............................................. 6-6 読み出し方法 ............................................................5-1 EOFポインタ キー順ファイル ...................................................... 6-20 137692J 索引 -1 索引 P K KEYPOSITIONプロシージャ POSITIONプロシージャ 動作 ...........................................................................C-3 説明 ........................................................................... 3-3 入力順ファイル ...................................................... 8-12 動作 ...........................................................................C-3 の使用方法 ............................................................... 2-4 の使用方法 ............................................................... 2-4 未完了操作に対するエラー 27 ............................... 3-4 非構造化ファイル .................................................. 5-11 未完了操作に対するエラー 27 ............................... 3-4 L PURGEプロシージャ ................................................... 3-2 R LOCKFILEプロシージャ 説明 ......................................................................... 10-2 待ちなしI/Oに必要なAWAITO .............................. 3-3 LOCKRECプロシージャ RBA、定義された ........................................................ 1-4 READLOCKプロシージャ 説明 ......................................................................... 10-3 キー順ファイル ...................................................... 6-20 待ちなしI/Oに必要なAWAITO .............................. 3-3 キュー・ファイル .................................................... 7-7 シーケンシャル・アクセス .................................. 9-16 M 説明 .................................................................. 3-3, 10-3 対象となる読み出し操作 ........................................ 3-6 MAXEXTENTS属性 ..................................................... 1-2 入力順ファイル ...................................................... 8-12 非構造化ファイル .................................................... 5-9 N 待ちなしI/Oに必要なAWAITO .............................. 3-3 READUPDATELOCKプロシージャ Next-recordポインタ キー順ファイル ...................................................... 6-20 相対ファイル ................................................... 9-3, 9-15 キュー・ファイル .................................................... 7-7 非構造化ファイル .................................................... 5-7 説明 .................................................................. 3-3, 10-3 Null属性値 ................................................................... 2-12 相対ファイル ......................................................... 9-17 対象となる読み出し操作 ........................................ 3-6 O 待ちなしI/Oに必要なAWAITO .............................. 3-3 READUPDATEプロシージャ OPENプロシージャ キー順ファイル ...................................................... 6-20 シーケンシャル・ブロック・バッファリング .... 4-16 説明 ........................................................................... 3-3 説明 ........................................................................... 3-2 相対ファイル ......................................................... 9-17 動作 ...........................................................................C-3 対象となる読み出し操作 ........................................ 3-6 例 ............................................................................... 4-8 動作 ...........................................................................C-4 非構造化ファイル .................................................. 5-11 待ちなしI/Oに必要なAWAITO .............................. 3-3 索引 -2 137692J 索引 U READプロシージャ キー順ファイル ...................................................... 6-20 キュー・ファイル ....................................................7-7 UNLOCKFILEプロシージャ シーケンシャル・アクセス ................................... 9-16 説明 ..................................................................3-3, 10-2 対象となる読み出し操作 ......................................... 3-6 待ちなしI/Oに必要なAWAITO ............................... 3-3 動作 .......................................................................... C-3 UNLOCKRECプロシージャ 入力順ファイル ...................................................... 8-12 説明 ..................................................................3-3, 10-3 非構造化ファイル ....................................................5-9 待ちなしI/Oに必要なAWAITO ............................... 3-3 待ちなしI/Oに必要なAWAITO ...............................3-3 W RENAMEプロシージャ 説明 ........................................................................... 3-2 WRITEUPDATEUNLOCKプロシージャ REPOSITIONプロシージャ 説明 ........................................................................... 3-3 キー順ファイル ...................................................... 6-20 未完了操作へのエラー 27 ........................................3-4 説明 ..................................................................3-3, 10-3 相対ファイル .......................................................... 9-17 S 対象となる書き込み操作 ......................................... 3-6 待ちなしI/Oに必要なAWAITO ............................... 3-3 SAVEPOSITIONプロシージャ ....................................3-3 SETKEYプロシージャ WRITEUPDATEプロシージャ キー順ファイル ...................................................... 6-20 説明 ........................................................................... 3-2 SETMODENOWAITプロシージャ 説明 ........................................................................... 3-3 相対ファイル .......................................................... 9-17 説明 ........................................................................... 3-3 対象となる書き込み操作 ......................................... 3-6 待ちなしI/Oに必要なAWAITO ...............................3-3 動作 .......................................................................... C-4 未完了操作に対するエラー 27 ................................3-4 非構造化ファイル .................................................. 5-11 SETMODEプロシージャ WRITEプロシージャ 説明 ........................................................................... 3-3 current-recordポインタの効果 ................................. 5-9 未完了操作に対するエラー 27 ................................3-4 EOFポインタの効果 ................................................ 5-9 SETPOSITIONプロシージャ 説明 ........................................................................... 3-2 next-recordポインタの効果 ...................................... 5-9 キー順ファイル ...................................................... 6-21 キュー・ファイル .................................................... 7-6 T 検証 ........................................................................... 4-7 説明 ........................................................................... 3-3 TMF 相対ファイル .......................................................... 9-17 オーディット、定義 ................................................1-6 対象となる書き込み操作 ......................................... 3-6 レコード・ロック ....................................................1-6 動作 .......................................................................... C-4 ロック規則 .............................................................. 10-8 非構造化ファイル ...........................................5-9, 5-12 待ちなしI/Oに必要なAWAITO ............................... 3-3 137692J 索引 -3 索引 ア 割り当てと割り当て解除 ......................1-3, 4-19, 11-2 エクステント・サイズ キー順ファイル ........................................................ 6-5 アクセス・パス EXACT位置設定モード .......................................... 2-9 相対ファイル ........................................................... 9-7 GENERIC位置設定モード ...................................... 2-8 入力順ファイル ........................................................ 8-4 概要 ........................................................................... 2-4 非構造化ファイル .................................................... 5-3 リレーショナル・アクセス ................................... 2-15 エラー アクセス・モード ......................................................... 1-6 エクステント割り当てエラー ............................... 11-2 アクセスのタイプ カテゴリ ................................................................. 11-1 キー順ファイル ........................................................ 6-2 通信パス・エラー .................................................. 11-1 キュー・ファイル .................................................... 7-2 データ・エラー ...................................................... 11-1 相対ファイル ............................................................ 9-3 デバイス操作エラー .............................................. 11-1 パーティション・ファイル .................................. 11-3 アクセス例 キー順ファイル ...................................................... 6-22 パス・エラー .......................................................... 11-1 キュー・ファイル .................................................. 7-14 プライマリ・アプリケーション・プロセスのエラー 相対ファイル .......................................................... 9-18 ............................................................................ 11-3 入力順ファイル ...................................................... 8-13 プロシージャ呼び出しからの∼ ............................. 3-5 非構造化ファイル .................................................... 5-9 メッセージ ............................................................. 11-1 圧縮、オーディット・チェックポイント .................. 4-5 オ イ オーディット・チェックポイントの圧縮 .................. 4-5 位置決め オーディット・ファイル、オープンするときのエラー 構造化ファイル ........................................................ 2-4 ............................................................................... 10-10 相対ファイル ............................................................ 9-2 カ 位置決めモード ............................................................ 2-7 インデックス短縮 ......................................................... 6-7 インデックス・ブロック ............................................. 6-5 書き込み専用アクセス ................................................. 1-6 書き込み操作の検証 ..................................................... 4-7 エ カレント・キーの値 キー順ファイル ...................................................... 6-20 エクステント セカンダリ ............................................................... 1-3 キュー・ファイル .................................................. 7-13 カレント・レコード・ポインタ 定義 ........................................................................... 1-2 相対ファイル .................................................. 9-3, 9-15 ファイル・ディレクトリ ........................................ 1-5 非構造化ファイル .................................................... 5-7 プライマリ ............................................................... 1-3 ブロック・サイズに対する相対値 ....4-2, 6-5, 8-4, 9-8 索引 -4 137692J 索引 キ 主キーのタイムスタンプ ......................................... 7-2 説明 ........................................................................... 7-1 キー 同期深度 .................................................................... 7-6 主 ...............................................................................1-4 ファイル作成の例 .................................................... 7-3 代替 ........................................................................... 1-4 レコード形式 ............................................................ 7-2 定義 ........................................................................... 1-2 キュー・ファイル・レコードのタイムスタンプ ....... 7-2 キー指定子 ............................................................2-4, 2-11 共有アクセス ................................................................. 1-6 キー順ファイル ケ EOFポインタ .......................................................... 6-20 アクセス ...........................................................6-2, 6-20 アクセスのタイプ ....................................................6-2 形式1と形式2ファイル インデックス・ブロック ......................................... 6-5 定義 ........................................................................... 1-1 現在の主キー値 ...................................................... 6-21 ブロック形式 ........................................................... B-2 構造 ........................................................................... 6-1 現在キー指定子の定義 ................................................. 2-4 シーケンシャル・アクセス ................................... 6-20 コ 主キー・オフセット ................................................6-6 代替キーの使用 ...................................................... 2-13 ツリー構造 ................................................................6-2 構造化ファイル ディスク・エクステント・サイズ ......................... 6-5 エクステント・サイズに対するブロック・サイズの相 ビットマップ・ブロック ................................. 6-2, B-1 対値 ................................................ 4-2, 6-5, 8-4, 9-6 ファイル作成の例 ....................................................6-8 キー順ファイルの構造 ............................................ 6-1 ブロック分割 ............................................................6-2 説明 ........................................................................... 1-4 他のタイプとの比較 ................................................1-8 相対ファイルの構造 ................................................ 9-1 レコード長 .........................................................6-1, 6-4 比較表 ....................................................................... 1-8 キー順ファイルのブロック分割 ..................................6-2 ブロック形式 ........................................................... B-1 逆方向読み出し .............................................................4-9 サ キャッシュアクセス・モード シーケンシャル・アクセス ................................... 4-16 システム管理アクセス ........................................... 4-16 サイズ制限 ダイレクトI/O ........................................................ 4-17 キー順ファイル ........................................................ 4-5 ランダム・アクセス .............................................. 4-16 相対ファイル ............................................................ 4-5 キャッシュ・アクセスのタイプ ................................ 4-12 単一パーティション ................................................ 4-4 キュー・ファイル 入力順ファイル ........................................................ 4-5 アクセス .............................................................7-2, 7-6 アクセス例 .............................................................. 7-14 非構造化ファイル .................................................... 4-5 作成 構造 ........................................................................... 7-2 キー順ファイル ........................................................ 6-4 主キー .......................................................................7-2 キュー・ファイル .................................................... 7-3 137692J 索引 -5 索引 相対ファイル ............................................................ 9-4 アプリケーション例 ................................................ 9-2 入力順ファイル ........................................................ 8-2 位置決め ................................................................... 9-2 ファイル ................................................................... 1-2 構造 ........................................................................... 9-1 作成 ........................................................................... 9-4 シ 代替キーの使用 ...................................................... 2-13 定義 ........................................................................... 9-1 シーケンシャル・アクセス ..............5-9, 6-20, 8-12, 9-16 ディスク・エクステント・サイズ ......................... 9-7 シーケンシャル・キャッシュ・アクセス・タイプ . 4-12 ファイルの作成例 ....................................9-7, 9-9, 9-12 シーケンシャル・キャッシュ・アクセス・モード . 4-16 ほかのタイプとの比較 ............................................ 1-8 シーケンシャル・ブロック・バッファリング ......... 4-14 レコード長 ........................................................ 9-1, 9-5 システム管理キャッシュ・アクセス・モード ......... 4-16 レコード番号 .................................................... 2-1, 9-1 自動更新オプション ...................................4-17, 5-8, 9-14 挿入順による代替キー ................................................. 2-4 主キー タ オフセット ............................................................... 6-6 キー順ファイルの∼ ................................................ 2-1 キュー・ファイルの∼ ..................................... 2-1, 7-2 代替キー 相対ファイルの∼ .................................................... 2-1 概要 ........................................................................... 2-9 入力順ファイルの∼ ................................................ 2-1 キー順ファイル ...................................................... 2-13 例 ............................................................................... 2-3 自動メンテナンス .................................................. 2-12 条件コード .................................................................... 3-5 相対ファイル ......................................................... 2-13 照合順序 ........................................................................ 6-6 挿入順の∼ ............................................................... 2-4 属性 セ Null値 ................................................................. 2-12 自動更新 ............................................................ 2-13 セカンダリ・エクステント ......................................... 1-3 入力順ファイル ...................................................... 2-13 セクタ、定義 ................................................................ 1-2 ファイルの作成 .........................................6-4, 8-2, 9-4 例 .......................................... 2-3, 6-24, 6-27, 6-31, 6-39 ソ レコード形式 ........................................................... 2-9 代替キー・ファイル 相対バイト・アドレス RBAを参照 相対ファイル キー指定子 ............................................................. 2-11 キー長 ..................................................................... 2-14 キー・オフセット .................................................. 2-11 current-recordポインタ ................................... 9-3, 9-15 自動更新 ................................................................. 2-13 EOFポインタ ............................................................ 9-3 内容 ......................................................................... 2-13 Next-recordポインタ ....................................... 9-3, 9-15 ファイル作成の例 ..................................6-16 ,8-8, 9-11 アクセス .......................................................... 9-3, 9-14 複数の∼ ................................................................. 2-13 アクセスのタイプ .................................................... 9-3 タイムスタンプ .......................................................... 4-11 索引 -6 137692J 索引 ダイレクトI/Oキャッシュ・アクセス・モード ........ 4-17 レコード・アドレス ................................................ 2-1 短縮、インデックス ..................................................... 6-7 ハ ツ パーティション・ファイル 通信パス・エラー ....................................................... 11-1 エクステントの数 .................................................... 1-2 オープンする .....................................................1-4, 4-9 テ 全パーティションの作成 ..................................5-5, 8-2 定義 ........................................................................... 1-4 ディスク・エクステント・サイズ パーティション間の相違点 ..................................... 1-5 キー順ファイル ........................................................6-5 ファイル作成例 ............................ 5-4, 6-16, 8-10, 9-12 相対ファイル ............................................................9-7 ファイル識別子 ........................................................ 1-5 入力順ファイル ........................................................8-4 ロック ....................................................................... 1-5 非構造化ファイル ....................................................5-3 排他アクセス ................................................................. 1-6 ディレクトリ .................................................................1-5 排他モード ..................................................................... 1-6 データのパージ ........................................................... 4-18 バッファリング データ・エラー ........................................................... 11-1 キャッシュ .............................................................. 4-12 デッドロック ............................................................... 10-7 バッファリングされた ...................................... 4-12 デバイス操作エラー ................................................... 11-1 ライトスルー ..................................................... 4-12 シーケンシャル・ブロック・バッファリング ト FILE_OPEN_パラメータ .................................. 4-15 共有ファイル・アクセス .................................. 4-15 同期深度、キュー・ファイル ...................................... 7-6 ディスク・プロセスの限定使用 ...................... 4-14 トランザクションのロック ........................................ 10-8 バッファ・スペースの共有 .............................. 4-16 トランスファ・カウント・パラメータ .......................3-4 ヒ ニ 非構造化ファイル 入力順ファイル BUFFERSIZEゾクセイ ............................................ 5-2 アクセスする .......................................................... 8-12 current-recordポインタ ............................................. 5-1 アクセス例 .............................................................. 8-13 EOFポインタ ............................................................ 5-1 作成 ........................................................................... 8-2 next-recordポインタ ................................................. 5-1 代替キーの使用 ...................................................... 2-13 アクセスのタイプ .................................................... 5-1 ディスク・エクステント・サイズ ......................... 8-4 定義 ........................................................................... 1-4 ファイルの作成例 ................................... 8-4, 8-6, 8-10 ディスク・エクステント・サイズ ......................... 5-3 ほかのタイプとの比較 .............................................1-8 ファイル作成例 ........................................................ 5-3 レコード長、最大値 ................................................8-3 ファイル・ロック .................................................. 10-7 137692J 索引 -7 索引 ランダム・アクセス .............................................. 5-11 パーティション・ファイル ............................. 1-4, 4-9 レコード・ロック .................................................. 10-7 パーマネント・ディスク・ファイル ..................... 4-8 ファイルの作成 フ 2つの方法 ................................................................. 1-7 COMPRESSパラメータ .......................................... 6-6 ファイル DCOMPRESSパラメータ ........................................ 6-6 一時 ........................................................................... 1-2 インデックス・ブロック ........................................ 6-5 構造化 ....................................................................... 1-4 キー指定子 ............................................................. 2-11 作成 ........................................................................... 1-2 主キーのオフセット ................................................ 6-6 パーティションされた ..................................... 1-2, 1-4 相対ファイル ........................................................... 9-4 パーマネント ............................................................ 1-2 代替キー・ファイル .................................6-4, 8-2, 9-4 非構造化 ................................................................... 1-4 代替キーのオフセット .......................................... 2-11 ロード ....................................................................... 1-7 入力順ファイル ........................................................ 8-2 ファイル、定義 ............................................................. 1-1 パーティション・ファイル ......................5-4, 8-2, 9-4 ファイル・コード ......................................................... 4-2 ファイル・コード .................................................... 4-2 ファイル•コントロール・ブック ブロック・サイズ FCBを参照 エクステント・サイズに対する相対値 ..... 4-2, 9-6 ファイル・サイズの制限 ............................................. 4-4 決定する .......................................................... 8-3, 9-5 キー順ファイル ........................................................ 4-5 ブロック・サイズに対するエクステント・サイズの 相対ファイル ............................................................ 4-5 相対値 ...................................................... 4-2, 9-7 入力順ファイル ........................................................ 4-5 例 非構造化ファイル .................................................... 4-5 キー順ファイル ................................................... 6-8 ファイル・タイプ ......................................................... 1-2 キー順、パーティション・ファイル .............. 6-16 ファイル・ディレクトリ ............................................. 1-5 相対ファイル ....................................................... 9-7 ファイル・ユーティリティ・プログラム 相対、パーティション・ファイル .................. 9-12 FUPを参照 ファイル・ロック 代替キー・ファイル .........................6-16, 8-8, 9-11 代替キーを持つキー順ファイル ...................... 6-10 説明 ......................................................................... 10-2 代替キーを持つ相対ファイル ............................ 9-9 非構造化ファイル .................................................. 10-7 代替キーを持つ入力順ファイル ........................ 8-6 レコード・ロックとの関係 ................................... 10-6 入力順ファイル ................................................... 8-4 ファイル形式 入力順ファイル、パーティション・ファイル 8-10 圧縮 ........................................................................... 4-3 非構造化ファイル ............................................... 5-3 形式1、形式2ファイルを参照 非構造化、パーティション・ファイル ............ 5-4 サポートされた∼ .................................................... 4-3 代替キー・ファイル ファイル情報の更新 ............................................ 5-7, 9-14 ファイルの有効期限 ................................................... 4-11 ファイルのオープン ファイルのロード ......................................................... 1-7 アクセス・タイプ .................................................. 4-16 索引 -8 1つのパーティションの再ロード ......................... 12-3 137692J 索引 1つのパーティションをロード ............................. 12-3 ブロック形式(2) ........................................................... B-9 キー順ファイル ...................................................... 12-1 代替キーの追加 ...................................................... 12-2 ヘ ファイル番号 .................................................................3-4 ファイルへのアクセス キー順ファイル ...............................................6-2, 6-20 ページ、定義 ................................................................. 1-2 キュー・ファイル ....................................................7-6 ホ 相対ファイル ...................................................9-3, 9-14 入力順ファイル ...................................................... 8-12 非構造化ファイル ....................................................5-1 包括ロック ................................................................... 10-4 複数プロセスのアクセス ......................................... 1-6 保護アクセス ................................................................. 1-6 ファイル識別子、パーティション・ファイル ...........1-5 マ フィールド、定義 .........................................................2-1 プライマリ・アプリケーション・プロセスのエラー ................................................................................. 11-3 待ちありI/O、定義 ........................................................ 1-6 プライマリ・エクステント ..........................................1-3 待ちなしI/O、定義 ........................................................ 1-6 プロシージャ ヨ シーケンシャルIO(SIO) 一般特性 ...............................................................3-8 ファイル・システム 用語 ................................................................................ 1-1 外部宣言 ...............................................................3-7 読み出し/書き込みアクセス ......................................... 1-6 サマリ表 ...............................................................3-1 読み出し専用アクセス ................................................. 1-6 条件コード ...........................................................3-5 ラ タグ・パラメータ ................................................3-4 動作 ...................................................................... C-1 トランスファ・カウント・パラメータ ............. 3-4 ランダム・アクセス バッファ・パラメータ ........................................3-4 キー順ファイル ...................................................... 6-20 ファイル番号とファイル名の使用 ....................3-4 キュー・ファイル .................................................... 7-2 プロシージャ呼び出しのタグ・パラメータ ...............3-4 相対ファイル .......................................................... 9-17 プロシージャ呼び出しのバッファ・パラメータ ....... 3-4 入力順ファイル ...................................................... 8-12 ブロック、定義 ....................................... 1-2, 6-4, 8-3, 9-5 非構造化ファイル .................................................. 5-11 ブロック・サイズ ランダム・キャッシュ・アクセス・モード ............. 4-16 インデックス・ブロック ......................................... 6-5 エクステント・サイズに対する相対値 リ ........................................................ 4-2, 6-5, 8-4, 9-7 決定する ..................................................... 6-5, 8-3, 9-5 リレーショナル・アクセス ........................................ 2-15 ブロック形式(1) ........................................................... B-2 リレーショナル・プロセスの例 ................................ 6-39 137692J 索引 -9 索引 レ 論理レコード、定義 ................................1-2, 6-4, 8-3, 9-5 レコード 構造 ........................................................................... 2-1 削除 .......................................................6-21, 6-37, 9-18 挿入 ................................................................ 6-21, 9-17 定義 ........................................................................... 1-1 レコード・ロック 説明 ......................................................................... 10-3 非構造化ファイル .................................................. 10-7 ファイル・ロックとの関係 ................................... 10-6 ロック解除 ............................................................. 10-3 レコード長 キー順ファイル ........................................................ 6-1 最大サイズ .................................................6-4, 8-3, 9-5 相対ファイル ............................................................ 9-1 レコードのキューへの追加 ......................................... 7-6 レコードのデキューイング ......................................... 7-7 ロ ロック KEYPOSITIONプロシージャ実行後の∼ ............ 6-21 TMFを使った∼ .............................................. 1-6, 10-8 位置決め ................................................................... 2-6 最大数 ............................................................ 10-6, 10-8 シーケンシャル・ブロック・バッファリングを使う ............................................................................ 10-6 所有 ......................................................................... 10-8 デッドロック .......................................................... 10-7 パーティション・ファイル ..................................... 1-4 ファイルあたりの最大数 .................................... 10-11 ファイル全体の∼ ................................................ 10-11 ファイルとレコードの相互関係 ........................... 10-6 包括 ......................................................................... 10-4 ロックに対する相対現在位置 ..................................... 2-6 ロック・モード ........................................................... 10-1 索引 -10 137692J