Skip to content

Commit

Permalink
cachedb_mongodb: Initial, stripped-down raw query adaptation (JSON->B…
Browse files Browse the repository at this point in the history
…SON)
  • Loading branch information
liviuchircu committed Feb 24, 2017
1 parent ed2007e commit f4e1762
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 126 deletions.
96 changes: 44 additions & 52 deletions modules/cachedb_mongodb/cachedb_mongodb_dbase.c
Expand Up @@ -866,83 +866,75 @@ int mongo_raw_remove(cachedb_con *connection,bson_t *raw_query)
return 0;
}

//static char *raw_query_buf=NULL;
//static int raw_query_buf_len=0;
static char *raw_query_buf;
static int raw_query_buf_len;

int mongo_con_raw_query(cachedb_con *connection,str *attr,cdb_raw_entry ***reply,int expected_kv_no,int *reply_no)
int mongo_con_raw_query(cachedb_con *con, str *attr, cdb_raw_entry ***reply,
int expected_kv_no, int *reply_no)
{
#if 0
bson_t new_b;
int ret;
bson_iterator i;
bson_t doc;
bson_iter_t iter;
struct timeval start;
const char *op=NULL;
const char *op = NULL;
const bson_value_t *value;
int ret = 0;

LM_DBG("Get operation on namespace %s\n",MONGO_NAMESPACE(connection));
LM_DBG("Get operation on namespace %s\n", MONGO_NAMESPACE(con));
start_expire_timer(start,mongo_exec_threshold);

if (attr->len > raw_query_buf_len) {
raw_query_buf = pkg_realloc(raw_query_buf,attr->len+1);
raw_query_buf = pkg_realloc(raw_query_buf, attr->len + 1);
if (!raw_query_buf) {
LM_ERR("No more pkg\n");
goto error;
LM_ERR("oom!\n");
return -1;
}

memcpy(raw_query_buf,attr->s,attr->len);
raw_query_buf[attr->len]=0;
memcpy(raw_query_buf, attr->s, attr->len);
raw_query_buf[attr->len] = '\0';

raw_query_buf_len = attr->len;
} else {
memcpy(raw_query_buf,attr->s,attr->len);
raw_query_buf[attr->len]=0;
memcpy(raw_query_buf, attr->s, attr->len);
raw_query_buf[attr->len] = '\0';
}

ret = json_to_bson(raw_query_buf,&new_b);

ret = json_to_bson(raw_query_buf, &doc);
if (ret < 0) {
LM_ERR("Failed to convert [%.*s] to BSON\n",attr->len,attr->s);
goto error;
LM_ERR("Failed to convert [%.*s] to BSON\n", attr->len, attr->s);
return -1;
}

if (bson_find(&i,&new_b,"op") == BSON_EOO) {
LM_ERR("No \"op\" specified \n");
bson_destroy(&new_b);
goto error;
if (!bson_iter_init_find(&iter, &doc, "op")) {
LM_ERR("No 'op' specified in raw query [%.*s]\n", attr->len, attr->s);
bson_destroy(&doc);
return -1;
}

if (bson_iterator_type( &i ) != BSON_STRING) {
LM_ERR("The op must be a string \n");
bson_destroy(&new_b);
goto error;
value = bson_iter_value(&iter);
if (value->value_type != BSON_TYPE_UTF8) {
LM_ERR("string 'op' needed in raw query [%.*s]\n", attr->len, attr->s);
bson_destroy(&doc);
return -1;
}

op = bson_iterator_string( &i );

if (strcmp(op,"find") == 0) {
ret = mongo_raw_find(connection,&new_b,reply,expected_kv_no,reply_no);
} else if (strcmp(op,"update") == 0) {
ret = mongo_raw_update(connection,&new_b);
} else if (strcmp(op,"insert") == 0) {
ret = mongo_raw_insert(connection,&new_b);
} else if (strcmp(op,"remove") == 0) {
ret = mongo_raw_remove(connection,&new_b);
} else if (strcmp(op,"count") == 0) {
ret = mongo_raw_count(connection,&new_b,reply,expected_kv_no,reply_no);
op = value->value.v_utf8.str;

if (strcmp(op, "find") == 0) {
ret = mongo_raw_find(con, &doc, reply, expected_kv_no, reply_no);
} else if (strcmp(op, "insert") == 0) {
ret = mongo_raw_insert(con, &doc);
} else if (strcmp(op, "update") == 0) {
ret = mongo_raw_update(con, &doc);
} else if (strcmp(op, "remove") == 0) {
ret = mongo_raw_remove(con, &doc);
} else if (strcmp(op, "count") == 0) {
ret = mongo_raw_count(con, &doc, reply, expected_kv_no, reply_no);
} else {
LM_ERR("Unsupported op type [%s] \n",op);
bson_destroy(&new_b);
goto error;
LM_ERR("Unsupported op type [%s] \n", op);
bson_destroy(&doc);
return -1;
}

stop_expire_timer(start,mongo_exec_threshold,
"cachedb_mongo raw",attr->s,attr->len,0);
bson_destroy(&new_b);
return ret;
error:
stop_expire_timer(start,mongo_exec_threshold,
"cachedb_mongo raw",attr->s,attr->len,0);
return -1;
#endif
return 0;
}

Expand Down
114 changes: 40 additions & 74 deletions modules/cachedb_mongodb/cachedb_mongodb_json.c
Expand Up @@ -28,37 +28,34 @@
#include "cachedb_mongodb_json.h"
#include "cachedb_mongodb_dbase.h"

int json_to_bson_append_element( bson_t *bb , const char *k , struct json_object *v );
int json_to_bson_append_element(bson_t *doc, const char *k, struct json_object *v);

int json_to_bson_append_array( bson_t *bb , struct json_object *a )
int json_to_bson_append_array(bson_t *doc, struct json_object *a)
{
#if 0
int i,al_len;
int i, al_len;
char *al;
json_object *it;

for ( i=0; i<json_object_array_length( a ); i++ ) {
al = int2str(i,&al_len);
if (al == NULL) {
LM_ERR("Failed to convert %d to str\n",i);
for (i = 0; i < json_object_array_length(a); i++) {
al = int2str(i, &al_len);
if (!al) {
LM_ERR("Failed to convert %d to str\n", i);
return -1;
}

al[al_len]=0;
it = json_object_array_get_idx(a,i);
if (it == NULL) {
al[al_len] = '\0';
it = json_object_array_get_idx(a, i);
if (!it) {
LM_ERR("Failed to get JSON idx\n");
return -1;
}

if (json_to_bson_append_element(bb,al,it) < 0) {
if (json_to_bson_append_element(doc, al, it) < 0) {
LM_ERR("Failed to append element to BSON\n");
return -1;
}
}
}

return 0;
#endif
return 0;
}

Expand All @@ -69,138 +66,107 @@ int json_to_bson_append_array( bson_t *bb , struct json_object *a )
val = (struct json_object*)entry->v, entry) : 0); \
entry = entry->next)

int json_to_bson_append(bson_t *bb,struct json_object *o)
int json_to_bson_append(bson_t *doc, struct json_object *o)
{
#if 0
json_object_object_iterator( o,key,val ) {
if (json_to_bson_append_element(bb,key,val)<0) {
json_object_object_iterator(o, key, val) {
if (json_to_bson_append_element(doc, key, val) < 0) {
LM_ERR("Failed to append new element\n");
return -1;
}
}

return 0;
#endif
return 0;
}

int json_to_bson_append_element( bson_t *bb , const char *k , struct json_object *v )
int json_to_bson_append_element(bson_t *doc, const char *k, struct json_object *v)
{
#if 0
if (v==NULL) {
bson_append_null(bb,k);
bson_t child;

if (!v) {
bson_append_null(doc, k, -1);
return 0;
}

switch (json_object_get_type(v)) {
case json_type_int:
if (bson_append_int(bb,k,json_object_get_int(v))
!= BSON_OK) {
if (!bson_append_int32(doc, k, -1, json_object_get_int(v))) {
LM_ERR("Failed to append int\n");
return -1;
}
break;
case json_type_boolean:
if (bson_append_bool(bb,k,json_object_get_boolean(v))
!= BSON_OK) {
if (!bson_append_bool(doc, k, -1, json_object_get_boolean(v))) {
LM_ERR("Failed to append boolean\n");
return -1;
}
break;
case json_type_double:
if (bson_append_double(bb,k,json_object_get_double(v))
!= BSON_OK) {
if (!bson_append_double(doc, k, -1, json_object_get_double(v))) {
LM_ERR("Failed to append double\n");
return -1;
}
break;
case json_type_string:
if (bson_append_string(bb,k,json_object_get_string(v))
!= BSON_OK) {
if (!bson_append_utf8(doc, k, -1, json_object_get_string(v), -1)) {
LM_ERR("Failed to append string\n");
return -1;
}
break;
case json_type_object:
if (bson_append_start_object( bb,k)
!= BSON_OK) {
LM_ERR("Failed to append start object\n");
return -1;
}
if (json_to_bson_append(bb,v)<0) {
BSON_APPEND_DOCUMENT_BEGIN(doc, k, &child);
if (json_to_bson_append(&child, v) < 0) {
LM_ERR("Failed to append to bson_t\n");
return -1;
}
if (bson_append_finish_object(bb)
!= BSON_OK) {
LM_ERR("Failed to finish appending to BSON\n");
return -1;
}
bson_append_document_end(doc, &child);
break;
case json_type_array:
if (bson_append_start_array(bb,k)
!= BSON_OK) {
LM_ERR("Failed to append start array\n");
return -1;
}

if (json_to_bson_append_array(bb,v) < 0) {
BSON_APPEND_ARRAY_BEGIN(doc, k, &child);
if (json_to_bson_append_array(&child, v) < 0) {
LM_ERR("Failed to append array to bson_t\n");
return -1;
}
if (bson_append_finish_object(bb)
!= BSON_OK) {
LM_ERR("Failed to finish appending array to bson_t\n");
return -1;
}
bson_append_array_end(doc, &child);
break;
default:
LM_ERR("Can't handle type for : %s\n",json_object_to_json_string(v));
LM_ERR("Can't handle type for : %s\n", json_object_to_json_string(v));
return -1;
}

return 0;
#endif
return 0;
}

int json_to_bson(char *json,bson_t *bb)
int json_to_bson(char *json, bson_t *doc)
{
#if 0
struct json_object *obj;

LM_DBG("Trying to convert [%s]\n",json);
LM_DBG("Trying to convert [%s]\n", json);

obj=json_tokener_parse(json);
obj = json_tokener_parse(json);
if (is_error(obj)) {
LM_ERR("Failed to parse JSON: %s\n",json);
LM_ERR("Failed to parse JSON: %s\n", json);
return -2;
}

if (!json_object_is_type(obj,json_type_object)) {
LM_ERR("Inconsystent JSON type\n");
if (!json_object_is_type(obj, json_type_object)) {
LM_ERR("Inconsistent JSON type\n");
goto error;
}

bson_init(bb);
if (json_to_bson_append(bb,obj) < 0) {
bson_init(doc);
if (json_to_bson_append(doc, obj) < 0) {
LM_ERR("Failed to convert json to bson_t\n");
bson_finish(bb);
bson_destroy(bb);
bson_destroy(doc);
goto error;
}

bson_finish(bb);
json_object_put(obj);

return 0;

error:
if (obj)
json_object_put(obj);
return -1;
#endif
return 0;
}

void bson_to_json_generic(struct json_object *obj,bson_iter_t *it,int type)
Expand Down

0 comments on commit f4e1762

Please sign in to comment.