Example #1
0
int w_bser_dump(const bser_ctx_t* ctx, json_t *json, void *data)
{
  int type = json_typeof(json);

  if (!is_bser_version_supported(ctx)) {
    return -1;
  }

  switch (type) {
    case JSON_NULL:
      return ctx->dump(&bser_null, sizeof(bser_null), data);
    case JSON_TRUE:
      return ctx->dump(&bser_true, sizeof(bser_true), data);
    case JSON_FALSE:
      return ctx->dump(&bser_false, sizeof(bser_false), data);
    case JSON_REAL:
      return bser_real(ctx, json_real_value(json), data);
    case JSON_INTEGER:
      return bser_int(ctx, json_integer_value(json), data);
    case JSON_STRING:
      return bser_bytestring(ctx, json_string_value(json), data);
    case JSON_ARRAY:
      return bser_array(ctx, json, data);
    case JSON_OBJECT:
      return bser_object(ctx, json, data);
    default:
      return -1;
  }
}
Example #2
0
int w_bser_dump(json_t *json, json_dump_callback_t dump, void *data)
{
    int type = json_typeof(json);

    switch (type) {
    case JSON_NULL:
        return dump(&bser_null, sizeof(bser_null), data);
    case JSON_TRUE:
        return dump(&bser_true, sizeof(bser_true), data);
    case JSON_FALSE:
        return dump(&bser_false, sizeof(bser_false), data);
    case JSON_REAL:
        return bser_real(json_real_value(json), dump, data);
    case JSON_INTEGER:
        return bser_int(json_integer_value(json), dump, data);
    case JSON_STRING:
        return bser_string(json_string_value(json), dump, data);
    case JSON_ARRAY:
        return bser_array(json, dump, data);
    case JSON_OBJECT:
        return bser_object(json, dump, data);
    default:
        return -1;
    }
}
Example #3
0
static int bser_template(const bser_ctx_t *ctx, const json_t *array,
    const json_t *templ, void *data)
{
  size_t n = json_array_size(array);
  size_t i, pn;

  if (!is_bser_version_supported(ctx)) {
    return -1;
  }

  if (ctx->dump(&bser_template_hdr, sizeof(bser_template_hdr), data)) {
    return -1;
  }

  // The template goes next
  if (bser_array(ctx, templ, data)) {
    return -1;
  }

  // Now the array of arrays of object values.
  // How many objects
  if (bser_int(ctx, n, data)) {
    return -1;
  }

  pn = json_array_size(templ);

  // For each object
  for (i = 0; i < n; i++) {
    json_t *obj = json_array_get(array, i);
    size_t pi;

    // For each factored key
    for (pi = 0; pi < pn; pi++) {
      const char *key = json_string_value(json_array_get(templ, pi));
      json_t *val;

      // Look up the object property
      val = json_object_get(obj, key);
      if (!val) {
        // property not set on this one; emit a skip
        if (ctx->dump(&bser_skip, sizeof(bser_skip), data)) {
          return -1;
        }
        continue;
      }

      // Emit value
      if (w_bser_dump(ctx, val, data)) {
        return -1;
      }
    }
  }

  return 0;
}