+ rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf));
+ http_send_response(c);
+}
+
+static void write_metadata(WRBUF w, struct conf_service *service,
+ struct record_metadata **ml, int full)
+{
+ int imeta;
+
+ for (imeta = 0; imeta < service->num_metadata; imeta++)
+ {
+ struct conf_metadata *cmd = &service->metadata[imeta];
+ struct record_metadata *md;
+ if (!cmd->brief && !full)
+ continue;
+ for (md = ml[imeta]; md; md = md->next)
+ {
+ wrbuf_printf(w, "\n<md-%s>", cmd->name);
+
+ switch (cmd->type)
+ {
+ case Metadata_type_generic:
+ wrbuf_xmlputs(w, md->data.text);
+ break;
+ case Metadata_type_year:
+ wrbuf_printf(w, "%d", md->data.number.min);
+ if (md->data.number.min != md->data.number.max)
+ wrbuf_printf(w, "-%d", md->data.number.max);
+ break;
+ default:
+ wrbuf_puts(w, "[can't represent]");
+ }
+ wrbuf_printf(w, "</md-%s>", cmd->name);
+ }
+ }
+}
+
+static void write_subrecord(struct record *r, WRBUF w,
+ struct conf_service *service, int show_details)
+{
+ char *name = session_setting_oneval(client_get_database(r->client), PZ_NAME);
+
+ wrbuf_puts(w, "<location id=\"");
+ wrbuf_xmlputs(w, client_get_database(r->client)->database->url);
+ wrbuf_puts(w, "\" ");
+
+ wrbuf_puts(w, "name=\"");
+ wrbuf_xmlputs(w, *name ? name : "Unknown");
+ wrbuf_puts(w, "\">");
+
+ if (show_details)
+ 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;
+
+ if (!s)
+ return;
+ if (!idstr)
+ {
+ error(rs, PAZPAR2_MISSING_PARAMETER, "id");
+ return;
+ }
+ wrbuf_rewind(c->wrbuf);
+ id = atoi(idstr);
+ if (!(rec = show_single(s->psession, id)))
+ {
+ error(rs, PAZPAR2_RECORD_MISSING, idstr);
+ return;
+ }
+ wrbuf_puts(c->wrbuf, "<record>\n");
+ wrbuf_printf(c->wrbuf, "<recid>%d</recid>\n", rec->recid);
+ write_metadata(c->wrbuf, service, rec->metadata, 1);
+ for (r = rec->records; r; r = r->next)
+ write_subrecord(r, c->wrbuf, service, 1);
+ wrbuf_puts(c->wrbuf, "</record>\n");
+ rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf));