Fix crash in record conv rule select YAZ-812
[yaz-moved-to-github.git] / src / seshigh.c
index 2ef4ad5..52ced9b 100644 (file)
@@ -74,7 +74,7 @@
 #include <yaz/yaz-util.h>
 #include <yaz/pquery.h>
 #include <yaz/oid_db.h>
-
+#include <yaz/query-charset.h>
 #include <yaz/srw.h>
 #include <yaz/backend.h>
 #include <yaz/yaz-ccl.h>
@@ -1862,8 +1862,8 @@ static void process_http_request(association *assoc, request *req)
         if (sr->which == Z_SRW_searchRetrieve_request)
         {
             Z_SRW_PDU *res =
-                yaz_srw_get_pdu(assoc->encode, Z_SRW_searchRetrieve_response,
-                                sr->srw_version);
+                yaz_srw_get_pdu_e(assoc->encode, Z_SRW_searchRetrieve_response,
+                                  sr);
             stylesheet = sr->u.request->stylesheet;
             if (num_diagnostic)
             {
@@ -1879,8 +1879,7 @@ static void process_http_request(association *assoc, request *req)
         }
         else if (sr->which == Z_SRW_explain_request)
         {
-            Z_SRW_PDU *res = yaz_srw_get_pdu(o, Z_SRW_explain_response,
-                                             sr->srw_version);
+            Z_SRW_PDU *res = yaz_srw_get_pdu_e(o, Z_SRW_explain_response, sr);
             stylesheet = sr->u.explain_request->stylesheet;
             if (num_diagnostic)
             {
@@ -1894,8 +1893,7 @@ static void process_http_request(association *assoc, request *req)
         }
         else if (sr->which == Z_SRW_scan_request)
         {
-            Z_SRW_PDU *res = yaz_srw_get_pdu(o, Z_SRW_scan_response,
-                                             sr->srw_version);
+            Z_SRW_PDU *res = yaz_srw_get_pdu_e(o, Z_SRW_scan_response, sr);
             stylesheet = sr->u.scan_request->stylesheet;
             if (num_diagnostic)
             {
@@ -2500,7 +2498,8 @@ static Z_Records *pack_records(association *a, char *setname, Odr_int start,
                                Z_ReferenceId *referenceId,
                                Odr_oid *oid, int *errcode)
 {
-    int recno, total_length = 0, dumped_records = 0;
+    int recno;
+    Odr_int dumped_records = 0;
     int toget = odr_int_to_int(*num);
     Z_Records *records =
         (Z_Records *) odr_malloc(a->encode, sizeof(*records));
@@ -2530,13 +2529,13 @@ static Z_Records *pack_records(association *a, char *setname, Odr_int start,
     {
         bend_fetch_rr freq;
         Z_NamePlusRecord *thisrec;
-        int this_length = 0;
+        Odr_int this_length = 0;
         /*
          * we get the number of bytes allocated on the stream before any
          * allocation done by the backend - this should give us a reasonable
          * idea of the total size of the data so far.
          */
-        total_length = odr_total(a->encode) - dumped_records;
+        Odr_int total_length = odr_total(a->encode) - dumped_records;
         freq.errcode = 0;
         freq.errstring = 0;
         freq.basename = 0;
@@ -2592,10 +2591,11 @@ static Z_Records *pack_records(association *a, char *setname, Odr_int start,
             this_length = freq.len;
         else
             this_length = odr_total(a->encode) - total_length - dumped_records;
-        yaz_log(YLOG_DEBUG, "  fetched record, len=%d, total=%d dumped=%d",
-            this_length, total_length, dumped_records);
+        yaz_log(log_requestdetail, "  fetched record, len=" ODR_INT_PRINTF
+                " total=" ODR_INT_PRINTF " dumped=" ODR_INT_PRINTF,
+                this_length, total_length, dumped_records);
         if (a->preferredMessageSize > 0 &&
-                this_length + total_length > a->preferredMessageSize)
+            this_length + total_length > a->preferredMessageSize)
         {
             /* record is small enough, really */
             if (this_length <= a->preferredMessageSize && recno > start)
@@ -2625,7 +2625,7 @@ static Z_Records *pack_records(association *a, char *setname, Odr_int start,
             else /* too big entirely */
             {
                 yaz_log(log_requestdetail, "Record > maxrcdsz "
-                        "this=%d max=%d",
+                        "this=" ODR_INT_PRINTF " max=%d",
                         this_length, a->maximumRecordSize);
                 reclist->records[reclist->num_records] =
                     surrogatediagrec(
@@ -2708,6 +2708,19 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb)
             bsrr->search_input = req->otherInfo;
         bsrr->present_number = *req->mediumSetPresentNumber;
 
+        if (assoc->server && assoc->server->client_query_charset &&
+            req->query->which == Z_Query_type_1)
+        {
+            yaz_iconv_t cd =
+                yaz_iconv_open("UTF-8", assoc->server->client_query_charset);
+            if (cd)
+            {
+                yaz_query_charset_convert_rpnquery(req->query->u.type_1,
+                                                   assoc->decode, cd);
+                yaz_iconv_close(cd);
+            }
+        }
+
         if (assoc->server && assoc->server->cql_transform
             && req->query->which == Z_Query_type_104
             && req->query->u.type_104->which == Z_External_CQL)