Github user arpadboda commented on a diff in the pull request:

    https://github.com/apache/nifi-minifi-cpp/pull/417#discussion_r225858082
  
    --- Diff: libminifi/src/capi/api.cpp ---
    @@ -237,25 +239,58 @@ void update_attribute(flow_file_record *ff, char 
*key, void *value, size_t size)
      * @param caller_attribute caller supplied object in which we will copy 
the data ptr
      * @return 0 if successful, -1 if the key does not exist
      */
    -uint8_t get_attribute(flow_file_record *ff, char *key, attribute 
*caller_attribute) {
    +uint8_t get_attribute(flow_file_record *ff, attribute *caller_attribute) {
    +  if (ff == nullptr) {
    +    return -1;
    +  }
       auto attribute_map = static_cast<string_map*>(ff->attributes);
    -  auto find = attribute_map->find(key);
    +  if (!attribute_map) {
    +    return -1;
    +  }
    +  auto find = attribute_map->find(caller_attribute->key);
       if (find != attribute_map->end()) {
    -    caller_attribute->key = key;
         caller_attribute->value = 
static_cast<void*>(const_cast<char*>(find->second.data()));
         caller_attribute->value_size = find->second.size();
         return 0;
       }
       return -1;
     }
     
    +attribute_set *get_all_attributes(const flow_file_record* ff) {
    +  if (ff == nullptr) {
    +    return nullptr;
    +  }
    +  auto attribute_map = static_cast<string_map*>(ff->attributes);
    +  if (!attribute_map || attribute_map->empty()) {
    +    return nullptr;
    +  }
    +  attribute_set * attr_set = new attribute_set;
    +  attr_set->size = attribute_map->size();
    +  attr_set->attributes = new attribute[attr_set->size];
    +  std::transform(attribute_map->begin(), attribute_map->end(), 
attr_set->attributes,
    +      [](const string_map::value_type& key_value) -> attribute {
    +    attribute ret_val;
    +    ret_val.key = key_value.first.data();
    +    ret_val.value = 
static_cast<void*>(const_cast<char*>(key_value.second.data()));
    +    ret_val.value_size = key_value.second.size();
    +    return ret_val;
    +  });
    +  return attr_set;
    +}
    +
    +void free_attribute_set(attribute_set * attr_set) {
    --- End diff --
    
    The first thing to decide here is whether we provide shallow or deep copy 
of the internal data (such as attributes, values, content, etc). In case 
anything we do goes with shallow approach (which we do in case of attributes), 
it becomes our responsibility to properly free things we allocate, we can't let 
the user calling free. (Needs good documentation we can point to?)


---

Reply via email to