X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;ds=sidebyside;f=src%2Fhttp_command.c;h=07e37be175d6799ad4dceae74141b152c18aadba;hb=9e89d4e3c7bc9c9a9b0e7cedc54ca3f15b49de1f;hp=4258b29a2999b3c8a01e370244637cebeefc339d;hpb=58aba67e02b51934a2cae721269fb381d8b0b08b;p=pazpar2-moved-to-github.git diff --git a/src/http_command.c b/src/http_command.c index 4258b29..07e37be 100644 --- a/src/http_command.c +++ b/src/http_command.c @@ -489,55 +489,6 @@ static void cmd_settings(struct http_channel *c) release_session(c, s); } -// 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 int targets_termlist(WRBUF wrbuf, struct session *se, int num, - NMEM nmem) -{ - struct hitsbytarget *ht; - int count, i; - - ht = hitsbytarget(se, &count, nmem); - qsort(ht, count, sizeof(struct hitsbytarget), cmp_ht); - for (i = 0; i < count && i < num && ht[i].hits > 0; i++) - { - - // do only print terms which have display names - - wrbuf_puts(wrbuf, "\n"); - - wrbuf_puts(wrbuf, ""); - wrbuf_xmlputs(wrbuf, ht[i].id); - wrbuf_puts(wrbuf, "\n"); - - wrbuf_puts(wrbuf, ""); - if (!ht[i].name || !ht[i].name[0]) - wrbuf_xmlputs(wrbuf, "NO TARGET NAME"); - else - wrbuf_xmlputs(wrbuf, ht[i].name); - wrbuf_puts(wrbuf, "\n"); - - wrbuf_printf(wrbuf, "" ODR_INT_PRINTF "\n", - ht[i].hits); - - wrbuf_puts(wrbuf, ""); - wrbuf_xmlputs(wrbuf, ht[i].state); - wrbuf_puts(wrbuf, "\n"); - - wrbuf_printf(wrbuf, "%d\n", - ht[i].diagnostic); - wrbuf_puts(wrbuf, "\n"); - } - return count; -} - static void cmd_termlist(struct http_channel *c) { struct http_response *rs = c->response; @@ -547,79 +498,23 @@ static void cmd_termlist(struct http_channel *c) const char *nums = http_argbyname(rq, "num"); int num = 15; int status; - WRBUF debug_log = 0; if (!s) return; status = session_active_clients(s->psession); - if (!name) - name = "subject"; - if (strlen(name) > 255) - return; if (nums) num = atoi(nums); - debug_log = wrbuf_alloc(); - wrbuf_rewind(c->wrbuf); wrbuf_puts(c->wrbuf, "\n"); wrbuf_printf(c->wrbuf, "%d\n", status); - while (*name) - { - char tname[256]; - const char *tp; - - if (!(tp = strchr(name, ','))) - tp = name + strlen(name); - strncpy(tname, name, tp - name); - tname[tp - name] = '\0'; - wrbuf_puts(c->wrbuf, "wrbuf, tname); - wrbuf_puts(c->wrbuf, "\">\n"); - if (!strcmp(tname, "xtargets")) - { - int targets = targets_termlist(c->wrbuf, s->psession, num, c->nmem); - wrbuf_printf(debug_log, " xtargets: %d", targets); - } - else - { - int len; - struct termlist_score **p = - get_termlist_score(s->psession, tname, &len); - if (p && len) - wrbuf_printf(debug_log, " %s: %d", tname, len); - if (p) - { - int i; - for (i = 0; i < len && i < num; i++) - { - // prevnt sending empty term elements - if (!p[i]->term || !p[i]->term[0]) - continue; - - wrbuf_puts(c->wrbuf, ""); - wrbuf_puts(c->wrbuf, ""); - wrbuf_xmlputs(c->wrbuf, p[i]->term); - wrbuf_puts(c->wrbuf, ""); - - wrbuf_printf(c->wrbuf, - "%d", - p[i]->frequency); - wrbuf_puts(c->wrbuf, "\n"); - } - } - } - wrbuf_puts(c->wrbuf, "\n"); - name = tp; - if (*name == ',') - name++; - } + + perform_termlist(c, s->psession, name, num); + wrbuf_puts(c->wrbuf, "\n"); - yaz_log(YLOG_DEBUG, "termlist response: %s ", wrbuf_cstr(debug_log)); - wrbuf_destroy(debug_log); rs->payload = nmem_strdup(rq->channel->nmem, wrbuf_cstr(c->wrbuf)); http_send_response(c); release_session(c, s); @@ -711,7 +606,7 @@ static void cmd_bytarget(struct http_channel *c) if (!s) return; - ht = hitsbytarget(s->psession, &count, c->nmem); + ht = get_hitsbytarget(s->psession, &count, c->nmem); wrbuf_rewind(c->wrbuf); wrbuf_puts(c->wrbuf, HTTP_COMMAND_RESPONSE_PREFIX "OK");