dpl_status_t cb_cdmi_req_add_metadata(dpl_dict_var_t *var, void *cb_arg) { struct cdmi_req_add_md_arg *arg = (struct cdmi_req_add_md_arg *) cb_arg; dpl_status_t ret, ret2; char buf[256]; snprintf(buf, sizeof (buf), "%smetadata:%s", arg->comma ? "," : "", var->key); ret2 = dpl_sbuf_add(arg->field, buf, strlen(buf)); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } arg->comma = 1; ret = DPL_SUCCESS; end: return ret; }
dpl_status_t dpl_cdmi_req_add_metadata(dpl_req_t *req, const dpl_dict_t *metadata, int append) { dpl_status_t ret, ret2; struct cdmi_req_add_md_arg arg; memset(&arg, 0, sizeof (arg)); if (append) { //iterate metadata object arg.field = dpl_sbuf_new(30); if (NULL == arg.field) { ret = DPL_ENOMEM; goto end; } ret2 = dpl_dict_iterate(metadata, cb_cdmi_req_add_metadata, &arg); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_sbuf_add(arg.field, "", 1); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_req_set_subresource(req, arg.field->buf); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } ret2 = dpl_req_add_metadata(req, metadata); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret = DPL_SUCCESS; end: if (NULL != arg.field) dpl_sbuf_free(arg.field); return ret; }
/** * * * @param blob * @param key * @param data * @param datalen * * @return */ dpl_status_t dpl_ntinydb_set(dpl_sbuf_t *blob, const char *key, char *data, int datalen) { char flag; int keylen, ret; uint32_t len; flag = 0; ret = dpl_sbuf_add(blob, &flag, 1); if (-1 == ret) return DPL_FAILURE; keylen = strlen(key); len = htonl(keylen); ret = dpl_sbuf_add(blob, (char *)&len, sizeof (len)); if (-1 == ret) return DPL_FAILURE; ret = dpl_sbuf_add(blob, key, keylen); if (-1 == ret) return DPL_FAILURE; len = htonl(datalen); ret = dpl_sbuf_add(blob, (char *)&len, sizeof (len)); if (-1 == ret) return DPL_FAILURE; ret = dpl_sbuf_add(blob, data, datalen); if (-1 == ret) return DPL_FAILURE; //printf("ntinydb_set '%s' '%.*s'\n", key, datalen, data); dpl_sbuf_print(blob); return DPL_SUCCESS; }
dpl_sbuf_t *dpl_sbuf_dup(const dpl_sbuf_t *src) { dpl_sbuf_t *dst; dst = dpl_sbuf_new(src->allocated); if (NULL == dst) return NULL; (void)dpl_sbuf_add(dst, src->buf, src->len); return dst; }
dpl_sbuf_add_str_fmt(dpl_sbuf_t *sb, const char *format, ...) { char buffer[4096]; size_t size; va_list args; va_start(args, format); size = vsnprintf(buffer, sizeof(buffer), format, args); va_end(args); if (size >= sizeof(buffer)) return DPL_ENOMEM; return dpl_sbuf_add(sb, buffer, size); }
dpl_status_t dpl_sbuf_add_str(dpl_sbuf_t *sb, const char *str) { return dpl_sbuf_add(sb, str, strlen(str)); }
static dpl_status_t convert_obj_to_value(dpl_ctx_t *ctx, struct json_object *obj, int level, dpl_value_t **valp) { int ret, ret2; dpl_value_t *val = NULL; char *key; struct lh_entry *entry; json_object *child; dpl_dict_t *subdict = NULL; dpl_vec_t *vector = NULL; DPRINTF("convert_obj_to_value level=%d type=%d\n", level, json_object_get_type(obj)); val = malloc(sizeof (*val)); if (NULL == val) { ret = DPL_ENOMEM; goto end; } memset(val, 0, sizeof (*val)); switch (json_object_get_type(obj)) { case json_type_null: { ret = DPL_ENOTSUPP; goto end; } case json_type_array: { int n_items = json_object_array_length(obj); int i; vector = dpl_vec_new(2, 2); if (NULL == vector) { ret = DPL_ENOMEM; goto end; } for (i = 0;i < n_items;i++) { child = json_object_array_get_idx(obj, i); dpl_value_t *subval; ret2 = convert_obj_to_value(ctx, child, level+1, &subval); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_vec_add_value(vector, subval); dpl_value_free(subval); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } val->type = DPL_VALUE_VECTOR; val->vector = vector; vector = NULL; break ; } case json_type_object: { subdict = dpl_dict_new(13); if (NULL == subdict) { ret = DPL_ENOMEM; goto end; } for (entry = json_object_get_object(obj)->head; (entry ? (key = (char*)entry->k, child = (struct json_object*)entry->v, entry) : 0); entry = entry->next) { dpl_value_t *subval; DPRINTF("key='%s'\n", key); ret2 = convert_obj_to_value(ctx, child, level+1, &subval); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_dict_add_value(subdict, key, subval, 0); dpl_value_free(subval); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } val->type = DPL_VALUE_SUBDICT; val->subdict = subdict; subdict = NULL; break ; } case json_type_boolean: case json_type_double: case json_type_int: { pthread_mutex_lock(&ctx->lock); //lock for objects other than string val->string = dpl_sbuf_new(16); if (NULL == val->string) { ret = DPL_ENOMEM; goto end; } dpl_sbuf_add_str(val->string, json_object_get_string(obj)); pthread_mutex_unlock(&ctx->lock); val->type = DPL_VALUE_STRING; break ; } case json_type_string: { pthread_mutex_lock(&ctx->lock); //lock for objects other than string val->string = dpl_sbuf_new(json_object_get_string_length(obj) + 1); if (NULL == val->string) { ret = DPL_ENOMEM; goto end; } dpl_sbuf_add(val->string, json_object_get_string(obj), json_object_get_string_length(obj)); pthread_mutex_unlock(&ctx->lock); val->type = DPL_VALUE_STRING; break ; } } if (NULL != valp) { *valp = val; val = NULL; } ret = DPL_SUCCESS; end: if (NULL != vector) dpl_vec_free(vector); if (NULL != subdict) dpl_dict_free(subdict); if (NULL != val) dpl_value_free(val); DPRINTF("level=%d ret=%d\n", level, ret); return ret; }