mirror of
https://github.com/Gnucash/gnucash.git
synced 2024-11-29 20:24:25 -06:00
83d14e1c1c
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.
2827 lines
101 KiB
Plaintext
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
|