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