(* camlp4r ./pa_html.cmo *)
(* $Id: mergeFamOk.ml,v 4.10.2.1 2006/01/03 12:04:10 ddr Exp $ *)
(* Copyright (c) 1998-2005 INRIA *)
open Config;
open Def;
open Util;
open Gutil;
value cat_strings base is1 sep is2 =
let n1 = sou base is1 in
let n2 = sou base is2 in
if n1 = "" then n2 else if n2 = "" then n1 else n1 ^ sep ^ n2
;
value merge_strings base is1 sep is2 =
if is1 = is2 then sou base is1 else cat_strings base is1 sep is2
;
value sorp base ip =
let p = poi base ip in
(sou base p.first_name, sou base p.surname, p.occ, Update.Link, "")
;
value merge_witnesses base wit1 wit2 =
let list =
List.fold_right
(fun wit list -> if List.mem wit list then list else [wit :: list])
(List.map (sorp base) (Array.to_list wit1))
(List.map (sorp base) (Array.to_list wit2))
in
Array.of_list list
;
value reconstitute conf base fam1 des1 fam2 des2 =
let field name proj null =
let x1 = proj fam1 in
let x2 = proj fam2 in
match p_getenv conf.env name with
[ Some "1" -> x1
| Some "2" -> x2
| _ -> if null x1 then x2 else x1 ]
in
let fam =
{marriage = field "marriage" (fun f -> f.marriage) ( \= Adef.codate_None);
marriage_place =
field "marriage_place" (fun f -> sou base f.marriage_place) ( \= "");
marriage_src =
merge_strings base fam1.marriage_src ", " fam2.marriage_src;
witnesses = merge_witnesses base fam1.witnesses fam2.witnesses;
relation = field "relation" (fun f -> f.relation) ( \= Married);
divorce = field "divorce" (fun f -> f.divorce) ( \= NotDivorced);
comment = merge_strings base fam1.comment ", " fam2.comment;
origin_file = sou base fam1.origin_file;
fsources = merge_strings base fam1.fsources ", " fam2.fsources;
fam_index = fam1.fam_index}
in
let des =
{children =
Array.map (UpdateFam.person_key base)
(Array.append des1.children des2.children)}
in
(fam, des)
;
value print_merge conf base =
match (p_getint conf.env "i", p_getint conf.env "i2") with
[ (Some f1, Some f2) ->
let fam1 = base.data.families.get f1 in
let des1 = base.data.descends.get f1 in
let fam2 = base.data.families.get f2 in
let des2 = base.data.descends.get f2 in
let (sfam, sdes) = reconstitute conf base fam1 des1 fam2 des2 in
let digest =
Update.digest_family fam1 (base.data.couples.get f1) des1
in
let scpl =
Gutil.map_couple_p conf.multi_parents (UpdateFam.person_key base)
(coi base sfam.fam_index)
in
UpdateFam.print_update_fam conf base (sfam, scpl, sdes) digest
| _ -> incorrect_request conf ]
;
value print_mod_merge_ok conf base wl cpl des =
let title _ = Wserver.wprint "%s" (capitale (transl conf "merge done")) in
do {
header conf title;
print_link_to_welcome conf True;
UpdateFamOk.print_family conf base wl cpl des;
match (p_getint conf.env "ini1", p_getint conf.env "ini2") with
[ (Some ini1, Some ini2) ->
let p1 = base.data.persons.get ini1 in
let p2 = base.data.persons.get ini2 in
do {
Wserver.wprint "\n";
html_p conf;
stag "a" "href=%sm=MRG_IND;i=%d;i2=%d" (commd conf) ini1 ini2 begin
Wserver.wprint "%s" (capitale (transl conf "continue merging"));
end;
Wserver.wprint "\n";
Merge.print_someone conf base p1;
Wserver.wprint "\n%s\n" (transl_nth conf "and" 0);
Merge.print_someone conf base p2;
Wserver.wprint "\n";
}
| _ -> () ];
trailer conf;
}
;
value effective_mod_merge conf base sfam scpl sdes =
match p_getint conf.env "i2" with
[ Some i2 ->
let fam2 = base.data.families.get i2 in
do {
UpdateFamOk.effective_del conf base fam2;
let (fam, cpl, des) =
UpdateFamOk.effective_mod conf base sfam scpl sdes
in
let wl =
UpdateFamOk.all_checks_family conf base fam cpl des
(scpl, sdes, None (* should be Some *))
in
let (fn, sn, occ, _, _) =
match p_getint conf.env "ip" with
[ Some i when Adef.int_of_iper (mother cpl) = i -> (mother scpl)
| _ -> (father scpl) ]
in
Util.commit_patches conf base;
History.record conf base (fn, sn, occ) "ff";
print_mod_merge_ok conf base wl cpl des;
}
| None -> incorrect_request conf ]
;
value print_mod_merge o_conf base =
let conf = Update.update_conf o_conf in
UpdateFamOk.print_mod_aux conf base (effective_mod_merge conf base)
;