Changeset: b519aec9f39c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b519aec9f39c
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_copyinto.c
        sql/backends/monet5/sql_copyinto.h
Branch: directappend
Log Message:

Reduce the number of parameters of mvc_import_table

By putting most of them in a struct.


diffs (204 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -2980,23 +2980,26 @@ mvc_import_table_wrap(Client cntxt, MalB
        BAT **b = NULL;
        ssize_t len = 0;
        sql_table *t = *(sql_table **) getArgReference(stk, pci, pci->retc + 0);
-       const char *tsep = *getArgReference_str(stk, pci, pci->retc + 1);
-       const char *rsep = *getArgReference_str(stk, pci, pci->retc + 2);
-       const char *ssep = *getArgReference_str(stk, pci, pci->retc + 3);
-       const char *ns = *getArgReference_str(stk, pci, pci->retc + 4);
+       struct csv_parameters csv_parms = {
+               .tsep = *getArgReference_str(stk, pci, pci->retc + 1),
+               .rsep = *getArgReference_str(stk, pci, pci->retc + 2),
+               .ssep = *getArgReference_str(stk, pci, pci->retc + 3),
+               .ns = *getArgReference_str(stk, pci, pci->retc + 4),
+               .nr = *getArgReference_lng(stk, pci, pci->retc + 6),
+               .offset = *getArgReference_lng(stk, pci, pci->retc + 7),
+               .best = *getArgReference_int(stk, pci, pci->retc + 8),
+               .escape = *getArgReference_int(stk, pci, pci->retc + 11),
+       };
+
        const char *fname = *getArgReference_str(stk, pci, pci->retc + 5);
-       lng sz = *getArgReference_lng(stk, pci, pci->retc + 6);
-       lng offset = *getArgReference_lng(stk, pci, pci->retc + 7);
        bool append_directly = false;
-       int besteffort = *getArgReference_int(stk, pci, pci->retc + 8);
-       if (besteffort >= 100) {
+       if (csv_parms.best >= 100) {
                // this matches the temporary ugliness in rel2bin_insert
-               besteffort -= 100;
+               csv_parms.best -= 100;
                append_directly = true;
        }
        char *fixed_widths = *getArgReference_str(stk, pci, pci->retc + 9);
        int onclient = *getArgReference_int(stk, pci, pci->retc + 10);
-       bool escape = *getArgReference_int(stk, pci, pci->retc + 11);
        str msg = MAL_SUCCEED;
        bstream *bstream_to_destroy;
        bstream *s;
@@ -3013,8 +3016,8 @@ mvc_import_table_wrap(Client cntxt, MalB
        /* The CSV parser expects ssep to have the value 0 if the user does not
         * specify a quotation character
         */
-       if (*ssep == 0 || strNil(ssep))
-               ssep = NULL;
+       if (*csv_parms.ssep == 0 || strNil(csv_parms.ssep))
+               csv_parms.ssep = NULL;
 
        if (strNil(fname))
                fname = NULL;
@@ -3025,11 +3028,12 @@ mvc_import_table_wrap(Client cntxt, MalB
        } else {
                if (onclient) {
                        mnstr_write(be->mvc->scanner.ws, PROMPT3, 
sizeof(PROMPT3)-1, 1);
-                       if (offset > 1 && rsep && rsep[0] == '\n' && rsep[1] == 
'\0') {
+                       if (csv_parms.offset > 1 && csv_parms.rsep && 
csv_parms.rsep[0] == '\n' && csv_parms.rsep[1] == '\0') {
                                /* only let client skip simple lines */
+                               //TODO shouldn't we return an error instead?
                                mnstr_printf(be->mvc->scanner.ws, "r " LLFMT " 
%s\n",
-                                            offset, fname);
-                               offset = 0;
+                                            csv_parms.offset, fname);
+                               csv_parms.offset = 0;
                        } else {
                                mnstr_printf(be->mvc->scanner.ws, "r 0 %s\n", 
fname);
                        }
@@ -3086,8 +3090,8 @@ mvc_import_table_wrap(Client cntxt, MalB
                                }
                        }
                        /* overwrite other delimiters to the ones the FWF 
stream uses */
-                       tsep = fwftsep;
-                       rsep = fwfrsep;
+                       csv_parms.tsep = fwftsep;
+                       csv_parms.rsep = fwfrsep;
 
                        ns = stream_fwf_create(ss, ncol, widths, 
STREAM_FWF_FILLER);
                        if (ns == NULL || mnstr_errnr(ns)) {
@@ -3106,7 +3110,9 @@ mvc_import_table_wrap(Client cntxt, MalB
                        throw(MAL, "sql.copy_from", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                }
        }
-       msg = mvc_import_table(cntxt, &b, be->mvc, s, t, tsep, rsep, ssep, ns, 
sz, offset, besteffort, from_stdin, escape, append_directly);
+       // extern str mvc_import_table(Client cntxt, BAT ***bats, mvc *c, 
bstream *s, bool from_stdin, sql_table *t, struct csv_parameters, 
append_directly);
+
+       msg = mvc_import_table(cntxt, &b, be->mvc, s, from_stdin, t, 
&csv_parms, append_directly);
        if (onclient) {
                mnstr_write(be->mvc->scanner.ws, PROMPT3, sizeof(PROMPT3)-1, 1);
                mnstr_flush(be->mvc->scanner.ws, MNSTR_FLUSH_DATA);
diff --git a/sql/backends/monet5/sql_copyinto.c 
b/sql/backends/monet5/sql_copyinto.c
--- a/sql/backends/monet5/sql_copyinto.c
+++ b/sql/backends/monet5/sql_copyinto.c
@@ -2523,7 +2523,7 @@ static void *
 }
 
 str
-mvc_import_table(Client cntxt, BAT ***bats, mvc *m, bstream *bs, sql_table *t, 
const char *sep, const char *rsep, const char *ssep, const char *ns, lng sz, 
lng offset, int best, bool from_stdin, bool escape, bool append_directly)
+mvc_import_table(Client cntxt, BAT ***bats, mvc *m, bstream *bs, bool 
from_stdin, sql_table *t, struct csv_parameters *csv_parms, bool 
append_directly)
 {
        int i = 0, j;
        node *n;
@@ -2553,20 +2553,20 @@ mvc_import_table(Client cntxt, BAT ***ba
                directappend_destroy(directappend);
                return msg;
        }
-       if (offset < 0 || offset > (lng) BUN_MAX) {
+       if (csv_parms->offset < 0 || csv_parms->offset > (lng) BUN_MAX) {
                directappend_destroy(directappend);
                throw(IO, "sql.copy_from", SQLSTATE(42000) "Offset out of 
range");
        }
 
-       if (offset > 0)
-               offset--;
+       if (csv_parms->offset > 0)
+               csv_parms->offset--;
        if (ol_first_node(t->columns)) {
                stream *out = m->scanner.ws;
 
                as = (Tablet) {
                        .nr_attrs = ol_length(t->columns),
-                       .nr = (sz < 1) ? BUN_NONE : (BUN) sz,
-                       .offset = (BUN) offset,
+                       .nr = (csv_parms->nr < 1) ? BUN_NONE : (BUN) 
csv_parms->nr,
+                       .offset = (BUN) csv_parms->offset,
                        .error = NULL,
                        .tryall = 0,
                        .complaints = NULL,
@@ -2597,8 +2597,8 @@ mvc_import_table(Client cntxt, BAT ***ba
                        }
 
                        fmt[i].name = col->base.name;
-                       fmt[i].sep = (n->next) ? sep : rsep;
-                       fmt[i].rsep = rsep;
+                       fmt[i].sep = (n->next) ? csv_parms->tsep : 
csv_parms->rsep;
+                       fmt[i].rsep = csv_parms->rsep;
                        fmt[i].seplen = _strlen(fmt[i].sep);
                        fmt[i].type = sql_subtype_string(m->ta, &col->type);
                        fmt[i].adt = ATOMindex(col->type.type->impl);
@@ -2617,9 +2617,9 @@ mvc_import_table(Client cntxt, BAT ***ba
                        }
                        fmt[i].c = NULL;
                        fmt[i].ws = !has_whitespace(fmt[i].sep);
-                       fmt[i].quote = ssep ? ssep[0] : 0;
-                       fmt[i].nullstr = ns;
-                       fmt[i].null_length = strlen(ns);
+                       fmt[i].quote = csv_parms->ssep ? csv_parms->ssep[0] : 0;
+                       fmt[i].nullstr = csv_parms->ns;
+                       fmt[i].null_length = strlen(csv_parms->ns);
                        fmt[i].nildata = ATOMnilptr(fmt[i].adt);
                        fmt[i].nil_len = ATOMlen(fmt[i].adt, fmt[i].nildata);
                        fmt[i].skip = (col->base.name[0] == '%');
@@ -2635,16 +2635,16 @@ mvc_import_table(Client cntxt, BAT ***ba
                // do .. while (false) allows us to use 'break' to drop out at 
any point
                do {
                        if (!directappend) {
-                               msg = TABLETcreate_bats(&as, (BUN) (sz < 0 ? 
1000 : sz));
+                               msg = TABLETcreate_bats(&as, (BUN) 
(csv_parms->nr < 0 ? 1000 : csv_parms->nr));
                                if (msg != MAL_SUCCEED)
                                        break;
                        }
 
-                       if (sz != 0) {
-                               BUN count = SQLload_file(cntxt, &as, bs, out, 
sep, rsep, ssep ? ssep[0] : 0, offset, sz, best, from_stdin, t->base.name, 
escape, directappend);
+                       if (csv_parms->nr != 0) {
+                               BUN count = SQLload_file(cntxt, &as, bs, out, 
csv_parms->tsep, csv_parms->rsep, csv_parms->ssep ? csv_parms->ssep[0] : 0, 
csv_parms->offset, csv_parms->nr, csv_parms->best, from_stdin, t->base.name, 
csv_parms->escape, directappend);
                                if (count == BUN_NONE)
                                        break;
-                               if (as.error && !best)
+                               if (as.error && !csv_parms->best)
                                        break;
                        }
 
@@ -2674,7 +2674,7 @@ mvc_import_table(Client cntxt, BAT ***ba
                } while (false);
 
                if (as.error) {
-                       if( !best) msg = createException(SQL, "sql.copy_from", 
SQLSTATE(42000) "Failed to import table '%s', %s", t->base.name, 
getExceptionMessage(as.error));
+                       if( !csv_parms->best) msg = createException(SQL, 
"sql.copy_from", SQLSTATE(42000) "Failed to import table '%s', %s", 
t->base.name, getExceptionMessage(as.error));
                        freeException(as.error);
                        as.error = NULL;
                }
diff --git a/sql/backends/monet5/sql_copyinto.h 
b/sql/backends/monet5/sql_copyinto.h
--- a/sql/backends/monet5/sql_copyinto.h
+++ b/sql/backends/monet5/sql_copyinto.h
@@ -12,7 +12,18 @@
 #include "mal_client.h"
 #include "sql_mvc.h"
 
-extern str mvc_import_table(Client cntxt, BAT ***bats, mvc *c, bstream *s, 
sql_table *t, const char *sep, const char *rsep, const char *ssep, const char 
*ns, lng nr, lng offset, int best, bool from_stdin, bool escape, bool 
append_directly);
+struct csv_parameters {
+       const char *tsep;
+       const char *rsep;
+       const char *ssep;
+       const char *ns;
+       lng nr;
+       lng offset;
+       int best;
+       bool escape;
+};
+
+extern str mvc_import_table(Client cntxt, BAT ***bats, mvc *c, bstream *s, 
bool from_stdin, sql_table *t, struct csv_parameters *csv_parms, bool 
append_directly);
 
 mal_export str COPYrejects(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 mal_export str COPYrejects_clear(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to