From 591505ef854aecb6b35c00fca9d58d54fe513eb8 Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Sat, 29 Mar 2008 22:43:42 -0400 Subject: [PATCH] Add close_file arg to saxdb_close_context(); allocate all saxdb contexts from heap. src/saxdb.h (saxdb_close_context): Add "close_file" argument. src/saxdb.c (saxdb_write_db): Use saxdb_{open,close}_context() rather than putting it on the stack. (write_database): Likewise. (saxdb_close_context): Implement the close_file argument. src/modcmd.c (cmd_dump_messages): Use the close_file argument. src/mod-helpserv.c (helpserv_log_request): Likewise. --- src/mod-helpserv.c | 3 +-- src/modcmd.c | 6 ++---- src/saxdb.c | 43 +++++++++++++++++++++---------------------- src/saxdb.h | 2 +- 4 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/mod-helpserv.c b/src/mod-helpserv.c index f1d6b8f..e360db9 100644 --- a/src/mod-helpserv.c +++ b/src/mod-helpserv.c @@ -726,8 +726,7 @@ static void helpserv_log_request(struct helpserv_request *req, const char *reaso saxdb_write_string(ctx, KEY_REQUEST_CLOSEREASON, reason); saxdb_write_string_list(ctx, KEY_REQUEST_TEXT, req->text); saxdb_end_record(ctx); - saxdb_close_context(ctx); - fflush(reqlog_f); + saxdb_close_context(ctx, 0); } } diff --git a/src/modcmd.c b/src/modcmd.c index cc298a9..7ae19af 100644 --- a/src/modcmd.c +++ b/src/modcmd.c @@ -1835,15 +1835,13 @@ static MODCMD_FUNC(cmd_dump_messages) { return 0; } if ((res = setjmp(*saxdb_jmp_buf(ctx))) != 0) { - saxdb_close_context(ctx); - fclose(pf); + saxdb_close_context(ctx, 1); reply("MCMSG_MESSAGE_DUMP_FAILED", strerror(res)); return 0; } else { for (it = dict_first(lang_C->messages); it; it = iter_next(it)) saxdb_write_string(ctx, iter_key(it), iter_data(it)); - saxdb_close_context(ctx); - fclose(pf); + saxdb_close_context(ctx, 1); reply("MCMSG_MESSAGES_DUMPED", fname); return 1; } diff --git a/src/saxdb.c b/src/saxdb.c index d504702..88c578d 100644 --- a/src/saxdb.c +++ b/src/saxdb.c @@ -126,37 +126,34 @@ saxdb_register(const char *name, saxdb_reader_func_t *reader, saxdb_writer_func_ static int saxdb_write_db(struct saxdb *db) { - struct saxdb_context ctx; + struct saxdb_context *ctx; + FILE *output; char tmp_fname[MAXLEN]; int res, res2; unsigned long start, finish; assert(db->filename); sprintf(tmp_fname, "%s.new", db->filename); - memset(&ctx, 0, sizeof(ctx)); - ctx.output = fopen(tmp_fname, "w+"); - int_list_init(&ctx.complex); - if (!ctx.output) { + output = fopen(tmp_fname, "w+"); + if (!output) { log_module(MAIN_LOG, LOG_ERROR, "Unable to write to %s: %s", tmp_fname, strerror(errno)); - int_list_clean(&ctx.complex); return 1; } + ctx = saxdb_open_context(output); start = time(NULL); - if ((res = setjmp(*saxdb_jmp_buf(&ctx))) || (res2 = db->writer(&ctx))) { + if ((res = setjmp(*saxdb_jmp_buf(ctx))) || (res2 = db->writer(ctx))) { if (res) { log_module(MAIN_LOG, LOG_ERROR, "Error writing to %s: %s", tmp_fname, strerror(res)); } else { log_module(MAIN_LOG, LOG_ERROR, "Internal error %d while writing to %s", res2, tmp_fname); } - int_list_clean(&ctx.complex); - fclose(ctx.output); + ctx->complex.used = 0; /* Squelch asserts about unbalanced output. */ + saxdb_close_context(ctx, 1); remove(tmp_fname); return 2; } finish = time(NULL); - assert(ctx.complex.used == 0); - int_list_clean(&ctx.complex); - fclose(ctx.output); + saxdb_close_context(ctx, 1); if (rename(tmp_fname, db->filename) < 0) { log_module(MAIN_LOG, LOG_ERROR, "Unable to rename %s to %s: %s", tmp_fname, db->filename, strerror(errno)); } @@ -537,21 +534,19 @@ write_database_helper(struct saxdb_context *ctx, struct dict *db) { int write_database(FILE *out, struct dict *db) { - struct saxdb_context ctx; + struct saxdb_context *ctx; int res; - ctx.output = out; - ctx.indent = 0; - int_list_init(&ctx.complex); - if (!(res = setjmp(*saxdb_jmp_buf(&ctx)))) { - write_database_helper(&ctx, db); + ctx = saxdb_open_context(out); + if (!(res = setjmp(*saxdb_jmp_buf(ctx)))) { + write_database_helper(ctx, db); } else { log_module(MAIN_LOG, LOG_ERROR, "Exception %d caught while writing to stream", res); - int_list_clean(&ctx.complex); + ctx->complex.used = 0; /* Squelch asserts about unbalanced output. */ + saxdb_close_context(ctx, 0); return 1; } - assert(ctx.complex.used == 0); - int_list_clean(&ctx.complex); + saxdb_close_context(ctx, 0); return 0; } @@ -574,8 +569,12 @@ saxdb_jmp_buf(struct saxdb_context *ctx) { void -saxdb_close_context(struct saxdb_context *ctx) { +saxdb_close_context(struct saxdb_context *ctx, int close_file) { assert(ctx->complex.used == 0); int_list_clean(&ctx->complex); + if (close_file) + fclose(ctx->output); + else + fflush(ctx->output); free(ctx); } diff --git a/src/saxdb.h b/src/saxdb.h index bf928c2..de1bbfe 100644 --- a/src/saxdb.h +++ b/src/saxdb.h @@ -52,6 +52,6 @@ void saxdb_write_sint(struct saxdb_context *dest, const char *name, long value); /* For doing db writing by hand */ struct saxdb_context *saxdb_open_context(FILE *f); jmp_buf *saxdb_jmp_buf(struct saxdb_context *ctx); -void saxdb_close_context(struct saxdb_context *ctx); +void saxdb_close_context(struct saxdb_context *ctx, int close_file); #endif /* !defined(DBMGR_H) */ -- 2.20.1