Skip to content

Commit

Permalink
cachedb_mongodb: Add support for TIMESTAMP and BINARY types
Browse files Browse the repository at this point in the history
(cherry picked from commit aafbb85)

This fixes some warnings when doing cache_raw_query() UPDATE operations:

WARNING:cachedb_mongodb:bson_to_json_generic:
    Unsupported type 17 for key clusterTime - skipping
WARNING:cachedb_mongodb:bson_to_json_generic:
    Unsupported type 5 for key hash - skipping
(cherry picked from commit d7d74d6)
  • Loading branch information
liviuchircu committed Jul 22, 2019
1 parent 8ef5d8e commit 9c3a932
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
24 changes: 24 additions & 0 deletions modules/cachedb_mongodb/cachedb_mongodb_dbase.c
Expand Up @@ -1201,6 +1201,8 @@ int mongo_db_query_trans(cachedb_con *con, const str *table, const db_key_t *_k,
bson_iter_t iter;
struct timeval start;
int ri, c, old_rows, rows = 0;
unsigned int ts, ulen, _;
const unsigned char *bin;
mongoc_collection_t *col = NULL;
char *strf, *stro;

Expand Down Expand Up @@ -1391,6 +1393,19 @@ int mongo_db_query_trans(cachedb_con *con, const str *table, const db_key_t *_k,
LM_DBG("Found null [%.*s]=[%d]\n",
_c[c]->len, _c[c]->s, VAL_NULL(cur_val));
break;
case BSON_TYPE_TIMESTAMP:
bson_iter_timestamp(&iter, &ts, &_);
VAL_TYPE(cur_val) = DB_INT;
VAL_INT(cur_val) = (int)ts;
LM_DBG("Found timestamp [%u]\n", ts);
break;
case BSON_TYPE_BINARY:
bson_iter_binary(&iter, NULL, &ulen, &bin);
VAL_TYPE(cur_val) = DB_STR;
VAL_STR(cur_val).s = (char *)bin;
VAL_STR(cur_val).len = (int)ulen;
LM_DBG("Found binary data: '%.*s'\n", ulen, bin);
break;
default:
LM_WARN("Unsupported type [%d] for [%.*s] - treating as NULL\n",
bson_iter_type(&iter), _c[c]->len, _c[c]->s);
Expand Down Expand Up @@ -1710,6 +1725,15 @@ int mongo_doc_to_dict(const bson_t *doc, cdb_dict_t *out_dict)
case BSON_TYPE_NULL:
pair->val.type = CDB_NULL;
break;
case BSON_TYPE_TIMESTAMP:
pair->val.type = CDB_INT32;
val->i32 = v->value.v_timestamp.timestamp;
break;
case BSON_TYPE_BINARY:
pair->val.type = CDB_STR;
val->st.s = (char *)v->value.v_binary.data;
val->st.len = v->value.v_binary.data_len;
break;
default:
LM_ERR("unsupported MongoDB type %d!\n", v->value_type);
pkg_free(pair);
Expand Down
15 changes: 14 additions & 1 deletion modules/cachedb_mongodb/cachedb_mongodb_json.c
Expand Up @@ -169,9 +169,12 @@ void bson_to_json_generic(struct json_object *obj, bson_iter_t *it,
{
const char *curr_key;
char *s, oid[25];
const unsigned char *bin;
int len;
struct json_object *obj2 = NULL;
unsigned int ts, ulen, _;
bson_iter_t it2;
bson_subtype_t subtype;

while (bson_iter_next(it)) {
curr_key = bson_iter_key(it);
Expand Down Expand Up @@ -262,7 +265,17 @@ void bson_to_json_generic(struct json_object *obj, bson_iter_t *it,
bson_iter_type(it),curr_key);
break;
case BSON_TYPE_NULL:
json_object_object_add(obj,curr_key,NULL);
json_object_object_add(obj,curr_key,NULL);
break;
case BSON_TYPE_TIMESTAMP:
bson_iter_timestamp(it, &ts, &_);
json_object_object_add(obj, curr_key,
json_object_new_int(ts));
break;
case BSON_TYPE_BINARY:
bson_iter_binary(it, &subtype, &ulen, &bin);
json_object_object_add(obj, curr_key,
json_object_new_string((const char *)bin));
break;
default:
LM_WARN("Unsupported type %d for key %s - skipping\n",
Expand Down

0 comments on commit 9c3a932

Please sign in to comment.