CCL: fix use of "term" field in sub queries
[yaz-moved-to-github.git] / src / zoom-sru.c
index f9baf44..d7f19cb 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2011 Index Data
+ * Copyright (C) 1995-2012 Index Data
  * See the file LICENSE for details.
  */
 /**
@@ -61,6 +61,8 @@ static zoom_ret send_srw(ZOOM_connection c, Z_SRW_PDU *sr)
         return zoom_complete;
     if (c->odr_print)
         z_GDU(c->odr_print, &gdu, 0, 0);
+    if (c->odr_save)
+        z_GDU(c->odr_save, &gdu, 0, 0);
     c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
         
     event = ZOOM_Event_create(ZOOM_EVENT_SEND_APDU);
@@ -101,14 +103,14 @@ zoom_ret ZOOM_connection_srw_send_scan(ZOOM_connection c)
     {
         sr->u.scan_request->query_type = Z_SRW_query_type_cql;
         sr->u.scan_request->scanClause.cql =
-            ZOOM_query_get_query_string(scan->query);
+            odr_strdup(c->odr_out, ZOOM_query_get_query_string(scan->query));
     }
     else if (z_query->which == Z_Query_type_1
              || z_query->which == Z_Query_type_101)
     {
         sr->u.scan_request->query_type = Z_SRW_query_type_pqf;
         sr->u.scan_request->scanClause.pqf =
-            ZOOM_query_get_query_string(scan->query);
+            odr_strdup(c->odr_out, ZOOM_query_get_query_string(scan->query));
     }
     else
     {
@@ -209,13 +211,21 @@ zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c)
     {
         sr->u.request->query_type = Z_SRW_query_type_pqf;
         sr->u.request->query.pqf =
-            ZOOM_query_get_query_string(resultset->query);
+            odr_strdup(c->odr_out, 
+                       ZOOM_query_get_query_string(resultset->query));
     }
     else
     {
         ZOOM_set_error(c, ZOOM_ERROR_UNSUPPORTED_QUERY, 0);
         return zoom_complete;
     }
+   
+    option_val = ZOOM_query_get_sru11(resultset->query);
+    if (option_val)
+    {
+        sr->u.request->sort_type = Z_SRW_sort_type_sort;
+        sr->u.request->sort.sortKeys = odr_strdup(c->odr_out, option_val);
+    }
     sr->u.request->startRecord = odr_intdup(c->odr_out, *start + 1);
     sr->u.request->maximumRecords = odr_intdup(
         c->odr_out, (resultset->step > 0 && resultset->step < *count) ? 
@@ -298,6 +308,9 @@ static zoom_ret handle_srw_response(ZOOM_connection c,
         if (res->numberOfRecords) {
             resultset->size = *res->numberOfRecords;
         }
+        if (res->suggestions) {
+            ZOOM_resultset_option_set(resultset, "suggestions", res->suggestions);
+        }
         for (i = 0; i<res->num_records; i++)
         {
             int pos;