Approximation. New function to get_version
authorDennis Schafroth <dennis@indexdata.com>
Thu, 12 Apr 2012 16:11:29 +0000 (18:11 +0200)
committerDennis Schafroth <dennis@indexdata.com>
Thu, 12 Apr 2012 16:11:29 +0000 (18:11 +0200)
src/http_command.c

index b75c9c9..5f40d29 100644 (file)
@@ -93,6 +93,16 @@ struct http_sessions {
 static YAZ_MUTEX g_http_session_mutex = 0;
 static int g_http_sessions = 0;
 
+int get_version(struct http_request *rq) {
+    const char *version = http_argbyname(rq, "version");
+    int version_no = 0;
+    if (version && strcmp(version, "")) {
+        version_no = atoi(version);
+    }
+    return version_no;
+}
+
+
 int http_session_use(int delta)
 {
     int sessions;
@@ -515,11 +525,7 @@ static void termlist_response(struct http_channel *c, struct http_session *s, co
     struct http_request *rq = c->request;
     const char *name    = http_argbyname(rq, "name");
     const char *nums    = http_argbyname(rq, "num");
-    const char *version = http_argbyname(rq, "version");
-    int version_no = 0;
-    if (version && strcmp(version, "")) {
-        version_no = atoi(version);
-    }
+    int version = get_version(rq);
     int num = 15;
     int status;
 
@@ -535,7 +541,7 @@ static void termlist_response(struct http_channel *c, struct http_session *s, co
     }
     wrbuf_printf(c->wrbuf, "<activeclients>%d</activeclients>\n", status);
 
-    perform_termlist(c, s->psession, name, num, version_no);
+    perform_termlist(c, s->psession, name, num, version);
 
     response_close(c, "termlist");
 }
@@ -681,11 +687,7 @@ static void bytarget_response(struct http_channel *c, struct http_session *s, co
     struct hitsbytarget *ht;
     struct http_request *rq = c->request;
     const char *settings = http_argbyname(rq, "settings");
-    const char *protocol_version = http_argbyname(rq, "version");
-    int version = 0;
-    if (protocol_version && strcmp(protocol_version,"")) {
-        version = atoi(protocol_version);
-    }
+    int version = get_version(rq);
     ht = get_hitsbytarget(s->psession, &count, c->nmem);
     if (!cmd_status)
         /* Old protocol, always ok */
@@ -1053,10 +1055,13 @@ static void show_records(struct http_channel *c, struct http_session *s, int act
     const char *start = http_argbyname(rq, "start");
     const char *num = http_argbyname(rq, "num");
     const char *sort = http_argbyname(rq, "sort");
+    int version = get_version(rq);
+
     int startn = 0;
     int numn = 20;
     int total;
     Odr_int total_hits;
+    Odr_int approx_hits;
     int i;
 
     if (!s)
@@ -1079,12 +1084,15 @@ static void show_records(struct http_channel *c, struct http_session *s, int act
 
     }
     
-    rl = show_range_start(s->psession, sp, startn, &numn, &total, &total_hits);
+    rl = show_range_start(s->psession, sp, startn, &numn, &total, &total_hits, &approx_hits);
 
     response_open(c, "show");
     wrbuf_printf(c->wrbuf, "\n<activeclients>%d</activeclients>\n", active);
     wrbuf_printf(c->wrbuf, "<merged>%d</merged>\n", total);
     wrbuf_printf(c->wrbuf, "<total>" ODR_INT_PRINTF "</total>\n", total_hits);
+    if (version >= 2) {
+        wrbuf_printf(c->wrbuf, "<approximation>" ODR_INT_PRINTF "</approximation>\n", approx_hits);
+    }
     wrbuf_printf(c->wrbuf, "<start>%d</start>\n", startn);
     wrbuf_printf(c->wrbuf, "<num>%d</num>\n", numn);
 
@@ -1137,6 +1145,7 @@ static void cmd_show(struct http_channel *c)
     const char *block = http_argbyname(rq, "block");
     const char *sort = http_argbyname(rq, "sort");
     const char *block_error = http_argbyname(rq, "report");
+
     struct reclist_sortparms *sp;
     int status;
     int report_error = 0;