diff --git a/TestFramework/data/TestCDataWrapper.cpp b/TestFramework/data/TestCDataWrapper.cpp index c1bc0aff78c63ec0c4511fd7659e697edb315684..7be685d9b5445fdb8f73a810687e695db181a50e 100644 --- a/TestFramework/data/TestCDataWrapper.cpp +++ b/TestFramework/data/TestCDataWrapper.cpp @@ -98,6 +98,32 @@ TEST(CDataWrapperTest, Performance) { ASSERT_TRUE(cloned->isBoolValue("bv")); data_pack.reset(); } +} +TEST(CDataWrapperTest, haKey) { + int idx = 0; + CDataWrapper data_pack; + data_pack.addBoolValue("bv", (int32_t)0); + data_pack.addInt32Value("i32v", (int32_t)0); + + data_pack.addInt32Value("i32v.pippo", (int32_t)0); + data_pack.addDoubleValue("dbv", (double)36.6); + data_pack.addDoubleValue("dbv.pippo", (double)37.6); + ASSERT_TRUE(data_pack.hasKey("bv")); + ASSERT_FALSE(data_pack.hasKey("bva")); + ASSERT_FALSE(data_pack.hasKey("bv.pippo")); + + ASSERT_TRUE(data_pack.hasKey("dbv")); + ASSERT_FALSE(data_pack.hasKey("dbva")); + ASSERT_FALSE(data_pack.hasKey("dbv.pippa")); + ASSERT_TRUE(data_pack.hasKey("dbv.pippo")); + + ASSERT_TRUE(data_pack.hasKey("i32v")); + ASSERT_FALSE(data_pack.hasKey("i32va")); + ASSERT_FALSE(data_pack.hasKey("i32v.pippa")); + ASSERT_TRUE(data_pack.hasKey("i32v.pippo")); + + + } TEST(CDataWrapperTest, TestJsonDouble) { const char* test_json_translation="{\"double_key\":[1.0,2.1,-1.0,-0.9]}"; diff --git a/chaos/common/data/CDataWrapper.cpp b/chaos/common/data/CDataWrapper.cpp index 0cd8d7df14391447c724303924d0436fffaa402c..efef62b8ee830865902ea7ae3cd64b872567ae82 100644 --- a/chaos/common/data/CDataWrapper.cpp +++ b/chaos/common/data/CDataWrapper.cpp @@ -811,7 +811,17 @@ CDBufferUniquePtr CDataWrapper::getBinaryValueAsCDataBuffer(const std::string& k // check if the key is present in data wrapper bool CDataWrapper::hasKey(const std::string& key) const { - return bson_has_field(ACCESS_BSON(bson), key.c_str()); + bson_iter_t iter; + bson_iter_t child; + + BSON_ASSERT (bson); + if(key.size()==0) return false; + if(strchr(key.c_str(),'.')){ + // if contains . cannot recurse + return (bson_iter_init (&iter, ACCESS_BSON(bson)) && bson_iter_find (&iter, key.c_str())); + } + return (bson_iter_init (&iter, ACCESS_BSON(bson)) && bson_iter_find_descendant (&iter, key.c_str(), &child)); + } bool CDataWrapper::isVector(const std::string& key) const {