/*! \brief Internal helper function which returns a filtered objectset. * * The following are filtered out of the objectset: * \li The id field. This is returned to the caller in an out parameter. * \li Fields that are not registered with sorcery. * * \param objectset Objectset to filter. * \param[out] id The ID of the sorcery object, as found in the objectset. * \param sorcery The sorcery instance that is requesting an objectset. * \param type The object type * * \return The filtered objectset */ static struct ast_variable *sorcery_realtime_filter_objectset(struct ast_variable *objectset, struct ast_variable **id, const struct ast_sorcery *sorcery, const char *type) { struct ast_variable *previous = NULL, *field = objectset; struct ast_sorcery_object_type *object_type; object_type = ast_sorcery_get_object_type(sorcery, type); if (!object_type) { ast_log(LOG_WARNING, "Unknown sorcery object type %s. Expect errors\n", type); /* Continue since we still want to filter out the id */ } while (field) { int remove_field = 0; int delete_field = 0; if (!strcmp(field->name, UUID_FIELD)) { *id = field; remove_field = 1; } else if (object_type && !ast_sorcery_is_object_field_registered(object_type, field->name)) { ast_debug(1, "Filtering out realtime field '%s' from retrieval\n", field->name); remove_field = 1; delete_field = 1; } if (remove_field) { struct ast_variable *removed; if (previous) { previous->next = field->next; } else { objectset = field->next; } removed = field; field = field->next; removed->next = NULL; if (delete_field) { ast_variables_destroy(removed); } } else { previous = field; field = field->next; } } ao2_cleanup(object_type); return objectset; }
/*! \brief Internal helper function which returns a filtered objectset. * * The following are filtered out of the objectset: * \li Fields that are not registered with sorcery. * * \param objectset Objectset to filter. * \param sorcery The sorcery instance that is requesting an objectset. * \param type The object type * * \return The filtered objectset */ static struct ast_variable *sorcery_astdb_filter_objectset(struct ast_variable *objectset, const struct ast_sorcery *sorcery, const char *type) { struct ast_variable *previous = NULL, *field = objectset; struct ast_sorcery_object_type *object_type; object_type = ast_sorcery_get_object_type(sorcery, type); if (!object_type) { ast_log(LOG_WARNING, "Unknown sorcery object type %s. Expect errors\n", type); return objectset; } while (field) { struct ast_variable *removed; if (ast_sorcery_is_object_field_registered(object_type, field->name)) { previous = field; field = field->next; continue; } ast_debug(1, "Filtering out astdb field '%s' from retrieval\n", field->name); if (previous) { previous->next = field->next; } else { objectset = field->next; } removed = field; field = field->next; removed->next = NULL; ast_variables_destroy(removed); } ao2_cleanup(object_type); return objectset; }