/*
- * $Id: http_command.c,v 1.22 2007-01-15 04:34:28 quinn Exp $
+ * $Id: http_command.c,v 1.31 2007-04-10 00:53:24 quinn Exp $
*/
#include <stdio.h>
struct session *psession;
unsigned int session_id;
int timestamp;
+ NMEM nmem;
struct http_session *next;
};
struct http_session *http_session_create()
{
- struct http_session *r = xmalloc(sizeof(*r));
- r->psession = new_session();
+ NMEM nmem = nmem_create();
+ struct http_session *r = nmem_malloc(nmem, sizeof(*r));
+
+ r->psession = new_session(nmem);
r->session_id = 0;
r->timestamp = 0;
+ r->nmem = nmem;
r->next = session_list;
session_list = r;
r->timeout_iochan = iochan_create(-1, session_timeout, 0);
}
iochan_destroy(s->timeout_iochan);
destroy_session(s->psession);
- xfree(s);
+ nmem_destroy(s->nmem);
}
static void error(struct http_response *rs, char *code, char *msg, char *txt)
}
// This implements functionality somewhat similar to 'bytarget', but in a termlist form
-static void targets_termlist(WRBUF wrbuf, struct session *se)
+static void targets_termlist(WRBUF wrbuf, struct session *se, int num)
{
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++)
+ for (i = 0; i < count && i < num && ht[i].hits > 0; i++)
{
wrbuf_puts(wrbuf, "\n<term>\n");
- wrbuf_printf(wrbuf, "<name>%s</name>\n", ht[i].id);
+ wrbuf_printf(wrbuf, "<id>%s</id>\n", ht[i].id);
+ wrbuf_printf(wrbuf, "<name>%s</name>\n", ht[i].name);
wrbuf_printf(wrbuf, "<frequency>%d</frequency>\n", ht[i].hits);
wrbuf_printf(wrbuf, "<state>%s</state>\n", ht[i].state);
wrbuf_printf(wrbuf, "<diagnostic>%d</diagnostic>\n", ht[i].diagnostic);
int len;
int i;
char *name = http_argbyname(rq, "name");
+ char *nums = http_argbyname(rq, "num");
+ int num = 15;
int status;
if (!s)
name = "subject";
if (strlen(name) > 255)
return;
+ if (nums)
+ num = atoi(nums);
wrbuf_rewind(c->wrbuf);
wrbuf_printf(c->wrbuf, "\n<list name=\"%s\">\n", tname);
if (!strcmp(tname, "xtargets"))
- targets_termlist(c->wrbuf, s->psession);
+ targets_termlist(c->wrbuf, s->psession, num);
else
{
p = termlist(s->psession, tname, &len);
if (p)
- for (i = 0; i < len; i++)
+ for (i = 0; i < len && i < num; i++)
{
wrbuf_puts(c->wrbuf, "\n<term>");
wrbuf_printf(c->wrbuf, "<name>%s</name>", p[i]->term);
name++;
}
wrbuf_puts(c->wrbuf, "</termlist>");
- rs->payload = nmem_strdup(rq->channel->nmem, wrbuf_buf(c->wrbuf));
+ rs->payload = nmem_strdup(rq->channel->nmem, wrbuf_cstr(c->wrbuf));
http_send_response(c);
}
}
wrbuf_puts(c->wrbuf, "</bytarget>");
- rs->payload = nmem_strdup(c->nmem, wrbuf_buf(c->wrbuf));
+ rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf));
http_send_response(c);
}
}
}
+static void write_subrecord(struct record *r, WRBUF w, struct conf_service *service)
+{
+ wrbuf_printf(w, "<location id=\"%s\" name=\"%s\">\n",
+ r->client->database->url,
+ r->client->database->name ? r->client->database->name : "");
+ write_metadata(w, service, r->metadata, 1);
+ wrbuf_puts(w, "</location>\n");
+}
+
static void cmd_record(struct http_channel *c)
{
struct http_response *rs = c->response;
struct http_request *rq = c->request;
struct http_session *s = locate_session(rq, rs);
struct record_cluster *rec;
+ struct record *r;
struct conf_service *service = global_parameters.server->service;
char *idstr = http_argbyname(rq, "id");
int id;
wrbuf_puts(c->wrbuf, "<record>\n");
wrbuf_printf(c->wrbuf, "<recid>%d</recid>", rec->recid);
write_metadata(c->wrbuf, service, rec->metadata, 1);
+ for (r = rec->records; r; r = r->next)
+ write_subrecord(r, c->wrbuf, service);
wrbuf_puts(c->wrbuf, "</record>\n");
- rs->payload = nmem_strdup(c->nmem, wrbuf_buf(c->wrbuf));
+ rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf));
http_send_response(c);
}
}
wrbuf_puts(c->wrbuf, "</show>\n");
- rs->payload = nmem_strdup(c->nmem, wrbuf_buf(c->wrbuf));
+ rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf));
http_send_response(c);
}
struct http_response *rs = c->response;
struct http_session *s = locate_session(rq, rs);
char *query = http_argbyname(rq, "query");
+ char *filter = http_argbyname(rq, "filter");
char *res;
if (!s)
error(rs, "417", "Must supply query", 0);
return;
}
- res = search(s->psession, query);
+ res = search(s->psession, query, filter);
if (res)
{
error(rs, "417", res, res);
wrbuf_printf(c->wrbuf, "<failed>%d</failed>\n", stat.num_failed);
wrbuf_printf(c->wrbuf, "<error>%d</error>\n", stat.num_error);
wrbuf_puts(c->wrbuf, "</stat>");
- rs->payload = nmem_strdup(c->nmem, wrbuf_buf(c->wrbuf));
+ rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf));
http_send_response(c);
}
wrbuf_printf(c->wrbuf, " </version>\n");
wrbuf_puts(c->wrbuf, "</info>");
- rs->payload = nmem_strdup(c->nmem, wrbuf_buf(c->wrbuf));
+ rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf));
http_send_response(c);
}