/*====================================== * valid_node_type -- Validate top-level node tree * node: [IN] node to validate * ntype: [IN] I/F/S/E/X * pmsg, [OUT] error message, if any * orig: [IN] node to match (may be null) *====================================*/ BOOLEAN valid_node_type (NODE node, char ntype, STRING *pmsg, NODE node0) { switch(ntype) { case 'I': return valid_indi_tree(node, pmsg, node0); case 'F': return valid_fam_tree(node, pmsg, node0); case 'S': return valid_sour_tree(node, pmsg, node0); case 'E': return valid_even_tree(node, pmsg, node0); default: return valid_othr_tree(node, pmsg, node0); } }
/*===================================== * llrpt_writefam -- Write family to database * usage: writefam(FAM) -> BOOLEAN *===================================*/ PVALUE llrpt_writefam (PNODE node, SYMTAB stab, BOOLEAN *eflg) { NODE fam1; NODE fam2 = eval_fam(iargs(node), stab, eflg, NULL); STRING rawrec=0, msg; INT len, cnt; BOOLEAN rtn=FALSE; if (*eflg) return NULL; /* make a copy, so we can delete it */ fam2 = copy_node_subtree(fam2); /* get existing record */ rawrec = retrieve_raw_record(rmvat(nxref(fam2)), &len); if (!rawrec) { /* TODO: What do we do here ? Are they adding a new fam ? or did they get the xref wrong ? */ goto end_writefam; } ASSERT(fam1 = string_to_node(rawrec)); cnt = resolve_refn_links(fam2); /* validate for showstopper errors */ if (!valid_fam_tree(fam2, &msg, fam1)) { /* TODO: What to do with msg ? */ goto end_writefam; } if (cnt > 0) { /* unresolvable refn links */ /* TODO: optional argument to make this fatal ? */ } if (equal_tree(fam1, fam2)) { /* optimization :) */ rtn = TRUE; goto end_writefam; } if (readonly) { /* TODO: database is read only error message */ goto end_writefam; } replace_fam(fam1, fam2); strfree(&rawrec); rtn = TRUE; end_writefam: return create_pvalue_from_bool(rtn); }