static gboolean spl_id_handler(xmlNodePtr node, gpointer data) { struct split_pdata *pdata = data; GncGUID *tmp = dom_tree_to_guid(node); g_return_val_if_fail(tmp, FALSE); xaccSplitSetGUID(pdata->split, tmp); g_free(tmp); return TRUE; }
/* File pointer must already be at the begining of a record */ static void process_trans_record( FILE *log_file) { char read_buf[2048]; char *read_retval; char * trans_ro = NULL; const char * record_end_str = "===== END"; int first_record = TRUE; int record_ended = FALSE; int split_num = 0; split_record record; Transaction * trans = NULL; Split * split = NULL; Account * acct = NULL; QofBook * book = gnc_get_current_book(); DEBUG("process_trans_record(): Begin...\n"); while ( record_ended == FALSE) { read_retval = fgets(read_buf, sizeof(read_buf), log_file); if (read_retval != NULL && strncmp(record_end_str, read_buf, strlen(record_end_str)) != 0) /* If we are not at the end of the record */ { split_num++; /*DEBUG("process_trans_record(): Line read: %s%s",read_buf ,"\n");*/ record = interpret_split_record( read_buf); dump_split_record( record); if (record.log_action_present) { switch (record.log_action) { case split_record::LOG_BEGIN_EDIT: DEBUG("process_trans_record():Ignoring log action: LOG_BEGIN_EDIT"); /*Do nothing, there is no point*/ break; case split_record::LOG_ROLLBACK: DEBUG("process_trans_record():Ignoring log action: LOG_ROLLBACK");/*Do nothing, since we didn't do the begin_edit either*/ break; case split_record::LOG_DELETE: DEBUG("process_trans_record(): Playing back LOG_DELETE"); if ((trans = xaccTransLookup (&(record.trans_guid), book)) != NULL && first_record == TRUE) { first_record = FALSE; if (xaccTransGetReadOnly(trans)) { PWARN("Destroying a read only transaction."); xaccTransClearReadOnly(trans); } xaccTransBeginEdit(trans); xaccTransDestroy(trans); } else if (first_record == TRUE) { PERR("The transaction to delete was not found!"); } else xaccTransDestroy(trans); break; case split_record::LOG_COMMIT: DEBUG("process_trans_record(): Playing back LOG_COMMIT"); if (record.trans_guid_present == TRUE && first_record == TRUE) { trans = xaccTransLookupDirect (record.trans_guid, book); if (trans != NULL) { DEBUG("process_trans_record(): Transaction to be edited was found"); xaccTransBeginEdit(trans); trans_ro = g_strdup(xaccTransGetReadOnly(trans)); if (trans_ro) { PWARN("Replaying a read only transaction."); xaccTransClearReadOnly(trans); } } else { DEBUG("process_trans_record(): Creating a new transaction"); trans = xaccMallocTransaction (book); xaccTransBeginEdit(trans); } xaccTransSetGUID (trans, &(record.trans_guid)); /*Fill the transaction info*/ if (record.date_entered_present) { xaccTransSetDateEnteredTS(trans, &(record.date_entered)); } if (record.date_posted_present) { xaccTransSetDatePostedTS(trans, &(record.date_posted)); } if (record.trans_num_present) { xaccTransSetNum(trans, record.trans_num); } if (record.trans_descr_present) { xaccTransSetDescription(trans, record.trans_descr); } if (record.trans_notes_present) { xaccTransSetNotes(trans, record.trans_notes); } } if (record.split_guid_present == TRUE) /*Fill the split info*/ { gboolean is_new_split; split = xaccSplitLookupDirect (record.split_guid, book); if (split != NULL) { DEBUG("process_trans_record(): Split to be edited was found"); is_new_split = FALSE; } else { DEBUG("process_trans_record(): Creating a new split"); split = xaccMallocSplit(book); is_new_split = TRUE; } xaccSplitSetGUID (split, &(record.split_guid)); if (record.acc_guid_present) { acct = xaccAccountLookupDirect(record.acc_guid, book); xaccAccountInsertSplit(acct, split); } if (is_new_split) xaccTransAppendSplit(trans, split); if (record.split_memo_present) { xaccSplitSetMemo(split, record.split_memo); } if (record.split_action_present) { xaccSplitSetAction(split, record.split_action); } if (record.date_reconciled_present) { xaccSplitSetDateReconciledTS (split, &(record.date_reconciled)); } if (record.split_reconcile_present) { xaccSplitSetReconcile(split, record.split_reconcile); } if (record.amount_present) { xaccSplitSetAmount(split, record.amount); } if (record.value_present) { xaccSplitSetValue(split, record.value); } } first_record = FALSE; break; } } else { PERR("Corrupted record"); } } else /* The record ended */ { record_ended = TRUE; DEBUG("process_trans_record(): Record ended\n"); if (trans != NULL) /*If we played with a transaction, commit it here*/ { xaccTransScrubCurrencyFromSplits(trans); xaccTransSetReadOnly(trans, trans_ro); xaccTransCommitEdit(trans); g_free(trans_ro); } } } }