PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ parse_jsonb()

static uint32_t * parse_jsonb ( mvt_agg_context ctx,
Jsonb *  jb,
uint32_t *  tags 
)
static

Definition at line 563 of file mvt.c.

565{
566 JsonbIterator *it;
567 JsonbValue v;
568 bool skipNested = false;
569 JsonbIteratorToken r;
570 uint32_t k;
571
572 if (!JB_ROOT_IS_OBJECT(jb))
573 return tags;
574
575 it = JsonbIteratorInit(&jb->root);
576
577 while ((r = JsonbIteratorNext(&it, &v, skipNested)) != WJB_DONE)
578 {
579 skipNested = true;
580
581 if (r == WJB_KEY && v.type != jbvNull)
582 {
583
584 k = get_key_index_with_size(ctx, v.val.string.val, v.val.string.len);
585 if (k == UINT32_MAX)
586 {
587 char *key;
588 uint32_t newSize = ctx->keys_hash_i + 1;
589
590 key = palloc(v.val.string.len + 1);
591 memcpy(key, v.val.string.val, v.val.string.len);
592 key[v.val.string.len] = '\0';
593
594 tags = repalloc(tags, newSize * 2 * sizeof(*tags));
595 k = add_key(ctx, key);
596 }
597
598 r = JsonbIteratorNext(&it, &v, skipNested);
599
600 if (v.type == jbvString)
601 {
602 char *value;
603 value = palloc(v.val.string.len + 1);
604 memcpy(value, v.val.string.val, v.val.string.len);
605 value[v.val.string.len] = '\0';
606 add_value_as_string(ctx, value, tags, k);
607 ctx->row_columns++;
608 }
609 else if (v.type == jbvBool)
610 {
611 MVT_PARSE_VALUE(v.val.boolean, mvt_kv_bool_value,
612 bool_values_hash, bool_value, sizeof(protobuf_c_boolean));
613 ctx->row_columns++;
614 }
615 else if (v.type == jbvNumeric)
616 {
617 char *str;
618 double d;
619 long l;
620 str = DatumGetCString(DirectFunctionCall1(numeric_out,
621 PointerGetDatum(v.val.numeric)));
622 d = strtod(str, NULL);
623 l = strtol(str, NULL, 10);
624
625 if (fabs(d - (double)l) > FLT_EPSILON)
626 {
627 MVT_PARSE_VALUE(d, mvt_kv_double_value, double_values_hash,
628 double_value, sizeof(double));
629 }
630 else
631 {
633 }
634 ctx->row_columns++;
635 }
636 }
637 }
638
639 return tags;
640}
char * r
Definition cu_in_wkt.c:24
#define str(s)
#define UINT32_MAX
static uint32_t get_key_index_with_size(mvt_agg_context *ctx, const char *name, size_t size)
Definition mvt.c:305
#define MVT_PARSE_INT_VALUE(value)
Definition mvt.c:493
static uint32_t add_key(mvt_agg_context *ctx, char *name)
Definition mvt.c:314
static void add_value_as_string(mvt_agg_context *ctx, char *value, uint32_t *tags, uint32_t k)
Definition mvt.c:544
#define MVT_PARSE_VALUE(value, kvtype, hash, valuefield, size)
Definition mvt.c:472
int value
Definition genraster.py:62
uint32_t keys_hash_i
Definition mvt.h:78
uint32_t row_columns
Definition mvt.h:79

References add_key(), add_value_as_string(), get_key_index_with_size(), mvt_agg_context::keys_hash_i, MVT_PARSE_INT_VALUE, MVT_PARSE_VALUE, r, mvt_agg_context::row_columns, str, and UINT32_MAX.

Referenced by parse_values().

Here is the call graph for this function:
Here is the caller graph for this function: