レコードの修正と削除は、次の手順で行なう。
modify_member(normal, Member_info, Comm, Status)-IFP :-
% 第3引数Commには、アトムmodify(修正)またはdelete(消去)が入力される。
put_into_pool(Member_info, Pool),
get_id_and_version(ID, Version)+Pool+Pool1,
modify_member1(ID, Version, Comm, Pool1, Status1)-IFP,
end_transaction(Status1, Status)-IFP.
otherwise.
modify_member(PreStatus, _Member_info, _Comm, Status)-IFP :-
Status = PreStatus.
%
modify_member1([ID], [Version], Comm, Pool, Status)-IFP :- string(ID) |
IFP <= search_index(meibo, ``(id=ID), Set, Status1),
IFP <= create_format(meibo, (*), CTIFormat, Status2),
set_attribute(version, ~(Version+1))+Pool+Pool1,
make_record(meibo, NewRec, UnRec, Status3)+Pool1+[]-IFP,
lib:error_check([Status1,Status2,Status3],irpr_kappa:modify_member1,Status4),
modify_member2(Status4,Set,Comm,CTIFormat,Version,NewRec,UnRec,Status)-IFP.
otherwise.
modify_member1(ID, Version, _Comm, Pool, Status)-IFP :-
Pool = [],
Status = abnormal({"Illegal id or version",ID,Version}).
%
modify_member2(normal, Set, Comm, CTIFormat,Version,NewRec,UnRec,Status)-IFP :-
IFP <= read_record(meibo,CTIFormat,set(Set,_),[VLB],Status1),
IFP <= get_attribute_info(meibo, version, [attr_path(AttrPath)], Status2),
lib:error_check([Status1,Status2], irpr_kappa:modify_member2, Status3),
modify_member3(Status3, VLB, Comm, CTIFormat, AttrPath, Version,
NewRec, UnRec, Status)-IFP.
otherwise.
modify_member2(PreStatus,_Set,_Comm,_CTIFormat,_Version,_NewRec,_UnRec,Status)-IFP :-
Status = PreStatus.
%
modify_member3(normal, VLB, Comm, CTIFormat, [AttrPath], Version, NewRec,
UnRec, Status)-IFP :-
modify_member4(VLB,Comm,CTIFormat,AttrPath,Version,NewRec,UnRec,Status)-IFP.
otherwise.
modify_member3(PreStatus, _VLB, _Comm, _CTIFormat, _AttrPath, _Version,
_NewRec, _UnRec, Status)-IFP :-
Status = PreStatus.
%
modify_member4(end, _Comm,_CTIFormat,_AttrPath,_Version,_NewRec,_UnRec,Status)-IFP :-
Status = abnormal({"Can not find any records."}).
modify_member4([{RID,Rec}],modify,CTIFormat,AttrPath,Version,NewRec,UnRec,Status)-IFP :-
vector_element(Rec, AttrPath, Version) |
% レコード修正の場合
% vector_element/3で、versionの一致を見ている。
IFP <= replace_record(meibo, CTIFormat, RID, NewRec, Status1),
IFP <= create_format(meibo_history, (*), HTIFormat, Status2),
lib:error_check([Status1,Status2],irpr_kappa:modify_member4,Status3),
modify_member5(Status3, HTIFormat, Rec, normal(UnRec), Status)-IFP.
% 修正前のunnestedレコード(UnRec)をコマンドステータスに返す。
modify_member4([{RID,Rec}],delete,CTIFormat,AttrPath,Version,NewRec,UnRec,Status)-IFP :-
vector_element(Rec, AttrPath, Version) |
% レコード消去の場合
IFP <= delete_record(meibo, RID, Status1),
IFP <= create_format(meibo_history, (*), HTIFormat, Status2),
lib:error_check([Status1,Status2],irpr_kappa:modify_member4,Status3),
modify_member5(Status3, HTIFormat, Rec, normal, Status)-IFP.
otherwise.
modify_member4(_BF,_Comm,_CTIFormat,_AttrPath,_Version,_NewRec,_UnRec,Status)-IFP :-
Status = abnormal({"Version number miss match."}).
% 更新履歴として操作前のレコードを追加する。
modify_member5(normal, HTIFormat, Rec, Status0, Status)-IFP :-
IFP <= add_record(meibo_history, HTIFormat, Rec, _RID, Status1),
modify_member6(Status1, Status0, Status).
otherwise.
modify_member5(PreStatus, _HTIFormat, _Rec, Status0, Status)-IFP :-
Status = PreStatus.
modify_member6(normal, Status0, Status) :- Status = Status0.
otherwise.
modify_member6(PreStatus, _Status0, Status) :- Status = PreStatus.