From 145ea9188f0e556323a78ecc12c07fe933bfa26b Mon Sep 17 00:00:00 2001
From: amichelo <andrea.michelotti@lnf.infn.it>
Date: Wed, 5 Apr 2023 15:17:26 +0200
Subject: [PATCH] support hasKey with names with dot

---
 TestFramework/data/TestCDataWrapper.cpp | 26 +++++++++++++++++++++++++
 chaos/common/data/CDataWrapper.cpp      |  4 ++++
 2 files changed, 30 insertions(+)

diff --git a/TestFramework/data/TestCDataWrapper.cpp b/TestFramework/data/TestCDataWrapper.cpp
index c1bc0aff7..7be685d9b 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 5c809d44a..efef62b8e 100644
--- a/chaos/common/data/CDataWrapper.cpp
+++ b/chaos/common/data/CDataWrapper.cpp
@@ -816,6 +816,10 @@ bool CDataWrapper::hasKey(const std::string& key) const {
 
    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));
    
 }
-- 
GitLab