X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fhttp_command.c;h=aa73f9149e70e89ed56216a58b713798e838077d;hb=b0e04a1cb9261a088d5c100dbc891f3240fa88ce;hp=c92c7c334ad51c8cc91ccdbd283aecec571d30c4;hpb=eb673212c641c36afba4cd502e283247de52a015;p=pazpar2-moved-to-github.git diff --git a/src/http_command.c b/src/http_command.c index c92c7c3..aa73f91 100644 --- a/src/http_command.c +++ b/src/http_command.c @@ -875,10 +875,14 @@ static void write_subrecord(struct record *r, WRBUF w, wrbuf_puts(w, "client)); - wrbuf_puts(w, "\" "); + wrbuf_puts(w, "\"\n"); - wrbuf_puts(w, "name=\""); + wrbuf_puts(w, " name=\""); wrbuf_xmlputs(w, *name ? name : "Unknown"); + wrbuf_puts(w, "\" "); + + wrbuf_puts(w, "checksum=\""); + wrbuf_printf(w, "%u", r->checksum); wrbuf_puts(w, "\">"); write_metadata(w, service, r->metadata, show_details); @@ -939,11 +943,11 @@ static void show_record(struct http_channel *c, struct http_session *s) struct http_response *rs = c->response; struct http_request *rq = c->request; struct record_cluster *rec, *prev_r, *next_r; - struct record *r; struct conf_service *service; const char *idstr = http_argbyname(rq, "id"); const char *offsetstr = http_argbyname(rq, "offset"); const char *binarystr = http_argbyname(rq, "binary"); + const char *checksumstr = http_argbyname(rq, "checksum"); if (!s) return; @@ -967,9 +971,8 @@ static void show_record(struct http_channel *c, struct http_session *s) } return; } - if (offsetstr) + if (offsetstr || checksumstr) { - int offset = atoi(offsetstr); const char *syntax = http_argbyname(rq, "syntax"); const char *esn = http_argbyname(rq, "esn"); int i; @@ -980,14 +983,25 @@ static void show_record(struct http_channel *c, struct http_session *s) if (binarystr && *binarystr != '0') binary = 1; - for (i = 0; i < offset && r; r = r->next, i++) - ; - if (!r) + if (checksumstr) { - error(rs, PAZPAR2_RECORD_FAIL, "no record at offset given"); + long v = atol(checksumstr); + for (i = 0; r; r = r->next) + if (v == r->checksum) + break; + if (!r) + error(rs, PAZPAR2_RECORD_FAIL, "no record"); } else { + int offset = atoi(offsetstr); + for (i = 0; i < offset && r; r = r->next, i++) + ; + if (!r) + error(rs, PAZPAR2_RECORD_FAIL, "no record at offset given"); + } + if (r) + { http_channel_observer_t obs = http_add_observer(c, r->client, show_raw_reset); int ret = client_show_raw_begin(r->client, r->position, @@ -1008,6 +1022,7 @@ static void show_record(struct http_channel *c, struct http_session *s) } else { + struct record *r; response_open_no_status(c, "record"); wrbuf_puts(c->wrbuf, "\n"); wrbuf_xmlputs(c->wrbuf, rec->recid);