QOF  0.7.5
Backends: Permanent storage for QOF entities.

Modules

 Session: Backend connections.
 
 QOF Serialisation Format
 
 qof-backend-gda outline
 
 QOF-backend-SQLite support
 

Files

file  qofbackend.h
 API for data storage Backend.
 

Data Structures

struct  QofBackendOption_s
 

Macros

#define QOF_MOD_BACKEND   "qof-backend"
 

Typedefs

typedef gint32 QofErrorId
 The ID of this error. More...
 
typedef struct QofBackendProvider_s QofBackendProvider
 
typedef struct QofBackend_s QofBackend
 Pseudo-object providing an interface between the framework and a persistant data store (e.g. a server, a database, or a file). More...
 
typedef void(* QofBePercentageFunc )(const gchar *message, double percent)
 DOCUMENT ME!
 

Functions

gboolean qof_load_backend_library (const gchar *directory, const gchar *filename, const gchar *init_fcn)
 Load a QOF-compatible backend shared library. More...
 
QofBackendqof_book_get_backend (QofBook *book)
 Retrieve the backend used by this book.
 
void qof_book_set_backend (QofBook *book, QofBackend *)
 Set the backend used by this book. More...
 

Allow access to the begin routine for this backend.

QOF_BEGIN_EDIT and QOF_COMMIT_EDIT_PART1 and part2 rely on calling QofBackend *be->begin and be->commit. This means the QofBackend struct becomes part of the public API. These function replaces those calls to allow the macros to be used when QOF is built as a library.

void qof_backend_run_begin (QofBackend *be, QofInstance *inst)
 
gboolean qof_backend_begin_exists (QofBackend *be)
 
void qof_backend_run_commit (QofBackend *be, QofInstance *inst)
 
gboolean qof_backend_commit_exists (QofBackend *be)
 

Backend Configuration using KVP

The backend uses qof_backend_get_config to pass back a KvpFrame of QofBackendOption that includes the translated strings that serve as description and tooltip for that option.

qof_backend_prepare_frame, qof_backend_prepare_option and qof_backend_complete_frame are intended to be used by the backend itself to create the options.

qof_backend_get_config, qof_backend_option_foreach and qof_backend_load_config are intended for either the backend or the frontend to retrieve the option data from the frame or set new data.

Backends are loaded using QofBackendProvider via the function specified in prov->backend_new. Before backend_new returns, you should ensure that your backend is fully configured and ready for use.

typedef struct QofBackendOption_s QofBackendOption
 
typedef void(* QofBackendOptionCB )(QofBackendOption *, gpointer data)
 
void qof_backend_prepare_frame (QofBackend *be)
 
void qof_backend_prepare_option (QofBackend *be, QofBackendOption *option)
 
KvpFrameqof_backend_complete_frame (QofBackend *be)
 
void qof_backend_option_foreach (KvpFrame *config, QofBackendOptionCB cb, gpointer data)
 
void qof_backend_load_config (QofBackend *be, KvpFrame *config)
 Load configuration options specific to this backend. More...
 
KvpFrameqof_backend_get_config (QofBackend *be)
 Get the available configuration options. More...
 

Detailed Description

The QOF Backend is a pseudo-object providing an interface between the engine and a persistant data store (e.g. a server, a database, or a file). Backends are not meant to be used directly by an application; instead the Session should be used to make a connection with some particular backend. There are no backend functions that are 'public' to users of the engine. The backend can, however, report errors to the GUI & other front-end users. This file defines these errors.

Backends are used to save and restore Entities in a Book.

Typedef Documentation

typedef struct QofBackend_s QofBackend

Pseudo-object providing an interface between the framework and a persistant data store (e.g. a server, a database, or a file).

There are no backend functions that are 'public' to users of the framework. The backend can, however, report errors to the GUI & other front-end users.

Definition at line 69 of file qofbackend.h.

A single Backend Configuration Option.

typedef void(* QofBackendOptionCB)(QofBackendOption *, gpointer data)

Backend configuration option foreach callback prototype.

Definition at line 134 of file qofbackend.h.

A structure that declares backend services that can be gotten.

The Provider specifies a URL access method, and specifies the function to create a backend that can handle that URL access function.

Definition at line 60 of file qofbackend.h.

typedef gint32 QofErrorId

The ID of this error.

0 == QOF_SUCCESS (equivalent to ERR_BACKEND_NO_ERR )

Definition at line 54 of file qofbackend.h.

Function Documentation

KvpFrame* qof_backend_complete_frame ( QofBackend be)

Complete the backend_configuration and return the frame.

Definition at line 200 of file qofbackend.c.

201 {
202  g_return_val_if_fail (be, NULL);
203  be->config_count = 0;
204  return be->backend_configuration;
205 }
KvpFrame* qof_backend_get_config ( QofBackend be)

Get the available configuration options.

To retrieve the options from the returned KvpFrame, the caller needs to parse the XML file that documents the option names and data types. The XML file itself is part of the backend and is installed in a directory determined by the backend. Therefore, loading a new backend requires two paths: the path to the .la file and the path to the xml. Both paths are available by including a generated header file, e.g. gncla-dir.h defines GNC_LIB_DIR for the location of the .la file and GNC_XML_DIR for the xml.

Parameters
beThe QofBackend to be configured.
Returns
A new KvpFrame containing the available options or NULL on failure.

Definition at line 410 of file qofbackend.c.

411 {
412  if (!be)
413  return NULL;
414  if (!be->get_config)
415  return NULL;
416  return (be->get_config) (be);
417 }
void qof_backend_load_config ( QofBackend be,
KvpFrame config 
)

Load configuration options specific to this backend.

Parameters
beThe backend to configure.
configA KvpFrame of QofBackendOptions that this backend will recognise. Each backend needs to document their own config types and acceptable values.

Definition at line 400 of file qofbackend.c.

401 {
402  if (!be || !config)
403  return;
404  if (!be->load_config)
405  return;
406  (be->load_config) (be, config);
407 }
void qof_backend_option_foreach ( KvpFrame config,
QofBackendOptionCB  cb,
gpointer  data 
)

Iterate over the frame and process each option.

Definition at line 383 of file qofbackend.c.

385 {
386  struct config_iterate helper;
387 
388  if (!config || !cb)
389  return;
390  ENTER (" ");
391  helper.fcn = cb;
392  helper.count = 1;
393  helper.data = data;
394  helper.recursive = config;
395  kvp_frame_for_each_slot (config, config_foreach_cb, &helper);
396  LEAVE (" ");
397 }
void qof_backend_prepare_frame ( QofBackend be)

Initialise the backend_configuration

Definition at line 99 of file qofbackend.c.

100 {
101  g_return_if_fail (be);
102  if (!kvp_frame_is_empty (be->backend_configuration))
103  {
104  kvp_frame_delete (be->backend_configuration);
105  be->backend_configuration = kvp_frame_new ();
106  }
107  be->config_count = 0;
108 }
void qof_backend_prepare_option ( QofBackend be,
QofBackendOption option 
)

Add an option to the backend_configuration. Repeat for more.

Definition at line 111 of file qofbackend.c.

113 {
114  KvpValue *value;
115  gchar *temp;
116  gint count;
117 
118  g_return_if_fail (be || option);
119  count = be->config_count;
120  count++;
121  value = NULL;
122  switch (option->type)
123  {
124  case KVP_TYPE_GINT64:
125  {
126  value = kvp_value_new_gint64 (*(gint64 *) option->value);
127  break;
128  }
129  case KVP_TYPE_DOUBLE:
130  {
131  value = kvp_value_new_double (*(gdouble *) option->value);
132  break;
133  }
134  case KVP_TYPE_NUMERIC:
135  {
136  value = kvp_value_new_numeric (*(QofNumeric *) option->value);
137  break;
138  }
139  case KVP_TYPE_STRING:
140  {
141  value = kvp_value_new_string ((const gchar *) option->value);
142  break;
143  }
144  case KVP_TYPE_BOOLEAN:
145  {
146  break;
147  }
148  case KVP_TYPE_GUID:
149  {
150  break;
151  } /* unsupported */
152  case KVP_TYPE_TIME :
153  {
154  value = kvp_value_new_time ((QofTime*) option->value);
155  break;
156  }
157 #ifndef QOF_DISABLE_DEPRECATED
158  case KVP_TYPE_TIMESPEC:
159  {
160  value = kvp_value_new_timespec (*(Timespec *) option->value);
161  break;
162  }
163 #endif
164  case KVP_TYPE_BINARY:
165  {
166  break;
167  } /* unsupported */
168  case KVP_TYPE_GLIST:
169  {
170  break;
171  } /* unsupported */
172  case KVP_TYPE_FRAME:
173  {
174  break;
175  } /* unsupported */
176  }
177  if (value)
178  {
179  temp = g_strdup_printf ("/%s", option->option_name);
180  kvp_frame_set_value (be->backend_configuration, temp, value);
181  g_free (temp);
182  temp =
183  g_strdup_printf ("/%s/%s", QOF_CONFIG_DESC,
184  option->option_name);
185  kvp_frame_set_string (be->backend_configuration, temp,
186  option->description);
187  g_free (temp);
188  temp =
189  g_strdup_printf ("/%s/%s", QOF_CONFIG_TIP,
190  option->option_name);
191  kvp_frame_set_string (be->backend_configuration, temp,
192  option->tooltip);
193  g_free (temp);
194  /* only increment the counter if successful */
195  be->config_count = count;
196  }
197 }
void qof_book_set_backend ( QofBook book,
QofBackend  
)

Set the backend used by this book.

Should only be used within a backend itself.

Definition at line 170 of file qofbook.c.

171 {
172  if (!book)
173  return;
174  ENTER ("book=%p be=%p", book, be);
175  book->backend = be;
176  LEAVE (" ");
177 }
gboolean qof_load_backend_library ( const gchar *  directory,
const gchar *  filename,
const gchar *  init_fcn 
)

Load a QOF-compatible backend shared library.

Parameters
directoryCan be NULL if filename is a complete path.
filenameName of the .la file that describes the shared library. This provides platform independence, courtesy of libtool.
init_fcnThe QofBackendProvider init function.
Returns
FALSE in case or error, otherwise TRUE.

Definition at line 431 of file qofbackend.c.

433 {
434  gchar *fullpath;
435  typedef void (*backend_init) (void);
436  GModule *backend;
437  backend_init gmod_init;
438  gpointer g;
439 
440  g_return_val_if_fail (g_module_supported (), FALSE);
441  fullpath = g_module_build_path (directory, filename);
442  backend = g_module_open (fullpath, G_MODULE_BIND_LAZY);
443  if (!backend)
444  {
445  PERR (" No backend found. %s", g_module_error ());
446  return FALSE;
447  }
448  g = &gmod_init;
449  if (!g_module_symbol (backend, init_fcn, g))
450  {
451  PERR (" Backend did not initialise. %s", g_module_error ());
452  return FALSE;
453  }
454  g_module_make_resident (backend);
455  gmod_init ();
456  g_free (fullpath);
457  return TRUE;
458 }