GError * meta1_service_url_load_json_object(struct json_object *obj, struct meta1_service_url_s **out) { EXTRA_ASSERT(out != NULL); *out = NULL; struct json_object *s=NULL, *t=NULL, *h=NULL, *a=NULL; struct oio_ext_json_mapping_s mapping[] = { {"seq", &s, json_type_int, 1}, {"type", &t, json_type_string, 1}, {"host", &h, json_type_string, 1}, {"args", &a, json_type_string, 1}, {NULL, NULL, 0, 0} }; GError *err = oio_ext_extract_json (obj, mapping); if (err) return err; struct meta1_service_url_s *m1u; size_t argslen = strlen(json_object_get_string(a)); m1u = g_malloc0(sizeof(struct meta1_service_url_s) + 1 + argslen), m1u->seq = json_object_get_int64(s); g_strlcpy(m1u->srvtype, json_object_get_string(t), sizeof(m1u->srvtype)); g_strlcpy(m1u->host, json_object_get_string(h), sizeof(m1u->host)); g_strlcpy(m1u->args, json_object_get_string(a), argslen+1); *out = m1u; return NULL; }
GError * namespace_info_init_json_object(struct json_object *obj, struct namespace_info_s *ni) { EXTRA_ASSERT(ni != NULL); struct json_object *ns=NULL, *sz=NULL; struct oio_ext_json_mapping_s mapping[] = { {"ns", &ns, json_type_string, 1}, {"chunksize", &sz, json_type_int, 1}, {NULL, NULL, 0, 0} }; GError *err = oio_ext_extract_json (obj, mapping); if (err) return err; g_strlcpy(ni->name, json_object_get_string(ns), sizeof(ni->name)); ni->chunk_size = json_object_get_int64(sz); if (NULL != (err = _load_hash(obj, "options", ni->options)) || NULL != (err = _load_hash(obj, "storage_policy", ni->storage_policy)) || NULL != (err = _load_hash(obj, "data_security", ni->data_security)) || NULL != (err = _load_hash(obj, "data_treatments", ni->data_treatments)) || NULL != (err = _load_hash(obj, "storage_class", ni->storage_class))) return err; return NULL; }
static GError * _body_parse_error (GString *b) { g_assert (b != NULL); struct json_tokener *tok = json_tokener_new (); struct json_object *jbody = json_tokener_parse_ex (tok, b->str, b->len); json_tokener_free (tok); tok = NULL; if (!jbody) return NEWERROR(0, "No error explained"); struct json_object *jcode, *jmsg; struct oio_ext_json_mapping_s map[] = { {"status", &jcode, json_type_int, 0}, {"message", &jmsg, json_type_string, 0}, {NULL, NULL, 0, 0} }; GError *err = oio_ext_extract_json(jbody, map); if (!err) { int code = 0; const char *msg = "Unknown error"; if (jcode) code = json_object_get_int64 (jcode); if (jmsg) msg = json_object_get_string (jmsg); err = NEWERROR(code, "(code=%d) %s", code, msg); } json_object_put (jbody); return err; }
GError* m2v2_json_load_single_header (struct json_object *j, gpointer *pbean) { GError *err = NULL; GByteArray *id = NULL, *hash = NULL; struct bean_CONTENTS_HEADERS_s *header = NULL; struct json_object *jid, *jhash, *jsize, *jctime, *jmtime, *jmethod, *jtype; struct oio_ext_json_mapping_s mapping[] = { {"id", &jid, json_type_string, 1}, {"hash", &jhash, json_type_string, 1}, {"size", &jsize, json_type_int, 1}, {"ctime", &jctime, json_type_int, 0}, {"mtime", &jmtime, json_type_int, 0}, {"chunk-method", &jmethod, json_type_string, 1}, {"mime-type", &jtype, json_type_string, 1}, {NULL, NULL, 0, 0} }; *pbean = NULL; if (NULL != (err = oio_ext_extract_json (j, mapping))) return err; id = metautils_gba_from_hexstring(json_object_get_string(jid)); if (!id) { err = NEWERROR(CODE_BAD_REQUEST, "Invalid header, not hexa id"); goto exit; } hash = metautils_gba_from_hexstring(json_object_get_string(jhash)); if (!hash || hash->len != 16) { err = NEWERROR(CODE_BAD_REQUEST, "Invalid header, not hexa16 hash"); goto exit; } header = _bean_create (&descr_struct_CONTENTS_HEADERS); CONTENTS_HEADERS_set2_id (header, id->data, id->len); CONTENTS_HEADERS_set2_hash (header, hash->data, hash->len); CONTENTS_HEADERS_set_size (header, json_object_get_int64(jsize)); if (jctime) CONTENTS_HEADERS_set_ctime (header, json_object_get_int64(jctime)); if (jmtime) CONTENTS_HEADERS_set_mtime (header, json_object_get_int64(jmtime)); CONTENTS_HEADERS_set2_chunk_method (header, json_object_get_string(jmethod)); CONTENTS_HEADERS_set2_mime_type (header, json_object_get_string(jtype)); *pbean = header; header = NULL; exit: metautils_gba_unref (id); metautils_gba_unref (hash); _bean_clean (header); return err; }
GError* m2v2_json_load_single_chunk (struct json_object *j, gpointer *pbean) { GError *err = NULL; GByteArray *hid = NULL, *hash = NULL; struct bean_CHUNKS_s *chunk = NULL; struct json_object *jid, *jcontent, *jhash, *jsize, *jctime, *jpos; struct oio_ext_json_mapping_s mapping[] = { {"id", &jid, json_type_string, 1}, {"hash", &jhash, json_type_string, 1}, {"size", &jsize, json_type_int, 1}, {"ctime", &jctime, json_type_int, 0}, {"content", &jcontent, json_type_string, 1}, {"pos", &jpos, json_type_string, 1}, {NULL, NULL, 0, 0} }; *pbean = NULL; if (NULL != (err = oio_ext_extract_json (j, mapping))) return err; hid = metautils_gba_from_hexstring(json_object_get_string(jid)); if (!hid) { err = NEWERROR(CODE_BAD_REQUEST, "Invalid header, not hexa id"); goto exit; } hash = metautils_gba_from_hexstring(json_object_get_string(jhash)); if (!hash) { err = NEWERROR(CODE_BAD_REQUEST, "Invalid chunk, not hexa header id"); goto exit; } chunk = _bean_create (&descr_struct_CHUNKS); CHUNKS_set2_id (chunk, json_object_get_string(jid)); CHUNKS_set_hash (chunk, hash); CHUNKS_set_size (chunk, json_object_get_int64(jsize)); CHUNKS_set_ctime (chunk, !jctime ? g_get_real_time() / G_TIME_SPAN_SECOND : json_object_get_int64(jctime)); CHUNKS_set_content (chunk, hid); CHUNKS_set2_position (chunk, json_object_get_string (jpos)); *pbean = chunk; chunk = NULL; exit: metautils_gba_unref (hid); metautils_gba_unref (hash); _bean_clean (chunk); return err; }
GError* service_info_load_json_object(struct json_object *obj, struct service_info_s **out, gboolean permissive) { EXTRA_ASSERT(out != NULL); *out = NULL; struct json_object *ns, *type, *url, *score, *tags; struct oio_ext_json_mapping_s mapping[] = { {"ns", &ns, json_type_string, !permissive}, {"type", &type, json_type_string, !permissive}, {"addr", &url, json_type_string, 1}, {"score", &score, json_type_int, !permissive}, {"tags", &tags, json_type_object, 0}, {NULL, NULL, 0, 0} }; GError *err = oio_ext_extract_json (obj, mapping); if (err) return err; struct addr_info_s addr; if (!grid_string_to_addrinfo(json_object_get_string(url), &addr)) return NEWERROR(CODE_BAD_REQUEST, "Invalid address"); struct service_info_s *si = g_malloc0(sizeof(struct service_info_s)); if (ns) g_strlcpy(si->ns_name, json_object_get_string(ns), sizeof(si->ns_name)); memcpy (&si->addr, &addr, sizeof(struct addr_info_s)); if (type) g_strlcpy(si->type, json_object_get_string(type), sizeof(si->type)); if (score) si->score.value = json_object_get_int(score); if (tags) { json_object_object_foreach(tags,key,val) { if (!g_str_has_prefix(key, "tag.") && !g_str_has_prefix(key, "stat.")) continue; struct service_tag_s *tag = _srvtag_load_json(key, val); if (tag) { if (!si->tags) si->tags = g_ptr_array_new(); g_ptr_array_add(si->tags, tag); } } } *out = si; return NULL; }
GError* m2v2_json_load_single_alias (struct json_object *j, gpointer *pbean) { GError *err = NULL; GByteArray *hid = NULL; struct bean_ALIASES_s *alias = NULL; struct json_object *jname, *jversion, *jctime, *jmtime, *jheader, *jdel; struct oio_ext_json_mapping_s m[] = { {"name", &jname, json_type_string, 1}, {"ver", &jversion, json_type_int, 1}, {"header", &jheader, json_type_string, 1}, {"ctime", &jctime, json_type_int, 0}, {"mtime", &jmtime, json_type_int, 0}, {"deleted", &jdel, json_type_boolean, 0}, {NULL, NULL, 0, 0} }; *pbean = NULL; if (NULL != (err = oio_ext_extract_json(j, m))) goto exit; hid = metautils_gba_from_hexstring(json_object_get_string(jheader)); if (!hid) { err = NEWERROR(CODE_BAD_REQUEST, "Invalid alias, not hexadecimal header_id"); goto exit; } alias = _bean_create (&descr_struct_ALIASES); ALIASES_set2_alias (alias, json_object_get_string(jname)); ALIASES_set_version (alias, json_object_get_int64(jversion)); ALIASES_set2_content (alias, hid->data, hid->len); ALIASES_set_deleted (alias, json_object_get_boolean(jdel)); ALIASES_set_mtime (alias, json_object_get_int64(jmtime)); ALIASES_set_ctime (alias, json_object_get_int64(jctime)); *pbean = alias; alias = NULL; exit: metautils_gba_unref (hid); _bean_clean (alias); return err; }