GnuCash  5.6-133-gc519490283+
Files | Functions

The transaction logging mechanism provides a very simple, low-level logging of user input to a file. More...

Files

file  TransLog.h
 API for the transaction logger.
 

Functions

void xaccOpenLog (void)
 
void xaccCloseLog (void)
 
void xaccReopenLog (void)
 
void xaccTransWriteLog (Transaction *trans, char flag)
 
void xaccLogEnable (void)
 document me
 
void xaccLogDisable (void)
 document me
 
void xaccLogSetBaseName (const char *)
 The xaccLogSetBaseName() method sets the base filepath and the root part of the journal file name. More...
 
gboolean xaccFileIsCurrentLog (const gchar *name)
 Test a filename to see if it is the name of the current logfile.
 

Detailed Description

The transaction logging mechanism provides a very simple, low-level logging of user input to a file.

The goal of the transaction logger is to provide mechanism of last resort for recovering lost user data in the event of a crash.

Ideally, the storage backends should provide a robust journaling, logging and crash-recovery mechanism. But just in case they don't, or it didn't work, this mechanism provides a "Plan B" by providing a low-tech, fool-proof, simple logging system that can be used to recover user input. There are some simple command-line tools that will read a log and replay it.

Function Documentation

◆ xaccLogSetBaseName()

void xaccLogSetBaseName ( const char *  )

The xaccLogSetBaseName() method sets the base filepath and the root part of the journal file name.

If the journal file is already open, it will close it and reopen it with the new base name.

Definition at line 119 of file TransLog.cpp.

120 {
121  if (!basepath) return;
122 
123  g_free (log_base_name);
124  log_base_name = g_strdup (basepath);
125 
126  if (trans_log)
127  {
128  xaccCloseLog();
129  xaccOpenLog();
130  }
131 }

◆ xaccTransWriteLog()

void xaccTransWriteLog ( Transaction *  trans,
char  flag 
)
Parameters
transThe transaction to write out to the log
flagThe engine currently uses the log mechanism with flag char set as follows: 'B' for 'begin edit' (followed by the transaction as it looks before any changes, i.e. the 'old value') 'D' for delete (i.e. delete the previous B; echoes the data in the 'old B') 'C' for commit (i.e. accept a previous B; data that follows is the 'new value') 'R' for rollback (i.e. revert to previous B; data that follows should be identical to old B)

Definition at line 223 of file TransLog.cpp.

224 {
225  GList *node;
226  char trans_guid_str[GUID_ENCODING_LENGTH + 1];
227  char split_guid_str[GUID_ENCODING_LENGTH + 1];
228  const char *trans_notes;
229  char dnow[100], dent[100], dpost[100], drecn[100];
230 
231  if (!gen_logs)
232  {
233  PINFO ("Attempt to write disabled transaction log");
234  return;
235  }
236  if (!trans_log) return;
237 
238  gnc_time64_to_iso8601_buff (gnc_time(nullptr), dnow);
239  gnc_time64_to_iso8601_buff (trans->date_entered, dent);
240  gnc_time64_to_iso8601_buff (trans->date_posted, dpost);
241  guid_to_string_buff (xaccTransGetGUID(trans), trans_guid_str);
242  trans_notes = xaccTransGetNotes(trans);
243  fprintf (trans_log, "===== START\n");
244 
245  for (node = trans->splits; node; node = node->next)
246  {
247  Split *split = GNC_SPLIT(node->data);
248  const char * accname = "";
249  char acc_guid_str[GUID_ENCODING_LENGTH + 1];
250  gnc_numeric amt, val;
251 
252  if (xaccSplitGetAccount(split))
253  {
254  accname = xaccAccountGetName (xaccSplitGetAccount(split));
256  acc_guid_str);
257  }
258  else
259  {
260  acc_guid_str[0] = '\0';
261  }
262 
263  gnc_time64_to_iso8601_buff (split->date_reconciled, drecn);
264 
265  guid_to_string_buff (xaccSplitGetGUID(split), split_guid_str);
266  amt = xaccSplitGetAmount (split);
267  val = xaccSplitGetValue (split);
268 
269  /* use tab-separated fields */
270  fprintf (trans_log,
271  "%c\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t"
272  "%s\t%s\t%s\t%s\t%c\t%" G_GINT64_FORMAT "/%" G_GINT64_FORMAT "\t%" G_GINT64_FORMAT "/%" G_GINT64_FORMAT "\t%s\n",
273  flag,
274  trans_guid_str, split_guid_str, /* trans+split make up unique id */
275  /* Note that the next three strings always exist,
276  * so we don't need to test them. */
277  dnow,
278  dent,
279  dpost,
280  acc_guid_str,
281  accname ? accname : "",
282  trans->num ? trans->num : "",
283  trans->description ? trans->description : "",
284  trans_notes ? trans_notes : "",
285  split->memo ? split->memo : "",
286  split->action ? split->action : "",
287  split->reconciled,
288  gnc_numeric_num(amt),
289  gnc_numeric_denom(amt),
290  gnc_numeric_num(val),
291  gnc_numeric_denom(val),
292  /* The next string always exists. No need to test it. */
293  drecn);
294  }
295 
296  fprintf (trans_log, "===== END\n");
297 
298  /* get data out to the disk */
299  fflush (trans_log);
300 }
#define PINFO(format, args...)
Print an informational note.
Definition: qoflog.h:256
gchar * guid_to_string_buff(const GncGUID *guid, gchar *str)
The guid_to_string_buff() routine puts a null-terminated string encoding of the id into the memory po...
Definition: guid.cpp:173
const char * xaccTransGetNotes(const Transaction *trans)
Gets the transaction Notes.
#define xaccAccountGetGUID(X)
Definition: Account.h:248
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
Definition: guid.h:84
#define xaccSplitGetGUID(X)
Definition: Split.h:555
#define xaccTransGetGUID(X)
Definition: Transaction.h:804
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction's commodity.
Definition: gmock-Split.cpp:84
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53
time64 gnc_time(time64 *tbuf)
get the current time
Definition: gnc-date.cpp:261
const char * xaccAccountGetName(const Account *acc)
Get the account's name.
Definition: Account.cpp:3304
char * gnc_time64_to_iso8601_buff(time64 time, char *buff)
The gnc_time64_to_iso8601_buff() routine takes the input UTC time64 value and prints it as an ISO-860...
Definition: gnc-date.cpp:1139
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account's commodity.
Definition: gmock-Split.cpp:69