Implement file compression.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@7773 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
David Hampton 2003-01-05 02:03:50 +00:00
parent ad710d157e
commit fe62ac23e9
7 changed files with 120 additions and 12 deletions

View File

@ -1,3 +1,15 @@
2003-01-04 David Hampton <hampton@employees.org>
* src/backend/file/io-gncxml-v2.c: Pipe the output through zlib if
the user requested compression. This request is either setting a
option in the preferences (for all files), or naming the
particular data file with a .gz extension. #88509
* src/backend/file/gnc-backend-file.c:
* src/gnome/top-level.c:
* src/app-utils/prefs.scm: Create a 'file compression' option and
pass the data into the backend.
2003-01-04 Derek Atkkins <derek@ihtfp.com>
* add a set of business accounts to the setup druid

View File

@ -511,6 +511,12 @@ without one.")
(N_ "General") (N_ "No account list setup on new file")
"j" (N_ "Don't popup the new account list dialog when you choose \"New File\" from the \"File\" menu") #f))
(gnc:register-configuration-option
(gnc:make-simple-boolean-option
(N_ "General") (N_ "Use file compression")
"k" (N_ "Compress the data file.")
#f))
(gnc:register-configuration-option
(gnc:make-number-range-option
(N_ "General") (N_ "Days to retain log files")

View File

@ -60,6 +60,7 @@ typedef enum
} GNCBookFileType;
static int file_retention_days = 0;
static gboolean file_compression = FALSE;
static void gnc_file_be_load_from_file(Backend *, GNCBook *);
@ -78,10 +79,10 @@ gnc_file_be_set_retention_days (int days)
file_retention_days = days;
}
int
gnc_file_be_get_retention_days (void)
void
gnc_file_be_set_compression (gboolean compress)
{
return file_retention_days;
file_compression = compress;
}
static void
@ -657,7 +658,7 @@ gnc_file_be_write_to_file(FileBackend *be, gboolean make_backup)
}
}
if(gnc_book_write_to_xml_file_v2(book, tmp_name))
if(gnc_book_write_to_xml_file_v2(book, tmp_name, file_compression))
{
/* Record the file's permissions before unlinking it */
rc = stat(datafile, &statbuf);

View File

@ -24,6 +24,8 @@
#include <glib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <zlib.h>
#include "gnc-book-p.h"
#include "gnc-engine.h"
@ -1165,15 +1167,69 @@ gnc_book_write_accounts_to_xml_filehandle_v2(Backend *be, GNCBook *book, FILE *o
return TRUE;
}
#define BUFLEN 4096
static FILE *
try_gz_open (const char *filename, const char *perms, gboolean use_gzip)
{
char buffer[BUFLEN];
unsigned bytes;
int filedes[2];
gzFile *out;
pid_t pid;
if (strstr(filename, ".gz.") != NULL) /* its got a temp extension */
use_gzip = TRUE;
if (!use_gzip)
return fopen(filename, perms);
//gboolean
//gnc_lookup_boolean_option( const char *section,
// const char *name,
// gboolean default_value)
//
if (pipe(filedes) < 0) {
PWARN("Pipe call failed. Opening uncompressed file.");
return fopen(filename, perms);
}
pid = fork();
switch (pid) {
case -1:
PWARN("Fork call failed. Opening uncompressed file.");
return fopen(filename, perms);
case 0: /* child */
close(filedes[1]);
out = gzopen(filename, perms);
if (out == NULL) {
PWARN("child gzopen failed\n");
exit(0);
}
while ((bytes = read(filedes[0], buffer, BUFLEN)) > 0)
gzwrite(out, buffer, bytes);
gzclose(out);
_exit(0);
default: /* parent */
sleep(2);
close(filedes[0]);
return fdopen(filedes[1], "w");
}
}
gboolean
gnc_book_write_to_xml_file_v2(
GNCBook *book,
const char *filename)
const char *filename,
gboolean compress)
{
FILE *out;
out = fopen(filename, "w");
if (out == NULL)
out = try_gz_open(filename, "w", compress);
if (out == NULL)
{
return FALSE;
}

View File

@ -126,7 +126,7 @@ gboolean gnc_session_load_from_xml_file_v2(GNCSession *session);
/* write all book info to a file */
gboolean gnc_book_write_to_xml_filehandle_v2(GNCBook *book, FILE *fh);
gboolean gnc_book_write_to_xml_file_v2(GNCBook *book, const char *filename);
gboolean gnc_book_write_to_xml_file_v2(GNCBook *book, const char *filename, gboolean compress);
/* write just the commodities and accounts to a file */
gboolean gnc_book_write_accounts_to_xml_filehandle_v2(Backend *be, GNCBook *book, FILE *fh);

View File

@ -28,6 +28,6 @@
Backend * gnc_backend_new (void);
void gnc_file_be_set_retention_days (int days);
int gnc_file_be_get_retention_days (void);
void gnc_file_be_set_compression (gboolean compress);
#endif

View File

@ -86,6 +86,8 @@ static void gnc_configure_auto_decimal_places_cb(gpointer);
static void gnc_configure_auto_decimal_places(void);
static void gnc_configure_file_be_retention_days_cb(gpointer);
static void gnc_configure_file_be_retention_days(void);
static void gnc_configure_file_be_compression_cb(gpointer);
static void gnc_configure_file_be_compression(void);
static void gnc_configure_register_font_cb(gpointer);
static void gnc_configure_register_font(void);
static void gnc_configure_register_hint_font_cb(gpointer);
@ -110,6 +112,7 @@ static SCM negative_color_callback_id = SCM_UNDEFINED;
static SCM auto_decimal_callback_id = SCM_UNDEFINED;
static SCM auto_decimal_places_callback_id = SCM_UNDEFINED;
static SCM log_retention_days_callback_id = SCM_UNDEFINED;
static SCM compression_callback_id = SCM_UNDEFINED;
static SCM register_font_callback_id = SCM_UNDEFINED;
static SCM register_hint_font_callback_id = SCM_UNDEFINED;
@ -376,6 +379,12 @@ gnc_gui_init (SCM command_line)
NULL, "General",
"Days to retain log files");
gnc_configure_file_be_compression();
compression_callback_id =
gnc_register_option_change_callback(gnc_configure_file_be_compression_cb,
NULL, "General",
"Use file compression");
gnc_configure_register_font();
register_font_callback_id =
gnc_register_option_change_callback(gnc_configure_register_font_cb,
@ -850,7 +859,7 @@ gnc_configure_auto_decimal_places (void)
/* gnc_configure_file_be_retention_days_cb
* Callback called when options change -
* sets auto decimal places option.
* sets days retained for the file backend.
*
* Args: Nothing
* Returns: Nothing
@ -862,7 +871,7 @@ gnc_configure_file_be_retention_days_cb (gpointer not_used)
}
/* gnc_configure_file_be_retention_days
* Pass the global value for the auto decimal places range to the engine.
* Pass the global value for the number of days to retain files to the file backend.
*
* Args: Nothing
* Returns: Nothing
@ -873,9 +882,33 @@ gnc_configure_file_be_retention_days (void)
gnc_file_be_set_retention_days
(gnc_lookup_number_option("General",
"Days to retain log files", 0));
}
/* gnc_configure_file_be_retention_days_cb
* Callback called when options change -
* sets days retained for the file backend.
*
* Args: Nothing
* Returns: Nothing
*/
static void
gnc_configure_file_be_compression_cb (gpointer not_used)
{
gnc_configure_file_be_compression ();
}
/* gnc_configure_file_be_retention_days
* Pass the global value for the number of days to retain files to the file backend.
*
* Args: Nothing
* Returns: Nothing
*/
static void
gnc_configure_file_be_compression (void)
{
gnc_file_be_set_compression
(gnc_lookup_boolean_option("General", "Use file compression", FALSE));
}
/* gnc_configure_register_font_cb
* Callback called when options change -