/*====================================== * llrpt_writeindi -- Write person to database * usage: writeindi(INDI) -> BOOLEAN *====================================*/ PVALUE llrpt_writeindi (PNODE node, SYMTAB stab, BOOLEAN *eflg) { NODE indi1; PNODE arg = iargs(node); NODE indi2 = eval_indi(arg, stab, eflg, NULL); STRING rawrec=0, msg; INT len, cnt; BOOLEAN rtn=FALSE; if (*eflg || !indi2) { prog_var_error(node, stab, arg, 0, nonind1, "writeindi"); return NULL; } /* make a copy, so we can delete it */ indi2 = copy_node_subtree(indi2); /* get existing record */ rawrec = retrieve_raw_record(rmvat(nxref(indi2)), &len); if (!rawrec) { /* TODO: What do we do here ? Are they adding a new indi ? or did they get the xref wrong ? */ goto end_writeindi; } ASSERT(indi1 = string_to_node(rawrec)); cnt = resolve_refn_links(indi2); /* validate for showstopper errors */ if (!valid_indi_tree(indi2, &msg, indi1)) { /* TODO: What to do with msg ? */ goto end_writeindi; } if (cnt > 0) { /* unresolvable refn links */ /* TODO: optional argument to make this fatal ? */ } if (equal_tree(indi1, indi2)) { /* optimization :) */ rtn = TRUE; goto end_writeindi; } if (readonly) { /* TODO: database is read only error message */ goto end_writeindi; } replace_indi(indi1, indi2); strfree(&rawrec); rtn = TRUE; end_writeindi: return create_pvalue_from_bool(rtn); }
/*====================================== * 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); } }
/*========================================================== * add_indi_by_edit -- Add new person to database by editing * (with user interaction) * returns addref'd record *========================================================*/ RECORD add_indi_by_edit (RFMT rfmt) { FILE *fp; RECORD indi0=0; NODE indi=0; STRING str, msg; BOOLEAN emp; XLAT ttmi = transl_get_predefined_xlat(MEDIN); if (readonly) { message(_(qSronlya)); return NULL; } /* Create person template for user to edit */ if (!(fp = fopen(editfile, LLWRITETEXT))) return NULL; prefix_file_for_edit(fp); /* prefer useroption in this db */ if ((str = getlloptstr("INDIREC", NULL))) fprintf(fp, "%s\n", str); else { /* default */ fprintf(fp, "0 INDI\n1 NAME Fname/Surname\n1 SEX MF\n"); fprintf(fp, "1 BIRT\n 2 DATE\n 2 PLAC\n"); fprintf(fp, "1 DEAT\n 2 DATE\n 2 PLAC\n1 SOUR\n"); } /* Have user edit new person record */ fclose(fp); do_edit(); while (TRUE) { INT cnt; if (indi0) { release_record(indi0); indi0=0; } indi0 = file_to_record(editfile, ttmi, &msg, &emp); if (!indi0) { if (ask_yes_or_no_msg(msg, _(qSiredit))) { do_edit(); continue; } break; } indi = nztop(indi0); cnt = resolve_refn_links(indi); /* check validation & allow user to reedit if invalid */ /* this is a showstopper, so alternative is to abort */ if (!valid_indi_tree(indi, &msg, NULL)) { if (ask_yes_or_no_msg(msg, _(qSiredit))) { do_edit(); continue; } release_record(indi0); indi0 = NULL; break; } /* Allow user to reedit if desired if any refn links unresolved */ /* this is not a showstopper, so alternative is to continue */ if (cnt > 0) { char msgb[120]; llstrncpyf(msgb, sizeof(msgb), uu8 , get_unresolved_ref_error_string(cnt), cnt); if (ask_yes_or_no_msg(msgb, _(qSireditopt))) { write_indi_to_file_for_edit(indi, editfile, rfmt); do_edit(); continue; } } break; } if (!indi0 || !ask_yes_or_no(_(qScfpadd))) { if (indi0) release_record(indi0); return NULL; } /* add the new record to the database */ add_new_indi_to_db(indi0); msg_status(_(qSgdpadd), indi_to_name(nztop(indi0), 35)); return indi0; }