diff --git a/chaos/common/data/CDataWrapper.cpp b/chaos/common/data/CDataWrapper.cpp index bedf9f04bfb4dc27c26352c2d1ab170aa0c63c12..017cd8a480dc9db5f3874eeb0cadf10f5e796eca 100644 --- a/chaos/common/data/CDataWrapper.cpp +++ b/chaos/common/data/CDataWrapper.cpp @@ -17,9 +17,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include <chaos/common/global.h> #include <chaos/common/chaos_constants.h> #include <chaos/common/data/CDataWrapper.h> +#include <chaos/common/global.h> #include <chaos/common/utility/Base64Util.h> #include <boost/lexical_cast.hpp> @@ -28,565 +28,586 @@ using namespace chaos::common::data; using namespace chaos::common::utility; #pragma mark Utility -#define ADD_VECTOR(v,ctype,bsontype){\ -for( std::vector<ctype>::const_iterator i=v.begin();i!=v.end();i++){\ -append ##bsontype ##ToArray(*i);}} +#define ADD_VECTOR(v, ctype, bsontype) \ + { \ + for (std::vector<ctype>::const_iterator i = v.begin(); i != v.end(); i++) { \ + append##bsontype##ToArray(*i); \ + } \ + } #define ITER_TYPE(i) ((bson_type_t) * ((i)->raw + (i)->type)) #define ALLOCATE_BSONT(x) ChaosBsonShrdPtr(x, &bsonDeallocator) #define ACCESS_BSON(x) static_cast<bson_t*>(x.get()) -#define CW_CAST_EXCEPTION(type){\ -std::stringstream ss;\ -ss<<"cannot get or cast to '" #type "' '"<<key<<"' ds:" << getJSONString();\ -throw CException(1, ss.str(), __PRETTY_FUNCTION__);} +#define CW_CAST_EXCEPTION(type) \ + { \ + std::stringstream ss; \ + ss << "cannot get or cast to '" #type "' '" << key << "' ds:" << getJSONString(); \ + throw CException(1, ss.str(), __PRETTY_FUNCTION__); \ + } -#define ENSURE_ARRAY(x) \ -if(x.get() == NULL) {array_index = 0; x = ALLOCATE_BSONT(bson_new());} +#define ENSURE_ARRAY(x) \ + if (x.get() == NULL) { \ + array_index = 0; \ + x = ALLOCATE_BSONT(bson_new()); \ + } -#define FIND_AND_CHECK(k,c)\ -bson_iter_t element_found;\ -bson_iter_init(&element_found, ACCESS_BSON(bson));\ -if(bson_iter_find_case(&element_found, key.c_str()) && c(&element_found)) +#define FIND_AND_CHECK(k, c) \ + bson_iter_t element_found; \ + bson_iter_init(&element_found, ACCESS_BSON(bson)); \ + if (bson_iter_find_case(&element_found, key.c_str()) && c(&element_found)) -#define INIT_ITERATOR(key) \ -bool keyfound;\ -bson_iter_t element_found;\ -bson_iter_init(&element_found, ACCESS_BSON(bson));\ -keyfound=bson_iter_find_case(&element_found, key.c_str()); +#define INIT_ITERATOR(key) \ + bool keyfound; \ + bson_iter_t element_found; \ + bson_iter_init(&element_found, ACCESS_BSON(bson)); \ + keyfound = bson_iter_find_case(&element_found, key.c_str()); -#define GET_VALUE(t,c) \ -if(keyfound&& (c(&element_found))){return bson_iter_##t (&element_found);} +#define GET_VALUE(t, c) \ + if (keyfound && (c(&element_found))) { \ + return bson_iter_##t(&element_found); \ + } -#define GET_64UVALUE() \ -if(keyfound&& (BSON_ITER_HOLDS_TIMESTAMP(&element_found))){uint64_t dst;uint32_t*u=(uint32_t*)&dst;bson_iter_timestamp(&element_found,&u[1],&u[0]);return dst ;} +#define GET_64UVALUE() \ + if (keyfound && (BSON_ITER_HOLDS_TIMESTAMP(&element_found))) { \ + uint64_t dst; \ + uint32_t* u = (uint32_t*)&dst; \ + bson_iter_timestamp(&element_found, &u[1], &u[0]); \ + return dst; \ + } -#define GET_VALUE_AS_STRING(t,c) \ -if(keyfound&& (c(&element_found))){std::stringstream ss;ss<<bson_iter_##t (&element_found);return ss.str();} +#define GET_VALUE_AS_STRING(t, c) \ + if (keyfound && (c(&element_found))) { \ + std::stringstream ss; \ + ss << bson_iter_##t(&element_found); \ + return ss.str(); \ + } -#define GET_TIMESTAMP_AS_STRING() \ -if(keyfound&& (BSON_ITER_HOLDS_TIMESTAMP(&element_found))){uint64_t dst;uint32_t*u=(uint32_t*)&dst;bson_iter_timestamp(&element_found,&u[1],&u[0]);std::stringstream ss;ss<<dst;return ss.str();} +#define GET_TIMESTAMP_AS_STRING() \ + if (keyfound && (BSON_ITER_HOLDS_TIMESTAMP(&element_found))) { \ + uint64_t dst; \ + uint32_t* u = (uint32_t*)&dst; \ + bson_iter_timestamp(&element_found, &u[1], &u[0]); \ + std::stringstream ss; \ + ss << dst; \ + return ss.str(); \ + } -static void bsonDeallocator(bson_t* bson) {if(bson){bson_destroy(bson);}} +static void bsonDeallocator(bson_t* bson) { + if (bson) { + bson_destroy(bson); + } +} -static void bsonValueDestroy(bson_value_t* bson_values) {if(bson_values){bson_value_destroy(bson_values);}} +static void bsonValueDestroy(bson_value_t* bson_values) { + if (bson_values) { + bson_value_destroy(bson_values); + } +} #pragma mark CDataWrapper -CDataWrapper::CDataWrapper(): -bson(ALLOCATE_BSONT(bson_new())), -array_index(0){ - if(bson==NULL){ - throw CException(-53, "Invalid BSON", __PRETTY_FUNCTION__); - - } +CDataWrapper::CDataWrapper() + : bson(ALLOCATE_BSONT(bson_new())), array_index(0) { + if (bson == NULL) { + throw CException(-53, "Invalid BSON", __PRETTY_FUNCTION__); + } } -bool CDataWrapper::isJSON(const::std::string&str){ - if(str.size()){ - try{ - CDataWrapper cd; - cd.setSerializedJsonData(str.c_str()); - return true; - } catch(...){ - - } +bool CDataWrapper::isJSON(const ::std::string& str) { + if (str.size()) { + try { + CDataWrapper cd; + cd.setSerializedJsonData(str.c_str()); + return true; + } catch (...) { } - return false; + } + return false; } -CDataWrapper::CDataWrapper(const bson_t *copy_bson): -array_index(0){ - if(copy_bson != NULL) { - bson = ALLOCATE_BSONT(bson_copy(copy_bson)); - } else { - bson = ALLOCATE_BSONT(bson_new()); - } - if(bson==NULL){ - throw CException(-61, "Invalid BSON", __PRETTY_FUNCTION__); - - }} -bool CDataWrapper::operator==(const CDataWrapper&d) const { - int32_t siz1,siz2; - const char*buf1=getBSONRawData(siz1); - const char*buf2=d.getBSONRawData(siz2); - if(siz1!=siz2){ - return false; - } - return (memcmp(buf1,buf2,siz1)==0); - +CDataWrapper::CDataWrapper(const bson_t* copy_bson) + : array_index(0) { + if (copy_bson != NULL) { + bson = ALLOCATE_BSONT(bson_copy(copy_bson)); + } else { + bson = ALLOCATE_BSONT(bson_new()); + } + if (bson == NULL) { + throw CException(-61, "Invalid BSON", __PRETTY_FUNCTION__); + } +} +bool CDataWrapper::operator==(const CDataWrapper& d) const { + int32_t siz1, siz2; + const char* buf1 = getBSONRawData(siz1); + const char* buf2 = d.getBSONRawData(siz2); + if (siz1 != siz2) { + return false; + } + return (memcmp(buf1, buf2, siz1) == 0); } CDataWrapper::CDataWrapper(const char* mem_ser, - uint32_t mem_size): -array_index(0){ - if(mem_ser != NULL || mem_size) { - bson = ALLOCATE_BSONT(bson_new_from_data((const uint8_t*)mem_ser, - mem_size)); - } else { - bson = ALLOCATE_BSONT(bson_new()); - } - if(bson==NULL){ - throw CException(-51, "Invalid BSON", __PRETTY_FUNCTION__); - - } + uint32_t mem_size) + : array_index(0) { + if (mem_ser != NULL || mem_size) { + bson = ALLOCATE_BSONT(bson_new_from_data((const uint8_t*)mem_ser, + mem_size)); + } else { + bson = ALLOCATE_BSONT(bson_new()); + } + if (bson == NULL) { + throw CException(-51, "Invalid BSON", __PRETTY_FUNCTION__); + } } -CDataWrapper::CDataWrapper(const char* mem_ser): -array_index(0) { - if(mem_ser) { - uint32_t size = BSON_UINT32_FROM_LE(*reinterpret_cast<const uint32_t *>(mem_ser)); - bson = ALLOCATE_BSONT(bson_new_from_data((const uint8_t*)mem_ser, - size)); - } else { - bson = ALLOCATE_BSONT(bson_new()); - } - if(bson==NULL){ - throw CException(-52, "Invalid BSON ", __PRETTY_FUNCTION__); - - } +CDataWrapper::CDataWrapper(const char* mem_ser) + : array_index(0) { + if (mem_ser) { + uint32_t size = BSON_UINT32_FROM_LE(*reinterpret_cast<const uint32_t*>(mem_ser)); + bson = ALLOCATE_BSONT(bson_new_from_data((const uint8_t*)mem_ser, + size)); + } else { + bson = ALLOCATE_BSONT(bson_new()); + } + if (bson == NULL) { + throw CException(-52, "Invalid BSON ", __PRETTY_FUNCTION__); + } } -CDataWrapper::CDataWrapper(const std::string& json_document): -array_index(0) { - bson_error_t err; - bson = ALLOCATE_BSONT(bson_new_from_json((const uint8_t*)json_document.c_str(), - json_document.size(), - &err)); - if(!bson.get()) { - bson = ALLOCATE_BSONT(bson_new()); - } +CDataWrapper::CDataWrapper(const std::string& json_document) + : array_index(0) { + bson_error_t err; + bson = ALLOCATE_BSONT(bson_new_from_json((const uint8_t*)json_document.c_str(), + json_document.size(), + &err)); + if (!bson.get()) { + bson = ALLOCATE_BSONT(bson_new()); + } } -CDataWrapper::~CDataWrapper(){} +CDataWrapper::~CDataWrapper() {} ChaosUniquePtr<CDataWrapper> CDataWrapper::instanceFromJson(const std::string& json_serialization) { - return ChaosUniquePtr<CDataWrapper>(new CDataWrapper(json_serialization)); + return ChaosUniquePtr<CDataWrapper>(new CDataWrapper(json_serialization)); } -ChaosUniquePtr<CDataWrapper> CDataWrapper::clone() const{ +ChaosUniquePtr<CDataWrapper> CDataWrapper::clone() const { /* CDataWrapper*ptr=new CDataWrapper(); copyAllTo(*ptr); return ChaosUniquePtr<CDataWrapper>(ptr);*/ - return ChaosUniquePtr<CDataWrapper>(new CDataWrapper(bson.get())); + return ChaosUniquePtr<CDataWrapper>(new CDataWrapper(bson.get())); } - -//add a csdata value -void CDataWrapper::addCSDataValue(const std::string& key, +// add a csdata value +void CDataWrapper::addCSDataValue(const std::string& key, const CDataWrapper& sub_object) { - bson_append_document(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - ACCESS_BSON(sub_object.bson)); + bson_append_document(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + ACCESS_BSON(sub_object.bson)); } -int CDataWrapper::countKeys() const{ - return bson_count_keys(ACCESS_BSON(bson)); +int CDataWrapper::countKeys() const { + return bson_count_keys(ACCESS_BSON(bson)); } -//add a string value -void CDataWrapper::addStringValue(const std::string& key, const string& value,const int max_size) { - - bson_append_utf8(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - value.c_str(), - value.size()); - +// add a string value +void CDataWrapper::addStringValue(const std::string& key, const string& value, const int max_size) { + bson_append_utf8(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + value.c_str(), + value.size()); } -//append a strin gto an open array +// append a strin gto an open array void CDataWrapper::appendStringToArray(const string& value) { - ENSURE_ARRAY(bson_tmp_array); - bson_append_utf8(ACCESS_BSON(bson_tmp_array), - ChaosToString(array_index++).c_str(), - -1, - value.c_str(), - (int)value.size()); -} -void CDataWrapper::appendBooleanToArray(bool value){ - ENSURE_ARRAY(bson_tmp_array); - bson_append_bool(ACCESS_BSON(bson_tmp_array), - ChaosToString(array_index++).c_str(), - -1, - value); -} - -//append a strin gto an open array + ENSURE_ARRAY(bson_tmp_array); + bson_append_utf8(ACCESS_BSON(bson_tmp_array), + ChaosToString(array_index++).c_str(), + -1, + value.c_str(), + (int)value.size()); +} +void CDataWrapper::appendBooleanToArray(bool value) { + ENSURE_ARRAY(bson_tmp_array); + bson_append_bool(ACCESS_BSON(bson_tmp_array), + ChaosToString(array_index++).c_str(), + -1, + value); +} + +// append a strin gto an open array void CDataWrapper::appendInt32ToArray(int32_t value) { - ENSURE_ARRAY(bson_tmp_array); - bson_append_int32(ACCESS_BSON(bson_tmp_array), - ChaosToString(array_index++).c_str(), - -1, - value); + ENSURE_ARRAY(bson_tmp_array); + bson_append_int32(ACCESS_BSON(bson_tmp_array), + ChaosToString(array_index++).c_str(), + -1, + value); } -//append a strin gto an open array +// append a strin gto an open array void CDataWrapper::appendInt64ToArray(int64_t value) { - ENSURE_ARRAY(bson_tmp_array); - bson_append_int64(ACCESS_BSON(bson_tmp_array), - ChaosToString(array_index++).c_str(), - -1, - value); + ENSURE_ARRAY(bson_tmp_array); + bson_append_int64(ACCESS_BSON(bson_tmp_array), + ChaosToString(array_index++).c_str(), + -1, + value); } -//append a strin gto an open array +// append a strin gto an open array void CDataWrapper::appendUInt64ToArray(uint64_t value) { - ENSURE_ARRAY(bson_tmp_array); - bson_append_timestamp(ACCESS_BSON(bson_tmp_array), - ChaosToString(array_index++).c_str(), - -1, - value>>32, - value&0xFFFFFFFF); + ENSURE_ARRAY(bson_tmp_array); + bson_append_timestamp(ACCESS_BSON(bson_tmp_array), + ChaosToString(array_index++).c_str(), + -1, + value >> 32, + value & 0xFFFFFFFF); } -//append a strin gto an open array +// append a strin gto an open array void CDataWrapper::appendDoubleToArray(double value) { - ENSURE_ARRAY(bson_tmp_array); - bson_append_double(ACCESS_BSON(bson_tmp_array), - ChaosToString(array_index++).c_str(), - -1, - value); + ENSURE_ARRAY(bson_tmp_array); + bson_append_double(ACCESS_BSON(bson_tmp_array), + ChaosToString(array_index++).c_str(), + -1, + value); } -//appen a CDataWrapper to an open array +// appen a CDataWrapper to an open array void CDataWrapper::appendCDataWrapperToArray(const CDataWrapper& value) { - ENSURE_ARRAY(bson_tmp_array); - bson_append_document(ACCESS_BSON(bson_tmp_array), - ChaosToString(array_index++).c_str(), - -1, - value.bson.get()); -} -void CDataWrapper::append(const std::string&key,CMultiTypeDataArrayWrapperSPtr&val) { -bson_append_array(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - val->array_doc); + ENSURE_ARRAY(bson_tmp_array); + bson_append_document(ACCESS_BSON(bson_tmp_array), + ChaosToString(array_index++).c_str(), + -1, + value.bson.get()); +} +void CDataWrapper::append(const std::string& key, CMultiTypeDataArrayWrapperSPtr& val) { + bson_append_array(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + val->array_doc); } - -//finalize the array into a key for the current dataobject +// finalize the array into a key for the current dataobject void CDataWrapper::finalizeArrayForKey(const std::string& key) { - ENSURE_ARRAY(bson_tmp_array); - - FIND_AND_CHECK(key, BSON_ITER_HOLDS_ARRAY){ - // if already exists - CMultiTypeDataArrayWrapperSPtr v=getVectorValue(key); - removeKey(key); - array_index=0; - bson_t *tmp=bson_new(); - for(int cnt=0;cnt<v->size();cnt++){ - bson_value_t * bv=v->getBSONElementAtIndex(cnt); - if(bv){ - std::string k=ChaosToString(array_index++); - bson_append_value(tmp,k.c_str(),-1,bv); - } - - } - bson_iter_t it; - bson_iter_init(&it, ACCESS_BSON(bson_tmp_array)); - while(bson_iter_next(&it)) { - const bson_value_t * bv= bson_iter_value(&it); - std::string k=ChaosToString(array_index++); - bson_append_value(tmp,k.c_str(),-1,bv); - } - - bson_append_array(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - tmp); - bson_tmp_array.reset(); - bson_free(tmp); - return; - } + ENSURE_ARRAY(bson_tmp_array); + + FIND_AND_CHECK(key, BSON_ITER_HOLDS_ARRAY) { + // if already exists + CMultiTypeDataArrayWrapperSPtr v = getVectorValue(key); + removeKey(key); + array_index = 0; + bson_t* tmp = bson_new(); + for (int cnt = 0; cnt < v->size(); cnt++) { + bson_value_t* bv = v->getBSONElementAtIndex(cnt); + if (bv) { + std::string k = ChaosToString(array_index++); + bson_append_value(tmp, k.c_str(), -1, bv); + } + } + bson_iter_t it; + bson_iter_init(&it, ACCESS_BSON(bson_tmp_array)); + while (bson_iter_next(&it)) { + const bson_value_t* bv = bson_iter_value(&it); + std::string k = ChaosToString(array_index++); + bson_append_value(tmp, k.c_str(), -1, bv); + } + bson_append_array(ACCESS_BSON(bson), key.c_str(), (int)key.size(), - bson_tmp_array.get()); + tmp); bson_tmp_array.reset(); + bson_free(tmp); + return; + } + bson_append_array(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + bson_tmp_array.get()); + bson_tmp_array.reset(); } -//return a vectorvalue for a key -CMultiTypeDataArrayWrapperSPtr CDataWrapper::getVectorValue(const std::string& key) const{ - return CMultiTypeDataArrayWrapperSPtr(new CMultiTypeDataArrayWrapper(bson, key)); +// return a vectorvalue for a key +CMultiTypeDataArrayWrapperSPtr CDataWrapper::getVectorValue(const std::string& key) const { + return CMultiTypeDataArrayWrapperSPtr(new CMultiTypeDataArrayWrapper(bson, key)); } void CDataWrapper::addNullValue(const std::string& key) { - bson_append_null(ACCESS_BSON(bson), - key.c_str(), - (int)key.size()); + bson_append_null(ACCESS_BSON(bson), + key.c_str(), + (int)key.size()); } -//add a long value +// add a long value void CDataWrapper::addInt32Value(const std::string& key, int32_t value) { - bson_append_int32(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - value); + bson_append_int32(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + value); } -//add a long value +// add a long value void CDataWrapper::addUInt32Value(const std::string& key, uint32_t value) { - bson_append_int32(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - static_cast<int32_t>(value)); + bson_append_int32(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + static_cast<int32_t>(value)); } -//add a double value +// add a double value void CDataWrapper::addDoubleValue(const std::string& key, double value) { - bson_append_double(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - value); + bson_append_double(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + value); } -//add a integer value +// add a integer value void CDataWrapper::addInt64Value(const std::string& key, int64_t value) { - bson_append_int64(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - value); + bson_append_int64(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + value); } -//add a integer value +// add a integer value void CDataWrapper::addUInt64Value(const std::string& key, uint64_t value) { - bson_append_timestamp(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - value>>32, - value&0xFFFFFFFF); -} - -//get a csdata value -CDWUniquePtr CDataWrapper::getCSDataValue(const std::string& key) const{ - FIND_AND_CHECK(key, BSON_ITER_HOLDS_DOCUMENT){ - uint32_t document_len = 0; - const uint8_t *document = NULL; - bson_iter_document(&element_found, - &document_len, - &document); - return CDWUniquePtr(new CDataWrapper((const char *)document,document_len)); - } else { - return CDWUniquePtr(new CDataWrapper()); - } + bson_append_timestamp(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + value >> 32, + value & 0xFFFFFFFF); +} + +// get a csdata value +CDWUniquePtr CDataWrapper::getCSDataValue(const std::string& key) const { + FIND_AND_CHECK(key, BSON_ITER_HOLDS_DOCUMENT) { + uint32_t document_len = 0; + const uint8_t* document = NULL; + bson_iter_document(&element_found, + &document_len, + &document); + return CDWUniquePtr(new CDataWrapper((const char*)document, document_len)); + } + else { + return CDWUniquePtr(new CDataWrapper()); + } } -void CDataWrapper::getCSDataValue(const std::string& key,chaos::common::data::CDataWrapper&cd) const{ - CDWUniquePtr res=getCSDataValue(key); - if(res.get()){ - res->copyAllTo(cd); - } +void CDataWrapper::getCSDataValue(const std::string& key, chaos::common::data::CDataWrapper& cd) const { + CDWUniquePtr res = getCSDataValue(key); + if (res.get()) { + res->copyAllTo(cd); + } } -ChaosUniquePtr<chaos::common::data::CDataWrapper> CDataWrapper::getCSProjection(const std::vector<std::string>&keys) const{ - CDWUniquePtr ret(new CDataWrapper()); - for(std::vector<std::string>::const_iterator i=keys.begin();i!=keys.end();i++){ - copyKeyTo(*i,*ret.get()); - } - return ret; - +ChaosUniquePtr<chaos::common::data::CDataWrapper> CDataWrapper::getCSProjection(const std::vector<std::string>& keys) const { + CDWUniquePtr ret(new CDataWrapper()); + for (std::vector<std::string>::const_iterator i = keys.begin(); i != keys.end(); i++) { + copyKeyTo(*i, *ret.get()); + } + return ret; } -std::string CDataWrapper::getJsonValue(const std::string& key) const{ - ChaosUniquePtr<CDataWrapper> tmp=getCSDataValue(key); - if(tmp.get()){ - return tmp->getJSONString(); - } - return std::string(); +std::string CDataWrapper::getJsonValue(const std::string& key) const { + ChaosUniquePtr<CDataWrapper> tmp = getCSDataValue(key); + if (tmp.get()) { + return tmp->getJSONString(); + } + return std::string(); } -//get string value -string CDataWrapper::getStringValue(const std::string& key) const{ - { - FIND_AND_CHECK(key, BSON_ITER_HOLDS_UTF8){ - return std::string(bson_iter_utf8(&element_found, NULL)); - } +// get string value +string CDataWrapper::getStringValue(const std::string& key) const { + { + FIND_AND_CHECK(key, BSON_ITER_HOLDS_UTF8) { + return std::string(bson_iter_utf8(&element_found, NULL)); } - INIT_ITERATOR(key); - - GET_VALUE_AS_STRING(int32,BSON_ITER_HOLDS_INT32); - GET_VALUE_AS_STRING(double,BSON_ITER_HOLDS_DOUBLE); - GET_VALUE_AS_STRING(int64,BSON_ITER_HOLDS_INT64); - GET_TIMESTAMP_AS_STRING(); + } + INIT_ITERATOR(key); - GET_VALUE_AS_STRING(bool,BSON_ITER_HOLDS_BOOL); - GET_VALUE_AS_STRING(date_time,BSON_ITER_HOLDS_DATE_TIME); + GET_VALUE_AS_STRING(int32, BSON_ITER_HOLDS_INT32); + GET_VALUE_AS_STRING(double, BSON_ITER_HOLDS_DOUBLE); + GET_VALUE_AS_STRING(int64, BSON_ITER_HOLDS_INT64); + GET_TIMESTAMP_AS_STRING(); + GET_VALUE_AS_STRING(bool, BSON_ITER_HOLDS_BOOL); + GET_VALUE_AS_STRING(date_time, BSON_ITER_HOLDS_DATE_TIME); - return std::string(); + return std::string(); } -//get string value -const char * CDataWrapper::getCStringValue(const std::string& key) const{ - return getRawValuePtr(key); +// get string value +const char* CDataWrapper::getCStringValue(const std::string& key) const { + return getRawValuePtr(key); } -//add a integer value -int32_t CDataWrapper::getInt32Value(const std::string& key) const{ - INIT_ITERATOR(key); - GET_VALUE(int32,BSON_ITER_HOLDS_INT32); - GET_VALUE(bool,BSON_ITER_HOLDS_BOOL); - GET_VALUE(double,BSON_ITER_HOLDS_DOUBLE); - if(isStringValue(key)){ - return atoi(getStringValue(key).c_str()); - } - CW_CAST_EXCEPTION(int32); -} -//add a integer value -uint32_t CDataWrapper::getUInt32Value(const std::string& key) const{ - INIT_ITERATOR(key); - GET_VALUE(int32,BSON_ITER_HOLDS_INT32); - GET_VALUE(bool,BSON_ITER_HOLDS_BOOL); - if(isStringValue(key)){ - return atoi(getStringValue(key).c_str()); - } - CW_CAST_EXCEPTION(uint32); -} -//add a integer value -int64_t CDataWrapper::getInt64Value(const std::string& key) const{ - INIT_ITERATOR(key); - GET_VALUE(int64,BSON_ITER_HOLDS_INT64); - - GET_64UVALUE(); - GET_VALUE(date_time,BSON_ITER_HOLDS_DATE_TIME); - GET_VALUE(int32,BSON_ITER_HOLDS_INT32); - GET_VALUE(double,BSON_ITER_HOLDS_DOUBLE); - GET_VALUE(bool,BSON_ITER_HOLDS_BOOL); - if(isStringValue(key)){ - return atoll(getStringValue(key).c_str()); - } - CW_CAST_EXCEPTION(int64); -} -//add a integer value -uint64_t CDataWrapper::getUInt64Value(const std::string& key) const{ - INIT_ITERATOR(key); - GET_64UVALUE(); - GET_VALUE(int64,BSON_ITER_HOLDS_INT64); - GET_VALUE(date_time,BSON_ITER_HOLDS_DATE_TIME); - GET_VALUE(int32,BSON_ITER_HOLDS_INT32); - GET_VALUE(double,BSON_ITER_HOLDS_DOUBLE); - GET_VALUE(bool,BSON_ITER_HOLDS_BOOL); - if(isStringValue(key)){ - return atoll(getStringValue(key).c_str()); - } - CW_CAST_EXCEPTION(uint64); -} -//add a integer value -double CDataWrapper::getDoubleValue(const std::string& key) const{ - INIT_ITERATOR(key); - GET_VALUE(double,BSON_ITER_HOLDS_DOUBLE); - GET_VALUE(int64,BSON_ITER_HOLDS_INT64); - GET_64UVALUE(); - GET_VALUE(int32,BSON_ITER_HOLDS_INT32); - GET_VALUE(bool,BSON_ITER_HOLDS_BOOL); - if(isStringValue(key)){ - return atof(getStringValue(key).c_str()); - } - CW_CAST_EXCEPTION(double); +// add a integer value +int32_t CDataWrapper::getInt32Value(const std::string& key) const { + INIT_ITERATOR(key); + GET_VALUE(int32, BSON_ITER_HOLDS_INT32); + GET_VALUE(bool, BSON_ITER_HOLDS_BOOL); + GET_VALUE(double, BSON_ITER_HOLDS_DOUBLE); + if (isStringValue(key)) { + return atoi(getStringValue(key).c_str()); + } + CW_CAST_EXCEPTION(int32); +} +// add a integer value +uint32_t CDataWrapper::getUInt32Value(const std::string& key) const { + INIT_ITERATOR(key); + GET_VALUE(int32, BSON_ITER_HOLDS_INT32); + GET_VALUE(bool, BSON_ITER_HOLDS_BOOL); + if (isStringValue(key)) { + return atoi(getStringValue(key).c_str()); + } + CW_CAST_EXCEPTION(uint32); +} +// add a integer value +int64_t CDataWrapper::getInt64Value(const std::string& key) const { + INIT_ITERATOR(key); + GET_VALUE(int64, BSON_ITER_HOLDS_INT64); + + GET_64UVALUE(); + GET_VALUE(date_time, BSON_ITER_HOLDS_DATE_TIME); + GET_VALUE(int32, BSON_ITER_HOLDS_INT32); + GET_VALUE(double, BSON_ITER_HOLDS_DOUBLE); + GET_VALUE(bool, BSON_ITER_HOLDS_BOOL); + if (isStringValue(key)) { + return atoll(getStringValue(key).c_str()); + } + CW_CAST_EXCEPTION(int64); +} +// add a integer value +uint64_t CDataWrapper::getUInt64Value(const std::string& key) const { + INIT_ITERATOR(key); + GET_64UVALUE(); + GET_VALUE(int64, BSON_ITER_HOLDS_INT64); + GET_VALUE(date_time, BSON_ITER_HOLDS_DATE_TIME); + GET_VALUE(int32, BSON_ITER_HOLDS_INT32); + GET_VALUE(double, BSON_ITER_HOLDS_DOUBLE); + GET_VALUE(bool, BSON_ITER_HOLDS_BOOL); + if (isStringValue(key)) { + return atoll(getStringValue(key).c_str()); + } + CW_CAST_EXCEPTION(uint64); +} +// add a integer value +double CDataWrapper::getDoubleValue(const std::string& key) const { + INIT_ITERATOR(key); + GET_VALUE(double, BSON_ITER_HOLDS_DOUBLE); + GET_VALUE(int64, BSON_ITER_HOLDS_INT64); + GET_64UVALUE(); + GET_VALUE(int32, BSON_ITER_HOLDS_INT32); + GET_VALUE(bool, BSON_ITER_HOLDS_BOOL); + if (isStringValue(key)) { + return atof(getStringValue(key).c_str()); + } + CW_CAST_EXCEPTION(double); } -//get a bool value -bool CDataWrapper::getBoolValue(const std::string& key) const{ - INIT_ITERATOR(key); - GET_VALUE(bool,BSON_ITER_HOLDS_BOOL); - GET_VALUE(int32,BSON_ITER_HOLDS_INT32); - if(isStringValue(key)){ - return (bool)atoi(getStringValue(key).c_str()); - } - CW_CAST_EXCEPTION(bool); +// get a bool value +bool CDataWrapper::getBoolValue(const std::string& key) const { + INIT_ITERATOR(key); + GET_VALUE(bool, BSON_ITER_HOLDS_BOOL); + GET_VALUE(int32, BSON_ITER_HOLDS_INT32); + if (isStringValue(key)) { + return (bool)atoi(getStringValue(key).c_str()); + } + CW_CAST_EXCEPTION(bool); } - -//set a binary data value +// set a binary data value void CDataWrapper::addBinaryValue(const std::string& key, - const char *buff, - int bufLen) { - bson_append_binary(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - BSON_SUBTYPE_BINARY, - (const uint8_t *)buff, - bufLen); -} - -chaos::DataType::BinarySubtype CDataWrapper::getBinarySubtype(const std::string& key) const{ - bson_subtype_t subtype = BSON_SUBTYPE_USER; - FIND_AND_CHECK(key, BSON_ITER_HOLDS_BINARY){ - const uint8_t *buff = NULL; - uint32_t buf_len; - bson_iter_binary(&element_found, - &subtype, - &buf_len, - &buff); - } - return (chaos::DataType::BinarySubtype)(subtype-BSON_SUBTYPE_USER); + const char* buff, + int bufLen) { + bson_append_binary(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + BSON_SUBTYPE_BINARY, + (const uint8_t*)buff, + bufLen); +} + +chaos::DataType::BinarySubtype CDataWrapper::getBinarySubtype(const std::string& key) const { + bson_subtype_t subtype = BSON_SUBTYPE_USER; + FIND_AND_CHECK(key, BSON_ITER_HOLDS_BINARY) { + const uint8_t* buff = NULL; + uint32_t buf_len; + bson_iter_binary(&element_found, + &subtype, + &buf_len, + &buff); + } + return (chaos::DataType::BinarySubtype)(subtype - BSON_SUBTYPE_USER); } -void CDataWrapper::addBinaryValue(const std::string& key, +void CDataWrapper::addBinaryValue(const std::string& key, chaos::DataType::BinarySubtype sub_type, - const char *buff, - int buf_len) { - bson_append_binary(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - (bson_subtype_t)(sub_type+BSON_SUBTYPE_USER), - (const uint8_t *)buff, - buf_len); + const char* buff, + int buf_len) { + bson_append_binary(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + (bson_subtype_t)(sub_type + BSON_SUBTYPE_USER), + (const uint8_t*)buff, + buf_len); } -void CDataWrapper::appendArray(const std::string& key,char* arr,int count){ - addBinaryValue(key,chaos::DataType::SUB_TYPE_INT8,(const char*)arr,count); +void CDataWrapper::appendArray(const std::string& key, char* arr, int count) { + addBinaryValue(key, chaos::DataType::SUB_TYPE_INT8, (const char*)arr, count); } -void CDataWrapper::appendArray(const std::string& key,int32_t* arr,int count){ - addBinaryValue(key,chaos::DataType::SUB_TYPE_INT32,(const char*)arr,count*sizeof(int32_t)); +void CDataWrapper::appendArray(const std::string& key, int32_t* arr, int count) { + addBinaryValue(key, chaos::DataType::SUB_TYPE_INT32, (const char*)arr, count * sizeof(int32_t)); } -void CDataWrapper::appendArray(const std::string& key,uint32_t* arr,int count){ - addBinaryValue(key,chaos::DataType::SUB_TYPE_UINT32,(const char*)arr,count*sizeof(int32_t)); +void CDataWrapper::appendArray(const std::string& key, uint32_t* arr, int count) { + addBinaryValue(key, chaos::DataType::SUB_TYPE_UINT32, (const char*)arr, count * sizeof(int32_t)); } -void CDataWrapper::appendArray(const std::string& key,double* arr,int count){ - addBinaryValue(key,chaos::DataType::SUB_TYPE_DOUBLE,(const char*)arr,count*sizeof(double)); +void CDataWrapper::appendArray(const std::string& key, double* arr, int count) { + addBinaryValue(key, chaos::DataType::SUB_TYPE_DOUBLE, (const char*)arr, count * sizeof(double)); } -void CDataWrapper::appendArray(const std::string& key,float* arr,int count){ - addBinaryValue(key,chaos::DataType::SUB_TYPE_FLOAT,(const char*)arr,count*sizeof(float)); +void CDataWrapper::appendArray(const std::string& key, float* arr, int count) { + addBinaryValue(key, chaos::DataType::SUB_TYPE_FLOAT, (const char*)arr, count * sizeof(float)); } -void CDataWrapper::appendArray(const std::string& key,int16_t* arr,int count){ - addBinaryValue(key,chaos::DataType::SUB_TYPE_INT16,(const char*)arr,count*sizeof(int16_t)); +void CDataWrapper::appendArray(const std::string& key, int16_t* arr, int count) { + addBinaryValue(key, chaos::DataType::SUB_TYPE_INT16, (const char*)arr, count * sizeof(int16_t)); } -void CDataWrapper::appendArray(const std::string& key,uint16_t* arr,int count){ - addBinaryValue(key,chaos::DataType::SUB_TYPE_UINT16,(const char*)arr,count*sizeof(int16_t)); +void CDataWrapper::appendArray(const std::string& key, uint16_t* arr, int count) { + addBinaryValue(key, chaos::DataType::SUB_TYPE_UINT16, (const char*)arr, count * sizeof(int16_t)); } -void CDataWrapper::appendArray(const std::string& key,int8_t* arr,int count){ - addBinaryValue(key,chaos::DataType::SUB_TYPE_INT8,(const char*)arr,count*sizeof(int16_t)); +void CDataWrapper::appendArray(const std::string& key, int8_t* arr, int count) { + addBinaryValue(key, chaos::DataType::SUB_TYPE_INT8, (const char*)arr, count * sizeof(int16_t)); } -void CDataWrapper::appendArray(const std::string& key,uint8_t* arr,int count){ - addBinaryValue(key,chaos::DataType::SUB_TYPE_UINT8,(const char*)arr,count*sizeof(int16_t)); +void CDataWrapper::appendArray(const std::string& key, uint8_t* arr, int count) { + addBinaryValue(key, chaos::DataType::SUB_TYPE_UINT8, (const char*)arr, count * sizeof(int16_t)); } -void CDataWrapper::appendArray(const std::string& key,int64_t* arr,int count){ - addBinaryValue(key,chaos::DataType::SUB_TYPE_INT64,(const char*)arr,count*sizeof(int64_t)); +void CDataWrapper::appendArray(const std::string& key, int64_t* arr, int count) { + addBinaryValue(key, chaos::DataType::SUB_TYPE_INT64, (const char*)arr, count * sizeof(int64_t)); } -void CDataWrapper::appendArray(const std::string& key,uint64_t* arr,int count){ - addBinaryValue(key,chaos::DataType::SUB_TYPE_UINT64,(const char*)arr,count*sizeof(uint64_t)); +void CDataWrapper::appendArray(const std::string& key, uint64_t* arr, int count) { + addBinaryValue(key, chaos::DataType::SUB_TYPE_UINT64, (const char*)arr, count * sizeof(uint64_t)); } -void CDataWrapper::append(const std::string& key,int32_t val){ - addInt32Value(key, val); +void CDataWrapper::append(const std::string& key, int32_t val) { + addInt32Value(key, val); } -void CDataWrapper::append(const std::string& key,int64_t val){ - addInt64Value(key, val); +void CDataWrapper::append(const std::string& key, int64_t val) { + addInt64Value(key, val); } -void CDataWrapper::append(const std::string& key,double val){ - addDoubleValue(key, val); +void CDataWrapper::append(const std::string& key, double val) { + addDoubleValue(key, val); } -void CDataWrapper::append(const std::string& key,bool val){ - addBoolValue(key, val); +void CDataWrapper::append(const std::string& key, bool val) { + addBoolValue(key, val); } -void CDataWrapper::append(const std::string& key,const std::string& val){ - addStringValue(key, val); +void CDataWrapper::append(const std::string& key, const std::string& val) { + addStringValue(key, val); } -void CDataWrapper::append(const std::string& key,const char* val){ - addStringValue(key, val); +void CDataWrapper::append(const std::string& key, const char* val) { + addStringValue(key, val); } -void CDataWrapper::append(const std::string& key,const CDataWrapper& val){ - addCSDataValue(key,val); +void CDataWrapper::append(const std::string& key, const CDataWrapper& val) { + addCSDataValue(key, val); } /* void CDataWrapper::append(const std::string& key,const std::vector<int32_t>& val){ @@ -649,257 +670,251 @@ void CDataWrapper::append(const std::string& key,const std::vector<bool>& val){ } */ -void CDataWrapper::append(const std::string& key,const std::vector<std::string>& val){ - ADD_VECTOR(val,std::string,String); - finalizeArrayForKey(key); - +void CDataWrapper::append(const std::string& key, const std::vector<std::string>& val) { + ADD_VECTOR(val, std::string, String); + finalizeArrayForKey(key); } -void CDataWrapper::append(const std::string& key,const std::vector<CDataWrapper>& val){ - ADD_VECTOR(val,CDataWrapper,CDataWrapper); - finalizeArrayForKey(key); +void CDataWrapper::append(const std::string& key, const std::vector<CDataWrapper>& val) { + ADD_VECTOR(val, CDataWrapper, CDataWrapper); + finalizeArrayForKey(key); } -void CDataWrapper::append(const std::string& key,const std::vector<int32_t>& val){ - ADD_VECTOR(val,int32_t,Int32); - finalizeArrayForKey(key); - +void CDataWrapper::append(const std::string& key, const std::vector<int32_t>& val) { + ADD_VECTOR(val, int32_t, Int32); + finalizeArrayForKey(key); } -void CDataWrapper::append(const std::string& key,const std::vector<int64_t>& val){ - ADD_VECTOR(val,int64_t,Int64); - finalizeArrayForKey(key); - +void CDataWrapper::append(const std::string& key, const std::vector<int64_t>& val) { + ADD_VECTOR(val, int64_t, Int64); + finalizeArrayForKey(key); } -void CDataWrapper::append(const std::string& key,const std::vector<double>& val){ - ADD_VECTOR(val,double,Double); - finalizeArrayForKey(key); +void CDataWrapper::append(const std::string& key, const std::vector<double>& val) { + ADD_VECTOR(val, double, Double); + finalizeArrayForKey(key); } -void CDataWrapper::append(const std::string&key,DataType::DataType typ,const char*buf,int len){ - int i; - if(len<=0 ||(typ!=DataType::TYPE_BOOLEAN) &&(typ!=DataType::TYPE_INT32)&&(typ!=DataType::TYPE_INT64)&&(typ!=DataType::TYPE_DOUBLE) ){ - throw CException(-51, "Invalid ARRAY TYPE/SIZE", __PRETTY_FUNCTION__); - +void CDataWrapper::append(const std::string& key, DataType::DataType typ, const char* buf, int len) { + int i; + if (len <= 0 || (typ != DataType::TYPE_BOOLEAN) && (typ != DataType::TYPE_INT32) && (typ != DataType::TYPE_INT64) && (typ != DataType::TYPE_DOUBLE)) { + throw CException(-51, "Invalid ARRAY TYPE/SIZE", __PRETTY_FUNCTION__); + } + switch (typ) { + case DataType::TYPE_BOOLEAN: + for (i = 0; i < len / sizeof(bool); i++) { + appendBooleanToArray(((bool*)buf)[i]); + } + break; + case DataType::TYPE_INT32: + for (i = 0; i < len / sizeof(int32_t); i++) { + appendInt32ToArray(((int32_t*)buf)[i]); + } + break; + case DataType::TYPE_INT64: + for (i = 0; i < len / sizeof(int64_t); i++) { + appendInt64ToArray(((int64_t*)buf)[i]); + } + break; + case DataType::TYPE_UINT64: + for (i = 0; i < len / sizeof(uint64_t); i++) { + appendInt64ToArray(((uint64_t*)buf)[i]); + } + break; + case DataType::TYPE_DOUBLE: + case DataType::TYPE_FLOAT: + for (i = 0; i < len / sizeof(double); i++) { + appendDoubleToArray(((double*)buf)[i]); + } + break; + + default: { + break; } - switch (typ) { - case DataType::TYPE_BOOLEAN: - for(i=0;i<len/sizeof(bool);i++){ - appendBooleanToArray(((bool*)buf)[i]); - } - break; - case DataType::TYPE_INT32: - for( i=0;i<len/sizeof(int32_t);i++){ - appendInt32ToArray(((int32_t*)buf)[i]); - } - break; - case DataType::TYPE_INT64: - for( i=0;i<len/sizeof(int64_t);i++){ - appendInt64ToArray(((int64_t*)buf)[i]); - } - break; - case DataType::TYPE_UINT64: - for( i=0;i<len/sizeof(uint64_t);i++){ - appendInt64ToArray(((uint64_t*)buf)[i]); - } - break; - case DataType::TYPE_DOUBLE: - case DataType::TYPE_FLOAT: - for( i=0;i<len/sizeof(double);i++){ - appendDoubleToArray(((double*)buf)[i]); - } - break; - - default:{ - break; - } - } - finalizeArrayForKey(key); + } + finalizeArrayForKey(key); } -void CDataWrapper::addVariantValue(const std::string& key, +void CDataWrapper::addVariantValue(const std::string& key, const CDataVariant& variant_value) { - //create variant using the typed data - switch (variant_value.getType()) { - case DataType::TYPE_BOOLEAN: - addBoolValue(key, variant_value.asBool()); - break; - case DataType::TYPE_INT32: - addInt32Value(key, variant_value.asInt32()); - break; - case DataType::TYPE_INT64: - addInt64Value(key, variant_value.asInt64()); - break; - case DataType::TYPE_UINT64: - addUInt64Value(key, variant_value.asUInt64()); - break; - case DataType::TYPE_DOUBLE: - case DataType::TYPE_FLOAT: - addDoubleValue(key, variant_value.asDouble()); - break; - case DataType::TYPE_CLUSTER:{ - addJsonValue(key,variant_value.asString()); - break; - } - case DataType::TYPE_STRING: - addStringValue(key, variant_value.asString()); - break; - case DataType::TYPE_BYTEARRAY: - addBinaryValue(key, - variant_value.asCDataBuffer()->getBuffer(), - (uint32_t)variant_value.asCDataBuffer()->getBufferSize()); - break; - default:{ - break; - } + // create variant using the typed data + switch (variant_value.getType()) { + case DataType::TYPE_BOOLEAN: + addBoolValue(key, variant_value.asBool()); + break; + case DataType::TYPE_INT32: + addInt32Value(key, variant_value.asInt32()); + break; + case DataType::TYPE_INT64: + addInt64Value(key, variant_value.asInt64()); + break; + case DataType::TYPE_UINT64: + addUInt64Value(key, variant_value.asUInt64()); + break; + case DataType::TYPE_DOUBLE: + case DataType::TYPE_FLOAT: + addDoubleValue(key, variant_value.asDouble()); + break; + case DataType::TYPE_CLUSTER: { + addJsonValue(key, variant_value.asString()); + break; + } + case DataType::TYPE_STRING: + addStringValue(key, variant_value.asString()); + break; + case DataType::TYPE_BYTEARRAY: + addBinaryValue(key, + variant_value.asCDataBuffer()->getBuffer(), + (uint32_t)variant_value.asCDataBuffer()->getBufferSize()); + break; + default: { + break; } + } } -//return the binary data value -const char* CDataWrapper::getBinaryValue(const std::string& key, uint32_t& bufLen) const{ - const uint8_t* ret = NULL; - bson_subtype_t sub = BSON_SUBTYPE_USER; - FIND_AND_CHECK(key, BSON_ITER_HOLDS_BINARY){ - bson_iter_binary(&element_found, - &sub, - &bufLen, - &ret); - return (const char*)ret; - } - return NULL; +// return the binary data value +const char* CDataWrapper::getBinaryValue(const std::string& key, uint32_t& bufLen) const { + const uint8_t* ret = NULL; + bson_subtype_t sub = BSON_SUBTYPE_USER; + FIND_AND_CHECK(key, BSON_ITER_HOLDS_BINARY) { + bson_iter_binary(&element_found, + &sub, + &bufLen, + &ret); + return (const char*)ret; + } + return NULL; } -CDBufferUniquePtr CDataWrapper::getBinaryValueAsCDataBuffer(const std::string &key) const{ - uint32_t buf_len = 0; - const char* buffer = getBinaryValue(key, buf_len); - if(buffer==NULL){ - // if not a pure binary probably is a string with a base64 - FIND_AND_CHECK(key, BSON_ITER_HOLDS_UTF8){ - std::string strb(bson_iter_utf8(&element_found, NULL)); - return Base64Util::decode(strb); - } +CDBufferUniquePtr CDataWrapper::getBinaryValueAsCDataBuffer(const std::string& key) const { + uint32_t buf_len = 0; + const char* buffer = getBinaryValue(key, buf_len); + if (buffer == NULL) { + // if not a pure binary probably is a string with a base64 + FIND_AND_CHECK(key, BSON_ITER_HOLDS_UTF8) { + std::string strb(bson_iter_utf8(&element_found, NULL)); + return Base64Util::decode(strb); } - return CDBufferUniquePtr(new CDataBuffer(buffer, - buf_len)); -} - -//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()); + } + return CDBufferUniquePtr(new CDataBuffer(buffer, + buf_len)); } -bool CDataWrapper::isVector(const std::string& key) const{ - FIND_AND_CHECK(key, BSON_ITER_HOLDS_ARRAY){ - return true; - } else { - return false; - } +// 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()); } -//return all key contained into the object -void CDataWrapper::getAllKey(ChaosStringVector& contained_key) const{ - bson_iter_t it; - bson_iter_init(&it, ACCESS_BSON(bson)); - while(bson_iter_next(&it)) { - contained_key.push_back(bson_iter_key(&it)); - } +bool CDataWrapper::isVector(const std::string& key) const { + FIND_AND_CHECK(key, BSON_ITER_HOLDS_ARRAY) { + return true; + } + else { + return false; + } } -//return all key contained into the object -void CDataWrapper::getAllKey(ChaosStringSet& contained_key) const{ - bson_iter_t it; - bson_iter_init(&it, ACCESS_BSON(bson)); - while(bson_iter_next(&it)) { - contained_key.insert(bson_iter_key(&it)); - } +// return all key contained into the object +void CDataWrapper::getAllKey(ChaosStringVector& contained_key) const { + bson_iter_t it; + bson_iter_init(&it, ACCESS_BSON(bson)); + while (bson_iter_next(&it)) { + contained_key.push_back(bson_iter_key(&it)); + } } -ChaosStringVector CDataWrapper::getAllKey() const{ - ChaosStringVector ret; - getAllKey(ret); - return ret; +// return all key contained into the object +void CDataWrapper::getAllKey(ChaosStringSet& contained_key) const { + bson_iter_t it; + bson_iter_init(&it, ACCESS_BSON(bson)); + while (bson_iter_next(&it)) { + contained_key.insert(bson_iter_key(&it)); + } } - -//return all key contained into the object -uint32_t CDataWrapper::getValueSize(const std::string& key) const{ - bson_iter_t it; - bson_iter_init(&it, ACCESS_BSON(bson)); - if(bson_iter_find_case(&it, key.c_str()) == false) return 0; - const bson_value_t *v = bson_iter_value(&it); - switch(v->value_type) { - case BSON_TYPE_INT64: - case BSON_TYPE_TIMESTAMP: - return sizeof(int64_t); - case BSON_TYPE_INT32: - return sizeof(int32_t); - case BSON_TYPE_BOOL: - return sizeof(bool); - case BSON_TYPE_DOUBLE: - return sizeof(double); - case BSON_TYPE_UTF8: - return v->value.v_utf8.len; - case BSON_TYPE_BINARY: - return v->value.v_binary.data_len; - case BSON_TYPE_ARRAY:{ - uint32_t array_len = 0; - const uint8_t *array = NULL; - bson_iter_array(&it, &array_len, &array); - return array_len; - } - case BSON_TYPE_DOCUMENT:{ - return v->value.v_doc.data_len; - } - default: - return 0; - break; - } - return 0; +ChaosStringVector CDataWrapper::getAllKey() const { + ChaosStringVector ret; + getAllKey(ret); + return ret; +} + +// return all key contained into the object +uint32_t CDataWrapper::getValueSize(const std::string& key) const { + bson_iter_t it; + bson_iter_init(&it, ACCESS_BSON(bson)); + if (bson_iter_find_case(&it, key.c_str()) == false) return 0; + const bson_value_t* v = bson_iter_value(&it); + switch (v->value_type) { + case BSON_TYPE_INT64: + case BSON_TYPE_TIMESTAMP: + return sizeof(int64_t); + case BSON_TYPE_INT32: + return sizeof(int32_t); + case BSON_TYPE_BOOL: + return sizeof(bool); + case BSON_TYPE_DOUBLE: + return sizeof(double); + case BSON_TYPE_UTF8: + return v->value.v_utf8.len; + case BSON_TYPE_BINARY: + return v->value.v_binary.data_len; + case BSON_TYPE_ARRAY: { + uint32_t array_len = 0; + const uint8_t* array = NULL; + bson_iter_array(&it, &array_len, &array); + return array_len; + } + case BSON_TYPE_DOCUMENT: { + return v->value.v_doc.data_len; + } + default: + return 0; + break; + } + return 0; } //! return the raw value ptr address -const char * CDataWrapper::getRawValuePtr(const std::string& key) const{ - bson_iter_t it; - bson_iter_init(&it, ACCESS_BSON(bson)); - if(bson_iter_find_case(&it, key.c_str()) == false) return 0; - const bson_value_t *v = bson_iter_value(&it); - switch(v->value_type) { - case BSON_TYPE_TIMESTAMP:{ - - - return reinterpret_cast<const char*>(&v->value.v_timestamp); - } - case BSON_TYPE_INT64: - - return reinterpret_cast<const char*>(&v->value.v_int64); - case BSON_TYPE_INT32: - return reinterpret_cast<const char*>(&v->value.v_int32); - case BSON_TYPE_BOOL: - return reinterpret_cast<const char*>(&v->value.v_bool); - case BSON_TYPE_DOUBLE: - return reinterpret_cast<const char*>(&v->value.v_double); - case BSON_TYPE_UTF8: - return static_cast<const char*>(v->value.v_utf8.str); - case BSON_TYPE_BINARY: - return reinterpret_cast<const char*>(v->value.v_binary.data); - case BSON_TYPE_ARRAY:{ - uint32_t array_len = 0; - const uint8_t *array = NULL; - bson_iter_array(&it, &array_len, &array); - return reinterpret_cast<const char*>(array); - } - case BSON_TYPE_DOCUMENT:{ - return reinterpret_cast<const char*>(v->value.v_doc.data); - } - default: - return NULL; - break; - } +const char* CDataWrapper::getRawValuePtr(const std::string& key) const { + bson_iter_t it; + bson_iter_init(&it, ACCESS_BSON(bson)); + if (bson_iter_find_case(&it, key.c_str()) == false) return 0; + const bson_value_t* v = bson_iter_value(&it); + switch (v->value_type) { + case BSON_TYPE_TIMESTAMP: { + return reinterpret_cast<const char*>(&v->value.v_timestamp); + } + case BSON_TYPE_INT64: + + return reinterpret_cast<const char*>(&v->value.v_int64); + case BSON_TYPE_INT32: + return reinterpret_cast<const char*>(&v->value.v_int32); + case BSON_TYPE_BOOL: + return reinterpret_cast<const char*>(&v->value.v_bool); + case BSON_TYPE_DOUBLE: + return reinterpret_cast<const char*>(&v->value.v_double); + case BSON_TYPE_UTF8: + return static_cast<const char*>(v->value.v_utf8.str); + case BSON_TYPE_BINARY: + return reinterpret_cast<const char*>(v->value.v_binary.data); + case BSON_TYPE_ARRAY: { + uint32_t array_len = 0; + const uint8_t* array = NULL; + bson_iter_array(&it, &array_len, &array); + return reinterpret_cast<const char*>(array); + } + case BSON_TYPE_DOCUMENT: { + return reinterpret_cast<const char*>(v->value.v_doc.data); + } + default: + return NULL; + break; + } } -//add a bool value +// add a bool value void CDataWrapper::addBoolValue(const std::string& key, bool value) { - bson_append_bool(ACCESS_BSON(bson), - key.c_str(), - (int)key.size(), - value); + bson_append_bool(ACCESS_BSON(bson), + key.c_str(), + (int)key.size(), + value); } /* @@ -911,95 +926,93 @@ __attribute__((__deprecated__)) #else __declspec(deprecated) #endif -SerializationBufferUPtr CDataWrapper::getBSONData() const{ - const char * buff = reinterpret_cast<const char*>(bson_get_data(ACCESS_BSON(bson))); - if(!buff) return SerializationBufferUPtr(); - return SerializationBufferUPtr(new SerializationBuffer(buff, bson->len)); +SerializationBufferUPtr +CDataWrapper::getBSONData() const { + const char* buff = reinterpret_cast<const char*>(bson_get_data(ACCESS_BSON(bson))); + if (!buff) return SerializationBufferUPtr(); + return SerializationBufferUPtr(new SerializationBuffer(buff, bson->len)); } BufferUPtr CDataWrapper::getBSONDataBuffer() const { - return BufferUPtr(new Buffer(reinterpret_cast<const char*>(bson_get_data(ACCESS_BSON(bson))), - bson->len)); + return BufferUPtr(new Buffer(reinterpret_cast<const char*>(bson_get_data(ACCESS_BSON(bson))), + bson->len)); } /* Return the pointer of the data and the size. th eownership of data remain of the CDataWrapper */ -const char* CDataWrapper::getBSONRawData(int& size) const{ - if(bson.get()==NULL){ - return NULL; - - } - size = bson->len; - return reinterpret_cast<const char*>(bson_get_data(ACCESS_BSON(bson))); +const char* CDataWrapper::getBSONRawData(int& size) const { + if (bson.get() == NULL) { + return NULL; + } + size = bson->len; + return reinterpret_cast<const char*>(bson_get_data(ACCESS_BSON(bson))); } /* Return the pointer of the data and the size. th eownership of data remain of the CDataWrapper */ -const char* CDataWrapper::getBSONRawData() const{ - return reinterpret_cast<const char*>(bson_get_data(ACCESS_BSON(bson))); +const char* CDataWrapper::getBSONRawData() const { + return reinterpret_cast<const char*>(bson_get_data(ACCESS_BSON(bson))); +} +const bson_t* CDataWrapper::getBSON() const { + return reinterpret_cast<const bson_t*>((ACCESS_BSON(bson))); } -const bson_t*CDataWrapper::getBSON() const { - return reinterpret_cast<const bson_t*>((ACCESS_BSON(bson))); - } -const int CDataWrapper::getBSONRawSize() const{ - return bson->len; +const int CDataWrapper::getBSONRawSize() const { + return bson->len; } -//return the json data -string CDataWrapper::getJSONString() const{ - size_t str_size = 0; - if(bson.get()==NULL){ - return std::string("{}"); +// return the json data +string CDataWrapper::getJSONString() const { + size_t str_size = 0; + if (bson.get() == NULL) { + return std::string("{}"); + } + char* str_c = bson_as_canonical_extended_json(ACCESS_BSON(bson), + &str_size); + if (str_c == NULL) { + return std::string("{}"); + } + std::string result(str_c); + bson_free(str_c); + return result; +} +// return the json data +string CDataWrapper::getCompliantJSONString() const { + size_t str_size = 0; + char* str_c = bson_as_relaxed_extended_json(ACCESS_BSON(bson), &str_size); + if (str_c == NULL) { + str_c = bson_as_canonical_extended_json(ACCESS_BSON(bson), &str_size); + if (str_c == NULL) { + return std::string("{}"); } - char * str_c = bson_as_canonical_extended_json(ACCESS_BSON(bson), - &str_size); - if(str_c==NULL){ - return std::string("{}"); - - } - std::string result(str_c); - bson_free(str_c); - return result; -} - -//return the json data -string CDataWrapper::getCompliantJSONString() const{ - size_t str_size = 0; - char * str_c = bson_as_relaxed_extended_json(ACCESS_BSON(bson),&str_size); - if(str_c==NULL){ - str_c =bson_as_canonical_extended_json(ACCESS_BSON(bson), &str_size); - if(str_c==NULL){ - return std::string("{}"); - } - LERR_<<"## cannot convert to compliant JSON:'"<<str_c<<"'"; - } - std::string result(str_c); - bson_free(str_c); - return result; + LERR_ << "## cannot convert to compliant JSON:'" << str_c << "'"; + } + std::string result(str_c); + bson_free(str_c); + return result; } -//reinitialize the object with bson data +// reinitialize the object with bson data void CDataWrapper::setSerializedData(const char* bson_data) { - bson_iter_t it; - size_t len = (size_t)BSON_UINT32_FROM_LE(*reinterpret_cast<const uint32_t *>(bson_data)); - if(!bson_iter_init_from_data(&it, - reinterpret_cast<const uint8_t *>(bson_data), - len)) return; - while(bson_iter_next(&it)){ - bson_append_value(ACCESS_BSON(bson), - bson_iter_key(&it), - -1, - bson_iter_value(&it)); - } + bson_iter_t it; + size_t len = (size_t)BSON_UINT32_FROM_LE(*reinterpret_cast<const uint32_t*>(bson_data)); + if (!bson_iter_init_from_data(&it, + reinterpret_cast<const uint8_t*>(bson_data), + len)) return; + while (bson_iter_next(&it)) { + bson_append_value(ACCESS_BSON(bson), + bson_iter_key(&it), + -1, + bson_iter_value(&it)); + } } -//reinitialize the object with bson data +// reinitialize the object with bson data void CDataWrapper::setSerializedJsonData(const char* json_data) { bson_error_t err; size_t len = (size_t)strlen(json_data); @@ -1009,257 +1022,248 @@ void CDataWrapper::setSerializedJsonData(const char* json_data) { &err)); if (bson == NULL) { std::stringstream ss; - ss << "Error serializing json into bson: '"<<err.message<<"' json:'"<< json_data << "' "; + ss << "Error serializing json into bson: '" << err.message << "' json:'" << json_data << "' "; throw CException(1, ss.str(), __PRETTY_FUNCTION__); } } } -//append all elemento of an +// append all elemento of an void CDataWrapper::appendAllElement(CDataWrapper& src_cdw) { - bson_iter_t it; - bson_iter_init(&it, ACCESS_BSON(src_cdw.bson)); - while (bson_iter_next(&it)) { - bson_append_value(ACCESS_BSON(bson), - bson_iter_key(&it), - -1, - bson_iter_value(&it)); - } + bson_iter_t it; + bson_iter_init(&it, ACCESS_BSON(src_cdw.bson)); + while (bson_iter_next(&it)) { + bson_append_value(ACCESS_BSON(bson), + bson_iter_key(&it), + -1, + bson_iter_value(&it)); + } } bool CDataWrapper::copyKeyTo(const std::string& key_to_copy, - CDataWrapper& destination) const { - return copyKeyToNewKey(key_to_copy, - key_to_copy, - destination); + CDataWrapper& destination) const { + return copyKeyToNewKey(key_to_copy, + key_to_copy, + destination); } -//!copy a key(with value) from this instance to another CDataWrapper witha new key +//! copy a key(with value) from this instance to another CDataWrapper witha new key bool CDataWrapper::copyKeyToNewKey(const std::string& key_to_copy, const std::string& new_key, - CDataWrapper& destination) const { - bson_iter_t it; - bson_iter_init(&it, ACCESS_BSON(bson)); - if(bson_iter_find_case(&it, key_to_copy.c_str()) == false) return false; - bson_append_value(ACCESS_BSON(destination.bson), - new_key.c_str(), - (int)new_key.size(), - bson_iter_value(&it)); - return true; + CDataWrapper& destination) const { + bson_iter_t it; + bson_iter_init(&it, ACCESS_BSON(bson)); + if (bson_iter_find_case(&it, key_to_copy.c_str()) == false) return false; + bson_append_value(ACCESS_BSON(destination.bson), + new_key.c_str(), + (int)new_key.size(), + bson_iter_value(&it)); + return true; } void CDataWrapper::copyAllTo(CDataWrapper& destination) const { - bson_iter_t it; - bson_iter_init(&it, ACCESS_BSON(bson)); - while (bson_iter_next(&it)) { - bson_append_value(ACCESS_BSON(destination.bson), - bson_iter_key(&it), - -1, - bson_iter_value(&it)); - } + bson_iter_t it; + bson_iter_init(&it, ACCESS_BSON(bson)); + while (bson_iter_next(&it)) { + bson_append_value(ACCESS_BSON(destination.bson), + bson_iter_key(&it), + -1, + bson_iter_value(&it)); + } } -//reset the datawrapper +// reset the datawrapper void CDataWrapper::reset() { - bson_reinit(ACCESS_BSON(bson)); - bson_tmp_array.reset(); -} -bool CDataWrapper::removeKey(const std::string& key){ - CDataWrapper destination; - bson_iter_t it; - bool found=false; - bson_iter_init(&it, ACCESS_BSON(bson)); - while (bson_iter_next(&it)) { - if(bson_iter_key(&it)!=key){ - bson_append_value(ACCESS_BSON(destination.bson), - bson_iter_key(&it), - -1, - bson_iter_value(&it)); - } else { - found=true; - } - } - bson_reinit(ACCESS_BSON(bson)); - bson_iter_init(&it, ACCESS_BSON(destination.bson)); - while (bson_iter_next(&it)) { - bson_append_value(ACCESS_BSON(bson), - bson_iter_key(&it), - -1, - bson_iter_value(&it)); - - } - return found; -} -bool CDataWrapper::replaceKey(const std::string& key,const CDataWrapper&d ){ - CDataWrapper destination; - bson_iter_t it; - bool found=false; - bson_iter_init(&it, ACCESS_BSON(bson)); - while (bson_iter_next(&it)) { - if(bson_iter_key(&it)!=key){ - bson_append_value(ACCESS_BSON(destination.bson), - bson_iter_key(&it), - -1, - bson_iter_value(&it)); - } else { - bson_append_document(ACCESS_BSON(destination.bson), - key.c_str(), - (int)key.size(), - ACCESS_BSON(d.bson)); - - found=true; - } - } - reset(); - bson_iter_init(&it, ACCESS_BSON(destination.bson)); - while (bson_iter_next(&it)) { - bson_append_value(ACCESS_BSON(bson), - bson_iter_key(&it), - -1, - bson_iter_value(&it)); - + bson_reinit(ACCESS_BSON(bson)); + bson_tmp_array.reset(); +} +bool CDataWrapper::removeKey(const std::string& key) { + CDataWrapper destination; + bson_iter_t it; + bool found = false; + bson_iter_init(&it, ACCESS_BSON(bson)); + while (bson_iter_next(&it)) { + if (bson_iter_key(&it) != key) { + bson_append_value(ACCESS_BSON(destination.bson), + bson_iter_key(&it), + -1, + bson_iter_value(&it)); + } else { + found = true; } - return found; -} - - -string CDataWrapper::toHash() const{ - char ret[33]; - bson_md5_t m; - uint8_t digest[16]; - bson_md5_init(&m); - bson_md5_append(&m, - bson_get_data(ACCESS_BSON(bson)), - bson->len); - bson_md5_finish(&m, - digest); - memset(ret, 0, 33); - for(int i = 0; i < 16; ++i) { - sprintf(&ret[i*2], "%02x", (unsigned int)digest[i]); + } + bson_reinit(ACCESS_BSON(bson)); + bson_iter_init(&it, ACCESS_BSON(destination.bson)); + while (bson_iter_next(&it)) { + bson_append_value(ACCESS_BSON(bson), + bson_iter_key(&it), + -1, + bson_iter_value(&it)); + } + return found; +} +bool CDataWrapper::replaceKey(const std::string& key, const CDataWrapper& d) { + CDataWrapper destination; + bson_iter_t it; + bool found = false; + bson_iter_init(&it, ACCESS_BSON(bson)); + while (bson_iter_next(&it)) { + if (bson_iter_key(&it) != key) { + bson_append_value(ACCESS_BSON(destination.bson), + bson_iter_key(&it), + -1, + bson_iter_value(&it)); + } else { + bson_append_document(ACCESS_BSON(destination.bson), + key.c_str(), + (int)key.size(), + ACCESS_BSON(d.bson)); + + found = true; } - return std::string(ret, 33); + } + reset(); + bson_iter_init(&it, ACCESS_BSON(destination.bson)); + while (bson_iter_next(&it)) { + bson_append_value(ACCESS_BSON(bson), + bson_iter_key(&it), + -1, + bson_iter_value(&it)); + } + return found; +} + +string CDataWrapper::toHash() const { + char ret[33]; + bson_md5_t m; + uint8_t digest[16]; + bson_md5_init(&m); + bson_md5_append(&m, + bson_get_data(ACCESS_BSON(bson)), + bson->len); + bson_md5_finish(&m, + digest); + memset(ret, 0, 33); + for (int i = 0; i < 16; ++i) { + sprintf(&ret[i * 2], "%02x", (unsigned int)digest[i]); + } + return std::string(ret, 33); } -CDataVariant CDataWrapper::getVariantValue(const std::string& key) const{ - //check if key is present - if(!hasKey(key)) { - LERR_<<__PRETTY_FUNCTION__<<" Key '"+key+"' not found "; - return CDataVariant(); - } - //create variant using the typed data - switch (getValueType(key)) { - case chaos::DataType::TYPE_BOOLEAN: - return CDataVariant(getBoolValue(key)); - case chaos::DataType::TYPE_INT32: - return CDataVariant(getInt32Value(key)); - case chaos::DataType::TYPE_INT64: - return CDataVariant(getInt64Value(key)); - case chaos::DataType::TYPE_UINT64: - return CDataVariant(getUInt64Value(key)); - case chaos::DataType::TYPE_DOUBLE:{ - double val=getDoubleValue(key); - return CDataVariant(val); - } - case chaos::DataType::TYPE_FLOAT:{ - float val=getDoubleValue(key); - return CDataVariant(val); - } - case chaos::DataType::TYPE_STRING: - return CDataVariant(getStringValue(key)); - case chaos::DataType::TYPE_CLUSTER: - if(isStringValue(key)){ - return CDataVariant(getValueType(key),(const void *)getStringValue(key).c_str(),(uint32_t)getStringValue(key).size()+1); - } else { - return CDataVariant(MOVE(getCSDataValue(key))); - - } - - - case chaos::DataType::TYPE_BYTEARRAY: - return CDataVariant(getBinaryValueAsCDataBuffer(key)); - default: - throw CException(-120, "Variant value type for key '"+key+"' unsupported", __PRETTY_FUNCTION__); - - break; - } +CDataVariant CDataWrapper::getVariantValue(const std::string& key) const { + // check if key is present + if (!hasKey(key)) { + LERR_ << __PRETTY_FUNCTION__ << " Key '" + key + "' not found "; return CDataVariant(); - + } + // create variant using the typed data + switch (getValueType(key)) { + case chaos::DataType::TYPE_BOOLEAN: + return CDataVariant(getBoolValue(key)); + case chaos::DataType::TYPE_INT32: + return CDataVariant(getInt32Value(key)); + case chaos::DataType::TYPE_INT64: + return CDataVariant(getInt64Value(key)); + case chaos::DataType::TYPE_UINT64: + return CDataVariant(getUInt64Value(key)); + case chaos::DataType::TYPE_DOUBLE: { + double val = getDoubleValue(key); + return CDataVariant(val); + } + case chaos::DataType::TYPE_FLOAT: { + float val = getDoubleValue(key); + return CDataVariant(val); + } + case chaos::DataType::TYPE_STRING: + return CDataVariant(getStringValue(key)); + case chaos::DataType::TYPE_CLUSTER: + if (isStringValue(key)) { + return CDataVariant(getValueType(key), (const void*)getStringValue(key).c_str(), (uint32_t)getStringValue(key).size() + 1); + } else { + return CDataVariant(MOVE(getCSDataValue(key))); + } + + case chaos::DataType::TYPE_BYTEARRAY: + return CDataVariant(getBinaryValueAsCDataBuffer(key)); + default: + throw CException(-120, "Variant value type for key '" + key + "' unsupported", __PRETTY_FUNCTION__); + + break; + } + return CDataVariant(); } //------------------------checking utility -bool CDataWrapper::isNullValue(const std::string& key) const{ - FIND_AND_CHECK(key, BSON_ITER_HOLDS_NULL){ - return true; - } - return false; +bool CDataWrapper::isNullValue(const std::string& key) const { + FIND_AND_CHECK(key, BSON_ITER_HOLDS_NULL) { + return true; + } + return false; } -bool CDataWrapper::isBoolValue(const std::string& key) const{ - FIND_AND_CHECK(key, BSON_ITER_HOLDS_BOOL){ - return true; - } - return false; +bool CDataWrapper::isBoolValue(const std::string& key) const { + FIND_AND_CHECK(key, BSON_ITER_HOLDS_BOOL) { + return true; + } + return false; } -bool CDataWrapper::isInt32Value(const std::string& key) const{ - FIND_AND_CHECK(key, BSON_ITER_HOLDS_INT32){ - return true; - } - return false; +bool CDataWrapper::isInt32Value(const std::string& key) const { + FIND_AND_CHECK(key, BSON_ITER_HOLDS_INT32) { + return true; + } + return false; } -bool CDataWrapper::isInt64Value(const std::string& key) const{ - bson_iter_t element_found; - bson_iter_init(&element_found, ACCESS_BSON(bson)); - if(bson_iter_find_case(&element_found, key.c_str())){ - if(BSON_ITER_HOLDS_INT64(&element_found)||BSON_ITER_HOLDS_TIMESTAMP(&element_found)){ - return true; - } +bool CDataWrapper::isInt64Value(const std::string& key) const { + bson_iter_t element_found; + bson_iter_init(&element_found, ACCESS_BSON(bson)); + if (bson_iter_find_case(&element_found, key.c_str())) { + if (BSON_ITER_HOLDS_INT64(&element_found) || BSON_ITER_HOLDS_TIMESTAMP(&element_found)) { + return true; } - return false; + } + return false; } - - -bool CDataWrapper::isDoubleValue(const std::string& key) const{ - FIND_AND_CHECK(key, BSON_ITER_HOLDS_DOUBLE){ - return true; - } - return false; +bool CDataWrapper::isDoubleValue(const std::string& key) const { + FIND_AND_CHECK(key, BSON_ITER_HOLDS_DOUBLE) { + return true; + } + return false; } -bool CDataWrapper::isJsonValue(const std::string& json) const{ - bool ret=false; - try{ - CDataWrapper tmp; - tmp.setSerializedJsonData(json.c_str()); - ret=true; - } catch(...){ - - } - return ret; +bool CDataWrapper::isJsonValue(const std::string& json) const { + bool ret = false; + try { + CDataWrapper tmp; + tmp.setSerializedJsonData(json.c_str()); + ret = true; + } catch (...) { + } + return ret; } -double CDataWrapper::getAsRealValue(const std::string& key) const{ - if(isDoubleValue(key)){ - return getDoubleValue(key); - } - if(isInt32Value(key)){ - return (double)getInt32Value(key); - } - if(isInt64Value(key)){ - return (double)getInt64Value(key); - } - if(isBoolValue(key)){ - return (double)getBoolValue(key); - } - return std::numeric_limits<double>::quiet_NaN(); +double CDataWrapper::getAsRealValue(const std::string& key) const { + if (isDoubleValue(key)) { + return getDoubleValue(key); + } + if (isInt32Value(key)) { + return (double)getInt32Value(key); + } + if (isInt64Value(key)) { + return (double)getInt64Value(key); + } + if (isBoolValue(key)) { + return (double)getBoolValue(key); + } + return std::numeric_limits<double>::quiet_NaN(); } -void CDataWrapper::addJsonValue(const std::string& key, const string& val){ - CDataWrapper tmp; - tmp.setSerializedJsonData(val.c_str()); - addCSDataValue(key,tmp); +void CDataWrapper::addJsonValue(const std::string& key, const string& val) { + CDataWrapper tmp; + tmp.setSerializedJsonData(val.c_str()); + addCSDataValue(key, tmp); } /*void CDataWrapper::addJsonValue(const std::string& key, Json::Value& val){ @@ -1268,511 +1272,522 @@ void CDataWrapper::addJsonValue(const std::string& key, const string& val){ addJsonValue(key,output); } */ -bool CDataWrapper::isStringValue(const std::string& key) const{ - FIND_AND_CHECK(key, BSON_ITER_HOLDS_UTF8){ - return true; - } - return false; +bool CDataWrapper::isStringValue(const std::string& key) const { + FIND_AND_CHECK(key, BSON_ITER_HOLDS_UTF8) { + return true; + } + return false; } -bool CDataWrapper::isBinaryValue(const std::string& key) const{ - FIND_AND_CHECK(key, BSON_ITER_HOLDS_BINARY){ - return true; - } - return false; -} -bool CDataWrapper::isCDataWrapperValue() const{ - bson_iter_t element_found;bson_iter_init(&element_found, ACCESS_BSON(bson)); - if(BSON_ITER_HOLDS_DOCUMENT(&element_found))return true; - - return false; +bool CDataWrapper::isBinaryValue(const std::string& key) const { + FIND_AND_CHECK(key, BSON_ITER_HOLDS_BINARY) { + return true; + } + return false; } +bool CDataWrapper::isCDataWrapperValue() const { + bson_iter_t element_found; + bson_iter_init(&element_found, ACCESS_BSON(bson)); + if (BSON_ITER_HOLDS_DOCUMENT(&element_found)) return true; -bool CDataWrapper::isCDataWrapperValue(const std::string& key) const{ - FIND_AND_CHECK(key, BSON_ITER_HOLDS_DOCUMENT){ - return true; - } - return false; + return false; } -bool CDataWrapper::isVectorValue(const std::string& key) const{ - FIND_AND_CHECK(key, BSON_ITER_HOLDS_ARRAY){ - return true; - } - return false; +bool CDataWrapper::isCDataWrapperValue(const std::string& key) const { + FIND_AND_CHECK(key, BSON_ITER_HOLDS_DOCUMENT) { + return true; + } + return false; } -chaos::DataType::DataType CDataWrapper::getValueType(const std::string& key) const{ - chaos::DataType::DataType result = chaos::DataType::TYPE_UNDEFINED; - bson_iter_t it; - bson_iter_init(&it, ACCESS_BSON(bson)); - if(bson_iter_find_case(&it, key.c_str()) == false) return result; - switch(bson_iter_type(&it)) { - case BSON_TYPE_ARRAY: - result = chaos::DataType::TYPE_ACCESS_ARRAY; - break; - case BSON_TYPE_DOCUMENT: - result = chaos::DataType::TYPE_CLUSTER; - break; - case BSON_TYPE_BINARY: - result = chaos::DataType::TYPE_BYTEARRAY; - switch(getBinarySubtype(key)){ - case chaos::DataType::SUB_TYPE_INT8: - return chaos::DataType::TYPE_VECTOR_INT8; - case chaos::DataType::SUB_TYPE_UINT8: - return chaos::DataType::TYPE_VECTOR_UINT8; - case chaos::DataType::SUB_TYPE_INT32: - return chaos::DataType::TYPE_VECTOR_INT32; - case chaos::DataType::SUB_TYPE_UINT32: - return chaos::DataType::TYPE_VECTOR_UINT32; - case chaos::DataType::SUB_TYPE_FLOAT: - return chaos::DataType::TYPE_VECTOR_FLOAT; - case chaos::DataType::SUB_TYPE_DOUBLE: - return chaos::DataType::TYPE_VECTOR_DOUBLE; - case chaos::DataType::SUB_TYPE_INT16: - return chaos::DataType::TYPE_VECTOR_INT16; - case chaos::DataType::SUB_TYPE_UINT16: - return chaos::DataType::TYPE_VECTOR_UINT16; - case chaos::DataType::SUB_TYPE_INT64: - return chaos::DataType::TYPE_VECTOR_INT64; - case chaos::DataType::SUB_TYPE_UINT64: - return chaos::DataType::TYPE_VECTOR_UINT64; - case chaos::DataType::SUB_TYPE_BOOLEAN: - return chaos::DataType::TYPE_VECTOR_BOOL; - - } - return result; - case BSON_TYPE_UTF8: - result = chaos::DataType::TYPE_STRING; - break; - case BSON_TYPE_DOUBLE: - result = chaos::DataType::TYPE_DOUBLE; - break; - case BSON_TYPE_INT32: - result = chaos::DataType::TYPE_INT32; - break; - case BSON_TYPE_INT64: - result = chaos::DataType::TYPE_INT64; - break; - case BSON_TYPE_TIMESTAMP: - result = chaos::DataType::TYPE_UINT64; - break; - case BSON_TYPE_BOOL: - result = chaos::DataType::TYPE_BOOLEAN; - break; - case BSON_TYPE_NULL: - result = chaos::DataType::TYPE_UNDEFINED; - break; - default: - break; - - } - return result; +bool CDataWrapper::isVectorValue(const std::string& key) const { + FIND_AND_CHECK(key, BSON_ITER_HOLDS_ARRAY) { + return true; + } + return false; +} + +chaos::DataType::DataType CDataWrapper::getValueType(const std::string& key) const { + chaos::DataType::DataType result = chaos::DataType::TYPE_UNDEFINED; + bson_iter_t it; + bson_iter_init(&it, ACCESS_BSON(bson)); + if (bson_iter_find_case(&it, key.c_str()) == false) return result; + switch (bson_iter_type(&it)) { + case BSON_TYPE_ARRAY: + result = chaos::DataType::TYPE_ACCESS_ARRAY; + break; + case BSON_TYPE_DOCUMENT: + result = chaos::DataType::TYPE_CLUSTER; + break; + case BSON_TYPE_BINARY: + result = chaos::DataType::TYPE_BYTEARRAY; + switch (getBinarySubtype(key)) { + case chaos::DataType::SUB_TYPE_INT8: + return chaos::DataType::TYPE_VECTOR_INT8; + case chaos::DataType::SUB_TYPE_UINT8: + return chaos::DataType::TYPE_VECTOR_UINT8; + case chaos::DataType::SUB_TYPE_INT32: + return chaos::DataType::TYPE_VECTOR_INT32; + case chaos::DataType::SUB_TYPE_UINT32: + return chaos::DataType::TYPE_VECTOR_UINT32; + case chaos::DataType::SUB_TYPE_FLOAT: + return chaos::DataType::TYPE_VECTOR_FLOAT; + case chaos::DataType::SUB_TYPE_DOUBLE: + return chaos::DataType::TYPE_VECTOR_DOUBLE; + case chaos::DataType::SUB_TYPE_INT16: + return chaos::DataType::TYPE_VECTOR_INT16; + case chaos::DataType::SUB_TYPE_UINT16: + return chaos::DataType::TYPE_VECTOR_UINT16; + case chaos::DataType::SUB_TYPE_INT64: + return chaos::DataType::TYPE_VECTOR_INT64; + case chaos::DataType::SUB_TYPE_UINT64: + return chaos::DataType::TYPE_VECTOR_UINT64; + case chaos::DataType::SUB_TYPE_BOOLEAN: + return chaos::DataType::TYPE_VECTOR_BOOL; + } + return result; + case BSON_TYPE_UTF8: + result = chaos::DataType::TYPE_STRING; + break; + case BSON_TYPE_DOUBLE: + result = chaos::DataType::TYPE_DOUBLE; + break; + case BSON_TYPE_INT32: + result = chaos::DataType::TYPE_INT32; + break; + case BSON_TYPE_INT64: + result = chaos::DataType::TYPE_INT64; + break; + case BSON_TYPE_TIMESTAMP: + result = chaos::DataType::TYPE_UINT64; + break; + case BSON_TYPE_BOOL: + result = chaos::DataType::TYPE_BOOLEAN; + break; + case BSON_TYPE_NULL: + result = chaos::DataType::TYPE_UNDEFINED; + break; + default: + break; + } + return result; } bool CDataWrapper::isEmpty() const { - return (bson_count_keys(ACCESS_BSON(bson)) == 0); + return (bson_count_keys(ACCESS_BSON(bson)) == 0); } -int CDataWrapper::setAsString(const std::string& key,const std::string& sval){ - bson_iter_t it; - bson_iter_init(&it, static_cast<bson_t*>(bson.get())); - if(bson_iter_find_case(&it, key.c_str()) == false) - return -1; - switch(ITER_TYPE(&it)){ - case BSON_TYPE_INT64:{ - CDataVariant val(sval); - - int64_t tmp=val.asInt64(); - setBson(&it,tmp); - } - break; - /* case BSON_TYPE_TIMESTAMP:{ - CDataVariant val(sval); - - uint64_t tmp=val.asUInt64(); - setBson(&it,tmp); - } - break;*/ - case BSON_TYPE_DOUBLE:{ - CDataVariant val(sval); - - double tmp=val.asDouble(); - setBson(&it,tmp); - } - break; - case BSON_TYPE_INT32:{ - CDataVariant val(sval); - - int32_t tmp=val.asInt32(); - setBson(&it,tmp); - } - break; - case BSON_TYPE_BOOL:{ - CDataVariant val(sval); - - bool tmp=val.asBool(); - setBson(&it,tmp); - } - break; - case BSON_TYPE_UTF8: - setBson(&it,sval); - break; - case BSON_TYPE_BINARY:{ - - chaos::common::data::CDBufferUniquePtr ptr=Base64Util::decode(sval); - - setBson(&it,ptr->getBuffer(),ptr->getBufferSize()); - break; - } - default: - return -2; - - - } - return 0; +int CDataWrapper::setAsString(const std::string& key, const std::string& sval) { + bson_iter_t it; + bson_iter_init(&it, static_cast<bson_t*>(bson.get())); + if (bson_iter_find_case(&it, key.c_str()) == false) + return -1; + switch (ITER_TYPE(&it)) { + case BSON_TYPE_INT64: { + CDataVariant val(sval); + + int64_t tmp = val.asInt64(); + setBson(&it, tmp); + } break; + /* case BSON_TYPE_TIMESTAMP:{ + CDataVariant val(sval); + + uint64_t tmp=val.asUInt64(); + setBson(&it,tmp); + } + break;*/ + case BSON_TYPE_DOUBLE: { + CDataVariant val(sval); + + double tmp = val.asDouble(); + setBson(&it, tmp); + } break; + case BSON_TYPE_INT32: { + CDataVariant val(sval); + + int32_t tmp = val.asInt32(); + setBson(&it, tmp); + } break; + case BSON_TYPE_BOOL: { + CDataVariant val(sval); + + bool tmp = val.asBool(); + setBson(&it, tmp); + } break; + case BSON_TYPE_UTF8: + setBson(&it, sval); + break; + case BSON_TYPE_BINARY: { + chaos::common::data::CDBufferUniquePtr ptr = Base64Util::decode(sval); + + setBson(&it, ptr->getBuffer(), ptr->getBufferSize()); + break; + } + default: + return -2; + } + return 0; } - -int CDataWrapper::setBson( const bson_iter_t *v ,const int64_t& val){ - if(ITER_TYPE(v)==BSON_TYPE_INT64){ - memcpy((void*)(v->raw + v->d1), (void*)&val,sizeof(int64_t)); - return sizeof(int64_t); - } - return -1; +int CDataWrapper::setBson(const bson_iter_t* v, const int64_t& val) { + if (ITER_TYPE(v) == BSON_TYPE_INT64) { + memcpy((void*)(v->raw + v->d1), (void*)&val, sizeof(int64_t)); + return sizeof(int64_t); + } + return -1; } -int CDataWrapper::setBson(const bson_iter_t *v ,const int32_t& val){ - if(ITER_TYPE(v)==BSON_TYPE_INT32){ - memcpy((void*)(v->raw + v->d1),(void*)&val ,sizeof(int32_t)); - return sizeof(int32_t); - } - return -1; +int CDataWrapper::setBson(const bson_iter_t* v, const int32_t& val) { + if (ITER_TYPE(v) == BSON_TYPE_INT32) { + memcpy((void*)(v->raw + v->d1), (void*)&val, sizeof(int32_t)); + return sizeof(int32_t); + } + return -1; } -int CDataWrapper::setBson(const bson_iter_t *v ,const double& val){ - if(ITER_TYPE(v)==BSON_TYPE_DOUBLE){ - memcpy((void*)(v->raw + v->d1), (void*)&val,sizeof(double)); - return sizeof(double); - } - return -1; +int CDataWrapper::setBson(const bson_iter_t* v, const double& val) { + if (ITER_TYPE(v) == BSON_TYPE_DOUBLE) { + memcpy((void*)(v->raw + v->d1), (void*)&val, sizeof(double)); + return sizeof(double); + } + return -1; } -int CDataWrapper::setBson(const bson_iter_t *v ,const bool& val){ - if(ITER_TYPE(v)==BSON_TYPE_BOOL){ - memcpy((void*)(v->raw + v->d1), (void*)&val,sizeof(bool)); - return sizeof(bool); - } - return -1; +int CDataWrapper::setBson(const bson_iter_t* v, const bool& val) { + if (ITER_TYPE(v) == BSON_TYPE_BOOL) { + memcpy((void*)(v->raw + v->d1), (void*)&val, sizeof(bool)); + return sizeof(bool); + } + return -1; } -int CDataWrapper::setBson(const bson_iter_t *v ,const std::string& val){ - if(ITER_TYPE(v)== BSON_TYPE_UTF8){ - char key[256]; - strncpy(key,bson_iter_key_unsafe(v),sizeof(key)); - removeKey(key); - addStringValue(key,val); - - return (val.size()+1); +int CDataWrapper::setBson(const bson_iter_t* v, const std::string& val) { + if (ITER_TYPE(v) == BSON_TYPE_UTF8) { + char key[256]; + strncpy(key, bson_iter_key_unsafe(v), sizeof(key)); + removeKey(key); + addStringValue(key, val); - } - return -1; + return (val.size() + 1); + } + return -1; } -int CDataWrapper::setBson(const bson_iter_t *v ,const void* val){ - if(ITER_TYPE(v)== BSON_TYPE_BINARY){ - const bson_value_t *vv = bson_iter_value((bson_iter_t *)v); - memcpy((void*)(v->raw + v->d3), (void*)val,vv->value.v_binary.data_len); - return vv->value.v_binary.data_len; - } else if(ITER_TYPE(v)== BSON_TYPE_UTF8){ - return setBson(v,std::string((const char*)val)); - } - return -1; +int CDataWrapper::setBson(const bson_iter_t* v, const void* val) { + if (ITER_TYPE(v) == BSON_TYPE_BINARY) { + const bson_value_t* vv = bson_iter_value((bson_iter_t*)v); + memcpy((void*)(v->raw + v->d3), (void*)val, vv->value.v_binary.data_len); + return vv->value.v_binary.data_len; + } else if (ITER_TYPE(v) == BSON_TYPE_UTF8) { + return setBson(v, std::string((const char*)val)); + } + return -1; } -int CDataWrapper::setValue(const std::string& key,const void* val,size_t size){ - bson_iter_t it; - bson_iter_init(&it, static_cast<bson_t*>(bson.get())); - if(bson_iter_find_case(&it, key.c_str()) == false) - return -1; - return setBson(&it,val,size); -} - - -int CDataWrapper::setBson(const bson_iter_t *v ,const void* val,size_t size){ - if(ITER_TYPE(v)== BSON_TYPE_BINARY){ - bson_value_t *vv = (bson_value_t *)bson_iter_value((bson_iter_t *)v); - // without check is more useful, the programmer must be aware of the preallocated data size - if(size>=vv->value.v_binary.data_len){ - char key[256]; - strncpy(key,bson_iter_key_unsafe(v),sizeof(key)); - removeKey(key); - addBinaryValue(key,(const char*)val,size); - return size; - } else { - memcpy((void*)(v->raw + v->d3), (void*)val,size); - vv->value.v_binary.data_len=size; - return vv->value.v_binary.data_len; - } - } +int CDataWrapper::setValue(const std::string& key, const void* val, size_t size) { + bson_iter_t it; + bson_iter_init(&it, static_cast<bson_t*>(bson.get())); + if (bson_iter_find_case(&it, key.c_str()) == false) return -1; -} -int CDataWrapper::setBson(const bson_iter_t *v ,const CDataWrapper* val){ - if(ITER_TYPE(v)== BSON_TYPE_DOCUMENT){ - const bson_value_t *vv = bson_iter_value((bson_iter_t *)v); - - memcpy((void*)(v->raw + v->d1), (void*)val->getBSONRawData(),vv->value.v_doc.data_len); - return vv->value.v_doc.data_len; + return setBson(&it, val, size); +} + +int CDataWrapper::setBson(const bson_iter_t* v, const void* val, size_t size) { + if (ITER_TYPE(v) == BSON_TYPE_BINARY) { + bson_value_t* vv = (bson_value_t*)bson_iter_value((bson_iter_t*)v); + // without check is more useful, the programmer must be aware of the preallocated data size + if (size >= vv->value.v_binary.data_len) { + char key[256]; + strncpy(key, bson_iter_key_unsafe(v), sizeof(key)); + removeKey(key); + addBinaryValue(key, (const char*)val, size); + return size; + } else { + memcpy((void*)(v->raw + v->d3), (void*)val, size); + vv->value.v_binary.data_len = size; + return vv->value.v_binary.data_len; } - return -1; + } + return -1; +} +int CDataWrapper::setBson(const bson_iter_t* v, const CDataWrapper* val) { + if (ITER_TYPE(v) == BSON_TYPE_DOCUMENT) { + const bson_value_t* vv = bson_iter_value((bson_iter_t*)v); + + memcpy((void*)(v->raw + v->d1), (void*)val->getBSONRawData(), vv->value.v_doc.data_len); + return vv->value.v_doc.data_len; + } + return -1; } #ifdef EPICS - void CDataWrapper::setSerializedData(epics::pvData::StructureConstPtr ptr){ - std::string id= ptr->getID(); - addStringValue("type",id); - size_t numberFields = ptr->getNumberFields(); - for(size_t i=0; i<numberFields; i++) { - epics::pvData::FieldConstPtr pfield = ptr->getField(i); - CDataWrapper cs; - cs.addStringValue(ptr->getFieldName(i),pfield->getID()); - - switch(pfield->getType()) { - case epics::pvData::scalar: - case epics::pvData::scalarArray: - break; - case epics::pvData::structure: - { - epics::pvData::Field const *xxx = pfield.get(); - epics::pvData::Structure const *pstruct = static_cast<epics::pvData::Structure const*>(xxx); - cs.setSerializedData(epics::pvData::StructureConstPtr(pstruct)); - break; - } - /* case epics::pvData::structureArray: - { - format::indent_scope s(o); - Field const *xxx = pfield.get(); - StructureArray const *pstructureArray = static_cast<StructureArray const*>(xxx); - o << *pstructureArray->getStructure(); - break; - } - case epics::pvData::union_: - { - Field const *xxx = pfield.get(); - Union const *punion = static_cast<Union const*>(xxx); - format::indent_scope s(o); - punion->dumpFields(o); - break; - } - case epics::pvData::unionArray: - { - format::indent_scope s(o); - Field const *xxx = pfield.get(); - UnionArray const *punionArray = static_cast<UnionArray const*>(xxx); - o << *punionArray->getUnion(); - break; - }*/ - default: - break; - } - } - +void CDataWrapper::setSerializedData(pvd::PVStructure::const_shared_pointer& ptr) { + pvd::StructureConstPtr structure_ptr=ptr->getStructure(); + + std::string id = structure_ptr->getID(); + addStringValue("type", id); + size_t numberFields = ptr->getNumberFields(); + pvd::PVFieldPtrArray pv_fields=ptr->getPVFields(); + for (pvd::PVFieldPtrArray::iterator i = pv_fields.begin(); i != pv_fields.end(); i++) { + //epics::pvData::FieldConstPtr pfield = structure_ptr->getField(i); + + CDataWrapper cs; + const std::string& fname=(*i)->getFieldName(); + const epics::pvData::FieldConstPtr& field=(*i)->getField(); + std::ostringstream ss; + + LDBG_<<"Adding field \""<<fname<< "\" type:\""<<field->getID();//<<"\" dump:"<<ss.str(); + cs.addStringValue("type", field->getID()); + + switch (field->getType()) { + case epics::pvData::scalar: + break; + case epics::pvData::scalarArray: + LDBG_<<"Adding Scalar/ScalarArray "<<fname; + /* epics::pvData::Field const* xxx = pfield.get(); + epics::pvData::Scalar const* value = static_cast<epics::pvData::Scalar const*>(xxx); + */ + addCSDataValue(fname,cs); + break; + case epics::pvData::structure: { + LDBG_<<"Adding Structure "<<fname; + pvd::PVStructure::const_shared_pointer tmp=ptr->getSubField<pvd::PVStructure>(fname); + /* epics::pvData::Field const* xxx = pfield.get(); + epics::pvData::Structure const* pstruct = static_cast<epics::pvData::Structure const*>(xxx); + epics::pvData::StructureConstPtr tmp=epics::pvData::StructureConstPtr(pstruct); + */ + cs.setSerializedData(tmp); + addCSDataValue(fname,cs); + break; + } + case epics::pvData::structureArray: + { + LDBG_<<"Adding Structure Array "<<fname; + + /*format::indent_scope s(o); + Field const *xxx = pfield.get(); + StructureArray const *pstructureArray = static_cast<StructureArray const*>(xxx); + o << *pstructureArray->getStructure();*/ + break; + } + case epics::pvData::union_: + { + LDBG_<<"Adding Union "<<fname; + + /*Field const *xxx = pfield.get(); + Union const *punion = static_cast<Union const*>(xxx); + format::indent_scope s(o); + punion->dumpFields(o);*/ + break; + } + case epics::pvData::unionArray: + { + LDBG_<<"Adding Union Array "<<fname; + + /* format::indent_scope s(o); + Field const *xxx = pfield.get(); + UnionArray const *punionArray = static_cast<UnionArray const*>(xxx); + o << *punionArray->getUnion();*/ + break; + } + default: + LDBG_<<"Undefined "<<fname; + + break; } + } +} #endif #pragma mark CMultiTypeDataArrayWrapper CMultiTypeDataArrayWrapper::CMultiTypeDataArrayWrapper(const ChaosBsonShrdPtr& _document_shrd_ptr, - const std::string& key): -document_shrd_ptr(_document_shrd_ptr), -array_doc(new bson_t()) { - bson_iter_t element_found; - bson_iter_init(&element_found, ACCESS_BSON(_document_shrd_ptr)); - if(bson_iter_find_case(&element_found, key.c_str())&& - BSON_ITER_HOLDS_ARRAY(&element_found)) { - uint32_t array_len; - const uint8_t *array; - bson_iter_array(&element_found, - &array_len, - &array); - if (bson_init_static(array_doc, array, array_len)) { - bson_iter_t iter; - if(bson_iter_init(&iter, array_doc)) { - while(bson_iter_next(&iter)) { - //ChaosBsonValuesShrdPtr copy = ChaosBsonValuesShrdPtr(new bson_value_t(), &bsonValueDestroy); - //bson_value_t copy; - bson_value_t*copy = new bson_value_t(); - bson_value_copy(bson_iter_value(&iter), copy); - values.push_back(copy); - } - } + const std::string& key) + : document_shrd_ptr(_document_shrd_ptr), array_doc(new bson_t()) { + bson_iter_t element_found; + bson_iter_init(&element_found, ACCESS_BSON(_document_shrd_ptr)); + if (bson_iter_find_case(&element_found, key.c_str()) && + BSON_ITER_HOLDS_ARRAY(&element_found)) { + uint32_t array_len; + const uint8_t* array; + bson_iter_array(&element_found, + &array_len, + &array); + if (bson_init_static(array_doc, array, array_len)) { + bson_iter_t iter; + if (bson_iter_init(&iter, array_doc)) { + while (bson_iter_next(&iter)) { + // ChaosBsonValuesShrdPtr copy = ChaosBsonValuesShrdPtr(new bson_value_t(), &bsonValueDestroy); + // bson_value_t copy; + bson_value_t* copy = new bson_value_t(); + bson_value_copy(bson_iter_value(&iter), copy); + values.push_back(copy); } + } } + } } -std::map<std::string,std::string> CMultiTypeDataArrayWrapper::toKVmap(const std::string kname,const std::string kvalue) const { -std::map<std::string,std::string> ret; - for(int cnt=0;cnt<size();cnt++){ - if(isCDataWrapperElementAtIndex(cnt)){ - CDWUniquePtr ele= getCDataWrapperElementAtIndex(cnt); - if(ele->hasKey(kname)&& ele->hasKey(kvalue)){ - std::string k=ele->getStringValue(kname); - if(k.size()){ - ret[k]=ele->getStringValue(kvalue); - } - } +std::map<std::string, std::string> CMultiTypeDataArrayWrapper::toKVmap(const std::string kname, const std::string kvalue) const { + std::map<std::string, std::string> ret; + for (int cnt = 0; cnt < size(); cnt++) { + if (isCDataWrapperElementAtIndex(cnt)) { + CDWUniquePtr ele = getCDataWrapperElementAtIndex(cnt); + if (ele->hasKey(kname) && ele->hasKey(kvalue)) { + std::string k = ele->getStringValue(kname); + if (k.size()) { + ret[k] = ele->getStringValue(kvalue); } + } } - return ret; + } + return ret; } CMultiTypeDataArrayWrapper::~CMultiTypeDataArrayWrapper() { - for(VectorBsonValuesIterator it = values.begin(), - end = values.end(); - it != end; - it++) { - bson_value_destroy(*it); - delete(*it); - } - values.clear(); - delete(array_doc); + for (VectorBsonValuesIterator it = values.begin(), + end = values.end(); + it != end; + it++) { + bson_value_destroy(*it); + delete (*it); + } + values.clear(); + delete (array_doc); } std::string CMultiTypeDataArrayWrapper::getJSONString() { - size_t str_size; - char * str_c = bson_as_canonical_extended_json(static_cast<const bson_t*>(array_doc),&str_size); - return std::string(str_c,str_size); + size_t str_size; + char* str_c = bson_as_canonical_extended_json(static_cast<const bson_t*>(array_doc), &str_size); + return std::string(str_c, str_size); } std::string CMultiTypeDataArrayWrapper::getCanonicalJSONString() { - size_t str_size; - char * str_c = bson_as_relaxed_extended_json(static_cast<const bson_t*>(array_doc),&str_size); - return std::string(str_c,str_size); + size_t str_size; + char* str_c = bson_as_relaxed_extended_json(static_cast<const bson_t*>(array_doc), &str_size); + return std::string(str_c, str_size); } -string CMultiTypeDataArrayWrapper::getStringElementAtIndex(const int pos) const{ - // CHAOS_ASSERT(values[pos]->value_type == BSON_TYPE_UTF8); - if(values[pos]->value_type != BSON_TYPE_UTF8){ - std::stringstream ss; - ss<<"type at index ["<<pos<<"] is not String, typeid:"<<values[pos]->value_type; - throw CException(1, ss.str(), __PRETTY_FUNCTION__); - } - return std::string(values[pos]->value.v_utf8.str, values[pos]->value.v_utf8.len); +string CMultiTypeDataArrayWrapper::getStringElementAtIndex(const int pos) const { + // CHAOS_ASSERT(values[pos]->value_type == BSON_TYPE_UTF8); + if (values[pos]->value_type != BSON_TYPE_UTF8) { + std::stringstream ss; + ss << "type at index [" << pos << "] is not String, typeid:" << values[pos]->value_type; + throw CException(1, ss.str(), __PRETTY_FUNCTION__); + } + return std::string(values[pos]->value.v_utf8.str, values[pos]->value.v_utf8.len); } -bson_value_t * CMultiTypeDataArrayWrapper::getBSONElementAtIndex(const int pos) const{ - if(pos<values.size()) return values[pos]; - return NULL; +bson_value_t* CMultiTypeDataArrayWrapper::getBSONElementAtIndex(const int pos) const { + if (pos < values.size()) return values[pos]; + return NULL; } -double CMultiTypeDataArrayWrapper::getDoubleElementAtIndex(const int pos) const{ - if(values[pos]->value_type != BSON_TYPE_DOUBLE){ - std::stringstream ss; - ss<<"type at index ["<<pos<<"] is not double, typeid:"<<values[pos]->value_type; - throw CException(1, ss.str(), __PRETTY_FUNCTION__); - } - return values[pos]->value.v_double; +double CMultiTypeDataArrayWrapper::getDoubleElementAtIndex(const int pos) const { + if (values[pos]->value_type != BSON_TYPE_DOUBLE) { + std::stringstream ss; + ss << "type at index [" << pos << "] is not double, typeid:" << values[pos]->value_type; + throw CException(1, ss.str(), __PRETTY_FUNCTION__); + } + return values[pos]->value.v_double; } -int32_t CMultiTypeDataArrayWrapper::getInt32ElementAtIndex(const int pos) const{ - return values[pos]->value.v_int32; +int32_t CMultiTypeDataArrayWrapper::getInt32ElementAtIndex(const int pos) const { + return values[pos]->value.v_int32; } -bool CMultiTypeDataArrayWrapper::getBoolElementAtIndex(const int pos) const{ - return values[pos]->value.v_bool; - - +bool CMultiTypeDataArrayWrapper::getBoolElementAtIndex(const int pos) const { + return values[pos]->value.v_bool; } int CMultiTypeDataArrayWrapper::removeElementAtIndex(const int pos) { - if(pos<values.size()){ - VectorBsonValues::iterator i=values.begin()+pos; - bson_value_destroy(*i); - values.erase(i); - } - return values.size(); + if (pos < values.size()) { + VectorBsonValues::iterator i = values.begin() + pos; + bson_value_destroy(*i); + values.erase(i); + } + return values.size(); } -int64_t CMultiTypeDataArrayWrapper::getInt64ElementAtIndex(const int pos) const{ - //CHAOS_ASSERT(values[pos]->value_type == BSON_TYPE_INT64); - if(values[pos]->value_type != BSON_TYPE_INT64){ - std::stringstream ss; - ss<<"type at index ["<<pos<<"] is not int64, typeid:"<<values[pos]->value_type; - throw CException(1, ss.str(), __PRETTY_FUNCTION__); - } - return values[pos]->value.v_int64; +int64_t CMultiTypeDataArrayWrapper::getInt64ElementAtIndex(const int pos) const { + // CHAOS_ASSERT(values[pos]->value_type == BSON_TYPE_INT64); + if (values[pos]->value_type != BSON_TYPE_INT64) { + std::stringstream ss; + ss << "type at index [" << pos << "] is not int64, typeid:" << values[pos]->value_type; + throw CException(1, ss.str(), __PRETTY_FUNCTION__); + } + return values[pos]->value.v_int64; } -uint64_t CMultiTypeDataArrayWrapper::getUInt64ElementAtIndex(const int pos) const{ - //CHAOS_ASSERT(values[pos]->value_type == BSON_TYPE_INT64); - if(values[pos]->value_type != BSON_TYPE_TIMESTAMP){ - std::stringstream ss; - ss<<"type at index ["<<pos<<"] is not uint64, typeid:"<<values[pos]->value_type; - throw CException(1, ss.str(), __PRETTY_FUNCTION__); - } - uint64_t ret=((uint64_t)values[pos]->value.v_timestamp.timestamp<<32) | values[pos]->value.v_timestamp.increment; +uint64_t CMultiTypeDataArrayWrapper::getUInt64ElementAtIndex(const int pos) const { + // CHAOS_ASSERT(values[pos]->value_type == BSON_TYPE_INT64); + if (values[pos]->value_type != BSON_TYPE_TIMESTAMP) { + std::stringstream ss; + ss << "type at index [" << pos << "] is not uint64, typeid:" << values[pos]->value_type; + throw CException(1, ss.str(), __PRETTY_FUNCTION__); + } + uint64_t ret = ((uint64_t)values[pos]->value.v_timestamp.timestamp << 32) | values[pos]->value.v_timestamp.increment; - return ret; + return ret; } -bool CMultiTypeDataArrayWrapper::isStringElementAtIndex(const int pos) const{ - return values[pos]->value_type == BSON_TYPE_UTF8; +bool CMultiTypeDataArrayWrapper::isStringElementAtIndex(const int pos) const { + return values[pos]->value_type == BSON_TYPE_UTF8; } -bool CMultiTypeDataArrayWrapper::isDoubleElementAtIndex(const int pos) const{ - return values[pos]->value_type == BSON_TYPE_DOUBLE; +bool CMultiTypeDataArrayWrapper::isDoubleElementAtIndex(const int pos) const { + return values[pos]->value_type == BSON_TYPE_DOUBLE; } -bool CMultiTypeDataArrayWrapper::isInt32ElementAtIndex(const int pos) const{ - return values[pos]->value_type == BSON_TYPE_INT32; +bool CMultiTypeDataArrayWrapper::isInt32ElementAtIndex(const int pos) const { + return values[pos]->value_type == BSON_TYPE_INT32; } -bool CMultiTypeDataArrayWrapper::isBoolElementAtIndex(const int pos) const{ - return values[pos]->value_type == BSON_TYPE_BOOL; +bool CMultiTypeDataArrayWrapper::isBoolElementAtIndex(const int pos) const { + return values[pos]->value_type == BSON_TYPE_BOOL; } -bool CMultiTypeDataArrayWrapper::isInt64ElementAtIndex(const int pos) const{ - return ((values[pos]->value_type == BSON_TYPE_INT64)||(values[pos]->value_type == BSON_TYPE_TIMESTAMP)); +bool CMultiTypeDataArrayWrapper::isInt64ElementAtIndex(const int pos) const { + return ((values[pos]->value_type == BSON_TYPE_INT64) || (values[pos]->value_type == BSON_TYPE_TIMESTAMP)); } -bool CMultiTypeDataArrayWrapper::isCDataWrapperElementAtIndex(const int pos) const{ - return values[pos]->value_type == BSON_TYPE_DOCUMENT; +bool CMultiTypeDataArrayWrapper::isCDataWrapperElementAtIndex(const int pos) const { + return values[pos]->value_type == BSON_TYPE_DOCUMENT; } -const char * CMultiTypeDataArrayWrapper::getRawValueAtIndex(const int pos,uint32_t& size) const{ - switch(values[pos]->value_type ) { - case BSON_TYPE_INT64: - size=sizeof(int64_t); - return reinterpret_cast<const char*>(&values[pos]->value.v_int64); - case BSON_TYPE_TIMESTAMP: - size=sizeof(uint64_t); - return reinterpret_cast<const char*>(&values[pos]->value.v_timestamp); - case BSON_TYPE_INT32: - size=sizeof(int32_t); - return reinterpret_cast<const char*>(&values[pos]->value.v_int32); - case BSON_TYPE_BOOL: - size=sizeof(bool); - return reinterpret_cast<const char*>(&values[pos]->value.v_bool); - case BSON_TYPE_DOUBLE: - size=sizeof(double); - return reinterpret_cast<const char*>(&values[pos]->value.v_double); - case BSON_TYPE_UTF8: - size = values[pos]->value.v_utf8.len; - return static_cast<const char*>(values[pos]->value.v_utf8.str); - case BSON_TYPE_BINARY: - size = values[pos]->value.v_binary.data_len; - return reinterpret_cast<const char*>(values[pos]->value.v_binary.data); - default: - break; - } - return NULL; +const char* CMultiTypeDataArrayWrapper::getRawValueAtIndex(const int pos, uint32_t& size) const { + switch (values[pos]->value_type) { + case BSON_TYPE_INT64: + size = sizeof(int64_t); + return reinterpret_cast<const char*>(&values[pos]->value.v_int64); + case BSON_TYPE_TIMESTAMP: + size = sizeof(uint64_t); + return reinterpret_cast<const char*>(&values[pos]->value.v_timestamp); + case BSON_TYPE_INT32: + size = sizeof(int32_t); + return reinterpret_cast<const char*>(&values[pos]->value.v_int32); + case BSON_TYPE_BOOL: + size = sizeof(bool); + return reinterpret_cast<const char*>(&values[pos]->value.v_bool); + case BSON_TYPE_DOUBLE: + size = sizeof(double); + return reinterpret_cast<const char*>(&values[pos]->value.v_double); + case BSON_TYPE_UTF8: + size = values[pos]->value.v_utf8.len; + return static_cast<const char*>(values[pos]->value.v_utf8.str); + case BSON_TYPE_BINARY: + size = values[pos]->value.v_binary.data_len; + return reinterpret_cast<const char*>(values[pos]->value.v_binary.data); + default: + break; + } + return NULL; } -ChaosUniquePtr<CDataWrapper> CMultiTypeDataArrayWrapper::getCDataWrapperElementAtIndex(const int pos) const{ - // CHAOS_ASSERT(values[pos]->value_type == BSON_TYPE_DOCUMENT); - if(values[pos]->value_type != BSON_TYPE_DOCUMENT){ - std::stringstream ss; - ss<<"type at index ["<<pos<<"] is not CDataWrapper, typeid:"<<values[pos]->value_type; - throw CException(1, ss.str(), __PRETTY_FUNCTION__); - } - return ChaosUniquePtr<CDataWrapper>(new CDataWrapper((const char *)values[pos]->value.v_doc.data, values[pos]->value.v_doc.data_len)); +ChaosUniquePtr<CDataWrapper> CMultiTypeDataArrayWrapper::getCDataWrapperElementAtIndex(const int pos) const { + // CHAOS_ASSERT(values[pos]->value_type == BSON_TYPE_DOCUMENT); + if (values[pos]->value_type != BSON_TYPE_DOCUMENT) { + std::stringstream ss; + ss << "type at index [" << pos << "] is not CDataWrapper, typeid:" << values[pos]->value_type; + throw CException(1, ss.str(), __PRETTY_FUNCTION__); + } + return ChaosUniquePtr<CDataWrapper>(new CDataWrapper((const char*)values[pos]->value.v_doc.data, values[pos]->value.v_doc.data_len)); } -size_t CMultiTypeDataArrayWrapper::size() const{ - return values.size(); +size_t CMultiTypeDataArrayWrapper::size() const { + return values.size(); } - \ No newline at end of file diff --git a/chaos/common/data/CDataWrapper.h b/chaos/common/data/CDataWrapper.h index 56942b9dd137e4961c962b0c84a24681fc53b743..a480a7fbcc47d062b600cbb03a1b1c345a1e48d0 100644 --- a/chaos/common/data/CDataWrapper.h +++ b/chaos/common/data/CDataWrapper.h @@ -35,6 +35,7 @@ #endif #ifdef EPICS #include <pv/pvData.h> +namespace pvd = epics::pvData; #endif /* #ifdef EPICS @@ -225,7 +226,7 @@ namespace chaos { ChaosUniquePtr<chaos::common::data::CDataWrapper> getCSProjection(const std::vector<std::string>&) const; #ifdef EPICS - void setSerializedData(epics::pvData::StructureConstPtr ptr); + void setSerializedData(pvd::PVStructure::const_shared_pointer& ptr); #endif //add a string value