From: Jean-Philippe Orsini Date: Fri, 11 May 2012 16:44:28 +0000 (+0000) Subject: load bpph from cache and merge it the http request result X-Git-Tag: v1.3.0~75 X-Git-Url: http://git.wpitchoune.net/gitweb/?p=ppastats.git;a=commitdiff_plain;h=a9435991d03d0bd9e81d6cb6003013bec4b2e6e9 load bpph from cache and merge it the http request result --- diff --git a/src/lp.c b/src/lp.c index 9ba2eec..bd9ba5d 100644 --- a/src/lp.c +++ b/src/lp.c @@ -21,6 +21,7 @@ #include #include +#include "list.h" #include "lp.h" struct distro_series *distro_series_new(const char *name, @@ -169,3 +170,30 @@ void daily_download_total_list_free(struct daily_download_total **list) } } +struct bpph **bpph_list_add(struct bpph **list, struct bpph *new) +{ + struct bpph **cur, *bpph; + + if (list) + for (cur = list; *cur; cur++) { + bpph = *cur; + + if (!strcmp(bpph->self_link, new->self_link)) + return list; + } + + return (struct bpph **)list_add((void **)list, new); +} + +struct bpph **bpph_list_append_list(struct bpph **list1, struct bpph **list2) +{ + struct bpph **cur; + + if (!list2) + return list1; + + for (cur = list2; *cur; cur++) + list1 = bpph_list_add(list1, *cur); + + return list1; +} diff --git a/src/lp.h b/src/lp.h index 11c6481..3e95b4e 100644 --- a/src/lp.h +++ b/src/lp.h @@ -86,6 +86,8 @@ struct bpph *bpph_new(const char *binary_package_name, void bpph_list_free(struct bpph **list); +struct bpph **bpph_list_append_list(struct bpph **list1, struct bpph **list2); + char *get_archive_url(const char *owner, const char *ppa); #endif diff --git a/src/lp_json.c b/src/lp_json.c index d88587a..590d334 100644 --- a/src/lp_json.c +++ b/src/lp_json.c @@ -97,6 +97,11 @@ static json_object *bpph_to_json(struct bpph *bpph) json_object_object_add (json, + "self_link", + json_object_new_string(bpph->self_link)); + + json_object_object_add + (json, "architecture_specific", json_object_new_boolean(bpph->architecture_specific)); @@ -217,8 +222,9 @@ json_object *bpph_list_to_json(struct bpph **list) entries = json_object_new_array(); json_object_object_add(result, "entries", entries); - for (cur = list; *cur; cur++) - json_object_array_add(entries, bpph_to_json(*cur)); + if (list) + for (cur = list; *cur; cur++) + json_object_array_add(entries, bpph_to_json(*cur)); return result; } diff --git a/src/lp_ws.c b/src/lp_ws.c index a813b33..11092c4 100644 --- a/src/lp_ws.c +++ b/src/lp_ws.c @@ -59,9 +59,41 @@ static json_object *get_json_object(const char *url) return NULL; } +static char *get_bpph_list_cache_key(const char *archive_url) +{ + char *key; + + key = malloc(strlen(archive_url + 7) + strlen("/bpph") + 1); + sprintf(key, "%s/bpph", archive_url + 7); + + return key; +} + +static struct bpph **get_bpph_list_from_cache(const char *key) +{ + char *content; + struct bpph **list; + json_object *json; + + content = fcache_get(key); + if (!content) + return NULL; + + json = json_tokener_parse(content); + if (!json) + return NULL; + + list = json_object_to_bpph_list(json); + + json_object_put(json); + free(content); + + return list; +} + struct bpph **get_bpph_list(const char *archive_url, const char *pkg_status) { - char *url, *bpph_key; + char *url, *key; struct bpph **result = NULL; struct json_object *o, *bpph_json, *o_next; @@ -78,6 +110,9 @@ struct bpph **get_bpph_list(const char *archive_url, const char *pkg_status) strcat(url, pkg_status); } + key = get_bpph_list_cache_key(archive_url); + result = get_bpph_list_from_cache(key); + while (url) { o = get_json_object(url); free(url); @@ -86,9 +121,8 @@ struct bpph **get_bpph_list(const char *archive_url, const char *pkg_status) if (!o) break; - result = (struct bpph **)list_append_list - ((void **)result, - (void **)json_object_to_bpph_list(o)); + result = bpph_list_append_list(result, + json_object_to_bpph_list(o)); o_next = json_object_object_get(o, "next_collection_link"); @@ -100,12 +134,10 @@ struct bpph **get_bpph_list(const char *archive_url, const char *pkg_status) bpph_json = bpph_list_to_json(result); - bpph_key = malloc(strlen(archive_url + 7) + strlen("/bpph") + 1); - sprintf(bpph_key, "%s/bpph", archive_url + 7); - fcache_put(bpph_key, json_object_to_json_string(bpph_json)); + fcache_put(key, json_object_to_json_string(bpph_json)); json_object_put(bpph_json); - free(bpph_key); + free(key); return result; }