Changeset: 220df0d3989d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/220df0d3989d
Modified Files:
sql/backends/monet5/sql.c
Branch: nested
Log Message:
factor out common logic
diffs (177 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
@@ -5770,45 +5770,48 @@ jsonv2local(const ValPtr t, char *v)
}
static str
-insert_json_value(JSONterm *jt, sql_subtype *t, BAT *b, const char *kname,
size_t klen)
+insert_json_value(JSONterm *jt, sql_subtype *t, BAT *b)
{
char *msg = MAL_SUCCEED;
size_t vsize = jt->valuelen;
char *val = (char *)jt->value;
ValPtr v = NULL;
- ValRecord vr = (ValRecord) {.bat=false, .vtype=TYPE_void};
+ ValRecord vr = (ValRecord) {.bat=false, .vtype=t->type->localtype};
+ if (t->type->localtype == ATOMindex("json"))
+ vr.vtype = TYPE_str;
+ char eos = val[vsize];
+ val[vsize] = '\0';
+ v = jsonv2local(&vr, val);
+ val[vsize] = eos;
+ if (v) {
+ if (BUNappend(b, VALget(v), false) != GDK_SUCCEED)
+ msg = createException(SQL, "sql.insert_json_value",
"BUNappend failed");
+ } else {
+ msg = createException(SQL, "sql.insert_json_value",
"jsonv2local failed");
+ }
+ return msg;
+}
+
+static sql_subtype*
+find_subtype_field(sql_subtype *t, const char *kname, size_t klen)
+{
+ sql_subtype *nt = NULL;
for(node *n = t->type->d.fields->h; n; n = n->next) {
sql_arg *a = n->data;
size_t alen = strlen(a->name);
if (klen == alen && strncmp(kname, a->name, klen) == 0) {
- vr.vtype = a->type.type->localtype;
- if (vr.vtype == ATOMindex("json")) // if json
- vr.vtype = TYPE_str;
- char eos = val[vsize];
- val[vsize] = '\0';
- v = jsonv2local(&vr, val);
- val[vsize] = eos;
- if (v == NULL)
- msg = createException(SQL,
"sql.insert_json_value", "jsonv2local failed");
+ nt = &a->type;
break;
}
}
- if (v) {
- if (BUNappend(b, VALget(v), false) != GDK_SUCCEED)
- msg = createException(SQL, "sql.insert_json_value",
"BUNappend failed");
- } else {
- msg = (msg == MAL_SUCCEED) ? createException(SQL,
"sql.insert_json_value", "missing field") : msg;
- }
- return msg;
+ return nt;
}
static int
insert_json_object(char **msg, JSON *js, BAT **bats, int *BO, int nr, int elm,
sql_subtype *t)
{
- // char buf[128]; /* TODO use proper buffer */
int bat_offset = *BO;
- node *n;
JSONterm *ja = js->elm+elm;
if (ja->kind != JSON_OBJECT || !t->type->composite) {
*msg = "missing object start";
@@ -5825,25 +5828,17 @@ insert_json_object(char **msg, JSON *js,
switch (jt->kind) {
case JSON_OBJECT:
if (name && nlen) {
- sql_subtype *nt = NULL;
- // find subtype matching field
- for(n = t->type->d.fields->h; n; n = n->next) {
- sql_arg *a = n->data;
- int alen = (int)strlen(a->name);
- if (nlen == alen && strncmp(name,
a->name, nlen) == 0) {
- nt = &a->type;
- break;
- }
- }
- assert(nt && !nt->multiset);
- if (nt->type->composite)
+ sql_subtype *nt = find_subtype_field(t, name,
nlen);
+ if (nt && nt->type->composite)
elm = insert_json_object(msg, js, bats,
&bat_offset, nr, elm, nt);
- else {
+ else if (nt && nt->type->localtype ==
ATOMindex("json")){
// json string value
- insert_json_value(jt, t,
bats[bat_offset], name, nlen);
+ insert_json_value(jt, nt,
bats[bat_offset]);
// set term offset
elm = ((jt - 1)->next) - 1; // ? is
this right
bat_offset ++;
+ } else {
+ assert(0);
}
} else {
assert(0);
@@ -5853,17 +5848,18 @@ insert_json_object(char **msg, JSON *js,
/* TODO get id for nested array from the a global
struct */
if (name && nlen) {
// find subtype matching field
- sql_subtype *nt = NULL;
- for(n = t->type->d.fields->h; n; n = n->next) {
- sql_arg *a = n->data;
- int alen = (int)strlen(a->name);
- if (nlen == alen && strncmp(name,
a->name, nlen) == 0) {
- nt = &a->type;
- break;
- }
+ sql_subtype *nt = find_subtype_field(t, name,
nlen);
+ if(nt && nt->multiset)
+ elm = insert_json_array(msg, js, bats,
&bat_offset, nr, elm, nt);
+ else if (nt && nt->type->localtype ==
ATOMindex("json")) {
+ // json string value
+ insert_json_value(jt, nt,
bats[bat_offset]);
+ // set term offset
+ elm = ((jt - 1)->next) - 1; // ? is
this right
+ bat_offset ++;
+ } else {
+ assert(0);
}
- assert(nt && nt->multiset);
- elm = insert_json_array(msg, js, bats,
&bat_offset, nr, elm, nt);
} else {
assert(0);
}
@@ -5882,33 +5878,16 @@ insert_json_object(char **msg, JSON *js,
case JSON_NUMBER:
case JSON_BOOL:
case JSON_NULL:
- //pos = -1;
- //ValPtr v = NULL;
- //ValRecord vr = (ValRecord) {.bat=false,
.vtype=TYPE_void};
- //if (jt->valuelen > 128-1)
- // return -8;
- //strncpy(buf, jt->value, jt->valuelen);
- //buf[jt->valuelen] = 0;
- //for(i = 0, n = t->type->d.fields->h; i < w && n &&
pos < 0; i++, n = n->next) {
- // sql_arg *a = n->data;
- // int alen = (int)strlen(a->name);
- // if (nlen == alen && strncmp(name, a->name,
nlen) == 0) {
- // pos = i;
- // vr.vtype = a->type.type->localtype;
- // v = jsonv2local(&vr, buf);
- // break;
- // }
- //}
- //if (pos < 0 || v == NULL) {
- // *msg = "field name missing";
- // return -8;
- //}
- //if (elm > 0 && BUNappend(bats[bat_offset], VALget(v),
false) != GDK_SUCCEED) {
- // return -5;
- //}
- if ((*msg = insert_json_value(jt, t, bats[bat_offset],
name, nlen)) != MAL_SUCCEED)
- return -1;
- bat_offset ++;
+ if (name && nlen) {
+ sql_subtype *nt = find_subtype_field(t, name,
nlen);
+ if (nt) {
+ if ((*msg = insert_json_value(jt, nt,
bats[bat_offset])) != MAL_SUCCEED)
+ return -1;
+ bat_offset ++;
+ }
+ else
+ *msg = "field name missing";
+ }
}
}
if (bat_offset > nr)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]