Add close_file arg to saxdb_close_context(); allocate all saxdb contexts from heap.
authorMichael Poole <mdpoole@troilus.org>
Sun, 30 Mar 2008 02:43:42 +0000 (22:43 -0400)
committerMichael Poole <mdpoole@troilus.org>
Sun, 30 Mar 2008 02:43:42 +0000 (22:43 -0400)
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
src/modcmd.c
src/saxdb.c
src/saxdb.h

index f1d6b8f2b6116c332986115019f20da2d5052a33..e360db963379bcac14bb7b58b505aeeaa83c342b 100644 (file)
@@ -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);
     }
 }
 
index cc298a9a0cced2bf94a08923bc9b3c89ffdd2fe9..7ae19af97739b126432fa2bf6415c2e7531526a6 100644 (file)
@@ -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;
     }
index d504702bad104bd0c18d3a82ba2cd6b5ae6a3bc9..88c578d08e00aba9e3b226f34faa1c1407b5cdab 100644 (file)
@@ -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);
 }
index bf928c28b03ddf92137309e8d7f4f6b975baa2a0..de1bbfe6f318d7bf15cef8be0126cb349396fc41 100644 (file)
@@ -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) */