Happy new year
[pazpar2-moved-to-github.git] / src / http_command.c
index 94314f6..64331a4 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Pazpar2.
-   Copyright (C) 2006-2013 Index Data
+   Copyright (C) Index Data
 
 Pazpar2 is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
@@ -114,7 +114,7 @@ int http_session_use(int delta)
     g_http_sessions += delta;
     sessions = g_http_sessions;
     yaz_mutex_leave(g_http_session_mutex);
-    yaz_log(YLOG_DEBUG, "%s sessions=%d", delta == 0 ? "" :
+    yaz_log(YLOG_DEBUG, "%s http_sessions=%d", delta == 0 ? "" :
             (delta > 0 ? "INC" : "DEC"), sessions);
     return sessions;
 
@@ -263,9 +263,9 @@ static const char *get_msg(enum pazpar2_error_code code)
     return "No error";
 }
 
-static void error(struct http_response *rs,
-                  enum pazpar2_error_code code,
-                  const char *addinfo)
+static void error2(struct http_response *rs,
+                   enum pazpar2_error_code code,
+                   const char *addinfo, const char *addinfo2)
 {
     struct http_channel *c = rs->channel;
     WRBUF text = wrbuf_alloc();
@@ -278,7 +278,14 @@ static void error(struct http_response *rs,
     wrbuf_printf(text, HTTP_COMMAND_RESPONSE_PREFIX
                  "<error code=\"%d\" msg=\"%s\">", (int) code, msg);
     if (addinfo)
+    {
         wrbuf_xmlputs(text, addinfo);
+        if (addinfo2)
+        {
+            wrbuf_xmlputs(text, ": ");
+            wrbuf_xmlputs(text, addinfo2);
+        }
+    }
     wrbuf_puts(text, "</error>");
 
     yaz_log(YLOG_WARN, "HTTP %s %s%s%s", http_status,
@@ -288,6 +295,13 @@ static void error(struct http_response *rs,
     http_send_response(c);
 }
 
+static void error(struct http_response *rs,
+                  enum pazpar2_error_code code,
+                  const char *addinfo)
+{
+    error2(rs, code, addinfo, 0);
+}
+
 static void response_open_command(struct http_channel *c, const char *command)
 {
     wrbuf_rewind(c->wrbuf);
@@ -658,24 +672,12 @@ static void session_status(struct http_channel *c, struct http_session *s)
 static void cmd_service(struct http_channel *c)
 {
     struct http_session *s = locate_session(c);
-    xmlNode *xml_node;
     if (!s)
         return;
 
     response_open_command(c, 0);
-    xml_node = s->psession->service->xml_node;
-    if (xml_node)
-    {
-        xmlNode *tmp = xmlCopyNode(xml_node, 1);
-        xmlBufferPtr buf = xmlBufferCreate();
-
-        xmlNodeDump(buf, tmp->doc, tmp, 0, 0);
-
-        wrbuf_write(c->wrbuf, (const char *) buf->content, buf->use);
-        xmlBufferFree(buf);
-        xmlFreeNode(tmp);
-    }
-
+    if (s->psession->service->xml_node)
+        wrbuf_puts(c->wrbuf, s->psession->service->xml_node);
     response_close(c, 0);
     release_session(c, s);
 }
@@ -884,7 +886,8 @@ static void cmd_bytarget(struct http_channel *c)
 }
 
 static void write_metadata(WRBUF w, struct conf_service *service,
-                           struct record_metadata **ml, int full, int indent)
+                           struct record_metadata **ml, unsigned flags,
+                           int indent)
 {
     int imeta;
 
@@ -892,7 +895,7 @@ static void write_metadata(WRBUF w, struct conf_service *service,
     {
         struct conf_metadata *cmd = &service->metadata[imeta];
         struct record_metadata *md;
-        if (!cmd->brief && !full)
+        if (!cmd->brief && !(flags & 1))
             continue;
         for (md = ml[imeta]; md; md = md->next)
         {
@@ -912,13 +915,19 @@ static void write_metadata(WRBUF w, struct conf_service *service,
             switch (cmd->type)
             {
                 case Metadata_type_generic:
-                    wrbuf_xmlputs(w, md->data.text.disp);
+                    if (md->data.text.snippet && (flags & 2))
+                        wrbuf_puts(w, md->data.text.snippet);
+                    else
+                        wrbuf_xmlputs(w, md->data.text.disp);
                     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;
+                case Metadata_type_float:
+                    wrbuf_printf(w, "%f", md->data.fnumber);
+                    break;
                 default:
                     wrbuf_puts(w, "[can't represent]");
                     break;
@@ -929,7 +938,8 @@ static void write_metadata(WRBUF w, struct conf_service *service,
 }
 
 static void write_subrecord(struct record *r, WRBUF w,
-        struct conf_service *service, int show_details)
+                            struct conf_service *service, unsigned flags,
+                            int indent)
 {
     const char *name = session_setting_oneval(
         client_get_database(r->client), PZ_NAME);
@@ -946,7 +956,7 @@ static void write_subrecord(struct record *r, WRBUF w,
     wrbuf_printf(w,  "%u", r->checksum);
     wrbuf_puts(w, "\">\n");
 
-    write_metadata(w, service, r->metadata, show_details, 2);
+    write_metadata(w, service, r->metadata, flags, indent);
     wrbuf_puts(w, " </location>\n");
 }
 
@@ -1009,6 +1019,8 @@ static void show_record(struct http_channel *c, struct http_session *s)
     const char *offsetstr = http_argbyname(rq, "offset");
     const char *binarystr = http_argbyname(rq, "binary");
     const char *checksumstr = http_argbyname(rq, "checksum");
+    const char *snippets = http_argbyname(rq, "snippets");
+    unsigned flags = (snippets && *snippets == '1') ? 3 : 1;
 
     if (!s)
         return;
@@ -1102,9 +1114,9 @@ static void show_record(struct http_channel *c, struct http_session *s)
         }
         wrbuf_printf(c->wrbuf, " <activeclients>%d</activeclients>\n",
                      session_active_clients(s->psession));
-        write_metadata(c->wrbuf, service, rec->metadata, 1, 1);
+        write_metadata(c->wrbuf, service, rec->metadata, flags, 1);
         for (r = rec->records; r; r = r->next)
-            write_subrecord(r, c->wrbuf, service, 2);
+            write_subrecord(r, c->wrbuf, service, flags, 2);
         response_close(c, "record");
     }
     show_single_stop(s->psession, rec);
@@ -1145,6 +1157,8 @@ static void show_records(struct http_channel *c, struct http_session *s,
     const char *num = http_argbyname(rq, "num");
     const char *sort = http_argbyname(rq, "sort");
     int version = get_version(rq);
+    const char *snippets = http_argbyname(rq, "snippets");
+    unsigned flags = (snippets && *snippets == '1') ? 2 : 0;
 
     int startn = 0;
     int numn = 20;
@@ -1199,9 +1213,9 @@ static void show_records(struct http_channel *c, struct http_session *s,
         struct conf_service *service = s->psession->service;
 
         wrbuf_puts(c->wrbuf, "<hit>\n");
-        write_metadata(c->wrbuf, service, rec->metadata, 0, 1);
+        write_metadata(c->wrbuf, service, rec->metadata, flags, 1);
         for (ccount = 0, p = rl[i]->records; p;  p = p->next, ccount++)
-            write_subrecord(p, c->wrbuf, service, 0); // subrecs w/o details
+            write_subrecord(p, c->wrbuf, service, flags, 2);
         wrbuf_printf(c->wrbuf, " <count>%d</count>\n", ccount);
        if (strstr(sort, "relevance"))
         {
@@ -1274,7 +1288,7 @@ static void cmd_show(struct http_channel *c)
 
     status = session_active_clients(s->psession);
 
-    if (block)
+    if (block && reclist_get_num_records(s->psession->reclist) == 0)
     {
         if (!strcmp(block, "preferred")
             && !session_is_preferred_clients_ready(s->psession)
@@ -1364,6 +1378,7 @@ static void cmd_search(struct http_channel *c)
     const char *rank = http_argbyname(rq, "rank");
     enum pazpar2_error_code code;
     const char *addinfo = 0;
+    const char *addinfo2 = 0;
     struct reclist_sortparms *sp;
     struct conf_service *service = 0;
 
@@ -1394,10 +1409,10 @@ static void cmd_search(struct http_channel *c)
     }
 
     code = session_search(s->psession, query, startrecs, maxrecs, filter, limit,
-                          &addinfo, sp, mergekey, rank);
+                          &addinfo, &addinfo2, sp, mergekey, rank);
     if (code)
     {
-        error(rs, code, addinfo);
+        error2(rs, code, addinfo, addinfo2);
         release_session(c, s);
         return;
     }