Changeset: 1a13fada1eeb for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1a13fada1eeb Modified Files: sql/backends/monet5/sql_result.c Branch: protocol Log Message:
Proper cleanup. diffs (171 lines): diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c --- a/sql/backends/monet5/sql_result.c +++ b/sql/backends/monet5/sql_result.c @@ -1870,21 +1870,24 @@ static int mvc_export_resultset_prot10(r size_t row = 0; size_t srow = 0; size_t varsized = 0; - lng *var_col_len; - BATiter *iterators; + lng *var_col_len = NULL; + BATiter *iterators = NULL; lng fixed_lengths = 0; + int fres = -1; - iterators = GDKmalloc(sizeof(BATiter) * t->nr_cols); - var_col_len = GDKmalloc(sizeof(lng) * t->nr_cols); + iterators = GDKzalloc(sizeof(BATiter) * t->nr_cols); + var_col_len = GDKzalloc(sizeof(lng) * t->nr_cols); if (!iterators || !var_col_len) { - return -1; + fres = -1; + goto cleanup; } if (t->order) { order = BBPquickdesc(t->order, FALSE); if (!order) { - return -1; + fres = -1; + goto cleanup; } count = BATcount(order); } else { @@ -1892,7 +1895,8 @@ static int mvc_export_resultset_prot10(r } if (!mnstr_writeStr(s, "*\n") || !mnstr_writeInt(s, t->id) || !mnstr_writeLng(s, count) || !mnstr_writeLng(s, (lng) t->nr_cols)) { - return -1; + fres = -1; + goto cleanup; } for (i = 0; i < (size_t) t->nr_cols; i++) { @@ -1930,7 +1934,8 @@ static int mvc_export_resultset_prot10(r break; #endif default: - return -1; + fres = -1; + goto cleanup; } if (res == MAL_SUCCEED) { mtype = TYPE_dbl; @@ -1938,7 +1943,8 @@ static int mvc_export_resultset_prot10(r BBPunfix(iterators[i].b->batCacheid); iterators[i].b = BATdescriptor(result); } else { - return -1; + fres = -1; + goto cleanup; } } @@ -1956,12 +1962,14 @@ static int mvc_export_resultset_prot10(r if (!mnstr_writeLng(s, (lng)(strlen(c->tn) + strlen(c->name) + strlen(c->type.type->sqlname) + sizeof(int) + 3)) || !write_str_term(s, c->tn) || !write_str_term(s, c->name) || !write_str_term(s, c->type.type->sqlname) || !mnstr_writeInt(s, typelen)) { - return -1; + fres = -1; + goto cleanup; } // write NULL values for this column to the stream // NULL values are encoded as <size:int> <NULL value> (<size> is always <typelen> for fixed size columns) if (!mnstr_writeInt(s, nil_len)) { - return -1; + fres = -1; + goto cleanup; } switch(ATOMstorage(mtype)) { @@ -1992,10 +2000,12 @@ static int mvc_export_resultset_prot10(r break; default: assert(0); - return -1; + fres = -1; + goto cleanup; } if (!retval) { - return -1; + fres = -1; + goto cleanup; } } mnstr_flush(s); @@ -2052,7 +2062,8 @@ static int mvc_export_resultset_prot10(r if (!mnstr_readChr(c, &cont_req)) { fprintf(stderr, "Received cancellation message.\n"); - return -1; + fres = -1; + goto cleanup; } // consume flush from client @@ -2072,7 +2083,8 @@ static int mvc_export_resultset_prot10(r assert(bs2_buffer(s).pos == 0); if (!mnstr_writeLng(s, (lng)(row - srow))) { - return -1; + fres = -1; + goto cleanup; } for (i = 0; i < (size_t) t->nr_cols; i++) { @@ -2092,14 +2104,16 @@ static int mvc_export_resultset_prot10(r fprintf(stderr, "Write strings to %zu\n", bufpos); #endif if (!mnstr_writeLng(s, var_col_len[i])) { - return -1; + fres = -1; + goto cleanup; } for (crow = srow; crow < row; crow++) { #ifdef PROT10_DEBUG bufpos += strlen((char*) BUNtail(iterators[i], crow)) + 1; #endif if (!write_str_term(s, (char*) BUNtail(iterators[i], crow))) { - return -1; + fres = -1; + goto cleanup; } } } else { @@ -2112,7 +2126,8 @@ static int mvc_export_resultset_prot10(r bufpos += (atom_size * (row - srow)); #endif if (mnstr_write(s, Tloc(iterators[i].b, srow), atom_size, row - srow) != (ssize_t) (row - srow)) { - return -1; + fres = -1; + goto cleanup; } } } @@ -2122,11 +2137,23 @@ static int mvc_export_resultset_prot10(r #endif if (mnstr_flush(s) < 0) { fprintf(stderr, "Failed to flush.\n"); - return -1; + fres = -1; + goto cleanup; } srow = row; } - return 0; +cleanup: + if (var_col_len) + GDKfree(var_col_len); + if (iterators) { + for(i = 0; i < t->nr_cols; i++) { + if (iterators[i].b) { + BBPunfix(iterators[i].b->batCacheid); + } + } + GDKfree(iterators); + } + return fres; } int _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list