X-Git-Url: http://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Flp_ws.c;h=3086e6f3960eb3c5bf7e3cfd1944e35e42a7f456;hb=c75862be119ac38a67f841fcc7da339be423973a;hp=fcf08c41b3ce736e1a66510b510bada33df04b8f;hpb=cbe5f873c5f0306a7a5d2f431992dbbb6edbe332;p=ppastats.git diff --git a/src/lp_ws.c b/src/lp_ws.c index fcf08c4..3086e6f 100644 --- a/src/lp_ws.c +++ b/src/lp_ws.c @@ -35,8 +35,9 @@ #include "lp_json.h" #include "ppastats.h" -static const char * -QUERY_GET_PUBLISHED_BINARIES = "?ws.op=getPublishedBinaries&ws.size=150"; +/** Default ws.size value for the getPublishedBinaries request. */ +static const int DEFAULT_WS_SIZE = 150; + static const char *QUERY_GET_DOWNLOAD_COUNT = "?ws.op=getDownloadCount"; static const char * QUERY_GET_DAILY_DOWNLOAD_TOTALS = "?ws.op=getDailyDownloadTotals"; @@ -59,7 +60,7 @@ static json_object *get_json_object(const char *url) return NULL; } -char *get_bpph_list_cache_key(const char *archive_url) +static char *get_bpph_list_cache_key(const char *archive_url) { char *key; @@ -69,7 +70,7 @@ char *get_bpph_list_cache_key(const char *archive_url) return key; } -struct bpph **get_bpph_list_from_cache(const char *key) +static struct bpph **get_bpph_list_from_cache(const char *key) { char *content; struct bpph **list; @@ -91,7 +92,7 @@ struct bpph **get_bpph_list_from_cache(const char *key) return list; } -struct tm *get_last_creation_date(struct bpph **list) +static char *get_last_creation_date(struct bpph **list) { time_t last, t; struct bpph **cur; @@ -100,55 +101,83 @@ struct tm *get_last_creation_date(struct bpph **list) if (list) for (cur = list; *cur; cur++) { - t = mktime(&(*cur)->date_created); + t = (*cur)->date_created; if (t > last) last = t; } - return localtime(&last); + if (last) + return time_to_str(last); + else + return NULL; } -struct bpph **get_bpph_list(const char *archive_url, const char *pkg_status) +/* + * 'archive_url': LP URL of the archive. + * 'size': size of the reply array. Between 1-300, else default value is used. + */ +static char *create_query_get_bpph(const char *archive_url, + const char *status, + int size) +{ + static const char *default_opt = "?ws.op=getPublishedBinaries&ws.size="; + static const char *status_opt = "&status="; + char *url; + size_t n; + + if (size < 1 || size > 300) + size = DEFAULT_WS_SIZE; + + n = strlen(archive_url) + strlen(default_opt) + 3 + 1; + + if (status) + n += strlen(status_opt) + strlen(status); + + url = malloc(n); + sprintf(url, "%s%s%d", archive_url, default_opt, size); + + if (status) { + strcat(url, status_opt); + strcat(url, status); + } + + return url; +} + +struct bpph **get_bpph_list(const char *archive_url, + const char *pkg_status, + int ws_size) { char *url, *key, *tmp; - struct bpph **result = NULL; + struct bpph **result; struct json_object *o, *bpph_json, *o_next; - char *created_since_date; - struct tm *tm; + char *date; int ok; - url = malloc(strlen(archive_url) - + strlen(QUERY_GET_PUBLISHED_BINARIES) - + 1); - strcpy(url, archive_url); - strcat(url, QUERY_GET_PUBLISHED_BINARIES); + url = create_query_get_bpph(archive_url, pkg_status, ws_size); key = get_bpph_list_cache_key(archive_url); result = get_bpph_list_from_cache(key); if (result) { - tm = get_last_creation_date(result); - - created_since_date = malloc(200); - strftime(created_since_date, - 100, - "%FT%T", - tm); + date = get_last_creation_date(result); - printf("Update package since: %s\n", created_since_date); + if (date) { + printf("Update package since: %s\n", date); - tmp = malloc(strlen(url) - + strlen("&created_since_date=") - + strlen(created_since_date)+1); - strcpy(tmp, url); - strcat(tmp, "&created_since_date="); - strcat(tmp, created_since_date); + tmp = malloc(strlen(url) + + strlen("&created_since_date=") + + strlen(date)+1); + strcpy(tmp, url); + strcat(tmp, "&created_since_date="); + strcat(tmp, date); - free(url); - url = tmp; + free(url); + url = tmp; - free(created_since_date); + free(date); + } } ok = 1; @@ -171,7 +200,6 @@ struct bpph **get_bpph_list(const char *archive_url, const char *pkg_status) url = strdup(json_object_get_string(o_next)); json_object_put(o); - } if (ok) {