From f60c76a8f28fc008d5a8f2f630f0ab8dc95dd586 Mon Sep 17 00:00:00 2001 From: adam Date: Sun, 4 Aug 2013 23:11:25 +0700 Subject: [PATCH] #88 fixed it --- tcejdb/bson.c | 21 ++++++++++++--------- tcejdb/testejdb/t2.c | 4 +++- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/tcejdb/bson.c b/tcejdb/bson.c index 139484c..02a7aeb 100644 --- a/tcejdb/bson.c +++ b/tcejdb/bson.c @@ -1537,7 +1537,7 @@ int bson_merge3(const void *bsdata1, const void *bsdata2, bson *out) { } const char *fp = fpath; int nl = 0; //nesting level - bool generated = false; //if `true` a missing parts of bson object are generated + bool appendmissing = false; //if `true` a missing parts of bson object are generated while (fplen > 0) { //split fpath with '.' delim const char *rp = fp; const char *ep = fp + fplen; @@ -1560,11 +1560,11 @@ int bson_merge3(const void *bsdata1, const void *bsdata2, bson *out) { bson_append_finish_object(out); //arrays are covered also } } else { //intermediate part - if (!generated) { + if (!appendmissing) { bson_iterator_from_buffer(&it1, bsdata1); bt = bson_find_fieldpath_value2(fpath, (fp - fpath) + keylen, &it1); if (bt == BSON_EOO) { - generated = true; + appendmissing = true; } else if (bt == BSON_OBJECT) { if (bson_isnumstr(key, keylen)) { break; @@ -1576,12 +1576,15 @@ int bson_merge3(const void *bsdata1, const void *bsdata2, bson *out) { } else { break; } - } else if (bson_isnumstr(key, keylen)) { - nl++; - bson_append_start_array2(out, key, keylen); - } else { - nl++; - bson_append_start_object2(out, key, keylen); + } + if (appendmissing) { + if (bson_isnumstr(key, keylen)) { + nl++; + bson_append_start_array2(out, key, keylen); + } else { + nl++; + bson_append_start_object2(out, key, keylen); + } } } fp = rp; diff --git a/tcejdb/testejdb/t2.c b/tcejdb/testejdb/t2.c index 84c8c97..79e9f73 100644 --- a/tcejdb/testejdb/t2.c +++ b/tcejdb/testejdb/t2.c @@ -3164,6 +3164,7 @@ void testTicket88() { //https://github.com/Softmotions/ejdb/issues/88 bson_init_as_query(&bsq1); bson_append_start_object(&bsq1, "$set"); bson_append_int(&bsq1, "arr1.1", 1111); + bson_append_string(&bsq1, "a.b", "c"); bson_append_finish_object(&bsq1); bson_finish(&bsq1); @@ -3178,7 +3179,8 @@ void testTicket88() { //https://github.com/Softmotions/ejdb/issues/88 bson bsq2; bson_init_as_query(&bsq2); - bson_append_int(&bsq1, "arr1.1", 1111); + bson_append_int(&bsq2, "arr1.1", 1111); + bson_append_string(&bsq2, "a.b", "c"); bson_finish(&bsq2); q1 = ejdbcreatequery(jb, &bsq2, NULL, 0, NULL); ejdbqryexecute(ccoll, q1, &count, JBQRYCOUNT, NULL); -- 2.7.4