レコードの読みは、次の手順で行なう。
プログラミングテクニックとして、原始コマンドread_record/5の読み込み 制御を利用した大量データへの対応が重要である。この点については、以下の read_record_loop/5を参照。
read_record1(normal, TableName, ReadSeq, ValidF, VLS,NVLS,Status)-IFP :- % 引数ReadSeqは読み順。集合の実体を読む場合、set(Set, _)を入力する。 IFP <= create_format(TableName, (*), IFormat, Status1), % (*)でテーブル全体を指定して、内部フォーマットIFormatを入手 IFP <= get_table_info(TableName, [schema(Schema0)], Status2), % スキーマ情報を入手 Schema0 = Schema, lib:error_check([Status1,Status2],irpr_kappa:read_record1,Status3), read_record2(Status3,TableName,ReadSeq,IFormat,ValidF,Schema,VLS,NVLS,Status)-IFP. otherwise. read_record1(PreStatus, _TableName, _ReadSeq, _ValidF, VLS,NVLS,Status)-IFP :- NVLS = VLS, Status = PreStatus. read_record2(normal,TableName,ReadSeq,IFormat,ValidF,Schema,VLS,NVLS,Status)-IFP :- IFP <= read_record(TableName, IFormat, ReadSeq, RRVLS, Status), ValidFL = [valid_flag(ValidF)], read_record_loop(VLS, Schema, ValidFL, RRVLS, NVLS). otherwise. read_record2(PreStatus,_TableName,_ReadSeq,_IFormat,_ValidF,_Schema,VLS,NVLS,Status)-IFP :- NVLS = VLS, Status = PreStatus. %%%% % read_record_loop/5 read_record_loop([VLB|VLS], Schema, ValidFL, RRVLS, NVLS) :- RRVLS = [RRVLB|RRVLS1], % 原始コマンドread_record/5の第4引数を具体化 read_record_loop1(RRVLB, VLB, VLS, Schema, ValidFL, RRVLS1, NVLS). read_record_loop([], _Schema, _ValidFL, RRVLS, NVLS) :- RRVLS = [], NVLS = [].
read_record_loop/5の第1引数でリストセル具体化を待った後、 RRVLSのリストセル具体化を行なっている。 [VLB|VLS]の具体化は、前節のコマンドステータスComStatusの受け取り側 (irpr_service:output_vls/5,output_vls_loop/8)で行なっており、 Car(VLB)の内容を出力し終ってから、Cdr(VLS)のリストセル具体化を 行なうようにしている。
このように要求駆動でレコードを読み込む理由は、前述のように、 大量データへの対応である。 RRVLSのリストセル具体化が先に行なわれてしまうと、全レコードが一度に読み 込まれ、大量データでは主記憶容量が不足する恐れがある。
%%%% read_record_loop1(RRVLB, VLB, VLS, Schema, ValidFL,RRVLS,NVLS) :- list(RRVLB) | unnest_record_vlb(RRVLB, UNVLB, Schema, ValidFL)+UNVLB+VLB, % VLBには、RRVLBを全てアンネストしたUNVLBが一度に返される。 read_record_loop(VLS, Schema, ValidFL, RRVLS, NVLS). read_record_loop1(end, VLB, VLS, _Schema, _ValidFL, RRVLS, NVLS) :- NVLS = [VLB|VLS], RRVLS = []. %%%% % read_record/5の結果は、1レコードずつアンネストされる。 unnest_record_vlb([{_,VL}|RRVLB], UNVLB, Schema, ValidFL)-VLB :- unnest_record(Schema,VL)+UnVL+ValidFL, % VLをアンネストしたUnVLを作り、その最後にValidFLを繋げる。 UNVLB = [UnVL|UNVLB1], unnest_record_vlb(RRVLB, UNVLB1, Schema, ValidFL)-VLB. unnest_record_vlb([], UNVLB, _Schema, _ValidFL)-VLB :- UNVLB = [].