PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ 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
Definition: lwin_wkt_lex.c:343
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, UINT32_MAX, and genraster::value.

Referenced by parse_values().

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