[Gnucash-changes] Add QofBackendOption to compress QSF
Neil Williams
codehelp at cvs.gnucash.org
Sat Oct 1 13:55:04 EDT 2005
Log Message:
-----------
Add QofBackendOption to compress QSF
Tags:
----
gnucash-gnome2-dev
Modified Files:
--------------
gnucash/src/backend/qsf:
qsf-backend.c
Revision Data
-------------
Index: qsf-backend.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/qsf/Attic/qsf-backend.c,v
retrieving revision 1.1.2.18
retrieving revision 1.1.2.19
diff -Lsrc/backend/qsf/qsf-backend.c -Lsrc/backend/qsf/qsf-backend.c -u -r1.1.2.18 -r1.1.2.19
--- src/backend/qsf/qsf-backend.c
+++ src/backend/qsf/qsf-backend.c
@@ -24,33 +24,50 @@
#define _GNU_SOURCE
+#include "qof-backend-qsf.h"
#include "qsf-xml.h"
#include "qsf-dir.h"
-#include "qof-backend-qsf.h"
#include <errno.h>
#include <sys/stat.h>
#define QSF_TYPE_BINARY "binary"
#define QSF_TYPE_GLIST "glist"
#define QSF_TYPE_FRAME "frame"
+#define QSF_COMPRESS "compression_level"
-static int module = MOD_BACKEND;
+static QofLogModule log_module = QOF_MOD_QSF;
+static int use_gz_level = 0;
+
+static void option_cb (QofBackendOption *option, gpointer data)
+{
+ if(0 == safe_strcmp(QSF_COMPRESS, option->option_name)) {
+ use_gz_level = *(gint*)option->value;
+ }
+}
static void
qsf_load_config(QofBackend *be, KvpFrame *config)
{
-
+ qof_backend_option_foreach(config, option_cb, NULL);
}
static KvpFrame*
qsf_get_config(QofBackend *be)
{
+ QofBackendOption *option;
+
if(!be) { return NULL; }
- if(!kvp_frame_is_empty(be->backend_configuration)) {
- kvp_frame_delete(be->backend_configuration);
- be->backend_configuration = kvp_frame_new();
- }
- return be->backend_configuration;
+ qof_backend_prepare_frame(be);
+ option = g_new0(QofBackendOption, 1);
+ option->option_name = QSF_COMPRESS;
+ option->description = _("Level of compression to use: 0 for none, 9 for highest.");
+ option->tooltip = _("QOF can compress QSF XML files using gzip. "
+ "Note that compression is not used when outputting to STDOUT.");
+ option->type = KVP_TYPE_GINT64;
+ option->value = (gpointer)&use_gz_level;
+ qof_backend_prepare_option(be, option);
+ g_free(option);
+ return qof_backend_complete_frame(be);
}
struct QSFBackend_s
@@ -738,22 +755,26 @@
}
static void
-write_qsf_from_book(FILE *out, QofBook *book)
+write_qsf_from_book(const char *path, QofBook *book)
{
xmlDocPtr qsf_doc;
gint write_result;
QofBackend *be;
+ be = qof_book_get_backend(book);
qsf_doc = qofbook_to_qsf(book);
write_result = 0;
+ if((use_gz_level > 0) && (use_gz_level <= 9))
+ {
+ xmlSetDocCompressMode(qsf_doc, use_gz_level);
+ }
g_return_if_fail(qsf_is_valid(QSF_SCHEMA_DIR, QSF_OBJECT_SCHEMA, qsf_doc) == TRUE);
- write_result = xmlDocFormatDump(out, qsf_doc, 1);
- if(write_result < 0) {
- be = qof_book_get_backend(book);
+ write_result = xmlSaveFormatFileEnc(path, qsf_doc, "UTF-8", 1);
+ if(write_result < 0)
+ {
qof_backend_set_error(be, ERR_FILEIO_WRITE_ERROR);
return;
}
- fprintf(out, "\n");
xmlFreeDoc(qsf_doc);
}
@@ -764,16 +785,16 @@
qsf_doc = qofbook_to_qsf(book);
g_return_if_fail(qsf_is_valid(QSF_SCHEMA_DIR, QSF_OBJECT_SCHEMA, qsf_doc) == TRUE);
- xmlDocFormatDump(stdout, qsf_doc, 1);
+ xmlSaveFormatFileEnc("-", qsf_doc, "UTF-8", 1);
fprintf(stdout, "\n");
xmlFreeDoc(qsf_doc);
+ LEAVE (" ");
}
void
qsf_write_file(QofBackend *be, QofBook *book)
{
QSFBackend *qsf_be;
- FILE *out;
char *path;
qsf_be = (QSFBackend*)be;
@@ -783,14 +804,8 @@
return;
}
path = strdup(qsf_be->fullpath);
- out = fopen(path, "w");
- if (!out) {
- qof_backend_set_error(be, ERR_FILEIO_WRITE_ERROR);
- return;
- }
- write_qsf_from_book(out, book);
+ write_qsf_from_book(path, book);
g_free(path);
- fclose(out);
}
/* QofBackend routine to load from file - needs a map.
@@ -1135,6 +1150,7 @@
qsf_provider_init(void)
{
QofBackendProvider *prov;
+
#ifdef ENABLE_NLS
setlocale (LC_ALL, "");
bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
@@ -1147,7 +1163,6 @@
prov->partial_book_supported = TRUE;
prov->backend_new = qsf_backend_new;
prov->check_data_type = qsf_determine_file_type;
- prov->provider_config = "qsf-backend-v0.1.xml";
prov->provider_free = qsf_provider_free;
qof_backend_register_provider (prov);
}
More information about the gnucash-changes
mailing list