From 60892f2ef45fa1ee656e1a00cac0578f9d6f9536 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Orsini Date: Fri, 11 May 2012 11:50:29 +0000 Subject: [PATCH] save bpph list into file cache --- src/fcache.c | 2 +- src/fcache.h | 2 +- src/lp.h | 2 ++ src/lp_json.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++------- src/lp_json.h | 3 +- src/lp_ws.c | 24 +++++++++++----- 6 files changed, 102 insertions(+), 21 deletions(-) diff --git a/src/fcache.c b/src/fcache.c index acc2e7a..2f76486 100644 --- a/src/fcache.c +++ b/src/fcache.c @@ -94,7 +94,7 @@ char *fcache_get(const char *key) return content; } -void fcache_put(const char *key, char *value) +void fcache_put(const char *key, const char *value) { char *path, *dir, *tmp; FILE *f; diff --git a/src/fcache.h b/src/fcache.h index 0e73b8d..43e0ad9 100644 --- a/src/fcache.h +++ b/src/fcache.h @@ -23,7 +23,7 @@ #include char *fcache_get(const char *k); -void fcache_put(const char *k, char *v); +void fcache_put(const char *k, const char *v); void fcache_cleanup(); diff --git a/src/lp.h b/src/lp.h index 0603742..5b2a1ed 100644 --- a/src/lp.h +++ b/src/lp.h @@ -38,6 +38,8 @@ struct bpph { char *distro_arch_series_link; char *self_link; int architecture_specific; + + struct tm date_created; }; struct distro_arch_series { diff --git a/src/lp_json.c b/src/lp_json.c index 6034120..a2b88f6 100644 --- a/src/lp_json.c +++ b/src/lp_json.c @@ -20,20 +20,23 @@ #define _XOPEN_SOURCE #include - #include #include +#include +#include #include "lp_json.h" #include "lp_ws.h" -struct bpph *json_object_to_bpph(json_object *o) +static struct bpph *json_to_bpph(json_object *o) { const char *binary_package_name; const char *binary_package_version; const char *distro_arch_series_link; const char *self_link; int architecture_specific; + const char *date_created; + struct bpph *bpph; binary_package_name = json_object_get_string (json_object_object_get(o, "binary_package_name")); @@ -53,11 +56,63 @@ struct bpph *json_object_to_bpph(json_object *o) else architecture_specific = 0; - return bpph_new(binary_package_name, - binary_package_version, - distro_arch_series_link, - self_link, - architecture_specific); + bpph = bpph_new(binary_package_name, + binary_package_version, + distro_arch_series_link, + self_link, + architecture_specific); + + date_created = json_object_get_string + (json_object_object_get(o, "date_created")); + if (date_created) { + bpph->date_created.tm_isdst = -1; + strptime(date_created, "%FT%T%z", &bpph->date_created); + } + + return bpph; +} + +static json_object *bpph_to_json(struct bpph *bpph) +{ + json_object *json; + char *date; + + json = json_object_new_object(); + + json_object_object_add + (json, + "binary_package_name", + json_object_new_string(bpph->binary_package_name)); + + json_object_object_add + (json, + "binary_package_version", + json_object_new_string(bpph->binary_package_version)); + + json_object_object_add + (json, + "distro_arch_series_link", + json_object_new_string(bpph->distro_arch_series_link)); + + json_object_object_add + (json, + "architecture_specific", + json_object_new_boolean(bpph->architecture_specific)); + + date = malloc(strlen("YY-MM-DDThh:mm:ss+xxx") + 1); + strftime(date, + strlen("YY-MM-DDThh:mm:ss+xxx") + 1, + "%FT%T%z", + &bpph->date_created); + + json_object_object_add + (json, + "date_created", + json_object_new_string(date)); + + free(date); + + return json; } struct distro_arch_series *json_object_to_distro_arch_series(json_object *o) @@ -68,7 +123,6 @@ struct distro_arch_series *json_object_to_distro_arch_series(json_object *o) boolean is_nominated_arch_indep; const char *distroseries_link; - display_name = json_object_get_string (json_object_object_get(o, "display_name")); @@ -134,8 +188,8 @@ struct bpph **json_object_to_bpph_list(json_object *o) (sizeof(struct bpph *)*(n+1)); for (i = 0, i2 = 0; i < n; i++) { - h = json_object_to_bpph(json_object_array_get_idx(o_entries, - i)); + h = json_to_bpph(json_object_array_get_idx(o_entries, + i)); if (!h->architecture_specific) { distro = get_distro_arch_series @@ -155,6 +209,22 @@ struct bpph **json_object_to_bpph_list(json_object *o) return entries; } +json_object *bpph_list_to_json(struct bpph **list) +{ + json_object *result, *entries; + struct bpph **cur; + + result = json_object_new_object(); + + 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)); + + return result; +} + struct daily_download_total * json_object_to_daily_download_total(const char *d, json_object *o_c) { diff --git a/src/lp_json.h b/src/lp_json.h index 3b7f553..51df15e 100644 --- a/src/lp_json.h +++ b/src/lp_json.h @@ -24,9 +24,8 @@ #include "lp.h" -struct bpph *json_object_to_bpph(json_object *o); - struct bpph **json_object_to_bpph_list(json_object *o); +json_object *bpph_list_to_json(struct bpph **); struct distro_arch_series *json_object_to_distro_arch_series(json_object *o); struct distro_series *json_object_to_distro_series(json_object *o); diff --git a/src/lp_ws.c b/src/lp_ws.c index 2044371..a813b33 100644 --- a/src/lp_ws.c +++ b/src/lp_ws.c @@ -20,6 +20,7 @@ #include #define _(String) gettext(String) +#include #include #include @@ -60,10 +61,9 @@ static json_object *get_json_object(const char *url) struct bpph **get_bpph_list(const char *archive_url, const char *pkg_status) { - struct json_object *o_next; - char *url; - json_object *o; - void **result = NULL; + char *url, *bpph_key; + struct bpph **result = NULL; + struct json_object *o, *bpph_json, *o_next; url = malloc(strlen(archive_url)+ strlen(QUERY_GET_PUBLISHED_BINARIES)+ @@ -86,8 +86,9 @@ struct bpph **get_bpph_list(const char *archive_url, const char *pkg_status) if (!o) break; - result = list_append_list(result, - (void **)json_object_to_bpph_list(o)); + result = (struct bpph **)list_append_list + ((void **)result, + (void **)json_object_to_bpph_list(o)); o_next = json_object_object_get(o, "next_collection_link"); @@ -97,7 +98,16 @@ struct bpph **get_bpph_list(const char *archive_url, const char *pkg_status) json_object_put(o); } - return (struct bpph **)result; + 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)); + + json_object_put(bpph_json); + free(bpph_key); + + return result; } int get_download_count(const char *archive_url) -- 2.7.4