GnuCash
5.6-150-g038405b370+
|
The QOF Backend is a pseudo-object providing an interface between the engine and a persistent data store (e.g. More...
Files | |
file | qofbackend.h |
API for data storage Backend. | |
file | qofsession.h |
Encapsulates a connection to a backend (persistent store) | |
Macros | |
#define | QOF_MOD_BACKEND "qof.backend" |
#define | QOF_MOD_SESSION "qof.session" |
Typedefs | |
typedef void(* | QofBePercentageFunc) (const char *message, double percent) |
DOCUMENT ME! | |
typedef void(* | QofPercentageFunc) (const char *message, double percent) |
The qof_session_load() method causes the QofBook to be made ready to to use with this URL/datastore. More... | |
Functions | |
QofBackendError | qof_backend_get_error (QofBackend *) |
Get the last backend error. More... | |
void | qof_backend_set_error (QofBackend *, QofBackendError) |
Set the error on the specified QofBackend. More... | |
gboolean | qof_backend_can_rollback (QofBackend *) |
void | qof_backend_rollback_instance (QofBackend *, QofInstance *) |
gboolean | qof_load_backend_library (const gchar *directory, const gchar *module_name) |
Load a QOF-compatible backend shared library. More... | |
void | qof_finalize_backend_libraries (void) |
Finalize all loaded backend shareable libraries. More... | |
QofBackend * | qof_book_get_backend (const QofBook *book) |
Retrieve the backend used by this book. | |
void | qof_book_set_backend (QofBook *book, QofBackend *) |
QofSession * | qof_session_new (QofBook *book) |
void | qof_session_destroy (QofSession *session) |
void | qof_session_swap_data (QofSession *session_1, QofSession *session_2) |
The qof_session_swap_data () method swaps the book of the two given sessions. More... | |
void | qof_session_begin (QofSession *session, const char *new_uri, SessionOpenMode mode) |
Begins a new session. More... | |
void | qof_session_load (QofSession *session, QofPercentageFunc percentage_func) |
QofBook * | qof_session_get_book (const QofSession *session) |
Returns the QofBook of this session. More... | |
const char * | qof_session_get_file_path (const QofSession *session) |
The qof_session_get_file_path() routine returns the fully-qualified file path for the session. More... | |
const char * | qof_session_get_url (const QofSession *session) |
gboolean | qof_session_save_in_progress (const QofSession *session) |
The qof_session_not_saved() subroutine will return TRUE if any data in the session hasn't been saved to long-term storage. | |
QofBackend * | qof_session_get_backend (const QofSession *session) |
Returns the qof session's backend. | |
void | qof_session_save (QofSession *session, QofPercentageFunc percentage_func) |
The qof_session_save() method will commit all changes that have been made to the session. More... | |
void | qof_session_safe_save (QofSession *session, QofPercentageFunc percentage_func) |
A special version of save used in the sql backend which moves the existing tables aside, then saves everything to new tables, then deletes the old tables after the save is completed without error. More... | |
void | qof_session_end (QofSession *session) |
The qof_session_end() method will release the session lock. More... | |
Session Errors | |
QofBackendError | qof_session_get_error (QofSession *session) |
The qof_session_get_error() routine can be used to obtain the reason for any failure. More... | |
const char * | qof_session_get_error_message (const QofSession *session) |
QofBackendError | qof_session_pop_error (QofSession *session) |
The qof_session_pop_error() routine can be used to obtain the reason for any failure. More... | |
The QOF Backend is a pseudo-object providing an interface between the engine and a persistent data store (e.g.
The QOF Session encapsulates a connection to a storage backend.
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.
That is, it manages the connection to a persistent data store; whereas the backend is the thing that performs the actual datastore access.
This class provides several important services:
1) It resolves and loads the appropriate backend, based on the URL.
2) It reports backend errors (e.g. network errors, storage corruption errors) through a single, backend-independent API.
3) It reports non-error events received from the backend.
4) It helps manage global dataset locks. For example, for the file backend, the lock prevents multiple users from editing the same file at the same time, thus avoiding lost data due to race conditions. Thus, an open session implies that the associated file is locked.
5) Misc utilities, such as a search path for the file to be edited, and/or other URL resolution utilities. This should simplify install & maintenance problems for naive users who may not have a good grasp on what a file system is, or where they want to keep their data files.
6) In the future, this class is probably a good place to manage a portion of the user authentication process, and hold user credentials/cookies/keys/tokens. This is because at the coarsest level, authorization can happen at the datastore level: i.e. does this user even have the authority to connect to and open this datastore?
A brief note about books & sessions: A book encapsulates the datasets manipulated by QOF. A book holds the actual data. By contrast, the session mediates the connection between a book (the thing that lives in virtual memory in the local process) and the datastore (the place where book data lives permanently, e.g., file, database).
In the current design, a session may hold multiple books. For now, exactly what this means is somewhat vague, and code in various places makes some implicit assumptions: first, only one book is 'current' and open for editing. Next, its assumed that all of the books in a session are related in some way. i.e. that they are all earlier accounting periods of the currently open book. In particular, the backends probably make that assumption, in order to store the different accounting periods in a clump so that one can be found, given another.
If you want multiple books that are unrelated to each other, use multiple sessions.
The session now calls QofBackendProvider->check_data_type to check that the incoming path contains data that the backend provider can open. The backend provider should also check if it can contact it's storage media (disk, network, server, etc.) and abort if it can't. Malformed file URL's would be handled the same way.
typedef void(* QofPercentageFunc) (const char *message, double percent) |
The qof_session_load() method causes the QofBook to be made ready to to use with this URL/datastore.
When the URL points at a file, then this routine would load the data from the file. With remote backends, e.g. network or SQL, this would load only enough data to make the book actually usable; it would not cause all of the data to be loaded.
XXX the current design tries to accommodate multiple calls to 'load' for each session, each time wiping out the old books; this seems wrong to me, and should be restricted to allow only one load per session.
Definition at line 199 of file qofsession.h.
enum QofBackendError |
The errors that can be reported to the GUI & other front-end users.
Definition at line 57 of file qofbackend.h.
enum SessionOpenMode |
Mode for opening sessions.
Definition at line 120 of file qofsession.h.
QofBackendError qof_backend_get_error | ( | QofBackend * | ) |
Get the last backend error.
Definition at line 144 of file qof-backend.cpp.
void qof_backend_set_error | ( | QofBackend * | , |
QofBackendError | |||
) |
Set the error on the specified QofBackend.
Definition at line 151 of file qof-backend.cpp.
void qof_finalize_backend_libraries | ( | void | ) |
Finalize all loaded backend shareable libraries.
Definition at line 178 of file qof-backend.cpp.
gboolean qof_load_backend_library | ( | const gchar * | directory, |
const gchar * | module_name | ||
) |
Load a QOF-compatible backend shared library.
directory | Can be NULL if filename is a complete path. |
module_name | Name of the .la file that describes the shared library. This provides platform independence, courtesy of libtool. |
void qof_session_begin | ( | QofSession * | session, |
const char * | new_uri, | ||
SessionOpenMode | mode | ||
) |
Begins a new session.
session | Newly-allocated with qof_session_new. |
uri | must be a string in the form of a URI/URL. The access method specified depends on the loaded backends. Paths may be relative or absolute. If the path is relative, that is if the argument is "file://somefile.xml", then the current working directory is assumed. Customized backends can choose to search other application-specific directories or URI schemes as well. |
mode | The SessionOpenMode. |
SESSION_NORMAL_OPEN
: Find an existing file or database at the provided uri and open it if it is unlocked. If it is locked post a QOF_BACKEND_LOCKED error. SESSION_NEW_STORE
: Check for an existing file or database at the provided uri and if none is found, create it. If the file or database exists post a QOF_BACKED_STORE_EXISTS and return. SESSION_NEW_OVERWRITE
: Create a new file or database at the provided uri, deleting any existing file or database. SESSION_READ_ONLY
: Find an existing file or database and open it without disturbing the lock if it exists or setting one if not. This will also set a flag on the book that will prevent many elements from being edited and will prevent the backend from saving any edits. SESSION_BREAK_LOCK
: Find an existing file or database, lock it, and open it. If there is already a lock replace it with a new one for this session.ERROR_BACKEND_NONE
to determine that the session began successfully. Definition at line 610 of file qofsession.cpp.
void qof_session_end | ( | QofSession * | session | ) |
The qof_session_end() method will release the session lock.
For the file backend, it will not save the data to a file. Thus, this method acts as an "abort" or "rollback" primitive. However, for other backends, such as the sql backend, the data would have been written out before this, and so this routines wouldn't roll-back anything; it would just shut the connection.
Definition at line 647 of file qofsession.cpp.
QofBook* qof_session_get_book | ( | const QofSession * | session | ) |
Returns the QofBook of this session.
Definition at line 574 of file qofsession.cpp.
QofBackendError qof_session_get_error | ( | QofSession * | session | ) |
The qof_session_get_error() routine can be used to obtain the reason for any failure.
Calling this routine returns the current error.
Definition at line 728 of file qofsession.cpp.
const char* qof_session_get_file_path | ( | const QofSession * | session | ) |
The qof_session_get_file_path() routine returns the fully-qualified file path for the session.
That is, if a relative or partial filename was for the session, then it had to have been fully resolved to open the session. This routine returns the result of this resolution. The path is always guaranteed to reside in the local file system, even if the session itself was opened as a URL. (currently, the filepath is derived from the url by substituting commas for slashes).
The qof_session_get_url() routine returns the url that was opened. URL's for local files take the form of file:/some/where/some/file.gml
Definition at line 581 of file qofsession.cpp.
QofBackendError qof_session_pop_error | ( | QofSession * | session | ) |
The qof_session_pop_error() routine can be used to obtain the reason for any failure.
Calling this routine resets the error value.
This routine allows an implementation of multiple error values, e.g. in a stack, where this routine pops the top value. The current implementation has a stack that is one-deep.
See qofbackend.h for a listing of returned errors.
Definition at line 567 of file qofsession.cpp.
void qof_session_safe_save | ( | QofSession * | session, |
QofPercentageFunc | percentage_func | ||
) |
A special version of save used in the sql backend which moves the existing tables aside, then saves everything to new tables, then deletes the old tables after the save is completed without error.
If there are errors, it removes the old tables and renames the new tables back.
Definition at line 633 of file qofsession.cpp.
void qof_session_save | ( | QofSession * | session, |
QofPercentageFunc | percentage_func | ||
) |
The qof_session_save() method will commit all changes that have been made to the session.
For the file backend, this is nothing more than a write to the file of the current Accounts & etc. For the SQL backend, this is typically a no-op (since all data has already been written out to the database.
Definition at line 625 of file qofsession.cpp.
void qof_session_swap_data | ( | QofSession * | session_1, |
QofSession * | session_2 | ||
) |
The qof_session_swap_data () method swaps the book of the two given sessions.
It is useful for 'Save As' type functionality.
Definition at line 654 of file qofsession.cpp.