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

Reply via email to