+
+struct daily_download_total **get_daily_download_totals(const char *binary_url)
+{
+ char *url, *key, *content;
+ json_object *j_ddts, *json;
+ struct daily_download_total **retrieved_ddts = NULL;
+ struct daily_download_total **cached_ddts;
+ struct daily_download_total **ddts;
+ time_t last_t;
+
+ key = get_ddts_list_cache_key(binary_url);
+
+ content = fcache_get(key);
+ if (content) {
+ json = json_tokener_parse(content);
+ free(content);
+ } else {
+ json = NULL;
+ }
+
+ if (json) {
+ cached_ddts = json_object_to_daily_download_totals(json);
+ json_object_put(json);
+ last_t = ddts_get_last_date(cached_ddts);
+ } else {
+ last_t = 0;
+ cached_ddts = NULL;
+ }
+
+ url = create_ddts_query(binary_url, last_t);
+
+ json = get_json_object(url);
+
+ free(url);
+
+ if (json) {
+ retrieved_ddts = json_object_to_daily_download_totals(json);
+
+ ddts = ddts_merge(cached_ddts, retrieved_ddts);
+
+ json_object_put(json);
+ j_ddts = ddts_to_json_for_cache(ddts);
+ fcache_put(key, json_object_get_string(j_ddts));
+ json_object_put(j_ddts);
+ } else {
+ ddts = NULL;
+ }
+
+ free(key);
+ if (ddts != cached_ddts)
+ free(cached_ddts);
+ free(retrieved_ddts);
+
+ return ddts;
+}
+