gnucash/libgnucash/doc/design/engine.texi
Geert Janssens 83d14e1c1c Restructure the src directory
It is split into
- /libgnucash (for the non-gui bits)
- /gnucash (for the gui)
- /common (misc source files used by both)
- /bindings (currently only holds python bindings)

This is the first step in restructuring the code. It will need much
more fine tuning later on.
2017-08-10 18:45:00 +02:00

2827 lines
101 KiB
Plaintext

@node Engine, Component Manager, Top Level, Top
@chapter Engine
@cindex The Engine
@strong{This whole document is completely outdated. Don't read this. All
function names and every described structure has changed
completely. Only read this if you want to know how gnucash looked like
in 1999. This is completely outdated!}
The Engine provides an interface to a financial engine with three basic
financial entities: Accounts, Transactions (known as Journal Entries in
accounting practice), and Splits (known as Ledger Entries). These three
entities are the central data structures of the GnuCash financial data
model.
In addition, the Engine provides the abstraction of Account Groups
(collections of related accounts) and GNCBooks. A GNCBook abstracts both
a set of related GnuCash data (financial entities plus additional
information such as budgets, per-file preferences, etc.) plus a
file-editing session allowing transparent support for locking and
implementation with other backends such as SQL.
The Engine code contains no GUI code whatsoever and is designed to
be created as a shared library for use by other programs.
@menu
* Engine Introduction::
* Using and Extending the Engine API::
* Globally Unique Identifiers::
* Numeric Library::
* Key-Value Pair Frames::
* Events::
* Commodities::
* Commodity Tables::
* Prices::
* Price Databases::
* Splits::
* Transactions::
* Accounts::
* Account Groups::
* GNCBooks::
* Scrub::
@end menu
@node Engine Introduction, Using and Extending the Engine API, Engine, Engine
@section Introduction
Splits (@pxref{Splits}), or "Ledger Entries" are the fundamental
accounting units. Each Split consists of an amount (number of dollar
bills, number of shares, etc.), the value of that amount expressed in
a (possibly) different currency than the amount, a Memo, a pointer to
the parent Transaction, a pointer to the debited Account, a reconciled
flag and timestamp, an "Action" field, and a key-value frame which can
store arbitrary data (@pxref{Key-Value Pair Frames}).
Transactions (@pxref{Transactions}) embody the notion of "double entry"
accounting. A Transaction consists of a date, a description, an ID number, a
list of one or more Splits, and a key-value frame. The transaction
also specifies the currency with which all of the splits will be
valued. When double-entry rules are enforced, the total value of
the splits are zero. If there are only two splits,
then the value of one must be positive, the other negative: this denotes
that one account is debited, and another is credited by an equal
amount. By forcing the value of the splits to always 'add up' to
zero, we can gaurentee that the balances of the accounts are always
correctly balanced.
The engine does not enforce double-entry accounting, but provides an API
to enable user-code to find unbalanced transactions and 'repair' them so
that they are in balance. @xref{Scrub}.
Note the sum of the values of Splits in a Transaction is always computed
with respect to a currency; thus splits can be balanced even when they
are in different currencies, as long as they share a common currency.
This feature allows currency-trading accounts to be established.
Every Split must point to its parent Transaction, and that Transaction
must in turn include that Split in the Transaction's list of Splits. A
Split can belong to at most one Transaction. These relationships are
enforced by the engine. The engine user cannnot accidentally destroy
this relationship as long as they stick to using the API and never
access internal structures directly.
Splits are grouped into Accounts (@pxref{Accounts}) which are also known
as "Ledgers" in accounting practice. Each Account consists of a list of
Splits that debit that Account. To ensure consistency, if a Split points
to an Account, then the Account must point to the Split, and vice-versa.
A Split can belong to at most one Account. Besides merely containing a
list of Splits, the Account structure also give the Account a name, a
code number, description and notes fields, a key-value frame, a pointer
to the commodity that is used for all splits in this account. The
commodity can be the name of anything traded and tradable: a stock
(e.g. "IBM", "McDonald's"), a currency (e.g. "USD", "GBP"), or
anything added to the commodity table.
Accounts can be arranged in a hierarchical tree. The nodes of the tree
are called "Account Groups" (@pxref{Account Groups}). By accounting
convention, the value of an Account is equal to the value of all of its
Splits plus the value of all of its sub-Accounts.
@node Using and Extending the Engine API, Globally Unique Identifiers, Engine Introduction, Engine
@section Using and Extending the Engine API
Engine API calls are named using a specific convention. For example,
the function to access the Memo field of a Split is
@code{xaccSplitGetMemo}. The prefix @code{xacc} comes
first@footnote{The @code{xacc} prefix is a historical artifact. GnuCash
was derived from X-Accountant by Robin Clark.}, followed by the name of
the entity for which the API call applies (@code{Split}), followed by
the action performed by the call (@code{Get}), followed by the name of
the field being accessed (@code{Memo}). Future API calls should conform
to this naming convention.
The formal arguments to Engine API calls always begin with the entity to
which the call applies. Thus, the arguments to @code{xaccSplitSetMemo}
are the @code{Split} pointer followed by the pointer to a memo
string. Future API calls should also conform to this convention.
Engine API calls should be implemented to behave as gracefully as
possible with unexpected input. Specifically, public API calls should
gracefully handle @code{NULL} pointer arguments. User code should be
able to handle @code{NULL} return values from Engine calls as well.
@node Globally Unique Identifiers, Numeric Library, Using and Extending the Engine API, Engine
@section Globally Unique Identifiers
@cindex Globally Unique Identifier
@tindex GUID
It is common for Engine structures to reference other Engine structures.
For example, an Account must reference its Splits, its parent Account
Group, and its child Account Group. Furthermore, other GnuCash modules
may need to reference Engine structures. For example, a GUI
implementation may wish to save a list of Accounts which the user has
open when the application exits in order to restore that same state upon
the next invocation.
One way to uniquely identify an Engine structure, at least while the
program is running, is using the C pointer which points to the
structure. C pointers have the advantage of speed, but also have some
disadvantages:
@itemize
@item
Pointers cannot be used in data files and are not persistent across
different program invocations.
@item
When an entity is destroyed, every other structure which references that
entity through a direct pointer must be immediately updated to prevent
illegal accesses.
@end itemize
The @dfn{GUID} (Globally Unique Identifier) provides a way to reference
Engine structures that is more flexible than C pointers. Each Engine
structure has an associated GUID which can be used to reference that
structure. Engine GUIDs have the following features:
@itemize
@item
The GUID is permanent, i.e., it persists between invocations of GnuCash.
@item
The GUID is guaranteed to be unique with the set of all Splits,
Transactions, and Accounts in the hierarchy of which the structure
is a member.
@item
With very high probability, the GUID is unique among all GUIDs
created by any invocation of GnuCash, all over the world.
@item
GUIDs can be efficiently encoded in a string representation.
@end itemize
@menu
* When to use GUIDs::
* GUID Types::
* How to use GUIDs::
* GUIDs and GnuCash Entities::
* The GUID Generator::
@end menu
@node When to use GUIDs, GUID Types, Globally Unique Identifiers, Globally Unique Identifiers
@subsection When to use GUIDs
@cindex When to use GUIDs
Although GUIDs are very flexible, the engine structures like Accounts
will probably continue to use C pointers for the foreseeable future,
since they are much faster (and in certain respects more convenient)
than using GUIDs. In general, however, it is much safer to use GUIDs.
In particular, you should consider using GUIDs if any of the following
is true:
@itemize
@item
You need to save a reference to an engine structure in a file.
@item
You need to save a reference to an engine structure that could
be deleted in between accesses to the saved reference.
@end itemize
@node GUID Types, How to use GUIDs, When to use GUIDs, Globally Unique Identifiers
@subsection GUID Types
@tindex GNCIdType
The GUIDs in GnuCash are typed using the enum @code{GNCIdType}.
Possible values and their meanings for GUID types are:
@table @code
@item GNC_ID_NONE
The GUID does not currently refer to a GnuCash entity, though it
could refer to one in the future.
@item GNC_ID_NULL
The GUID does not, and never will, refer to a GnuCash entity.
@item GNC_ID_ACCOUNT
The GUID refers to an Account (@pxref{Accounts}).
@item GNC_ID_TRANS
The GUID refers to a Transation (@pxref{Transactions}).
@item GNC_ID_SPLIT
The GUID refers to a Split (@pxref{Splits}).
@end table
@deftypefun GNCIdType xaccGUIDType (const GUID * @var{guid})
Return the type associated with @var{guid}.
@end deftypefun
@deftypefun {const GUID *} xaccGUIDNull (void)
Return a GUID which is guaranteed to always have type @code{GNC_ID_NULL}.
@end deftypefun
@node How to use GUIDs, GUIDs and GnuCash Entities, GUID Types, Globally Unique Identifiers
@subsection How to use GUIDs
The Engine API functions which access the GUID for a specific entity
return a pointer to the GUID. NOTE: Do not store the pointer
itself! Instead, store a copy of the GUID. Storing the pointer itself
would present some of the same problems as using the account pointer
directly. Example:
@example
@{
GUID saved_guid;
Account *account;
account = < something to get an Account pointer >
saved_guid = *xaccAccountGetGUID(account);
...
account = xaccAccountLookup(&saved_guid);
...
@}
@end example
You can compare two GUIDs with the following functions.
@deftypefun gboolean guid_equal (const GUID * @var{guid_1}, const GUID * @var{guid_2})
Compare two guids and return TRUE if they are both non-NULL and equal.
@end deftypefun
@deftypefun gint guid_compare (const GUID * @var{g1}, const GUID * @var{g2})
Return the @code{memcmp} of the two GUID's.
@end deftypefun
You can encode and decode GUIDs and their string representations using the
next two functions.
@deftypefun {gchar *} guid_to_string (const GUID * @var{guid})
Return a null-terminated string encoding of @var{guid}. String encodings
of identifiers are hex numbers printed only with the characters @code{0}
through @code{9} and @code{a} through @code{f}. The encoding will
always be @code{GUID_ENCODING_LENGTH} characters long. The returned
string must be freed when no longer needed using g_free.
@end deftypefun
@deftypefun {char *} guid_to_string_buff (const GUID * @var{guid}, char * @var{buff})
This routine does the same work as @code{guid_to_string}, except that the
string is written into the memory pointed at by @var{buff}. The
buffer must be at least GUID_ENCODING_LENGTH+1 characters long.
This routine is handy for avoiding a malloc/free cycle.
It returns a pointer to the @emph{end} of what was written.
(i.e. it can be used like @code{stpcpy} during string concatenation)
@end deftypefun
@deftypefun gboolean string_to_guid (const char * @var{string}, GUID * @var{guid})
Given a string, decode an id into @var{guid} if @var{guid} is
non-NULL. The function returns TRUE if the string was a valid 32
character hexadecimal number. This function accepts both upper and lower
case hex digits. If the return value is FALSE, the effect on @var{guid}
is undefined.
@end deftypefun
You can allocate and deallocate space for GUIDs using standard
memory routines. However, if your code is allocating and deallocating
lots of GUID objects, then the next two functions should be used.
@deftypefun {GUID *} xaccGUIDMalloc (void)
Return newly allocated memory for a GUID object. The memory must
be freed with @code{xaccGUIDFree}. In general, this function is
faster than using the standard libc allocators.
@end deftypefun
@deftypefun void xaccGUIDFree (GUID * @var{guid})
Free the space for a GUID that was allocated with @code{xaccGUIDMalloc}.
@end deftypefun
You can use the following two functions to aid in using GUIDS in hash
tables.
@deftypefun guint guid_hash_to_guint (gconstpointer @var{ptr})
Return a hash value suitable for use with a @code{GHashTable}.
@var{ptr} must point to a GUID.
@end deftypefun
@deftypefun {GHashTable *} guid_hash_table_new (void)
Return a new @code{GHashTable} which uses GUIDs as keys.
@end deftypefun
@node GUIDs and GnuCash Entities, The GUID Generator, How to use GUIDs, Globally Unique Identifiers
@subsection GUIDs and GnuCash Entities
This section documents a low-level API for associating entities with
GUIDs. User code and general engine code should not use this API;
instead use the API documented in the sections for the specific GnuCash
entities such as Accounts and Transactions.
@deftypefun void xaccGUIDNew (GUID * @var{guid})
Generate a new guid. This function is guaranteed to return a guid that
is unique within the scope of all GnuCash entities being managed by the
the current invocation of GnuCash. GnuCash routines should always use
this function and not @code{guid_replace}!
@end deftypefun
@deftypefun {void *} xaccLookupEntity (const GUID * @var{guid}, GNCIdType @var{entity_type})
Lookup an entity given an id and a type. If there is no entity
associated with the id, or if it has a different type, NULL is returned.
@end deftypefun
@deftypefun void xaccStoreEntity (void * @var{entity}, const GUID * @var{guid}, GNCIdType entity_type)
Store the given entity under the given id with the given type.
@end deftypefun
@deftypefun void xaccRemoveEntity (const GUID * @var{guid})
Remove any existing association between an entity and the given id. The
entity is not changed in any way.
@end deftypefun
@node The GUID Generator, , GUIDs and GnuCash Entities, Globally Unique Identifiers
@subsection The GUID Generator
@cindex The GUID Generator
GUIDs are created by the GUID generator. The API for this generator is
low-level and should not be used by user-code.
@deftypefun void guid_replace (GUID * @var{guid})
Create a new GUID and store it in @var{guid}. This is a low-level function!
GnuCash code should use @code{xaccGUIDNew}.
@end deftypefun
@node Numeric Library, Key-Value Pair Frames, Globally Unique Identifiers, Engine
@section Numeric Library
@cindex Numeric Library
@tindex gnc_numeric
=============== The documentation below for gnc_numeric is obsolete
and has been superseded by the gnc_numeric docs in the header file.
=========================================
Financial quantities in GnuCash (Split quantities and values) are stored
as exact quantities measured in the smallest denominational unit of the
appropriate currency. For example, 100.50 US Dollars would be stored as
(10050 / 100) US Dollars. GnuCash uses the @code{gnc_numeric} datatype
to store financial quantities.
The @code{gnc_numeric} API provides data types and functions for
manipulating exact numeric quantities. While the @code{gnc_numeric}
library was developed to represent and operate on exact financial
quantities in GnuCash, the library is also (hopefully) suitable for use
in any application where exact numeric representation for rational
numbers is needed.
A @code{gnc_numeric} value represents a number in rational form, with a
64-bit @code{long long} integer as numerator and denominator. If more
precision, a higher-precision representation of irrational numbers, or a
wider dynamic range is needed, a floating point format may be
appropriate. There are reasonable rational approximations to common
irrational constants (@pxref{Numeric Example}), but the transcendental
functions have not been implemented for @code{gnc_numeric} objects.
@menu
* Standard Numeric Arguments::
* Creating Numeric Objects::
* Basic Arithmetic Operations::
* Numeric Comparisons and Predicates::
* Numeric Denominator Conversion::
* Numeric Floating Point Conversion::
* Numeric String Conversion::
* Numeric Error Handling ::
* Numeric Example::
@end menu
@node Standard Numeric Arguments, Creating Numeric Objects, Numeric Library, Numeric Library
@subsection Standard Numeric Arguments
@cindex Standard Numeric Arguments
=============== The documentation below for gnc_numeric is obsolete
and has been superseded by the gnc_numeric docs in the header file.
=========================================
It is useful to specify a denominator in cases where it is known that
the output value is of constrained precision. For example, monetary
transactions must be executed in an integer number of the "smallest
currency unit" of the transaction. In US Dollars, the smallest currency
unit is the cent, and all monetary transactions must be done in units of
cents. Therefore, any fractional cents in a computed price must be
rounded away.
Most of the @code{gnc_numeric} arithmetic functions take two arguments
in addition to their numeric args: @var{denom}, which is the denominator
to use in the output @code{gnc_numeric object}, and @var{how}, which
describes how the arithmetic result is to be converted to that
denominator. This combination of output denominator and rounding policy
allows the results of financial and other exact computations to be
properly rounded to the appropriate units.
Valid values for @var{denom} are:
@table @code
@item n (positive int)
Use the number @code{n} as the denominator of the output value.
@item GNC_DENOM_RECIPROCAL (n)
Use the value @code{1/n} as the denominator of the output value.
@item GNC_DENOM_AUTO
Compute an appropriate denominator automatically. Flags in the @var{how}
argument will specify how to compute the denominator.
@end table
Valid values for @var{how} are bitwise combinations of zero or one
"rounding instructions" with zero or one "denominator types".
Rounding instructions control how fractional parts in the specified
denominator affect the result. For example, if a computed result is
"3/4" but the specified denominator for the return value is 2, should
the return value be "1/2" or "2/2"?
Possible rounding instructions are:
@table @code
@item GNC_RND_FLOOR
Round toward -infinity
@item GNC_RND_CEIL
Round toward +infinity
@item GNC_RND_TRUNC
Truncate fractions (round toward zero)
@item GNC_RND_PROMOTE
Promote fractions (round away from zero)
@item GNC_RND_ROUND
Use unbiased ("banker's") rounding. This rounds to the nearest integer,
and to the nearest even integer when there are two equidistant nearest
integers. This is generally the one you should use for financial
quantities.
@item GNC_RND_ROUND_HALF_UP
Round to the nearest integer, rounding away from zero when there are two
equidistant nearest integers.
@item GNC_RND_ROUND_HALF_DOWN
Round to the nearest integer, rounding toward zero when there are two
equidistant nearest integers.
@item GNC_RND_NEVER
Never round at all, and signal an error if there is a fractional result
in a computation.
@end table
The denominator type specifies how to compute a denominator if
@code{GNC_DENOM_AUTO} is specified as the @var{denom}. Valid denominator
types are:
@table @code
@item GNC_DENOM_EXACT
Use any denominator which gives an exactly correct ratio of numerator to
denominator. Use EXACT when you do not wish to lose any information in
the result but also do not want to spend any time finding the "best"
denominator.
@item GNC_DENOM_REDUCE
Reduce the result value by common factor elimination, using the smallest
possible value for the denominator that keeps the correct ratio. The
numerator and denominator of the result are relatively prime. This can
be computationally expensive for large fractions.
@item GNC_DENOM_LCD
Find the least common multiple of the arguments' denominators and use
that as the denominator of the result.
@item GNC_DENOM_FIXED
All arguments are required to have the same denominator, that
denominator is to be used in the output, and an error is to be signaled
if any argument has a different denominator.
@item GNC_DENOM_SIGFIG
Round to the number of significant figures given in the rounding
instructions by the GNC_DENOM_SIGFIGS () macro.
@item GNC_DENOM_SIGFIGS (n)
Use a value for the denominator that will keep at least @code{n}
significant figures in the result.
@end table
To use traditional rational-number operational semantics (all results
are exact and are reduced to relatively-prime fractions) pass the
argument @code{GNC_DENOM_AUTO} as @var{denom} and @code{GNC_DENOM_REDUCE
| GNC_RND_NEVER} as @var{how}.
To enforce strict financial semantics (such that all operands must have
the same denominator as each other and as the result), use
@var{GNC_DENOM_AUTO} as @var{denom} and @code{GNC_DENOM_FIXED |
GNC_RND_NEVER} as @var{how}.
@node Creating Numeric Objects, Basic Arithmetic Operations, Standard Numeric Arguments, Numeric Library
=============== The documentation below for gnc_numeric is obsolete
and has been superseded by the gnc_numeric docs in the header file.
=========================================
@subsection Creating Numeric Objects
@cindex Creating Numeric Objects
@deftypefun gnc_numeric gnc_numeric_create (int @var{num}, int @var{denom})
Create a @code{gnc_numeric} object with a value of "@var{num} / @var{denom}".
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_zero ()
Create a @code{gnc_numeric} object with a value of 0.
@end deftypefun
@node Basic Arithmetic Operations, Numeric Comparisons and Predicates, Creating Numeric Objects, Numeric Library
@subsection Basic Arithmetic Operations
@cindex Basic Arithmetic Operations
See @ref{Standard Numeric Arguments} for a description of the @var{denom}
and @var{how} arguments to each arithmetic function.
@deftypefun gnc_numeric gnc_numeric_add (gnc_numeric @var{a}, gnc_numeric @var{b}, gint64 @var{denom}, gint @var{how})
Return the sum of @var{a} and @var{b}.
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_sub (gnc_numeric @var{a}, gnc_numeric @var{b}, gint64 @var{denom}, gint @var{how})
Return "@var{a} - @var{b}".
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_mul (gnc_numeric @var{a}, gnc_numeric @var{b}, gint64 @var{denom}, gint @var{how})
Return the product of @var{a} and @var{b}.
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_div (gnc_numeric @var{a}, gnc_numeric @var{b}, gint64 @var{denom}, gint @var{how})
Return "@var{a} / @var{b}".
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_neg (gnc_numeric @var{a})
Return "-@var{a}".
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_abs (gnc_numeric @var{a})
Return the absolute value of @var{a}.
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_add_fixed (gnc_numeric @var{a}, gnc_numeric @var{b})
Equivalent to @code{gnc_numeric_add} on @var{a} and @var{b} with
@code{GNC_DENOM_AUTO} for @var{denom} and @code{GNC_DENOM_FIXED |
GNC_RND_NEVER} for @var{how}.
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_sub_fixed (gnc_numeric @var{a}, gnc_numeric @var{b})
Equivalent to @code{gnc_numeric_sub} on @var{a} and @var{b} with
@code{GNC_DENOM_AUTO} for @var{denom} and @code{GNC_DENOM_FIXED |
GNC_RND_NEVER} for @var{how}.
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_add_with_error (gnc_numeric @var{a}, gnc_numeric @var{b}, gint64 @var{denom}, gint @var{how}, {gnc_numeric *} @var{error})
The same as @code{gnc_numeric_add}, but uses @var{error} for accumulating
conversion roundoff error.
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_sub_with_error (gnc_numeric @var{a}, gnc_numeric @var{b}, gint64 @var{denom}, gint @var{how}, {gnc_numeric *} @var{error})
The same as @code{gnc_numeric_sub}, but uses @var{error} for accumulating
conversion roundoff error.
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_mul_with_error (gnc_numeric @var{a}, gnc_numeric @var{b}, gint64 @var{denom}, gint @var{how}, {gnc_numeric *} @var{error})
The same as @code{gnc_numeric_mul}, but uses @var{error} for accumulating
conversion roundoff error.
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_div_with_error (gnc_numeric @var{a}, gnc_numeric @var{b}, gint64 @var{denom}, gint @var{how}, {gnc_numeric *} @var{error})
The same as @code{gnc_numeric_div}, but uses @var{error} for accumulating
conversion roundoff error.
@end deftypefun
@node Numeric Comparisons and Predicates, Numeric Denominator Conversion, Basic Arithmetic Operations, Numeric Library
@subsection Numeric Comparisons and Predicates
@cindex Numeric Comparisons and Predicates
@deftypefun int gnc_numeric_zero_p (gnc_numeric @var{a})
Returns 1 if @code{@var{a} == 0}, otherwise returns 0.
@end deftypefun
@deftypefun int gnc_numeric_positive_p (gnc_numeric @var{a})
Returns 1 if @code{@var{a} > 0}, otherwise returns 0.
@end deftypefun
@deftypefun int gnc_numeric_negative_p (gnc_numeric @var{a})
Returns 1 if @code{@var{a} < 0}, otherwise returns 0.
@end deftypefun
@deftypefun int gnc_numeric_compare (gnc_numeric @var{a}, gnc_numeric @var{b})
Returns +1 if @code{@var{a} > @var{b}}, -1 if @code{@var{b} > @var{a}}, 0 if @code{@var{a} == @var{b}}.
@end deftypefun
@deftypefun int gnc_numeric_eq (gnc_numeric @var{a}, gnc_numeric @var{b})
Returns 1 if @code{numerator(@var{a}) == numerator(@var{b})} and
@code{denominator(@var{a}) == denominator(@var{b})}, otherwise returns 0.
@end deftypefun
@deftypefun int gnc_numeric_equal (gnc_numeric @var{a}, gnc_numeric @var{b})
Returns 1 if the fraction represented by @var{a} is equal to the fraction
represented by @var{b}, otherwise returns 0.
@end deftypefun
@deftypefun int gnc_numeric_same (gnc_numeric @var{a}, gnc_numeric @var{b}, gint64 @var{denom}, gint @var{how})
Convert both @var{a} and @var{b} to @var{denom} (@pxref{Standard Numeric
Arguments} and compare numerators of the result.
@example
For example, if @code{@var{a} == 7/16} and @code{@var{b} == 3/4},
@code{gnc_numeric_same(@var{a}, @var{b}, 2, GNC_RND_TRUNC) == 1}
because both 7/16 and 3/4 round to 1/2 under truncation. However,
@code{gnc_numeric_same(@var{a}, @var{b}, 2, GNC_RND_ROUND) == 0}
because 7/16 rounds to 1/2 under unbiased rounding but 3/4 rounds
to 2/2.
@end example
@end deftypefun
@node Numeric Denominator Conversion, Numeric Floating Point Conversion, Numeric Comparisons and Predicates, Numeric Library
=============== The documentation below for gnc_numeric is obsolete
and has been superseded by the gnc_numeric docs in the header file.
=========================================
@subsection Numeric Denominator Conversion
@cindex Numeric Denominator Conversion
@deftypefun gnc_numeric gnc_numeric_convert (gnc_numeric @var{in}, gint64 @var{denom}, gint @var{how})
Convert @var{in} to the specified denominator under standard arguments
@var{denom} and @var{how}. @xref{Standard Numeric Arguments}.
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_convert_with_error (gnc_numeric @var{in}, gint64 @var{denom}, gint @var{how}, {gnc_numeric *} @var{error})
Same as @code{gnc_numeric_convert}, but return a remainder value for
accumulating conversion error.
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_reduce (gnc_numeric @var{in})
Return @var{in} reduced by GCF reduction.
@end deftypefun
@node Numeric Floating Point Conversion, Numeric String Conversion, Numeric Denominator Conversion, Numeric Library
@subsection Numeric Floating Point Conversion
@cindex Numeric Floating Point Conversion
@deftypefun gnc_numeric double_to_gnc_numeric (double @var{arg}, gint64 @var{denom}, gint @var{how})
Convert a floating-point number to a @code{gnc_numeric}. Both @var{denom}
and @var{how} are used as in arithmetic, but @code{GNC_DENOM_AUTO} is
not recognized.
@end deftypefun
@deftypefun double gnc_numeric_to_double (gnc_numeric @var{arg})
Convert @var{arg} to a @code{double} value.
@end deftypefun
@node Numeric String Conversion, Numeric Error Handling , Numeric Floating Point Conversion, Numeric Library
@subsection Numeric String Conversion
@cindex Numeric String Conversion
@deftypefun {gchar *} gnc_numeric_to_string (gnc_numeric @var{n})
Return a string representation of @var{n}. The string must be
freed with @code{g_free}.
@end deftypefun
@deftypefun {const gchar *} string_to_gnc_numeric (const {gchar *} @var{str}, {gnc_numeric *} @var{n})
Read a @code{gnc_numeric} from @var{str}, skipping any leading
whitespace, and returning a pointer to just past the last byte
read. Return NULL on error.
@end deftypefun
@node Numeric Error Handling , Numeric Example, Numeric String Conversion, Numeric Library
@subsection Numeric Error Handling
@cindex Numeric Error Handling
@deftypefun int gnc_numeric_check (gnc_numeric @var{num})
Check @var{num} for the possibility that it is an error signal rather
than a proper value. Possible return codes are:
@table @code
@item GNC_ERROR_OK
No error condition
@item GNC_ERROR_ARG
An improper argument was passed to a function
@item GNC_ERROR_OVERFLOW
An overflow occurred while calculating a result
@item GNC_ERROR_DENOM_DIFF
@code{GNC_DENOM_FIXED} was specified, but argument denominators differed.
@item GNC_ERROR_REMAINDER
@code{GNC_RND_NEVER} was specified, but the result could not be
converted to the desired denominator without a remainder.
@end table
@end deftypefun
@deftypefun gnc_numeric gnc_numeric_error (int error_code)
Create a @code{gnc_numeric} object that signals the error condition
noted by @var{error_code} rather than a number.
@end deftypefun
@node Numeric Example, , Numeric Error Handling , Numeric Library
@subsection Numeric Example
@cindex Numeric Example
=============== The documentation below for gnc_numeric is obsolete
and has been superseded by the gnc_numeric docs in the header file.
=========================================
The following program finds the best @code{gnc_numeric} approximation to
the @file{math.h} constant @code{M_PI} given a maximum denominator. For
large denominators, the @code{gnc_numeric} approximation is accurate to
more decimal places than will generally be needed, but in some cases
this may not be good enough. For example,
@example
M_PI = 3.14159265358979323846
245850922 / 78256779 = 3.14159265358979311599 (16 sig figs)
3126535 / 995207 = 3.14159265358865047446 (12 sig figs)
355 / 113 = 3.14159292035398252096 (7 sig figs)
@end example
@example
#include <glib.h>
#include "gnc-numeric.h"
#include <math.h>
int
main(int argc, char ** argv)
@{
gnc_numeric approx, best;
double err, best_err=1.0;
double m_pi = M_PI;
gint64 denom;
gint64 max;
sscanf(argv[1], "%Ld", &max);
for (denom = 1; denom < max; denom++)
@{
approx = double_to_gnc_numeric (m_pi, denom, GNC_RND_ROUND);
err = m_pi - gnc_numeric_to_double (approx);
if (fabs (err) < fabs (best_err))
@{
best = approx;
best_err = err;
printf ("%Ld / %Ld = %.30f\n", gnc_numeric_num (best),
gnc_numeric_denom (best), gnc_numeric_to_double (best));
@}
@}
@}
@end example
@node Key-Value Pair Frames, Events, Numeric Library, Engine
@section Key-Value Pair Frames
@cindex Key-Value Pairs
The number and types of data items which are associated with the
financial abstractions (Accounts, Transactions, and Splits) can vary
widely. For example, an Account which represents a user's checking
account might need to store the bank name, a telephone number, and a
username for online banking purposes. Another Account representing the
user's ownership of a stock might need to store information about
retrieving price quotes online such as the ticker symbol and the
exchange.
To meet this need for varying data storage, the GnuCash accounting
entities use Key-Value Pair Frames (hereafter referred to as the
datatype @code{kvp_frame}). A @code{kvp_frame} is a set of associations
between character strings (keys) and @code{KvpValue} structures. A
@code{KvpValue} is a union with possible types enumerated in the
@code{kvp_value_t} enum which indicates the type of data stored in a
@code{KvpValue} object.
@menu
* Key-Value Policy::
* kvp_frame::
* KvpValue::
* kvp_list::
@end menu
@node Key-Value Policy, kvp_frame, Key-Value Pair Frames, Key-Value Pair Frames
@subsection Key-Value Policy
@cindex Key-Value Policy
This section defines the policy that programmers should follow
when using key-value pairs to store information. Because of the
large amount of information which can potentially be stored using
this mechanism, it is important to follow these guidelines so
that order will be maintained.
The following rules should be followed for using key-value pairs:
@itemize
@item
The document @file{src/engine/kvp_doc.txt} should be used to document the
use of keys and values. Please consult this document before planning any
use of new keys.
@item
Key strings should be in all lower case with the '-' character
separating words. If possible, use only alphanumeric characters and
'-'. Example: @code{bank-info}. Because the '/' character is useful for
describing keys in sub-frames (@code{bank-info/routing-number}), do not
use the '/' character in key names.
@item
Favor longer, descriptive key strings over short ones. Example:
@code{online-banking-info} is better than @code{onln-bnk}.
@item
Make use of the fact that frames can be stored in frames. If a group
of keys are used for a related purpose, consider storing them together
in a sub-frame.
@item
Values should generally not be accessed directly through keys, but
should rather be accessed through specific API calls. The API calls
do not necessarily need to part a part of the Engine API. For example,
the GUI would probably define keys that the Engine does not need to
know about.
@item
The same key should not be used for different engine structures (Accounts,
Transactions, Splits), unless the key's value has the same type and the
same basic purpose.
@end itemize
@node kvp_frame, KvpValue, Key-Value Policy, Key-Value Pair Frames
@subsection kvp_frame
@tindex kvp_frame
A @code{kvp_frame} is the datatype used to associate key strings with
@code{KvpValue} objects (@pxref{KvpValue}).
@deftypefun kvp_frame* kvp_frame_new (void)
Create and initialize a new @code{kvp_frame} object and return
a pointer to it.
@end deftypefun
@deftypefun void kvp_frame_delete (kvp_frame * @var{frame})
Free all memory associated with @var{frame}.
@end deftypefun
@deftypefun kvp_frame* kvp_frame_copy (const kvp_frame * frame)
Return a deep copy of @var{frame}.
@end deftypefun
@deftypefun void kvp_frame_set_slot (kvp_frame * @var{frame}, const char * @var{key}, const KvpValue * @var{value})
Associate @var{key} with @var{value} in @var{frame}.
@end deftypefun
@deftypefun void kvp_frame_set_slot_nc (kvp_frame * @var{frame}, const char * @var{key}, KvpValue * @var{value})
Same as @code{kvp_frame_set_slot}, except that @var{value} is used
directly, instead of being copied. This call transfers 'ownership'
of @var{value} to @var{frame}.
@end deftypefun
@deftypefun KvpValue* kvp_frame_get_slot (kvp_frame * @var{frame}, const char * @var{key})
Return the @code{KvpValue} object associated with @var{key}
in @var{frame} or return @code{NULL} if there is no association
for @var{key}. The value returned is not a copy.
@end deftypefun
@deftypefun void kvp_frame_set_slot_path (kvp_frame * @var{frame}, const KvpValue * @var{value}, const char * @var{first_key}, ...)
Associate @var{value} with the ``key path'' specified by the variable
argument list. Each key in the path except the last denotes a sub-frame
which is associated with the given key. The variable list must be
terminated with NULL.
@end deftypefun
@deftypefun void kvp_frame_set_slot_path_gslist (kvp_frame * @var{frame}, const KvpValue * @var{value}, GSList * @var{key_path})
The same as @code{kvp_frame_set_slot_path}, except that the key path is
specified using a GSList. All the keys in the list should be non-NULL.
@end deftypefun
@deftypefun {KvpValue *} kvp_frame_get_slot_path (kvp_frame * @var{frame}, const char * @var{first_key}, ...)
Return the value associated with the key path, or @code{NULL} if none.
The path is specified as in @code{kvp_frame_set_slot_path}.
@end deftypefun
@deftypefun {KvpValue *} kvp_frame_get_slot_path_gslist (kvp_frame * @var{frame}, GSList * @var{key_path})
Return the value associated with the key path, or @code{NULL} if none.
The path is specified as in @code{kvp_frame_set_slot_path_gslist}.
@end deftypefun
@deftypefun {kvp_frame *} kvp_frame_get_frame (kvp_frame * @var{frame}, ...)
Works like @code{kvp_frame_get_slot_path}, but returns the last frame
in the path. All the keys should refer to frames. If the frame path
does not exist, it is created.
@end deftypefun
@deftypefun {kvp_frame *} kvp_frame_get_frame_gslist (kvp_frame * @var{frame}, GSList * @var{key_path})
Works like @code{kvp_frame_get_slot_path_gslist}, but returns the last
frame in the path. All the keys should refer to frames. If the frame
path does not exist, it is created.
@end deftypefun
@deftypefun {kvp_frame *} kvp_frame_get_frame_slash (kvp_frame * @var{frame}, const char * @var{path})
Works like @code{kvp_frame_get_frame}, but the frame path is specified
as a single string where the keys are separated by slashes; thus, for
example: @code{/this/is/a/valid/path} and @code{///so//is////this/}.
Multiple slashes are compressed and a leading slash is optional. The
pointers @code{.} and @code{..} are @emph{not} followed/obeyed. (This
is arguably a bug that needs fixing).
@end deftypefun
@node KvpValue, kvp_list, kvp_frame, Key-Value Pair Frames
@subsection KvpValue
@tindex KvpValue
@tindex kvp_value_t
The @code{KvpValue} object stores the 'value' part of a key-value
association in a @code{kvp_frame} object.
@deftypefun void kvp_value_delete (KvpValue * @var{value})
Free all of the memory associated with @var{value}.
@end deftypefun
@deftypefun KvpValue* kvp_value_copy (const KvpValue * @var{value})
Return a deep copy of @var{value}.
@end deftypefun
@deftypefun kvp_value_t kvp_value_get_type (const KvpValue * @var{value})
Return the type of value stored in @var{value}.
@end deftypefun
A @code{kvp_value_t} enum must have one of the following values:
@table @code
@item KVP_TYPE_NONE
Indicates the abscence of a value in a @code{kvp_frame}.
@item KVP_TYPE_INT64
A @code{gint64} value.
@item KVP_TYPE_FLOAT64
A @code{double} value.
@item KVP_TYPE_STRING
A @code{char *} value of arbitrary length.
@item KVP_TYPE_GUID
A @code{GUID} value. @xref{Globally Unique Identifiers}.
@item KVP_TYPE_BINARY
Arbitrary binary data.
@item KVP_TYPE_LIST
A @code{kvp_list} item which contains a list of @code{KvpValue} items.
@item KVP_TYPE_FRAME
A @code{kvp_frame} object. Thus, frames may contain other frames in a
recursive manner.
@end table
@subsubsection Value Constructors
The following functions create and return @code{KvpValue} objects with
particular values. In the case of pointer arguments, deep copies are
performed.
@deftypefun KvpValue* kvp_value_new_int64 (gint64 @var{value})
@end deftypefun
@deftypefun KvpValue* kvp_value_new_float64 (double @var{value})
@end deftypefun
@deftypefun KvpValue* kvp_value_new_string (const char * @var{value})
@end deftypefun
@deftypefun KvpValue* kvp_value_new_guid (const GUID * @var{guid})
@end deftypefun
@deftypefun KvpValue* kvp_value_new_binary (const void * @var{data}, int @var{datasize})
@end deftypefun
@deftypefun KvpValue* kvp_value_new_list (const kvp_list * @var{value})
@end deftypefun
@deftypefun KvpValue* kvp_value_new_frame (const kvp_frame * @var{value});
@end deftypefun
@subsubsection Value Accessors
The following functions access the value of a given @code{KvpValue}
object. If the type of the object does not correspond to that named
in the function, @code{NULL}, @code{0}, or @code{0.0} is returned
as appropriate.
@deftypefun gint64 kvp_value_get_int64 (const KvpValue * @var{value})
@end deftypefun
@deftypefun double kvp_value_get_float64 (const KvpValue * @var{value})
@end deftypefun
@deftypefun char* kvp_value_get_string (const KvpValue * @var{value})
@end deftypefun
@deftypefun GUID* kvp_value_get_guid (const KvpValue * @var{value})
@end deftypefun
@deftypefun void* kvp_value_get_binary (const KvpValue * @var{value}, int * @var{size_return})
@end deftypefun
@deftypefun kvp_list* kvp_value_get_list (const KvpValue * @var{value})
@end deftypefun
@deftypefun kvp_frame* kvp_value_get_frame (const KvpValue * @var{value})
@end deftypefun
@node kvp_list, , KvpValue, Key-Value Pair Frames
@subsection kvp_list
@tindex kvp_list
A @code{kvp_list} object abstract a list of @code{KvpValue} objects.
@deftypefun kvp_list* kvp_list_new ()
Return a newly allocated @code{kvp_list} object.
@end deftypefun
@deftypefun void kvp_list_delete (kvp_list * @var{list})
Free all memory associated with @var{list}, including the
@code{KvpValue} objects in @var{list}.
@end deftypefun
@deftypefun kvp_list* kvp_list_copy (const kvp_list * @var{list})
Return a deep copy of @var{list}.
@end deftypefun
@deftypefun gboolean kvp_list_null_p (const kvp_list * @var{list})
Return @code{TRUE} if @var{list} is the empty list.
@end deftypefun
@deftypefun KvpValue* kvp_list_car (kvp_list * @var{list})
If @var{list} is @code{NULL} or the empty list, return @code{NULL}.
Otherwise, return the first @code{KvpValue} object in the list.
@end deftypefun
@deftypefun kvp_list* kvp_list_cdr (kvp_list * @var{list})
If @var{list} is @code{NULL} or the empty list, return @code{NULL}.
Otherwise, return a @code{kvp_list} object consisting of @var{list}
with the first value removed. NOTE: the returned list is not a copy!
@end deftypefun
@deftypefun kvp_list* kvp_list_cons (KvpValue * @var{car}, kvp_list * @var{cdr})
If either @var{car} or @var{cdr} is @code{NULL}, return @code{NULL}. Otherwise,
return a @code{kvp_list} object consisting of the value of @var{car} followed
by the values of @var{cdr}. This function uses 'hand-over' semantics, i.e.,
the arguments @var{car} and @var{cdr} are no longer the responsibility of
the caller and should not be accessed after the function returns.
@end deftypefun
@node Events, Commodities, Key-Value Pair Frames, Engine
@section Events
The Engine supports the concept of @dfn{Events} which notify
external code when engine entities are created, modified, or
destroyed.
User code can register event handers which are invoked for each event,
giving information about the specific engine entity generating the event
and the nature of the event (creation, modification, or deletion).
@menu
* Event API::
@end menu
@node Event API, , Events, Events
@subsection Event API
@tindex GNCEngineEventType
Engine events are classified using the @code{GNCEngineEventType}
bitmask which has the following predefined values:
@table @code
@item GNC_EVENT_NONE
A null value.
@item GNC_EVENT_CREATE
Indicates an entity has been created.
@item GNC_EVENT_MODIFY
Indicates an entity has been changed in some way.
@item GNC_EVENT_DESTROY
Indicates an entity is being destroyed.
@item GNC_EVENT_ALL
The boolean OR of @code{GNC_EVENT_CREATE}, @code{GNC_EVENT_MODIFY},
and @code{GNC_EVENT_DESTROY}.
@end table
Event handlers are functions with the following type:
@deftp {Data type} GNCEngineEventHandler void (*) (GUID * @var{entity}, GNCEngineEventType @var{event_type}, gpointer @var{user_data})
A callback invoked when an engine event occurs. @var{entity} is the
@code{GUID} of the entity generating the event. @var{event_type} is
one of @code{GNC_EVENT_CREATE}, @code{GNC_EVENT_MODIFY}, or
@code{GNC_EVENT_DESTROY}. @var{user_data} is the user data parameter
supplied when the handler was registered.
@end deftp
@deftypefun gint gnc_engine_register_event_handler (GNCEngineEventHandler @var{handler}, gpointer @var{user_data})
Register a handler for engine events. The return value is an identifier used
to specify this handler in other API calls.
@end deftypefun
@deftypefun void gnc_engine_unregister_event_handler (gint @var{handler_id})
Unregister the event handler specified by @var{handler_id}.
@end deftypefun
@deftypefun void gnc_engine_suspend_events (void)
Suspend all engine events. This function may be called multiple
times. To resume event generation, an equal number of calls to
@code{gnc_engine_resume_events} must be made.
@end deftypefun
@deftypefun void gnc_engine_resume_events (void)
Resume engine event generation.
@end deftypefun
@node Commodities, Commodity Tables, Events, Engine
@section Commodities
@tindex gnc_commodity
A Commodity is the Engine abstraction of a tradable quantity,
like a national currency or shares of a stock. A commodity
object contains the following pieces of information:
@table @asis
@item A mnemonic name
The `short' name for the commodity. For national currencies
this is the 3-letter ISO4217 code (USD, AUD, etc.). For stocks
this is generally the exchange symbol (RHAT, IBM, etc.).
@item A namespace
A string identifying the context in which the mnemonic is meaninful.
@item A full name
The `long' name for the commodity, such as "US Dollar" or "IBM Common
Stock".
@item A printable name
The name used to print out a string describing the commodity to
a user. This name is generally long -- in some contexts it may
be better to use the mnemonic instead. The printable name is
determined by the namespace and mnemonic.
@item A unique name
A canonical name for the commodity that cannot be identical to
another commodity's unique name. The unique name is determined
by the namespace and mnemonic.
@item An exchange code
A code used to identify the commodity in its namespace context.
For example, stocks have a unique code assigned to them by the
exchange they are listed on.
@item A fraction
An integer N which specifies that 1/N is generally the smallest
fraction of the commodity which can be traded. For example, most
currencies are tradable in 1/100ths, so the fraction would be 100.
@end table
@menu
* General Commodity API::
* Commodity Getters::
* Commodity Setters::
@end menu
@node General Commodity API, Commodity Getters, Commodities, Commodities
@subsection General Commodity API
@deftypefun {gnc_commodity *} gnc_commodity_new (const char * @var{fullname}, const char * @var{namespace}, const char * @var{mnemonic}, const char * @var{exchange_code}, int @var{fraction})
Create and return a new commodity object with the given values, or
@code{NULL} if any of the values are invalid.
@end deftypefun
@deftypefun void gnc_commodity_destroy (gnc_commodity * @var{cm})
Destroy the given commodity and free all associated memory.
@end deftypefun
@deftypefun gboolean gnc_commodity_equiv (const gnc_commodity * @var{a}, const gnc_commodity * @var{b})
Return true if the two given commodities are equivalent. Two commodities
are equivalent when they have the same namespace and the same mnemonic.
@end deftypefun
@node Commodity Getters, Commodity Setters, General Commodity API, Commodities
@subsection Commodity Getters
@deftypefun {const char *} gnc_commodity_get_mnemonic (const gnc_commodity * @var{cm})
Return the mnemonic of @var{cm}.
@end deftypefun
@deftypefun {const char *} gnc_commodity_get_namespace (const gnc_commodity * @var{cm})
Return the namespace of @var{cm}.
@end deftypefun
@deftypefun {const char *} gnc_commodity_get_fullname (const gnc_commodity * @var{cm})
Return the full name of @var{cm}.
@end deftypefun
@deftypefun {const char *} gnc_commodity_get_printname (const gnc_commodity * @var{cm})
Return the print name of @var{cm}.
@end deftypefun
@deftypefun {const char *} gnc_commodity_get_exchange_code (const gnc_commodity * @var{cm})
Return the exchange code of @var{cm}.
@end deftypefun
@deftypefun {const char *} gnc_commodity_get_unique_name (const gnc_commodity * @var{cm})
Return the unique name of @var{cm}.
@end deftypefun
@deftypefun int gnc_commodity_get_fraction (const gnc_commodity * @var{cm})
Return the smallest tradable fraction of @var{cm}.
@end deftypefun
@node Commodity Setters, , Commodity Getters, Commodities
@subsection Commodity Setters
@deftypefun void gnc_commodity_set_mnemonic (gnc_commodity * @var{cm}, const char * @var{mnemonic})
Set the mnemonic of @var{cm} to @var{mnemonic}.
@end deftypefun
@deftypefun void gnc_commodity_set_namespace (gnc_commodity * @var{cm}, const char * @var{namespace})
Set the namespace of @var{cm} to @var{namespace}.
@end deftypefun
@deftypefun void gnc_commodity_set_fullname (gnc_commodity * @var{cm}, const char * @var{fullname})
Set the fullname of @var{cm} to @var{fullname}.
@end deftypefun
@deftypefun void gnc_commodity_set_exchange_code (gnc_commodity * @var{cm}, const char * @var{exchange_code})
Set the exchange code of @var{cm} to @var{exchange_code}.
@end deftypefun
@deftypefun void gnc_commodity_set_fraction (gnc_commodity * @var{cm}, int @var{smallest_fraction})
Set the fraction of @var{cm} to @var{fraction}.
@end deftypefun
@node Commodity Tables, Prices, Commodities, Engine
@section Commodity Tables
@tindex gnc_commodity_table
A Commodity Table holds a set of commodities and allows user code
to add, remove, and access the commodities in the table.
There is a single, global Commodity Table used by the Engine.
@menu
* General Commodity Table API::
* Commodity Table Access API::
* Commodity Table Modification API::
@end menu
@node General Commodity Table API, Commodity Table Access API, Commodity Tables, Commodity Tables
@subsection General Commodity Table API
@deftypefun {gnc_commodity_table *} gnc_commodity_table_new (void)
Allocate and initialize a @code{gnc_commodity_table}. The returned
table must be destroyed with @code{gnc_commodity_table_destroy}.
@end deftypefun
@deftypefun void gnc_commodity_table_destroy (gnc_commodity_table * @var{table})
Destroy @var{table} and all associated resources, including all
Commodity objects in the table.
@end deftypefun
@deftypefun {gnc_commodity_table *} gnc_engine_commodities (void)
Return the global engine commodity table.
@end deftypefun
@node Commodity Table Access API, Commodity Table Modification API, General Commodity Table API, Commodity Tables
@subsection Commodity Table Access API
@deftypefun {gnc_commodity *} gnc_commodity_table_lookup (const gnc_commodity_table * @var{table}, const char * @var{namespace}, const char * @var{mnemonic})
Look up a commodity in @var{table} given the namespace and the mnemonic.
If no such commodity exists, @code{NULL} is returned.
@end deftypefun
@deftypefun {gnc_commodity *} gnc_commodity_table_find_full (const gnc_commodity_table * @var{table}, const char * @var{namespace}, const char * @var{fullnam}e)
Look up a commodity in @var{table} given the namespace and the full name.
If no such commodity exists, @code{NULL} is returned.
@end deftypefun
@deftypefun int gnc_commodity_table_has_namespace (const gnc_commodity_table * @var{table}, const char * @var{namespace})
Return true if @var{table} has the namespace @var{namespace}.
@end deftypefun
@deftypefun guint gnc_commodity_table_get_size (gnc_commodity_table * @var{table})
Return the total number of commodities stored in @var{table}.
@end deftypefun
@deftypefun guint gnc_commodity_table_get_number_of_namespaces (gnc_commodity_table * @var{table})
Return the number of distinct namespaces in @var{table}.
@end deftypefun
@deftypefun {GList *} gnc_commodity_table_get_namespaces (const gnc_commodity_table * @var{table})
Return a list of the distinct namespaces in @var{table}. The list should
be freed with @code{g_list_free} but the namespaces should not be freed
or modified.
@end deftypefun
@deftypefun {GList *} gnc_commodity_table_get_commodities (const gnc_commodity_table * @var{table}, const char * @var{namespace})
Return a list of the commodities under @var{namespace} in @var{table}.
The list should be freed with @code{g_list_free} but the commodities
should not be freed.
@end deftypefun
@node Commodity Table Modification API, , Commodity Table Access API, Commodity Tables
@subsection Commodity Table Modification API
@deftypefun {gnc_commodity *} gnc_commodity_table_insert (gnc_commodity_table * @var{table}, gnc_commodity * @var{comm})
Add commodity @var{comm} to @var{table}. If @var{comm}'s namespace is
not in @var{table}, the namespace will be added. This function has
hand-over semantics, i.e., @var{table} assumes responsibility for
@var{comm}. @var{comm} may even be destroyed by this call! The function
returns the actual commodity added as a result of the call. It may not
be the same object as @var{comm}, but will be equivalent to @var{comm}.
@end deftypefun
@deftypefun void gnc_commodity_table_remove (gnc_commodity_table * @var{table}, gnc_commodity * @var{comm})
Remove the given commodity from @var{table}. @var{comm} is not modified
or destroyed.
@end deftypefun
@deftypefun void gnc_commodity_table_add_namespace (gnc_commodity_table * @var{table}, const char * @var{namespace})
Add @var{namespace} to @var{table}.
@end deftypefun
@deftypefun void gnc_commodity_table_delete_namespace (gnc_commodity_table * @var{table}, const char * @var{namespace})
Delete @var{namespace} from @var{table} including all associated
commodities.
@end deftypefun
@deftypefun void gnc_commodity_table_remove_non_iso (gnc_commodity_table * @var{table})
Remove and destroy all commodities in @var{table} which are not in the
ISO4217 namespace.
@end deftypefun
@node Prices, Price Databases, Commodity Tables, Engine
@section Prices
@tindex GNCPrice
A Price is the Engine abstraction of an "instantaneous" price quote for a
given commodity with respect to another commodity. For example, a given
price might represent the value of LNUX in USD on 2001-02-03. A Price
contains the following pieces of information:
@table @asis
@item A GUID
A GUID uniquely identifying the GNCPrice.
@item A commodity
The commodity being priced.
@item A currency
The denomination of the value of the item being priced.
@item A value
The value of the item being priced.
@item A time
The time the price was valid.
@item A source
A string describing the source of the quote. These strings will have a
form like this: "Finance::Quote", "user:misc", "user:foo", etc. If the
quote came from a user, as a matter of policy, you @emph{must} prefix
the string you give with "user:". For now, the only other reserved
values are "Finance::Quote" and "old-file-import".
@item A type
A string describing the type of quote -- types possible right now are
"bid", "ask", "last", "nav", and "unknown".
@end table
@menu
* Price Implementation Details::
* General Price API::
* Price Getters::
* Price Setters::
@end menu
@node Price Implementation Details, General Price API, Prices, Prices
@subsection Price Implementation Details
For the source and type fields, @code{NULL} and the empty string are
considered the same, so if one of these is the empty string then it
might be @code{NULL} after a file save/restore.
GNCPrices are reference counted. When you create a price or or clone
one, the new price's reference count is set to 1. When you are finished
with a price, call @code{gnc_price_unref}. If you hand the price pointer
to some other code that needs to keep it, make sure it calls
@code{gnc_price_ref} to indicate its interest in that price, and calls
@code{gnc_price_unref} when it's finished with the price. For those
unfamiliar with reference counting, basically each price stores an
integer count which starts at 1 and is incremented every time someone
calls @code{gnc_price_ref}. Conversely, the count is decremented every
time someone calls @code{gnc_price_unref}. If the count ever reaches 0,
the price is destroyed.
All of the getters return data that's internal to the GNCPrice,
not copies, so don't free or modify these values.
All of the setters store copies of the data given, with the exception of
the commodity field which just stores the pointer given. It is assumed
that commodities are a global resource and are pointer unique.
@node General Price API, Price Getters, Price Implementation Details, Prices
@subsection General Price API
@deftypefun {GNCPrice *} gnc_price_create (void)
Return a newly allocated and initialized price with a reference count of
1. The price should be dereferenced with @code{gnc_price_unref} when no
longer needed, but the price should not be freed by user code.
@end deftypefun
@deftypefun {GNCPrice *} gnc_price_clone (GNCPrice * @var{p})
Return a newly allocated price that's a content-wise duplicate of
@var{p}. The returned clone will have a reference count of 1.
@end deftypefun
@deftypefun void gnc_price_ref (GNCPrice * @var{p})
Increase the reference count of @var{p} by 1.
@end deftypefun
@deftypefun void gnc_price_unref (GNCPrice * @var{p})
Decrease the reference coutn of @var{p} by 1. If the
resulting count is 0, @var{p} will be destroyed.
@end deftypefun
@deftypefun {GNCPrice *} gnc_price_lookup (const GUID * @var{guid})
Lookup and return the price associated with @var{guid}, or @code{NULL}
if there is no such price.
@end deftypefun
@node Price Getters, Price Setters, General Price API, Prices
@subsection Price Getters
@deftypefun {const GUID *} gnc_price_get_guid (GNCPrice * @var{p})
Return the GUID of @var{p}.
@end deftypefun
@deftypefun {gnc_commodity *} gnc_price_get_commodity (GNCPrice * @var{p})
Return the commodity of @var{p}.
@end deftypefun
@deftypefun {gnc_commodity *} gnc_price_get_currency (GNCPrice * @var{p})
Return the currency of @var{p}.
@end deftypefun
@deftypefun Timespec gnc_price_get_time (GNCPrice * @var{p})
Return the time of @var{p}.
@end deftypefun
@deftypefun {const char *} gnc_price_get_source (GNCPrice * @var{p})
Return the source of @var{p}.
@end deftypefun
@deftypefun {const char *} gnc_price_get_type (GNCPrice * @var{p})
Return the type of @var{p}.
@end deftypefun
@deftypefun gnc_numeric gnc_price_get_value (GNCPrice * @var{p})
Return the value of @var{p}.
@end deftypefun
@deftypefun gint32 gnc_price_get_version (GNCPrice * @var{p})
Return the version of @var{p}.
@end deftypefun
@node Price Setters, , Price Getters, Prices
@subsection Price Setters
Invocations of the setters should be wrapped with calls to
@code{gnc_price_begin_edit} and @code{gnc_price_commit_edit}. The
begin/commit calls help ensure that the local price db is synchronized
with the backend.
@deftypefun void gnc_price_begin_edit (GNCPrice * @var{p})
Begin a sequence of changes to @var{p}.
@end deftypefun
@deftypefun void gnc_price_commit_edit (GNCPrice * @var{p})
End a sequence of changes to @var{p}.
@end deftypefun
@deftypefun void gnc_price_set_commodity (GNCPrice * @var{p}, gnc_commodity * @var{c})
Set the commodity of @var{p} to @var{c}.
@end deftypefun
@deftypefun void gnc_price_set_currency (GNCPrice * @var{p}, gnc_commodity * @var{c})
Set the currency of @var{p} to @var{c}.
@end deftypefun
@deftypefun void gnc_price_set_time (GNCPrice * @var{p}, Timespec @var{t})
Set the time of @var{p} to @var{t}.
@end deftypefun
@deftypefun void gnc_price_set_source (GNCPrice * @var{p}, const char * @var{source})
Set the source of @var{p} to @var{source}.
@end deftypefun
@deftypefun void gnc_price_set_type (GNCPrice * @var{p}, const char * @var{type})
Set the type of @var{p}to @var{type}.
@end deftypefun
@deftypefun void gnc_price_set_value (GNCPrice * @var{p}, gnc_numeric @var{value})
Set the value of @var{p} to @var{value}.
@end deftypefun
@deftypefun void gnc_price_set_version (GNCPrice * @var{p}, gint32 @var{versn})
Set the version of @var{p} to @var{versn}.
@end deftypefun
@node Price Databases, Splits, Prices, Engine
@section Price Databases
@tindex GNCPriceDB
A Price Database stores GNCPrices and allows prices to be looked
up based on currency, commodity, and time.
@menu
* Price Lists::
* General Price Database API::
@end menu
@node Price Lists, General Price Database API, Price Databases, Price Databases
@subsection Price Lists
Price Lists are used by Price Databases to organize prices for a given
commodity and currency. A Price List is a list of prices with the same
commodity and currency, sorted by decreasing time (earlier prices come
later in the list).
@deftypefun gboolean gnc_price_list_insert (GList ** @var{prices}, GNCPrice * @var{p})
Insert price @var{p} into the list @var{prices}, calling
@var{gnc_price_ref} on @var{p} during the process.
@end deftypefun
@deftypefun gboolean gnc_price_list_remove (GList ** @var{prices}, GNCPrice * @var{p})
Remove price @var{p} from the list @var{prices}, calling
@code{gnc_price_unref} on @var{p} during the process.
@end deftypefun
@deftypefun void gnc_price_list_destroy (GList * @var{prices})
Destroy the price list @var{prices}, calling @code{gnc_price_unref}
on all the prices in the list.
@end deftypefun
@node General Price Database API, , Price Lists, Price Databases
@subsection General Price Database API
@deftypefun {GNCPriceDB *} gnc_pricedb_create (void)
Create and return a new price database.
@end deftypefun
@deftypefun void gnc_pricedb_destroy (GNCPriceDB * @var{db})
Destroy the price database @var{db} and unreference all of
the prices it contains. This may not deallocate all of those
prices; other code may still be holding references to them.
@end deftypefun
@deftypefun gboolean gnc_pricedb_add_price (GNCPriceDB * @var{db}, GNCPrice * @var{p})
Add the price @var{p} to @var{db}. This will increase the
reference count of @var{p}, so user code may safely drop
its reference to the price (i.e. call @code{gnc_price_unref})
if the call succeeds (returns true).
@end deftypefun
@deftypefun gboolean gnc_pricedb_remove_price (GNCPriceDB * @var{db}, GNCPrice * @var{p})
Removes the price @var{p} from the price database @var{db}. Returns true
if successful and false otherwise.
@end deftypefun
@node Splits, Transactions, Price Databases, Engine
@section Splits
@tindex Split
A Split is the Engine abstraction of an accounting entry in an Account
Ledger. In accounting terms, a Split is a Ledger Entry. As such, it
contains the following pieces of information:
@table @asis
@item A parent Account
The Account of which it is an entry.
@item A parent Transaction.
In accounting terms, this is the Journal Entry which this Ledger Entry
is linked to.
@item A 'share quantity'
This is the number of 'shares' which have been debited to the parent
Account. This quantity may be negative, in which case the Split
represents a 'credit'. Shares are given in units of the security of the
Account, unless the security field is NULL, in which case shares are
given in units of the Account currency. @xref{Accounts}.
@item A 'value'
This represents the value of the shares in units of the currency of
the Account. If the currency and the security are the same, or the
security field is NULL, the value and share quantity must be equal.
@item A 'reconciled' flag
This flag represents the reconciled status of the Split. Possible
reconciliation states for a Split are:
@table @asis
@item Not Reconciled
The Split has not been reconciled or cleared.
@item Cleared
The Split has been cleared, but not reconciled.
@item Reconciled
The Split has been reconciled with a statement.
@item Frozen
The Split has been frozen into the accounting period.
@end table
@end table
In addition to the above, Splits contain a Memo field, an Action
field, and a key-value pair frame. The Memo and Action fields are for
arbitrary user input. See src/engine/kvp_frame.txt for the names of
keys that have already been reserved for use in the frame.
@menu
* General Split API::
* Split Getters::
* Split Setters::
@end menu
@node General Split API, Split Getters, Splits, Splits
@subsection General Split API
@deftypefun {Split *} xaccMallocSplit (void)
Allocate, initialize, and return a new Split.
@end deftypefun
@deftypefun void xaccSplitDestroy (Split * @var{split})
Update @var{split}'s parent Account and Transaction in a consistent
manner, completely unlinking of @var{split} and freeing its memory. The
goal of this routine is to perform the removal and destruction of the
Split in an atomic fashion, with no chance of accidentally leaving the
accounting structure out-of-balance or otherwise inconsistent.
If the deletion of the Split leaves the Transaction with no Splits, then
the Transaction will be marked for deletion, but will not be deleted
until the @code{xaccTransCommitEdit()} routine is called.
@end deftypefun
@deftypefun {const GUID *} xaccSplitGetGUID (Split * @var{split})
Return the GUID of @var{split}.
@end deftypefun
@deftypefun {Split *} xaccSplitLookup (const GUID * @var{guid})
Return the split associated with @var{GUID}, or @code{NULL} if there is
no such split.
@end deftypefun
@deftypefun void xaccSplitMakeStockSplit (Split * @var{split})
Modify @var{split} to be an ``official'' stock-split split. Among other
things, this involves clearing the value of the split to 0.
@end deftypefun
@node Split Getters, Split Setters, General Split API, Splits
@subsection Split Getters
@deftypefun {Account *} xaccSplitGetAccount (Split * @var{split})
Return the parent Account of @var{split}.
@end deftypefun
@deftypefun {Transaction *} xaccSplitGetParent (Split * @var{split})
Return the parent Transaction of @var{split}.
@end deftypefun
@deftypefun gnc_numeric xaccSplitGetShareAmount (Split * @var{split})
Return the 'share quantity' of @var{split}.
@end deftypefun
@deftypefun gnc_numeric xaccSplitGetSharePrice (Split * @var{split})
Return the 'share price' of @var{split}, which is the value
divided by the share quantity.
@end deftypefun
@deftypefun gnc_numeric xaccSplitGetValue (Split * @var{split})
Return the value of @var{split}.
@end deftypefun
@deftypefun gnc_numeric xaccSplitGetBaseValue (Split * @var{split}, const char * @var{base_currency})
Return either the share quantity or the value of @var{split}, depending
upon whether @var{base_currency} matches the security or currency of the
parent Account, respectively. No other value for @var{base_currency} is
legal.
@end deftypefun
@deftypefun char xaccSplitGetReconcile (Split * @var{split})
Return the value of the reconcile flag in @var{split}. Possible
values for the flag are:
@table @code
@item NREC
Not Reconciled
@item CREC
Cleared
@item YREC
Reconciled
@item FREC
Frozen
@end table
@end deftypefun
@deftypefun void xaccSplitGetDateReconciledTS (Split * @var{split}, Timespec * @var{ts})
Fill @var{ts} with the reconciled date of @var{split}.
@end deftypefun
@deftypefun {const char *} xaccSplitGetMemo (Split * @var{split})
Return the Memo field of @var{split}.
@end deftypefun
@deftypefun {const char *} xaccSplitGetAction (Split * @var{split})
Return the Action field of @var{split}.
@end deftypefun
@deftypefun gnc_numeric xaccSplitGetBalance (Split * @var{split})
Return the balance of @var{split}'s parent Account up to and including
@var{split}. See @ref{Accounts} for details.
@end deftypefun
@deftypefun gnc_numeric xaccSplitGetClearedBalance (Split * @code{split})
Return the cleared balance of @var{split}'s parent Account up to and
including @var{split}. See @ref{Accounts} for details.
@end deftypefun
@deftypefun gnc_numeric xaccSplitGetReconciledBalance (Split * @code{split})
Return the reconciled balance of @var{split}'s parent Account up to and
including @var{split}. See @ref{Accounts} for details.
@end deftypefun
@deftypefun gnc_numeric xaccSplitGetShareBalance (Split * @var{split})
Return the share balance of @var{split}'s parent Account up to and
including @var{split}. See @ref{Accounts} for details.
@end deftypefun
@deftypefun gnc_numeric xaccSplitGetShareClearedBalance (Split * @code{split})
Return the share cleared balance of @var{split}'s parent Account up to
and including @var{split}. See @ref{Accounts} for details.
@end deftypefun
@deftypefun gnc_numeric xaccSplitGetShareReconciledBalance (Split * @code{split})
Return the share reconciled balance of @var{split}'s parent Account up
to and including @var{split}. See @ref{Accounts} for details.
@end deftypefun
@deftypefun {const char*} xaccSplitGetType (Split * @var{split})
Return @var{split}'s type as a string. Currently, the possibilities are
@table @code
@item normal
a normal split -- the default.
@item stock-split
a split representing a stock split. The value should be 0 and the
share amount should represent the number of shares added/subtracted from
the account as a result of the forward/reverse stock split.
@end table
@end deftypefun
@node Split Setters, , Split Getters, Splits
@subsection Split Setters
@deftypefun void xaccSplitSetMemo (Split * @var{split}, const char * @var{memo})
Set the memo field of @var{split} to @var{memo}.
@end deftypefun
@deftypefun void xaccSplitSetAction (Split * @var{split}, const char * @var{action})
Set the action field of @var{split} to @var{memo}. The action field is
an arbitrary string, but is intended to be conveniently limited to a
menu of selections such as "Buy", "Sell", "Interest", etc.
@end deftypefun
@deftypefun void xaccSplitSetReconcile (Split * @var{split}, char @var{reconciled_flag})
Set the reconciled flag of @var{split} to @var{reconciled_flag}. For the
possible values and meanings of @var{reconciled_flag}, see @ref{Split Getters}.
@end deftypefun
@deftypefun void xaccSplitSetDateReconciledSecs (Split * @var{split}, time_t @var{time})
Set the reconciliation date of @var{split} to @var{time}.
@end deftypefun
@deftypefun void xaccSplitSetDateReconciledTS (Split * @var{split}, Timespec * @var{ts})
Set the reconciliation date of @var{split} to @var{ts}.
@end deftypefun
@deftypefun void xaccSplitSetShareAmount (Split * @var{split}, gnc_numeric amount)
Set the share quantity of @var{split} to @var{amount}.
@end deftypefun
@deftypefun void xaccSplitSetSharePrice (Split * @var{split}, gnc_numeric @var{price})
Set the share price of @var{split} to @var{price}.
@end deftypefun
@deftypefun void xaccSplitSetSharePriceAndAmount (Split * @var{split}, gnc_numeric @var{price}, gnc_numeric @var{amount})
Set both the share price and share quantity of @var{split}. This routine
is more efficient than calling @code{xaccSplitSetShareAmount} and
@code{xaccSplitSetSharePrice} in succesion.
@end deftypefun
@deftypefun void xaccSplitSetValue (Split * @var{split}, gnc_numeric @var{value})
Adjust the share quantity of @var{split} so that @var{split}'s value is
equal to @var{value}.
@end deftypefun
@deftypefun void xaccSplitSetBaseValue (Split * @var{split}, gnc_numeric @var{value}, const char * @var{base_currency})
Set either the share quantity or value of @var{split} depending upon
whether @var{base_currency} is the security or current of @var{split}'s
parent Account. @xref{Accounts}.
@end deftypefun
@node Transactions, Accounts, Splits, Engine
@section Transactions
@tindex Transaction
A Transaction is the Engine abstraction of an accounting entry in a
Journal. In accounting terms, a Transaction is a Journal Entry. As
such, it contains the following pieces of information:
@table @asis
@item A list of Ledger Entries, or Splits
The list of debits and credits which make up this Transaction. As in
accounting, a Transaction is balanced when the sum of the debits equals
the sum of the credits.
@item The entry date
The date the transaction was entered into GnuCash.
@item The post date
The date the transaction was posted. This is often the date the
transaction was recorded by the bank, or the date the user initiated
the transaction (i.e., wrote the check, made the ATM withdrawal).
@item A transaction number field
This field is intended to hold a transaction number, such as a
check number or an ID assigned by a bank to an electronic transfer.
@item A description
A textual description of the transaction.
@end table
In addition to the above, Transactions contain a key-value pair frame.
@subsection The Transaction Edit Cycle
The Engine supports (and, in fact, requires) a 2-phase commit/rollback
cycle for modifying Transactions and their constituent Splits. A Transaction
must be opened for editing using @code{xaccTransBeginEdit()} before any of
the following actions may be taken.
@itemize
@item
Modifying any field of a Transaction.
@item
Modifying any Split belonging to the Transaction. That includes
re-parenting a Split to a different Account or a different Transaction.
In the case of re-parenting to a new Transaction, both Transactions must
be opened for editing.
@item
Deleting any Split belonging to the Transaction.
@item
Adding a Split to the transaction.
@item
Deleting the Transaction.
@end itemize
After the desired changes have been made, they must either be committed
using @code{xaccTransCommitEdit()} or rolled back using
@code{xaccTransRollbackEdit()}. Rolling back a transaction will undo any
changes which have been made to it or to its Splits since it was opened
for editing.
@menu
* General Transaction API::
* Transaction Getters::
* Transaction Setters::
@end menu
@node General Transaction API, Transaction Getters, Transactions, Transactions
@subsection General Transaction API
@deftypefun {Transaction *} xaccMallocTransaction (void)
Allocate, initialize, and return a new Transaction.
@end deftypefun
@deftypefun void xaccTransDestroy (Transaction * {trans})
Remove all of the Splits from each of their accounts and free the memory
associated with them. This routine must be followed by either an
@code{xaccTransCommitEdit()} in which case the transaction memory will
be freed, or by @code{xaccTransRollbackEdit()}, in which case all the
original Splits are put back into place.
@end deftypefun
@deftypefun void xaccTransAppendSplit (Transaction * @var{trans}, Split * @var{split})
Append @var{split} to the collection of Splits in @var{trans}. If the
Split is already a part of another Transaction, it will be removed from
that Transaction first.
@end deftypefun
@deftypefun void xaccTransBeginEdit (Transaction * @var{trans})
This method must be called before any changes are made to @var{trans} or
any of its component Splits. If this is not done, errors will result.
@end deftypefun
@deftypefun void xaccTransCommitEdit (Transaction * @var{trans})
This method indicates that the changes to @var{trans} and its Splits are
complete and should be made permanent. Note this routine may result in
the deletion of the transaction, if the Transaction is "empty" (has no
Splits) or if @code{xaccTransDestroy()} was called on the Transaction.
@end deftypefun
@deftypefun void xaccTransRollbackEdit (Transaction * @var{trans})
Rejects all changes made to @var{trans} and its Splits, and sets
@var{trans} back to where it was before the @code{xaccTransBeginEdit()}
call. This includes restoring any deleted Splits, removing any added
Splits, and undoing the effects of @code{xaccTransDestroy()}, as well
as restoring share quantities, memos, descriptions, etc.
@end deftypefun
@deftypefun gboolean xaccTransIsOpen (Transaction * @var{trans})
Return @code{TRUE} if @var{trans} is open for editing. Otherwise, it
returns @code{FALSE}.
@end deftypefun
@deftypefun {const GUID *} xaccTransGetGUID (Transaction * @var{trans})
Return the GUID of @var{trans}.
@end deftypefun
@deftypefun {Transaction *} xaccTransLookup (const GUID * @var{guid})
Return the Transaction associated with @var{GUID}, or @code{NULL} if
there is no such Transaction.
@end deftypefun
@deftypefun {KvpValue *} xaccTransGetSlot (Transaction * @var{trans}, const char * @var{key})
Return the @code{KvpValue} associated with @var{key} in @var{trans}.
If there is none, @code{NULL} is returned.
@end deftypefun
@deftypefun void xaccTransSetSlot (Split * @var{trans}, const char * @var{key}, const KvpValue * @var{value})
Associate a copy of @var{value} with @var{key} in @var{trans}.
@end deftypefun
@node Transaction Getters, Transaction Setters, General Transaction API, Transactions
@subsection Transaction Getters
@deftypefun {Split *} xaccTransGetSplit (Transaction * @var{trans}, int @var{i})
Return the @var{I}th Split of @var{trans}.
@end deftypefun
@deftypefun {GList *} xaccTransGetSplitList (Transaction * @var{trans})
Return a @code{GList} of the Splits in @var{trans}. This list is owned
by @var{trans} and should not be modified in any way!
@end deftypefun
@deftypefun {const char *} xaccTransGetNum (Transaction * @var{trans})
Return the number field of @var{trans}.
@end deftypefun
@deftypefun {const char *} xaccTransGetDescription (Transaction * @var{trans})
Return the description field of @var{trans}.
@end deftypefun
@deftypefun time_t xaccTransGetDate (Transaction * @var{trans})
Return the post date of @var{trans} as a @code{time_t} value.
@end deftypefun
@deftypefun {long long} xaccTransGetDateL (Transaction * @var{trans})
Return the post date of @var{trans} as a @code{long long} value.
@end deftypefun
@deftypefun void xaccTransGetDateTS (Transaction * @var{trans}, Timespec * @var{ts})
Return the post date of @var{trans} in @var{ts}.
@end deftypefun
@deftypefun void xaccTransGetDateEnteredTS (Transaction * @var{trans}, Timespec * @var{ts})
Return the entry date of @var{trans} in @var{ts}.
@end deftypefun
@deftypefun {char *} xaccTransGetDateStr (Transaction * @var{trans})
Return a string representing the post date of @var{trans}, or NULL if
@var{trans} is NULL. The string must be freed with @code{free()} after
use.
@end deftypefun
@deftypefun int xaccTransCountSplits (Transaction * @var{trans})
Return the number of Splits in @var{trans}.
@end deftypefun
@node Transaction Setters, , Transaction Getters, Transactions
@subsection Transaction Setters
Remember, before you modify a Transaction, you must open it for editing
with @code{xaccTransBeginEdit}.
@deftypefun void xaccTransSetDate (Transaction * @var{trans}, int @var{day}, int @var{mon}, int @var{year})
Set the post date of @var{trans} with @var{day}, @var{month}, and @var{year}.
@end deftypefun
@deftypefun void xaccTransSetDateSecs (Transaction * @var{trans}, time_t @var{time})
Set the post date of @var{trans} using a @code{time_t} value.
@end deftypefun
@deftypefun void xaccTransSetDateToday (Transaction * @var{trans})
Set the post date of @var{trans} to the current time.
@end deftypefun
@deftypefun void xaccTransSetDateTS (Transaction * @var{trans}, const Timespec * @var{ts})
Set the post date of @var{trans} from @var{ts}.
@end deftypefun
@deftypefun void xaccTransSetDateEnteredSecs (Transaction *trans, time_t time)
Set the entry date of @var{trans} from a @code{time_t} value.
@end deftypefun
@deftypefun void xaccTransSetDateEnteredTS (Transaction * @var{trans}, const Timespec * @var{ts})
Set the entry date of @var{trans} from @var{ts}.
@end deftypefun
@deftypefun void xaccTransSetNum (Transaction * @var{trans}, const char * @var{num})
Set the number field of @var{trans} to @var{num}.
@end deftypefun
@deftypefun void xaccTransSetDescription (Transaction * @var{trans}, const char * @var{desc})
Set the description field of @var{trans} to @var{desc}.
@end deftypefun
@node Accounts, Account Groups, Transactions, Engine
@section Accounts
@tindex Account
An Account is the Engine abstraction of an, well, an account. Accounts
contain the following pieces of information:
@table @asis
@item A list of Ledger Entries, or Splits
The list of debits and credits which apply to the Account. The sum of
all debits and credits is the account balance.
@item A type
An integer code identifying the type of account. The Account type
determines whether the Account holds shares valued in a currency
or not. It is also used by the GUI and reporting system to determine
how debits & credits to the Account should be treated and displayed.
@item A name
The name of the Account.
@item An account code
A string that is intended to hold a unique user-selected identifier
for the account. However, uniqueness of this field is not enforced.
@item A description
A textual description of the Account.
@item A currency
The commodity that Splits in the account are valued in, i.e., the
denomination of the 'value' member of Splits in the account.
@item A curreny SCU
The SCU is the smallest convertible unit that the currency is
traded in. This value overrides the default SCU of the currency.
@item A security
For Accounts which may contain shares (such as stock accounts),
the denomination of the 'share quantity' member of Splits in
the accounts. For accounts which do not contain shares, the
security is blank, and the share quantities are denominated
in the Account currency.
@item A security SCU
Analogous to the currency SCU, but for the security.
@item A parent and child Account Group.
The parent and child of an Account are Account Groups
(@pxref{Account Groups}). Account Groups are used to
connect Accounts together into an Account hierarchy.
If the parent Account Group is not present, the Account
is at the top level of the hierarchy. If the child
Account Group is not present, the Account has no
children.
@end table
In addition to the above, Accounts contain a key-value pair frame.
@menu
* Account Types::
* General Account API::
* Account Type API::
* Account Getters::
* Account Tax API::
@end menu
@node Account Types, General Account API, Accounts, Accounts
@subsection Account Types
@tindex GNCAccountType
Account Types are defined by the @code{GNCAccountType} enumeration.
Possible values are:
@table @code
@item BAD_TYPE, NO_TYPE
Both of these values indicate an illegal Account type.
@item BANK
Denotes a savings or checking account held at a bank.
Such an account is often interest bearing.
@item CASH
Denotes a shoe-box or pillowcase stuffed with cash. In other
words, actual currency held by the user.
@item CREDIT
Denotes credit card accounts.
@item ASSET
Denotes a generic asset account.
@item LIABILITY
Denotes a generic liability account.
@item STOCK
A stock account containing stock shares.
@item MUTUAL
A mutual fund account containing fund shares.
@item CURRENCY
Denotes a currency trading account. In many ways, a currency trading
account is like a stock trading account, where both quantities
and prices are set. However, generally both currency and security
are national currencies.
@item INCOME
Denotes an income account. The GnuCash financial model does not
use 'categories'. Actual accounts are used instead.
@item EXPENSE
Denotes an expense account.
@item EQUITY = 10,
Denotes an equity account.
@end table
@node General Account API, Account Type API, Account Types, Accounts
@subsection General Account API
@deftypefun {Account *} xaccMallocAccount (void)
Allocate and initialize an Account. The account must be
destroyed by calling @code{xaccAccountBeginEdit} followed
by @code{xaccAccountDestroy}.
@end deftypefun
@deftypefun void xaccAccountDestroy (Account * @var{account})
Destroys @var{account} and frees all memory associated with
it. This routine will also destroy the Account's children.
You must call @code{xaccAccountBeginEdit} before calling
this function.
@end deftypefun
@deftypefun void xaccAccountBeginEdit (Account * @var{account})
This routine, together with @code{xaccAccountCommitEdit},
provide a two-phase-commit wrapper for account updates
much in the same way as @var{xaccTransBeginEdit} and
@var{xaccTransCommitEdit} do for Transactions.
@end deftypefun
@deftypefun void xaccAccountCommitEdit (Account * @var{account})
The counterpart to @var{xaccAccountBeginEdit}.
@end deftypefun
@deftypefun {Account *} xaccCloneAccountSimple (const Account * @var{from})
Return a 'copy' of @var{from} that is identical in the type, name, code,
description, kvp data, and currency. All other fields are the same as an
account returned by @code{xaccMallocAccount}.
@end deftypefun
@deftypefun {const GUID *} xaccAccountGetGUID (Account * @var{account})
Return the globally unique id associated with @var{account}.
@end deftypefun
@deftypefun {Account *} xaccAccountLookup (const GUID * @var{guid})
Return the Account associated with @var{guid}, or NULL if there is
no such Account.
@end deftypefun
@deftypefun {kvp_frame *} xaccAccountGetSlots (Account * @var{account})
Return the @code{kvp_frame} associated with @var{account}. User code
may modify this @code{kvp_frame}, but must not destroy it.
@end deftypefun
@deftypefun void xaccAccountSetSlots_nc (Account * @var{account}, kvp_frame * @var{frame})
Set the @code{kvp_frame} associated wih @var{account}. After the call,
@var{frame} is owned by @var{account}, so don't destroy it.
@end deftypefun
@node Account Type API, Account Getters, General Account API, Accounts
@subsection Account Type API
@deftypefun {const char *} xaccAccountGetTypeStr (GNCAccountType @var{type})
Return a string corresponding to the given Account type suitable for
display by a GUI. The string is translated with gettext according to
the current locale.
@end deftypefun
@deftypefun {char *} xaccAccountTypeEnumAsString (GNCAccountType @var{type})
Return a string corresponding to the given Account type. The string
is not translated and is independent of the current locale.
@end deftypefun
@deftypefun gboolean xaccAccountStringToType (const char * @var{str}, GNCAccountType * @var{type})
Converts a string of the form returned by @code{xaccAccountTypeEnumAsString}
to a type, return in @var{type}. Returns true if the string corresponds
to an actual type.
@end deftypefun
@deftypefun GNCAccountType xaccAccountStringToEnum (const char * @var{str})
Similar to @code{xaccAccountStringToEnum}, but returns the type. If
@var{str} does not correspond to any valid type, @code{BAD_TYPE} is
returned.
@end deftypefun
@deftypefun gboolean xaccAccountTypesCompatible (GNCAccountType @var{parent_type}, GNCAccountType @var{child_type})
Returns TRUE if accounts of type @var{parent_type} can have child accounts
of type @var{child_type}. This compatibility is not enforced by the
engine, but one day it may be!
@end deftypefun
@node Account Getters, Account Tax API, Account Type API, Accounts
@subsection Account Getters
@deftypefun GNCAccountType xaccAccountGetType (Account * @var{account})
Return the type of @var{account}.
@end deftypefun
@deftypefun {const char *} xaccAccountGetName (Account * @var{account})
Return the name of @var{account}.
@end deftypefun
@deftypefun {const char *} xaccAccountGetCode (Account * @var{account})
Return the code of @var{account}.
@end deftypefun
@deftypefun {const char *} xaccAccountGetDescription (Account * @var{account})
Return the description of @var{account}.
@end deftypefun
@deftypefun {const char *} xaccAccountGetNotes (Account * @var{account})
Return the notes of @var{account}.
@end deftypefun
@deftypefun {gnc_commodity *} xaccAccountGetCurrency (Account * @var{account})
Return the currency of @var{account}.
@end deftypefun
@deftypefun int xaccAccountGetCurrencySCU (Account * @var{account})
Return the SCU (smallest convertible unit) of @var{account}'s
currency.
@end deftypefun
@deftypefun {gnc_commodity *} xaccAccountGetSecurity (Account * @var{account})
Return the security of @var{account}. For accounts without shares, this
field will be @code{NULL}.
@end deftypefun
@deftypefun int xaccAccountGetSecuritySCU (Account * @var{account})
Return the SCU (smallest convertible unit) of @var{account}'s
security.
@end deftypefun
@deftypefun {gnc_commodity *} xaccAccountGetEffectiveSecurity (Account * @var{account})
Get the `effective' security of the account. If the account has a non-NULL
security field, that field will be returned. Otherwise, the currency will
be returned.
@end deftypefun
@deftypefun {AccountGroup *} xaccAccountGetChildren (Account * @var{account})
Return the child group of @var{account}. The child group may be @code{NULL},
indicating @var{account} has no children.
@end deftypefun
@deftypefun {AccountGroup *} xaccAccountGetParent (Account * @var{account})
Return the parent Group of @var{account}. The parent may be @code{NULL},
indicating @var{account} is a top-level Account. However, even if the
parent is not @code{NULL}, the account may still be top-level if the
parent Group has no parent Account.
@end deftypefun
@deftypefun {Account *} xaccAccountGetParentAccount (Account * @var{account})
Similar to @code{xaccAccountGetParent}, but returns the parent Account
of the parent Group if the parent Group exists. Otherwise, returns
@code{NULL}.
@end deftypefun
@deftypefun gnc_numeric xaccAccountGetBalance (Account * @var{account})
Return the balance of @var{account}, which is also the balance of the
last Split in @var{account}. If there are no Splits, the balance is
zero. The balance is denominated in the Account currency.
@end deftypefun
@deftypefun gnc_numeric xaccAccountGetClearedBalance (Account * @var{account})
Return the cleared balance of @var{account}. The cleared balance is the
balance of all Splits in @var{account} which are either cleared or
reconciled or frozen. The cleared balance is denominated in the Account
currency.
@end deftypefun
@deftypefun gnc_numeric xaccAccountGetReconciledBalance (Account * @var{account})
Return the reconciled balance of @var{account}. The reconciled balance
is the balance of all Splits in @var{account} which are reconciled or
frozen. The reconciled balance is denominated in the Account currency.
@end deftypefun
@deftypefun gnc_numeric xaccAccountGetShareBalance (Account *account)
Return the share balance of @var{account}, which is also the share
balance of the last Split in @var{account}. If there are no Splits, the
balance is zero. The balance is denominated in the Account security, if
the Account security exits; otherwise the share balance is denominated
in the Account currency.
@end deftypefun
@deftypefun gnc_numeric xaccAccountGetShareClearedBalance (Account * @var{account})
Return the cleared share balance of @var{account}. The cleared share
balance is the share balance of all Splits in @var{account} which are
either cleared or reconciled or frozen. The cleared share balance is
denominated as the share balance.
@end deftypefun
@deftypefun gnc_numeric xaccAccountGetShareReconciledBalance (Account * @var{account})
Return the reconciled share balance of @var{account}. The reconciled
share balance is the share balance of all Splits in @var{account} which
are reconciled or frozen. The reconciled sharea balance is denominated
as the share balance.
@end deftypefun
@deftypefun gnc_numeric xaccAccountGetBalanceAsOfDate (Account * @var{account}, time_t @var{date})
Return the balance of @var{account} including all Splits whose parent
Transactions have posted dates on or before @var{date}.
@end deftypefun
@deftypefun gnc_numeric xaccAccountGetShareBalanceAsOfDate (Account * @var{account}, time_t @var{date})
Return the share balance of @var{account} including all Splits whose
parent Transactions have posted dates on or before @var{date}.
@end deftypefun
@deftypefun {GList *} xaccAccountGetSplitList (Account * @var{account})
Return a @code{GList} of the Splits in @var{account}. This list must
not be modified in any way.
@end deftypefun
@deftypefun {char *} xaccAccountGetFullName (Account * @var{account}, const char @var{separator})
Returns the fully qualified name of @var{account} using the given
separator character. The name must be g_freed after use. The fully
qualified name of an account is the concatenation of the names of the
account and all its ancestor accounts starting with the topmost account
and ending with the given account. Each name is separated by the given
character.
@end deftypefun
@node Account Tax API, , Account Getters, Accounts
@subsection Account Tax API
This set of API calls is related to tax information. All accounts have a
tax-related boolean flag that can be set or unset. There is an
additional set of API calls related to United States taxes that have
`US' in the function call names. Future API calls that are specific to
other countries should include the appropriate 2-letter country code in
the function names.
@deftypefun gboolean xaccAccountGetTaxRelated (Account * @var{account})
Return the tax-related flag of @var{account}.
@end deftypefun
@deftypefun void xaccAccountSetTaxRelated (Account * @var{account}, gboolean @var{tax_related})
Set the tax-related flag of @var{account}.
@end deftypefun
@deftypefun {const char *} xaccAccountGetTaxUSCode (Account * @var{account})
Get the US-specific tax code associated with @var{account}, or
@code{NULL} if there is none. These codes are internal to GnuCash
and currently defined in @file{src/scm/report/txf-export.scm}.
@end deftypefun
@deftypefun void xaccAccountSetTaxUSCode (Account * @var{account}, const char * @var{code})
Set the US-specific tax code associated with @var{account}.
@end deftypefun
@deftypefun {const char *} xaccAccountGetTaxUSPayerNameSource (Account * @var{account})
Get the payer name source associated with @var{account}. See
@file{src/scm/repot/taxtxf.scm} for details.
@end deftypefun
@deftypefun void xaccAccountSetTaxUSPayerNameSource (Account * @var{account}, const char * @var{source})
Set the payer name source associated with @var{account}.
@end deftypefun
@node Account Groups, GNCBooks, Accounts, Engine
@section Account Groups
@tindex AccountGroup
Account Groups are used by the Engine to connect Accounts
together into an Account hierarchy. Account Groups do not
correspond to any accounting concept -- they are specific
to the GnuCash engine. Account Groups contain the following
pieces of information:
@table @asis
@item A list of Accounts
The list Accounts in the Group.
@item A not-saved flag
Indicates whether any information in the hierarchy
rooted at the Group needs to be saved. That includes
Accounts, Splits, and Transactions.
@end table
Account Groups do not have key-value frames or GUIDs.
@menu
* General Account Group API::
* Account Group Account API::
@end menu
@node General Account Group API, Account Group Account API, Account Groups, Account Groups
@subsection General Account Group API
@deftypefun {AccountGroup *} xaccMallocAccountGroup (void)
Return a newly-allocated & initialized Account Group.
The Group must be freed with @code{xaccFreeAccountGroup}.
@end deftypefun
@deftypefun void xaccFreeAccountGroup (AccountGroup * @var{account_group})
Free the given Group and all its resources, including the Accounts.
@end deftypefun
@deftypefun void xaccAccountGroupCommitEdit (AccountGroup * @var{grp})
Recursively call @code{xaccAccountCommitEdit} on all child accounts
and their children.
@end deftypefun
@deftypefun void xaccGroupConcatGroup (AccountGroup * @var{to}, AccountGroup * @var{from})
Move all accounts in @var{from} to @var{to}. After this function
returns, @var{from} will have been destroyed.
@end deftypefun
@deftypefun void xaccGroupMergeAccounts (AccountGroup * @var{grp})
Merge all accounts in @var{grp} that have the same name and description.
The semantics of this function are rather complex. Consult the
implementation before use!
@end deftypefun
@deftypefun gboolean xaccGroupNotSaved (AccountGroup * @var{grp})
Return true if @var{grp} has changes which have not been saved.
@end deftypefun
@deftypefun void xaccGroupMarkSaved (AccountGroup * @var{grp})
Mark @var{grp} and all its children as saved.
@end deftypefun
@deftypefun void xaccGroupMarkNotSaved (AccountGroup * @var{grp})
Mark @var{grp} as not saved.
@end deftypefun
@deftypefun void xaccGroupMarkDoFree (AccountGroup * @var{grp})
Mark all accounts in @var{grp} as slated for destruction. This will
improve the efficiency of destroying a large account hierarchy.
@end deftypefun
@node Account Group Account API, , General Account Group API, Account Groups
@subsection Account Group Account API
@deftypefun void xaccGroupRemoveAccount (AccountGroup * @var{grp}, Account * @var{account})
Remove @var{account} from @var{grp}. If @var{account} is not in
@var{grp}, the function will return without performing any action.
In no case will @var{account} be destroyed or modified.
@end deftypefun
@deftypefun void xaccAccountRemoveGroup (Account * @var{acc})
Remove @var{acc}'s child group. The child group is not otherwise
modified or destroyed.
@end deftypefun
@deftypefun void xaccGroupInsertAccount (AccountGroup * @var{grp}, Account * @var{acc})
Add @var{acc} to @var{grp}. If @var{acc} is in another Group, it will be
removed first.
@end deftypefun
@deftypefun void xaccAccountInsertSubAccount (Account * @var{parent}, Account * @var{child})
Like @code{xaccGroupInsertAccount}, but uses a parent Account instead
of a parent group. If @var{parent} does not have a child Group, one
will be created.
@end deftypefun
@deftypefun int xaccGroupGetNumSubAccounts (AccountGroup * @var{grp})
Return the total number of Accounts in the hierarchy rooted at @var{grp}.
@end deftypefun
@deftypefun int xaccGroupGetNumAccounts (AccountGroup * @var{grp})
Return the number of accounts in @var{grp}. This count does not
include Accounts lower in the hierarchy.
@end deftypefun
@deftypefun int xaccGroupGetDepth (AccountGroup * @var{grp})
Returns the length of the longest tree branch in the hierarchy
rooted at @var{grp}. Each link between an Account and its
(non-null) children counts as one unit of length.
@end deftypefun
@deftypefun {Account *} xaccGroupGetAccount (AccountGroup * @var{group}, int @var{index})
Return the @var{index}th Account in @var{group}, starting at zero.
If @var{index} is out of range, @code{NULL} is returned.
@end deftypefun
@deftypefun {GList *} xaccGroupGetSubAccounts (AccountGroup * @var{grp})
Return a list of the Accounts, including sub-Accounts, in @var{grp}. The
returned list should be freed with @code{g_list_free} when no longer
needed.
@end deftypefun
@deftypefun {GList *} xaccGroupGetAccountList (AccountGroup * @var{grp})
Return a list of the immediate children of @var{grp}. The returned list
should not be freed or modified in any way.
@end deftypefun
@node GNCBooks, Scrub, Account Groups, Engine
@section GNCBooks
@tindex GNCBook
The @dfn{GNCBook} interface encapsulates all the information about a
GnuCash dataset, including the methods used to read and write the
dataset to datastores. This class provides several important services:
@itemize
@item
Prevents multiple users from editing the same file at the same time,
thus avoiding lost data due to race conditions. Thus an 'open book'
implies that the associated file is locked.
@item
Provides a search path for the file to be edited. This should simplify
install & maintenance problems for users who may not have a good grasp
of what a file system is, or where they want to keep their data files.
@end itemize
The current implementation assumes the use of files and file locks;
however, the API was designed to be general enough to allow the use
of generic URL's, and/or implementation on top of SQL or other
database/persistent object technology.
@menu
* GNCBook API::
@end menu
@node GNCBook API, , GNCBooks, GNCBooks
@subsection GNCBook API
@deftypefun {GNCBook *} gnc_book_new (void)
Allocate, initialize, and return a new GNCBook. The new book will contain
a newly allocated AccountGroup.
@end deftypefun
@deftypefun void gnc_book_destroy (GNCBook * @var{book})
End any editing session associated with @var{book}, and free all
memory associated with it.
@end deftypefun
@deftypefun gboolean gnc_book_begin (GNCBook * @var{book}, const char * @var{book_id}, gboolean ignore_lock, gboolean create_if_nonexistent)
Begins a new book editing session. It takes as an argument the book id.
The book id must be a string in the form of a URI/URL. In the current
implementation, only one type of URI is supported, and that is the file
URI: anything of the form @url{file:/home/somewhere/somedir/file.xac}
The path part must be a valid path. The file-part must be a valid
GnuCash data file. Paths may be relative or absolute. If the path is
relative; that is, if the argument is @url{file:somefile.xac} then a
sequence of search paths are checked for a file of this name.
The 'ignore_lock' argument, if set to TRUE, will cause this routine to
ignore any file locks that it finds. If set to FALSE, then file locks
will be tested and obeyed.
If the file exists, can be opened and read, and a lock can be obtained
then a lock will be obtained and the function returns TRUE.
If the file/database doesn't exist, and the create_if_nonexistent flag
is set to TRUE, then the database is created.
Otherwise the function returns FALSE.
@end deftypefun
@deftypefun gboolean gnc_book_load (GNCBook * @var{book})
Load the data associated with the book. The function returns TRUE on
success.
@end deftypefun
@deftypefun GNCBackendError gnc_book_get_error (GNCBook * @var{book})
Obtain the reason for a failure. Standard errno values are used. 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.
Some important error values:
@table @code
@item EINVAL
bad argument
@item ETXTBSY
book id is in use; it's locked by someone else
@item ENOSYS
unsupported URI type
@item ERANGE
file path too long
@item ENOLCK
book not open when @code{gnc_book_save()} was called.
@end table
@end deftypefun
@deftypefun {const char *} gnc_book_get_error_message (GNCBook * @var{book})
Return a string describing the reason for the current error. Calling
this routine resets the error value.
@end deftypefun
@deftypefun GNCBackendError gnc_book_pop_error (GNCBook * @var{book})
Same as @code{gnc_book_get_error}, but the error value is reset
in @var{book}.
@end deftypefun
@deftypefun {AccountGroup *} gnc_book_get_group (GNCBook * @var{book})
Return the current top-level account group.
@end deftypefun
@deftypefun void gnc_book_set_group (GNCBook * @var{book}, AccountGroup * @var{topgroup})
Set the topgroup to a new value.
@end deftypefun
@deftypefun {const char *} gnc_book_get_file_path (GNCBook * @var{book})
Return the fully-qualified file path for the book. That is, if a
relative or partial filename was for the book, then it had to have been
fully resolved to open the book. This routine returns the result of this
resolution.
@end deftypefun
@deftypefun gboolean gnc_book_save_may_clobber_data (GNCBook * @var{book})
Return TRUE if saving the book would overwrite other information.
@end deftypefun
@deftypefun void gnc_book_save (GNCBook * @var{book})
Commit all changes that have been made to the book.
@end deftypefun
@deftypefun void gnc_book_end (GNCBook * @var{book})
Release the session lock. It will @emph{not} save the account group to
a file. Thus, this method acts as an "abort" or "rollback" primitive.
@end deftypefun
@node Scrub, , GNCBooks, Engine
@section Scrub