/** Update the configuration from a server. */ lcb_error_t lcb_cccp_update(clconfig_provider *provider, const char *host, lcb_string *data) { VBUCKET_CONFIG_HANDLE vbc; clconfig_info *new_config; cccp_provider *cccp = (cccp_provider *)provider; vbc = vbucket_config_create(); if (!vbc) { return LCB_CLIENT_ENOMEM; } if (vbucket_config_parse2(vbc, LIBVBUCKET_SOURCE_MEMORY, data->base, host)) { vbucket_config_destroy(vbc); return LCB_PROTOCOL_ERROR; } new_config = lcb_clconfig_create(vbc, data, LCB_CLCONFIG_CCCP); if (!new_config) { vbucket_config_destroy(vbc); return LCB_CLIENT_ENOMEM; } if (cccp->config) { lcb_clconfig_decref(cccp->config); } /** TODO: Figure out the comparison vector */ new_config->cmpclock = gethrtime(); cccp->config = new_config; lcb_confmon_set_next(provider->parent, new_config, 0); return LCB_SUCCESS; }
static void config_callback(lcb_server_t *server, lcb_error_t error, const char *json) { VBUCKET_CONFIG_HANDLE config; lcb_t instance = server->instance; server->connection.timeout.usec = 0; lcb_connection_cancel_timer(&server->connection); if (error != LCB_SUCCESS) { lcb_error_handler(instance, error, "Failed to receive configration"); return; } config = vbucket_config_create(); if (config == NULL) { lcb_error_handler(instance, LCB_CLIENT_ENOMEM, "Failed to allocate memory for configuration"); return; } if (vbucket_config_parse2(config, LIBVBUCKET_SOURCE_MEMORY, json, server->connection.host)) { vbucket_config_destroy(config); lcb_error_handler(instance, LCB_PROTOCOL_ERROR, vbucket_get_error_message(config)); return; } lcb_update_vbconfig(instance, config); }
int vbucket_config_parse(VBUCKET_CONFIG_HANDLE handle, vbucket_source_t data_source, const char *data) { return vbucket_config_parse2(handle, data_source, data, "localhost"); }