Github user phrocker commented on a diff in the pull request: https://github.com/apache/nifi-minifi-cpp/pull/417#discussion_r225495011 --- 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, --- End diff -- Anytime I see an empty capture I question, what benefit does this serve over a range based for loop with const ref auto? It seems that would be the same length if not shorter and be a simpler read for future maintainers.
---