mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
turn on book support in the file backend
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@6441 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
6b2a678e53
commit
50d07c4a17
@ -41,10 +41,12 @@
|
||||
#include "gnc-xml.h"
|
||||
#include "io-gncxml-gen.h"
|
||||
#include "io-gncxml-v2.h"
|
||||
#include "io-utils.h"
|
||||
|
||||
#include "sixtp-dom-parsers.h"
|
||||
#include "gnc-book-p.h"
|
||||
#include "gnc-book.h"
|
||||
#include "gnc-engine-util.h"
|
||||
#include "Group.h"
|
||||
|
||||
const gchar *book_version_string = "2.0.0";
|
||||
@ -54,6 +56,7 @@ const gchar *book_version_string = "2.0.0";
|
||||
#define book_id_string "book:id"
|
||||
#define book_slots_string "book:slots"
|
||||
|
||||
static short module = MOD_IO;
|
||||
|
||||
/* ================================================================ */
|
||||
|
||||
@ -246,6 +249,50 @@ gnc_book_end_handler(gpointer data_for_children,
|
||||
return book != NULL;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gnc_book_id_end_handler(gpointer data_for_children,
|
||||
GSList* data_from_children, GSList* sibling_data,
|
||||
gpointer parent_data, gpointer global_data,
|
||||
gpointer *result, const gchar *tag)
|
||||
{
|
||||
gboolean successful;
|
||||
xmlNodePtr tree = (xmlNodePtr)data_for_children;
|
||||
gxpf_data *gdata = (gxpf_data*)global_data;
|
||||
GNCBook *book = gdata->bookdata;
|
||||
|
||||
if(parent_data) { return TRUE; }
|
||||
if(!tag) { return TRUE; }
|
||||
|
||||
g_return_val_if_fail(tree, FALSE);
|
||||
|
||||
successful = book_id_handler (tree, book);
|
||||
xmlFreeNode(tree);
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gnc_book_slots_end_handler(gpointer data_for_children,
|
||||
GSList* data_from_children, GSList* sibling_data,
|
||||
gpointer parent_data, gpointer global_data,
|
||||
gpointer *result, const gchar *tag)
|
||||
{
|
||||
gboolean successful;
|
||||
xmlNodePtr tree = (xmlNodePtr)data_for_children;
|
||||
gxpf_data *gdata = (gxpf_data*)global_data;
|
||||
GNCBook *book = gdata->bookdata;
|
||||
|
||||
if(parent_data) { return TRUE; }
|
||||
if(!tag) { return TRUE; }
|
||||
|
||||
g_return_val_if_fail(tree, FALSE);
|
||||
|
||||
successful = book_slots_handler (tree, book);
|
||||
xmlFreeNode(tree);
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
GNCBook*
|
||||
dom_tree_to_book (xmlNodePtr node, GNCBook *book)
|
||||
{
|
||||
@ -255,6 +302,7 @@ dom_tree_to_book (xmlNodePtr node, GNCBook *book)
|
||||
book);
|
||||
if (!successful)
|
||||
{
|
||||
PERR ("failed to parse book");
|
||||
book = NULL;
|
||||
}
|
||||
|
||||
@ -266,3 +314,16 @@ gnc_book_sixtp_parser_create(void)
|
||||
{
|
||||
return sixtp_dom_parser_new(gnc_book_end_handler, NULL, NULL);
|
||||
}
|
||||
|
||||
sixtp*
|
||||
gnc_book_id_sixtp_parser_create(void)
|
||||
{
|
||||
return sixtp_dom_parser_new(gnc_book_id_end_handler, NULL, NULL);
|
||||
}
|
||||
|
||||
sixtp*
|
||||
gnc_book_slots_sixtp_parser_create(void)
|
||||
{
|
||||
return sixtp_dom_parser_new(gnc_book_slots_end_handler, NULL, NULL);
|
||||
}
|
||||
|
||||
|
@ -39,6 +39,8 @@ sixtp* gnc_account_sixtp_parser_create(void);
|
||||
|
||||
xmlNodePtr gnc_book_dom_tree_create(GNCBook *book);
|
||||
sixtp* gnc_book_sixtp_parser_create(void);
|
||||
sixtp* gnc_book_id_sixtp_parser_create(void);
|
||||
sixtp* gnc_book_slots_sixtp_parser_create(void);
|
||||
|
||||
xmlNodePtr gnc_commodity_dom_tree_create(const gnc_commodity *com);
|
||||
sixtp* gnc_commodity_sixtp_parser_create(void);
|
||||
|
@ -51,6 +51,7 @@ static short module = MOD_IO;
|
||||
|
||||
|
||||
#define GNC_V2_STRING "gnc-v2"
|
||||
const gchar *book_version_string;
|
||||
|
||||
static void
|
||||
run_callback(sixtp_gdv2 *data, const char *type)
|
||||
@ -384,7 +385,7 @@ gnc_counter_end_handler(gpointer data_for_children,
|
||||
strval = dom_tree_to_text(tree);
|
||||
if(!string_to_gint64(strval, &val))
|
||||
{
|
||||
PWARN("string_to_gint64 failed with input: %s",
|
||||
PERR ("string_to_gint64 failed with input: %s",
|
||||
strval ? strval : "(null)");
|
||||
g_free (strval);
|
||||
xmlFree (type);
|
||||
@ -414,7 +415,7 @@ gnc_counter_end_handler(gpointer data_for_children,
|
||||
}
|
||||
else
|
||||
{
|
||||
PWARN("Unknown type: %s",
|
||||
PERR("Unknown type: %s",
|
||||
type ? type : "(null)");
|
||||
xmlFree (type);
|
||||
return FALSE;
|
||||
@ -450,6 +451,8 @@ print_counter_data(load_counter data)
|
||||
#endif
|
||||
|
||||
static const char *BOOK_TAG = "gnc:book";
|
||||
static const char *BOOK_ID_TAG = "book:id";
|
||||
static const char *BOOK_SLOTS_TAG = "book:slots";
|
||||
static const char *ACCOUNT_TAG = "gnc:account";
|
||||
static const char *PRICEDB_TAG = "gnc:pricedb";
|
||||
static const char *COMMODITY_TAG = "gnc:commodity";
|
||||
@ -502,13 +505,13 @@ generic_callback(const char *tag, gpointer globaldata, gpointer data)
|
||||
if(safe_strcmp(tag, BOOK_TAG) == 0)
|
||||
{
|
||||
add_book_local(gd, (GNCBook*)data);
|
||||
book_callback(tag, globaldata, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
// PWARN ("importing pre-book-style XML data file");
|
||||
}
|
||||
// xxx move me ...
|
||||
book_callback(tag, globaldata, data);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -521,6 +524,7 @@ gnc_session_load_from_xml_file_v2(
|
||||
sixtp_gdv2 *gd;
|
||||
sixtp *top_parser;
|
||||
sixtp *main_parser;
|
||||
sixtp *book_parser;
|
||||
|
||||
gd = g_new0(sixtp_gdv2, 1);
|
||||
|
||||
@ -544,6 +548,7 @@ gnc_session_load_from_xml_file_v2(
|
||||
|
||||
top_parser = sixtp_new();
|
||||
main_parser = sixtp_new();
|
||||
book_parser = sixtp_new();
|
||||
|
||||
if(!sixtp_add_some_sub_parsers(
|
||||
top_parser, TRUE,
|
||||
@ -556,6 +561,27 @@ gnc_session_load_from_xml_file_v2(
|
||||
if(!sixtp_add_some_sub_parsers(
|
||||
main_parser, TRUE,
|
||||
COUNT_DATA_TAG, gnc_counter_sixtp_parser_create(),
|
||||
BOOK_TAG, book_parser,
|
||||
|
||||
/* the following are present here only to support
|
||||
* the older, pre-book format. Basically, the top-level
|
||||
* book is implicit. */
|
||||
PRICEDB_TAG, gnc_pricedb_sixtp_parser_create(),
|
||||
COMMODITY_TAG, gnc_commodity_sixtp_parser_create(),
|
||||
ACCOUNT_TAG, gnc_account_sixtp_parser_create(),
|
||||
TRANSACTION_TAG, gnc_transaction_sixtp_parser_create(),
|
||||
SCHEDXACTION_TAG, gnc_schedXaction_sixtp_parser_create(),
|
||||
TEMPLATE_TRANSACTION_TAG, gnc_template_transaction_sixtp_parser_create(),
|
||||
NULL, NULL))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if(!sixtp_add_some_sub_parsers(
|
||||
book_parser, TRUE,
|
||||
BOOK_ID_TAG, gnc_book_id_sixtp_parser_create(),
|
||||
BOOK_SLOTS_TAG, gnc_book_slots_sixtp_parser_create(),
|
||||
COUNT_DATA_TAG, gnc_counter_sixtp_parser_create(),
|
||||
PRICEDB_TAG, gnc_pricedb_sixtp_parser_create(),
|
||||
COMMODITY_TAG, gnc_commodity_sixtp_parser_create(),
|
||||
ACCOUNT_TAG, gnc_account_sixtp_parser_create(),
|
||||
@ -672,6 +698,61 @@ compare_commodity_ids(gconstpointer a, gconstpointer b)
|
||||
gnc_commodity_get_mnemonic(cb)));
|
||||
}
|
||||
|
||||
static void write_pricedb (FILE *out, GNCBook *book);
|
||||
static void write_transactions (FILE *out, GNCBook *book);
|
||||
static void write_template_transaction_data (FILE *out, GNCBook *book);
|
||||
static void write_schedXactions(FILE *out, GNCBook *book);
|
||||
|
||||
static void
|
||||
write_book(FILE *out, GNCBook *book)
|
||||
{
|
||||
|
||||
#ifdef IMPLEMENT_BOOK_DOM_TREES_LATER
|
||||
/* We can't just blast out the dom tree, because the dom tree
|
||||
* doesn't have the books, transactions, etc underneath it.
|
||||
* But that is just as well, since I think the performance
|
||||
* will be much better if we write out as we go along
|
||||
*/
|
||||
xmlNodePtr node;
|
||||
|
||||
node = gnc_book_dom_tree_create(book);
|
||||
|
||||
if(!node)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
xmlElemDump(out, NULL, node);
|
||||
fprintf(out, "\n");
|
||||
|
||||
xmlFreeNode(node);
|
||||
#endif
|
||||
|
||||
fprintf( out, "<%s version=\"%s\">\n", BOOK_TAG, book_version_string );
|
||||
write_book_parts (out, book);
|
||||
|
||||
write_counts(out,
|
||||
"commodity",
|
||||
gnc_commodity_table_get_size(
|
||||
gnc_book_get_commodity_table(book)),
|
||||
"account",
|
||||
xaccGroupGetNumSubAccounts(gnc_book_get_group(book)),
|
||||
"transaction",
|
||||
gnc_book_count_transactions(book),
|
||||
"schedxaction",
|
||||
g_list_length( gnc_book_get_schedxactions(book) ),
|
||||
NULL);
|
||||
|
||||
write_commodities(out, book);
|
||||
write_pricedb(out, book);
|
||||
write_accounts(out, book);
|
||||
write_transactions(out, book);
|
||||
write_template_transaction_data(out, book);
|
||||
write_schedXactions(out, book);
|
||||
|
||||
fprintf( out, "</%s>\n", BOOK_TAG );
|
||||
}
|
||||
|
||||
void
|
||||
write_commodities(FILE *out, GNCBook *book)
|
||||
{
|
||||
@ -828,28 +909,10 @@ gnc_book_write_to_xml_filehandle_v2(GNCBook *book, FILE *out)
|
||||
write_v2_header (out);
|
||||
|
||||
write_counts(out,
|
||||
"commodity",
|
||||
gnc_commodity_table_get_size(
|
||||
gnc_book_get_commodity_table(book)),
|
||||
"account",
|
||||
xaccGroupGetNumSubAccounts(gnc_book_get_group(book)),
|
||||
"transaction",
|
||||
gnc_book_count_transactions(book),
|
||||
"schedxaction",
|
||||
g_list_length( gnc_book_get_schedxactions(book) ),
|
||||
"book", 1,
|
||||
NULL);
|
||||
|
||||
write_commodities(out, book);
|
||||
|
||||
write_pricedb(out, book);
|
||||
|
||||
write_accounts(out, book);
|
||||
|
||||
write_transactions(out, book);
|
||||
|
||||
write_template_transaction_data(out, book);
|
||||
|
||||
write_schedXactions(out, book);
|
||||
write_book(out, book);
|
||||
|
||||
fprintf(out, "</" GNC_V2_STRING ">\n\n");
|
||||
|
||||
@ -861,6 +924,7 @@ gnc_book_write_accounts_to_xml_filehandle_v2(GNCBook *book, FILE *out)
|
||||
{
|
||||
if (!out) return FALSE;
|
||||
|
||||
PWARN ("huhhhh ???? Who is using this thing ??? \n");
|
||||
write_v2_header (out);
|
||||
|
||||
write_counts(out,
|
||||
|
Loading…
Reference in New Issue
Block a user