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]

Reply via email to