Fix Metaproxy stops logging after check config failed MP-590
[metaproxy-moved-to-github.git] / src / filter_sru_to_z3950.cpp
index 26a6ad2..204639e 100644 (file)
@@ -95,6 +95,7 @@ namespace metaproxy_1 {
 
             bool z3950_search_request(
                 mp::Package &package,
+                mp::Package &z3950_package,
                 mp::odr &odr_en,
                 Z_SRW_PDU *sru_pdu_res,
                 Z_SRW_searchRetrieveRequest const *sr_req,
@@ -199,7 +200,6 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req)
     Z_SRW_PDU *sru_pdu_req = 0;
 
     mp::odr odr_en(ODR_ENCODE);
-    Z_SRW_PDU *sru_pdu_res = yaz_srw_get(odr_en, Z_SRW_explain_response);
 
     // determine database with the HTTP header information only
     mp_util::SRUServerInfo sruinfo = mp_util::get_sru_server_info(package);
@@ -217,14 +217,21 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req)
     Z_SOAP *soap = 0;
     char *charset = 0;
     const char *stylesheet = 0;
+    Z_SRW_diagnostic *diagnostic = 0;
+    int num_diagnostic = 0;
 
     // filter acts as sink for non-valid SRU requests
     if (! (sru_pdu_req = mp_util::decode_sru_request(package, odr_de, odr_en,
-                                                     sru_pdu_res, &soap,
+                                                     &diagnostic,
+                                                     &num_diagnostic, &soap,
                                                      charset)))
     {
         if (soap)
         {
+            Z_SRW_PDU *sru_pdu_res = yaz_srw_get(odr_en,
+                                                 Z_SRW_explain_response);
+            sru_pdu_res->u.explain_response->diagnostics = diagnostic;
+            sru_pdu_res->u.explain_response->num_diagnostics = num_diagnostic;
             mp_util::build_sru_explain(package, odr_en, sru_pdu_res,
                                        sruinfo, explainnode);
             mp_util::build_sru_response(package, odr_en, soap,
@@ -278,23 +285,29 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req)
 
     assert(sru_pdu_req);
 
-    // filter acts as sink for SRU explain requests
+    Package z3950_package(package.session(), package.origin());
+    z3950_package.copy_filter(package);
+
+    Z_SRW_PDU *sru_pdu_res = 0;
     if (sru_pdu_req->which == Z_SRW_explain_request)
     {
         Z_SRW_explainRequest *er_req = sru_pdu_req->u.explain_request;
         stylesheet = er_req->stylesheet;
-
+        sru_pdu_res = yaz_srw_get_pdu_e(odr_en, Z_SRW_explain_response,
+                                        sru_pdu_req);
+        sru_pdu_res->u.explain_response->diagnostics = diagnostic;
+        sru_pdu_res->u.explain_response->num_diagnostics = num_diagnostic;
         mp_util::build_sru_explain(package, odr_en, sru_pdu_res,
                                    sruinfo, explainnode, er_req);
     }
-    else if (sru_pdu_req->which == Z_SRW_searchRetrieve_request
-             && sru_pdu_req->u.request)
-    {   // searchRetrieve
+    else if (sru_pdu_req->which == Z_SRW_searchRetrieve_request)
+    {
         Z_SRW_searchRetrieveRequest *sr_req = sru_pdu_req->u.request;
         stylesheet = sr_req->stylesheet;
-
-        sru_pdu_res = yaz_srw_get_pdu(odr_en, Z_SRW_searchRetrieve_response,
-                                      sru_pdu_req->srw_version);
+        sru_pdu_res = yaz_srw_get_pdu_e(odr_en, Z_SRW_searchRetrieve_response,
+                                        sru_pdu_req);
+        sru_pdu_res->u.response->diagnostics = diagnostic;
+        sru_pdu_res->u.response->num_diagnostics = num_diagnostic;
 
         // checking that we have a query
         ok = mp_util::check_sru_query_exists(package, odr_en,
@@ -303,7 +316,7 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req)
         if (ok && z3950_init_request(package, odr_en,
                                      zurl, sru_pdu_res, sru_pdu_req))
         {
-            ok = z3950_search_request(package, odr_en,
+            ok = z3950_search_request(package, z3950_package, odr_en,
                                       sru_pdu_res, sr_req, zurl, dbargs);
 
             if (ok
@@ -316,31 +329,29 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req)
             z3950_close_request(package);
         }
     }
-
-    // scan
-    else if (sru_pdu_req->which == Z_SRW_scan_request
-             && sru_pdu_req->u.scan_request)
+    else if (sru_pdu_req->which == Z_SRW_scan_request)
     {
-        sru_pdu_res = yaz_srw_get_pdu(odr_en, Z_SRW_scan_response,
-                                      sru_pdu_req->srw_version);
         stylesheet = sru_pdu_req->u.scan_request->stylesheet;
+        sru_pdu_res = yaz_srw_get_pdu_e(odr_en, Z_SRW_scan_response,
+                                        sru_pdu_req);
+        sru_pdu_res->u.scan_response->diagnostics = diagnostic;
+        sru_pdu_res->u.scan_response->num_diagnostics = num_diagnostic;
 
         // we do not do scan at the moment, therefore issuing a diagnostic
-        yaz_add_srw_diagnostic(odr_en,
-                               &(sru_pdu_res->u.scan_response->diagnostics),
-                               &(sru_pdu_res->u.scan_response->num_diagnostics),
+        yaz_add_srw_diagnostic(odr_en, 
+                               &sru_pdu_res->u.scan_response->diagnostics,
+                               &sru_pdu_res->u.scan_response->num_diagnostics,
                                YAZ_SRW_UNSUPP_OPERATION, "scan");
     }
     else
     {
-        sru_pdu_res = yaz_srw_get(odr_en, Z_SRW_explain_response);
-
-        yaz_add_srw_diagnostic(odr_en,
-                               &(sru_pdu_res->u.explain_response->diagnostics),
-                               &(sru_pdu_res->u.explain_response->num_diagnostics),
+        sru_pdu_res =
+            yaz_srw_get_pdu_e(odr_en, Z_SRW_explain_response, sru_pdu_req);
+        sru_pdu_res->u.explain_response->diagnostics = diagnostic;
+        sru_pdu_res->u.explain_response->num_diagnostics = num_diagnostic;
+        yaz_add_srw_diagnostic(odr_en, &diagnostic, &num_diagnostic,
                                YAZ_SRW_UNSUPP_OPERATION, "unknown");
     }
-
     if (enable_package_log)
     {
         std::string l;
@@ -593,6 +604,7 @@ bool yf::SRUtoZ3950::Impl::z3950_close_request(mp::Package &package) const
 }
 
 bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
+                                                mp::Package &z3950_package,
                                                 mp::odr &odr_en,
                                                 Z_SRW_PDU *sru_pdu_res,
                                                 Z_SRW_searchRetrieveRequest
@@ -603,9 +615,6 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
 
     assert(sru_pdu_res->u.response);
 
-    Package z3950_package(package.session(), package.origin());
-    z3950_package.copy_filter(package);
-
     Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_searchRequest);
     Z_SearchRequest *z_searchRequest = apdu->u.searchRequest;
 
@@ -638,7 +647,7 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
     // yaz_oi_set_facetlist not public in YAZ 4.2.66
     if (sr_req->facetList)
     {
-        Z_OtherInformation **oi = &z_searchRequest->otherInfo;
+        Z_OtherInformation **oi = &z_searchRequest->additionalSearchInfo;
         yaz_oi_set_facetlist(oi, odr_en, sr_req->facetList);
     }
 #endif