The procedure of modifying and deleting a record is as follows.
modify_member(normal, Member_info, Comm, Status)-IFP :- % The third argument is unified with an atom modify or delete to % specify what to do. 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) | % In case of record modification % vector_element/3 checks if the version matches or not. 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. % returns the unnested unmodified record in the command status. modify_member4([{RID,Rec}],delete,CTIFormat,AttrPath,Version,NewRec,UnRec, Status)-IFP :- vector_element(Rec, AttrPath, Version) | % In case of record deletion 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."}). % adds the original record to meibo_history table as an updated record. 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.