next up previous
Next: Module main(irpr_client.kl1) Up: Module irpr_kappa(irpr_kappa.kl1) Previous: Appending a record

Modification and deletion of a record

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.