void mongo_read_preference_dtor(mongo_read_preference *rp) { int i; for (i = 0; i < rp->tagset_count; i++) { mongo_read_preference_tagset_dtor(rp->tagsets[i]); } free(rp->tagsets); /* We are not freeing *rp itself, as that's not always a pointer */ }
/* Option parser helpers */ static int parse_read_preference_tags(mongo_con_manager *manager, mongo_servers *servers, char *value, char **error_message) { mongo_read_preference_tagset *tmp_ts = calloc(1, sizeof(mongo_read_preference_tagset)); /* format = dc:ny,rack:1 - empty is allowed! */ if (strlen(value) == 0) { mongo_read_preference_add_tagset(&servers->read_pref, tmp_ts); } else { char *start, *end, *colon, *tmp_name, *tmp_value; start = value; while (1) { end = strchr(start, ','); colon = strchr(start, ':'); if (!colon) { int len = strlen(start) + sizeof("Error while trying to parse tags: No separator for ''"); *error_message = malloc(len + 1); snprintf(*error_message, len, "Error while trying to parse tags: No separator for '%s'", start); mongo_read_preference_tagset_dtor(tmp_ts); return 3; } tmp_name = mcon_strndup(start, colon - start); if (end) { tmp_value = mcon_strndup(colon + 1, end - colon - 1); start = end + 1; mongo_manager_log(manager, MLOG_PARSE, MLOG_INFO, "- Found tag '%s': '%s'", tmp_name, tmp_value); mongo_read_preference_add_tag(tmp_ts, tmp_name, tmp_value); free(tmp_value); free(tmp_name); } else { mongo_manager_log(manager, MLOG_PARSE, MLOG_INFO, "- Found tag '%s': '%s'", tmp_name, colon + 1); mongo_read_preference_add_tag(tmp_ts, tmp_name, colon + 1); free(tmp_name); break; } } mongo_read_preference_add_tagset(&servers->read_pref, tmp_ts); } return 0; }
void mongo_servers_dtor(mongo_servers *servers) { int i; for (i = 0; i < servers->count; i++) { mongo_server_def_dtor(servers->server[i]); } if (servers->options.repl_set_name) { free(servers->options.repl_set_name); } if (servers->options.default_wstring) { free(servers->options.default_wstring); } for (i = 0; i < servers->read_pref.tagset_count; i++) { mongo_read_preference_tagset_dtor(servers->read_pref.tagsets[i]); } if (servers->read_pref.tagsets) { free(servers->read_pref.tagsets); } free(servers); }