X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fhttp_command.c;h=9a14705a3506e760754154814943b29913cb1ac5;hb=5c0b5b368867a9b8fe6c3ffe7887890584ee9643;hp=6c99232efecd60ded0f4ce900981c180c081b377;hpb=fe3383c0559a453df1e5076fc6faac6d1a11685c;p=pazpar2-moved-to-github.git diff --git a/src/http_command.c b/src/http_command.c index 6c99232..9a14705 100644 --- a/src/http_command.c +++ b/src/http_command.c @@ -1,5 +1,5 @@ /* - * $Id: http_command.c,v 1.1 2006-12-20 20:47:16 quinn Exp $ + * $Id: http_command.c,v 1.7 2007-01-06 04:54:58 quinn Exp $ */ #include @@ -13,7 +13,6 @@ #include -#include "command.h" #include "util.h" #include "eventl.h" #include "pazpar2.h" @@ -144,6 +143,34 @@ static void cmd_init(struct http_channel *c) http_send_response(c); } +// Compares two hitsbytarget nodes by hitcount +static int cmp_ht(const void *p1, const void *p2) +{ + const struct hitsbytarget *h1 = p1; + const struct hitsbytarget *h2 = p2; + return h2->hits - h1->hits; +} + +// This implements functionality somewhat similar to 'bytarget', but in a termlist form +static void targets_termlist(WRBUF wrbuf, struct session *se) +{ + struct hitsbytarget *ht; + int count, i; + + if (!(ht = hitsbytarget(se, &count))) + return; + qsort(ht, count, sizeof(struct hitsbytarget), cmp_ht); + for (i = 0; i < count && i < 15; i++) + { + wrbuf_puts(wrbuf, "\n\n"); + wrbuf_printf(wrbuf, "%s\n", ht[i].id); + wrbuf_printf(wrbuf, "%d\n", ht[i].hits); + wrbuf_printf(wrbuf, "%s\n", ht[i].state); + wrbuf_printf(wrbuf, "%d\n", ht[i].diagnostic); + wrbuf_puts(wrbuf, "\n\n"); + } +} + static void cmd_termlist(struct http_channel *c) { struct http_response *rs = c->response; @@ -152,21 +179,51 @@ static void cmd_termlist(struct http_channel *c) struct termlist_score **p; int len; int i; + char *name = http_argbyname(rq, "name"); + int status = session_active_clients(s->psession); if (!s) return; + + if (!name) + name = "subject"; + if (strlen(name) > 255) + return; + wrbuf_rewind(c->wrbuf); wrbuf_puts(c->wrbuf, ""); - p = termlist(s->psession, &len); - if (p) - for (i = 0; i < len; i++) + wrbuf_printf(c->wrbuf, "\n%d", status); + while (*name) + { + char tname[256]; + char *tp; + + if (!(tp = strchr(name, ','))) + tp = name + strlen(name); + strncpy(tname, name, tp - name); + tname[tp - name] = '\0'; + + wrbuf_printf(c->wrbuf, "\n\n", tname); + if (!strcmp(tname, "xtargets")) + targets_termlist(c->wrbuf, s->psession); + else { - wrbuf_puts(c->wrbuf, "\n"); - wrbuf_printf(c->wrbuf, "%s", p[i]->term); - wrbuf_printf(c->wrbuf, "%d", p[i]->frequency); - wrbuf_puts(c->wrbuf, ""); + p = termlist(s->psession, tname, &len); + if (p) + for (i = 0; i < len; i++) + { + wrbuf_puts(c->wrbuf, "\n"); + wrbuf_printf(c->wrbuf, "%s", p[i]->term); + wrbuf_printf(c->wrbuf, "%d", p[i]->frequency); + wrbuf_puts(c->wrbuf, ""); + } } + wrbuf_puts(c->wrbuf, "\n"); + name = tp; + if (*name == ',') + name++; + } wrbuf_puts(c->wrbuf, ""); rs->payload = nmem_strdup(rq->channel->nmem, wrbuf_buf(c->wrbuf)); http_send_response(c); @@ -207,12 +264,13 @@ static void cmd_bytarget(struct http_channel *c) http_send_response(c); } -static void show_records(struct http_channel *c) +static void show_records(struct http_channel *c, int active) { struct http_request *rq = c->request; struct http_response *rs = c->response; struct http_session *s = locate_session(rq, rs); struct record **rl; + NMEM nmem_show; char *start = http_argbyname(rq, "start"); char *num = http_argbyname(rq, "num"); int startn = 0; @@ -224,15 +282,21 @@ static void show_records(struct http_channel *c) if (!s) return; + // We haven't counted clients yet if we're called on a block release + if (active < 0) + active = session_active_clients(s->psession); + if (start) startn = atoi(start); if (num) numn = atoi(num); - rl = show(s->psession, startn, &numn, &total, &total_hits); + nmem_show = nmem_create(); + rl = show(s->psession, startn, &numn, &total, &total_hits, nmem_show); wrbuf_rewind(c->wrbuf); wrbuf_puts(c->wrbuf, "\nOK\n"); + wrbuf_printf(c->wrbuf, "%d\n", active); wrbuf_printf(c->wrbuf, "%d\n", total); wrbuf_printf(c->wrbuf, "%d\n", total_hits); wrbuf_printf(c->wrbuf, "%d\n", startn); @@ -255,13 +319,14 @@ static void show_records(struct http_channel *c) wrbuf_puts(c->wrbuf, "\n"); rs->payload = nmem_strdup(c->nmem, wrbuf_buf(c->wrbuf)); http_send_response(c); + nmem_destroy(nmem_show); } static void show_records_ready(void *data) { struct http_channel *c = (struct http_channel *) data; - show_records(c); + show_records(c, -1); } static void cmd_show(struct http_channel *c) @@ -270,13 +335,14 @@ static void cmd_show(struct http_channel *c) struct http_response *rs = c->response; struct http_session *s = locate_session(rq, rs); char *block = http_argbyname(rq, "block"); + int status = session_active_clients(s->psession); if (!s) return; if (block) { - if (!s->psession->reclist || !s->psession->reclist->num_records) + if (status && (!s->psession->reclist || !s->psession->reclist->num_records)) { session_set_watch(s->psession, SESSION_WATCH_RECORDS, show_records_ready, c); yaz_log(YLOG_DEBUG, "Blocking on cmd_show"); @@ -284,7 +350,7 @@ static void cmd_show(struct http_channel *c) } } - show_records(c); + show_records(c, status); } static void cmd_ping(struct http_channel *c) @@ -330,6 +396,7 @@ static void cmd_stat(struct http_channel *c) struct http_response *rs = c->response; struct http_session *s = locate_session(rq, rs); struct statistics stat; + int clients = session_active_clients(s->psession); if (!s) return; @@ -338,6 +405,7 @@ static void cmd_stat(struct http_channel *c) wrbuf_rewind(c->wrbuf); wrbuf_puts(c->wrbuf, ""); + wrbuf_printf(c->wrbuf, "%d\n", clients); wrbuf_printf(c->wrbuf, "%d\n", stat.num_hits); wrbuf_printf(c->wrbuf, "%d\n", stat.num_records); wrbuf_printf(c->wrbuf, "%d\n", stat.num_clients);