int VALformat(char **buf, const ValRecord *res) { int t = res->vtype; *buf = 0; return ATOMformat(t, VALptr(res), buf); }
static str MDBgetFrame(BAT *b, BAT*bn, Client cntxt, MalBlkPtr mb, MalStkPtr s, int depth) { ValPtr v; int i; char *buf = 0; if (depth > 0) return MDBgetFrame(b,bn, cntxt, mb, s->up, depth - 1); if (s != 0) for (i = 0; i < s->stktop; i++, v++) { v = &s->stk[i]; ATOMformat(v->vtype, VALptr(v), &buf); BUNappend(b, getVarName(mb, i), FALSE); BUNappend(bn, buf, FALSE); GDKfree(buf); buf = NULL; } return MAL_SUCCEED; }
static str JSONrenderRowObject(BAT **bl, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, BUN idx) { int i, tpe; char *row, *name = 0, *val = 0; size_t len, lim, l; void *p; BATiter bi; row = (char *) GDKmalloc(lim = BUFSIZ); row[0] = '{'; row[1] = 0; len = 1; val = (char *) GDKmalloc(BUFSIZ); for (i = pci->retc; i < pci->argc; i += 2) { name = stk->stk[getArg(pci, i)].val.sval; bi = bat_iterator(bl[i + 1]); p = BUNtail(bi, BUNfirst(bl[i + 1]) + idx); tpe = getColumnType(getArgType(mb, pci, i + 1)); ATOMformat(tpe, p, &val); if (strncmp(val, "nil", 3) == 0) strcpy(val, "null"); l = strlen(name) + strlen(val); while (l > lim - len) row = (char *) GDKrealloc(row, lim += BUFSIZ); snprintf(row + len, lim - len, "\"%s\":%s,", name, val); len += l + 4; } if (row[1]) row[len - 1] = '}'; else { row[1] = '}'; row[2] = 0; } GDKfree(val); return row; }
static str JSONrenderRowArray(BAT **bl, MalBlkPtr mb, InstrPtr pci, BUN idx) { int i, tpe; char *row, *val = 0; size_t len, lim, l; void *p; BATiter bi; row = (char *) GDKmalloc(lim = BUFSIZ); row[0] = '['; row[1] = 0; len = 1; val = (char *) GDKmalloc(BUFSIZ); for (i = pci->retc; i < pci->argc; i++) { bi = bat_iterator(bl[i]); p = BUNtail(bi, BUNfirst(bl[i]) + idx); tpe = getColumnType(getArgType(mb, pci, i)); ATOMformat(tpe, p, &val); if (strncmp(val, "nil", 3) == 0) strcpy(val, "null"); l = strlen(val); while (l > lim - len) row = (char *) GDKrealloc(row, lim += BUFSIZ); snprintf(row + len, lim - len, "%s,", val); len += l + 1; } if (row[1]) row[len - 1] = ']'; else { row[1] = '}'; row[2] = 0; } GDKfree(val); return row; }
static str JSONfoldKeyValue(str *ret, const bat *id, const bat *key, const bat *values) { BAT *bo = 0, *bk = 0, *bv; BATiter boi, bki, bvi; int tpe; char *row, *val = 0, *nme = 0; BUN i, cnt; size_t len, lim, l; void *p; oid o = 0;; if (key) { bk = BATdescriptor(*key); if (bk == NULL) { *ret = GDKstrdup(str_nil); throw(MAL, "json.fold", RUNTIME_OBJECT_MISSING); } } bv = BATdescriptor(*values); if (bv == NULL) { if (bk) BBPunfix(bk->batCacheid); *ret = GDKstrdup(str_nil); throw(MAL, "json.fold", RUNTIME_OBJECT_MISSING); } tpe = bv->ttype; cnt = BATcount(bv); if (bk) bki = bat_iterator(bk); bvi = bat_iterator(bv); if (id) { bo = BATdescriptor(*id); if (bo == NULL) { if (bk) BBPunfix(bk->batCacheid); BBPunfix(bv->batCacheid); throw(MAL, "json.nest", RUNTIME_OBJECT_MISSING); } } row = (char *) GDKmalloc(lim = BUFSIZ); row[0] = '['; row[1] = 0; len = 1; val = (char *) GDKmalloc(BUFSIZ); if (id) { boi = bat_iterator(bo); o = *(oid *) BUNtail(boi, BUNfirst(bo)); } if (bk) bki = bat_iterator(bk); bvi = bat_iterator(bv); for (i = 0; i < cnt; i++) { if (id &&bk) { p = BUNtail(boi, BUNfirst(bo) + i); if (*(oid *) p != o) { snprintf(row + len, lim - len, ", "); len += 2; o = *(oid *) p; } } if (bk) { nme = (str) BUNtail(bki, BUNfirst(bk) + i); l = strlen(nme); while (l + 3 > lim - len) row = (char *) GDKrealloc(row, lim = (lim / (i + 1)) * cnt + BUFSIZ + l + 3); if (row == NULL) { *ret = GDKstrdup(str_nil); if (bo) BBPunfix(bo->batCacheid); if (bk) BBPunfix(bk->batCacheid); BBPunfix(bv->batCacheid); throw(MAL, "json.fold", MAL_MALLOC_FAIL); } if (strcmp(nme, str_nil)) { snprintf(row + len, lim - len, "\"%s\":", nme); len += l + 3; } } bvi = bat_iterator(bv); p = BUNtail(bvi, BUNfirst(bv) + i); if (tpe == TYPE_json) val = p; else { ATOMformat(tpe, p, &val); if (strncmp(val, "nil", 3) == 0) strcpy(val, "null"); } l = strlen(val); while (l > lim - len) row = (char *) GDKrealloc(row, lim = (lim / (i + 1)) * cnt + BUFSIZ + l + 3); if (row == NULL) { if (bo) BBPunfix(bo->batCacheid); if (bk) BBPunfix(bk->batCacheid); BBPunfix(bv->batCacheid); *ret = GDKstrdup(str_nil); throw(MAL, "json.fold", MAL_MALLOC_FAIL); } strncpy(row + len, val, l); len += l; row[len++] = ','; row[len] = 0; } if (row[1]) { row[len - 1] = ']'; row[len] = 0; } else { row[1] = ']'; row[2] = 0; } if (tpe != TYPE_json) GDKfree(val); if (bo) BBPunfix(bo->batCacheid); if (bk) BBPunfix(bk->batCacheid); BBPunfix(bv->batCacheid); *ret = row; return MAL_SUCCEED; }
/* Format the value in RES in the standard way for the type of RES * into a newly allocated buffer. Also see ATOMformat. */ char * VALformat(const ValRecord *res) { return ATOMformat(res->vtype, VALptr(res)); }
char * atom2string(sql_allocator *sa, atom *a) { char buf[BUFSIZ], *p = NULL; void *v; if (a->isnull) return sa_strdup(sa, "NULL"); switch (a->data.vtype) { #ifdef HAVE_HGE case TYPE_hge: { char *_buf = buf; int _bufsiz = BUFSIZ; hgeToStr(&_buf, &_bufsiz, &a->data.val.hval); break; } #endif case TYPE_lng: sprintf(buf, LLFMT, a->data.val.lval); break; case TYPE_wrd: sprintf(buf, SSZFMT, a->data.val.wval); break; case TYPE_oid: sprintf(buf, OIDFMT "@0", a->data.val.oval); break; case TYPE_int: sprintf(buf, "%d", a->data.val.ival); break; case TYPE_sht: sprintf(buf, "%d", a->data.val.shval); break; case TYPE_bte: sprintf(buf, "%d", a->data.val.btval); break; case TYPE_bit: if (a->data.val.btval) return sa_strdup(sa, "true"); return sa_strdup(sa, "false"); case TYPE_flt: sprintf(buf, "%f", a->data.val.fval); break; case TYPE_dbl: sprintf(buf, "%f", a->data.val.dval); break; case TYPE_str: if (a->data.val.sval) return sa_strdup(sa, a->data.val.sval); else sprintf(buf, "NULL"); break; default: v = &a->data.val.ival; if (ATOMvarsized(a->data.vtype)) v = a->data.val.pval; if (ATOMformat(a->data.vtype, v, &p) < 0) { snprintf(buf, BUFSIZ, "atom2string(TYPE_%d) not implemented", a->data.vtype); } else { char *r = sa_strdup(sa, p); _DELETE(p); return r; } } return sa_strdup(sa, buf); }