Use CONNECT for SSL backends and for Z39.50 thru HTTP proxy YAZ-825
[yaz-moved-to-github.git] / src / zoom-sru.c
index bca1889..17f7c18 100644 (file)
@@ -35,8 +35,7 @@ static zoom_ret send_srw(ZOOM_connection c, Z_SRW_PDU *sr)
     const char *database =  ZOOM_options_get(c->options, "databaseName");
 
     gdu = z_get_HTTP_Request_uri(c->odr_out, c->host_port,
-                                 database,
-                                 c->proxy ? 1 : 0);
+                                 database, c->proxy_mode);
 
     if (c->sru_mode == zoom_sru_get)
     {
@@ -145,7 +144,6 @@ zoom_ret ZOOM_connection_srw_send_scan(ZOOM_connection c)
 #if YAZ_HAVE_XML2
 zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c)
 {
-    const char *facets = 0;
     int i;
     int *start, *count;
     ZOOM_resultset resultset = 0;
@@ -162,14 +160,17 @@ zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c)
         return zoom_complete;
 
     resultset = c->tasks->u.search.resultset;
+
+    ZOOM_memcached_search(c, resultset);
+
     if (!resultset->setname)
-        resultset->setname = xstrdup("default");
+        resultset->setname = odr_strdup(resultset->odr, "default");
     ZOOM_options_set(resultset->options, "setname", resultset->setname);
     start = &c->tasks->u.search.start;
     count = &c->tasks->u.search.count;
-    facets = ZOOM_options_get(resultset->options, "facets");
-    if (facets)
-        facet_list = yaz_pqf_parse_facet_list(c->odr_out, facets);
+    if (resultset->req_facets)
+        facet_list = yaz_pqf_parse_facet_list(c->odr_out,
+                                              resultset->req_facets);
     schema = c->tasks->u.search.schema;
 
     if (resultset->live_set)
@@ -188,11 +189,6 @@ zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c)
                                      schema);
         if (!rec)
             break;
-        else
-        {
-            ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_RECV_RECORD);
-            ZOOM_connection_put_event(c, event);
-        }
     }
     *start += i;
     *count -= i;
@@ -257,6 +253,7 @@ static zoom_ret handle_srw_response(ZOOM_connection c,
                                     Z_SRW_searchRetrieveResponse *res)
 {
     ZOOM_resultset resultset = 0;
+    int *start, *count;
     int i;
     NMEM nmem;
     ZOOM_Event event;
@@ -269,6 +266,8 @@ static zoom_ret handle_srw_response(ZOOM_connection c,
         return zoom_complete;
 
     resultset = c->tasks->u.search.resultset;
+    start = &c->tasks->u.search.start;
+    count = &c->tasks->u.search.count;
     syntax = c->tasks->u.search.syntax;
     elementSetName = c->tasks->u.search.elementSetName;
     schema = c->tasks->u.search.schema;
@@ -297,24 +296,33 @@ static zoom_ret handle_srw_response(ZOOM_connection c,
     {
         if (res->numberOfRecords)
         {
-            resultset->size = *res->numberOfRecords;
-#if HAVE_LIBMEMCACHED_MEMCACHED_H
-            if (c->mc_st && resultset->live_set == 0)
+            Z_OtherInformation *oi = 0;
+            if (res->facetList)
             {
-                uint32_t flags = 0;
-                memcached_return_t rc;
-                time_t expiration = 36000;
-                char str[40];
-
-                sprintf(str, ODR_INT_PRINTF, resultset->size);
-                rc = memcached_set(c->mc_st,
-                                   wrbuf_buf(resultset->mc_key),wrbuf_len(resultset->mc_key),
-                                   str, strlen(str), expiration, flags);
-                yaz_log(YLOG_LOG, "Store SRU hit count key=%s value=%s rc=%u %s",
-                        wrbuf_cstr(resultset->mc_key), str, (unsigned) rc,
-                        memcached_last_error_message(c->mc_st));
+                ODR o = c->odr_in;
+                Z_External *ext = (Z_External *)
+                    odr_malloc(o, sizeof(*ext));
+
+                ext->which = Z_External_userFacets;
+                ext->u.facetList = res->facetList;
+                ext->direct_reference =
+                    odr_oiddup(o, yaz_oid_userinfo_facet_1);
+                ext->indirect_reference = 0;
+                ext->descriptor = 0;
+                oi = (Z_OtherInformation *) odr_malloc(o, sizeof(*oi));
+                oi->num_elements = 1;
+                oi->list = (Z_OtherInformationUnit **)
+                    odr_malloc(o, sizeof(*oi->list));
+                oi->list[0] = (Z_OtherInformationUnit *)
+                    odr_malloc(o, sizeof(**oi->list));
+                oi->list[0]->category = 0;
+                oi->list[0]->which = Z_OtherInfo_externallyDefinedInfo;
+                oi->list[0]->information.externallyDefinedInfo = ext;
             }
-#endif
+            resultset->size = *res->numberOfRecords;
+            ZOOM_memcached_hitcount(c, resultset, oi,
+                                    res->resultCountPrecision ?
+                                    res->resultCountPrecision : "exact");
         }
         resultset->live_set = 2;
         if (res->suggestions)
@@ -368,6 +376,10 @@ static zoom_ret handle_srw_response(ZOOM_connection c,
                                       schema, diag);
             }
         }
+        *count -= i;
+        if (*count < 0)
+            *count = 0;
+        *start += i;
         nmem = odr_extract_mem(c->odr_in);
         nmem_transfer(odr_getmem(resultset->odr), nmem);
         nmem_destroy(nmem);