sru_z3950: reformat; remove useless comments
[metaproxy-moved-to-github.git] / src / filter_sru_to_z3950.cpp
index d57c34d..a4aab88 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Metaproxy.
-   Copyright (C) 2005-2010 Index Data
+   Copyright (C) 2005-2012 Index Data
 
 Metaproxy is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
@@ -116,7 +116,8 @@ yf::SRUtoZ3950::~SRUtoZ3950()
 {  // must have a destructor because of boost::scoped_ptr
 }
 
-void yf::SRUtoZ3950::configure(const xmlNode *xmlnode, bool test_only)
+void yf::SRUtoZ3950::configure(const xmlNode *xmlnode, bool test_only,
+                               const char *path)
 {
     m_p->configure(xmlnode);
 }
@@ -210,6 +211,7 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req)
         return;
     }
     
+    bool enable_package_log = false;
     std::string zurl;
     Z_SRW_extra_arg *arg;
 
@@ -222,15 +224,24 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req)
         {
             package.origin().set_max_sockets(atoi(arg->value));
         }
-
+        else if (!strcmp(arg->name, "x-session-id"))
+        {
+            package.origin().set_custom_session(arg->value);
+        }
+        else if (!strcmp(arg->name, "x-log-enable"))
+        {
+            if (*arg->value == '1')
+            {
+                enable_package_log = true;
+                package.log_enable();
+            }
+        }
     assert(sru_pdu_req);
 
     // filter acts as sink for SRU explain requests
     if (sru_pdu_req->which == Z_SRW_explain_request)
     {
         Z_SRW_explainRequest *er_req = sru_pdu_req->u.explain_request;
-        //mp_util::build_simple_explain(package, odr_en, sru_pdu_res, 
-        //                           sruinfo, er_req);
         mp_util::build_sru_explain(package, odr_en, sru_pdu_res, 
                                    sruinfo, explainnode, er_req);
     }
@@ -284,6 +295,24 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req)
                                YAZ_SRW_UNSUPP_OPERATION, "unknown");
     }
 
+    if (enable_package_log)
+    {
+        std::string l;
+        package.log_reset(l);
+        if (l.length())
+        {
+            mp::wrbuf w;
+            
+            wrbuf_puts(w, "<log>\n");
+            wrbuf_xmlputs(w, l.c_str());
+            wrbuf_puts(w, "</log>");
+            
+            sru_pdu_res->extraResponseData_len = w.len();
+            sru_pdu_res->extraResponseData_buf =
+                odr_strdup(odr_en, wrbuf_cstr(w));
+        }
+    }
+    
     // build and send SRU response
     mp_util::build_sru_response(package, odr_en, soap, 
                                 sru_pdu_res, charset, stylesheet);
@@ -368,6 +397,9 @@ yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package,
     }
 
     init_req->idAuthentication = auth;
+
+    *init_req->preferredMessageSize = 10*1024*1024;
+    *init_req->maximumRecordSize = 10*1024*1024;
     
     ODR_MASK_SET(init_req->options, Z_Options_search);
     ODR_MASK_SET(init_req->options, Z_Options_present);
@@ -416,27 +448,14 @@ yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package,
     return false;
 }
 
-bool 
-yf::SRUtoZ3950::Impl::z3950_close_request(mp::Package &package) const
+bool yf::SRUtoZ3950::Impl::z3950_close_request(mp::Package &package) const
 {
-    // prepare and close Z3950 package 
     Package z3950_package(package.session(), package.origin());
     z3950_package.copy_filter(package);
     z3950_package.session().close();
 
-    // set close APDU
-    //mp::odr odr_en(ODR_ENCODE);
-    //Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_close);
-    //z3950_package.request() = apdu;
-
     z3950_package.move();
 
-    // check successful close response
-    //Z_GDU *z3950_gdu = z3950_package.response().get();
-    //if (z3950_gdu && z3950_gdu->which == Z_GDU_Z3950 
-    //    && z3950_gdu->u.z3950->which == Z_APDU_close)
-    //    return true;
-
     if (z3950_package.session().is_closed())
     {
         return true;
@@ -457,10 +476,12 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
     Package z3950_package(package.session(), package.origin());
     z3950_package.copy_filter(package);
 
-    //add stuff in z3950 apdu
     Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_searchRequest);
     Z_SearchRequest *z_searchRequest = apdu->u.searchRequest;
 
+    // RecordSyntax will always be XML
+    z_searchRequest->preferredRecordSyntax
+        = odr_oiddup(odr_en, yaz_oid_recsyn_xml);
 
     if (!mp_util::set_databases_from_zurl(odr_en, zurl,
                                           &z_searchRequest->num_databaseNames,
@@ -478,7 +499,6 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
                 = odr_strdup(odr_en, "Default");
     }
 
-    // z3950'fy query
     Z_Query *z_query = (Z_Query *) odr_malloc(odr_en, sizeof(Z_Query));
     z_searchRequest->query = z_query;
  
@@ -495,17 +515,10 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
 
     z3950_package.request() = apdu;
         
-    // send Z39.50 package off to backend
     z3950_package.move();
 
-
     Z_GDU *z3950_gdu = z3950_package.response().get();
 
-    //TODO: check success condition
-    //int yaz_diag_bib1_to_srw (int bib1_code);
-    //int yaz_diag_srw_to_bib1(int srw_code);
-    //Se kode i src/seshigh.c (srw_bend_search, srw_bend_init).
-
     if (!z3950_gdu || z3950_gdu->which != Z_GDU_Z3950 
         || z3950_gdu->u.z3950->which != Z_APDU_searchResponse
         || !z3950_gdu->u.z3950->u.searchResponse
@@ -518,30 +531,20 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
         return false;
     }
     
-    // everything fine, continuing
     Z_SearchResponse *sr = z3950_gdu->u.z3950->u.searchResponse;
 
-    // checking non surrogate diagnostics in Z3950 search response package
     if (!z3950_to_srw_diagnostics_ok(odr_en, sru_pdu_res->u.response, 
                                      sr->records))
     {
         return false;
     }
 
-    // Finally, roll on and srw'fy number of records
-    sru_pdu_res->u.response->numberOfRecords 
+    sru_pdu_res->u.response->numberOfRecords
         = odr_intdup(odr_en, *sr->resultCount);
-    
-    // srw'fy nextRecordPosition
-    //sru_pdu_res->u.response->nextRecordPosition 
-    //    = (int *) odr_malloc(odr_en, sizeof(int *));
-    //*(sru_pdu_res->u.response->nextRecordPosition) = 1;
-
     return true;
 }
 
-bool 
-yf::SRUtoZ3950::Impl::z3950_present_request(
+bool yf::SRUtoZ3950::Impl::z3950_present_request(
     mp::Package &package, 
     mp::odr &odr_en,
     Z_SRW_PDU *sru_pdu_res,
@@ -743,8 +746,9 @@ yf::SRUtoZ3950::Impl::z3950_present_request(
     return true;
 }
 
-int yf::SRUtoZ3950::Impl::z3950_build_query(mp::odr &odr_en, Z_Query *z_query, 
-                                            const Z_SRW_searchRetrieveRequest *req
+int yf::SRUtoZ3950::Impl::z3950_build_query(
+    mp::odr &odr_en, Z_Query *z_query, 
+    const Z_SRW_searchRetrieveRequest *req
     ) const
 {        
     if (req->query_type == Z_SRW_query_type_cql)
@@ -785,12 +789,11 @@ int yf::SRUtoZ3950::Impl::z3950_build_query(mp::odr &odr_en, Z_Query *z_query,
     return YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED;
 }
 
-
-bool 
-yf::SRUtoZ3950::Impl::z3950_to_srw_diagnostics_ok(mp::odr &odr_en, 
-                                                  Z_SRW_searchRetrieveResponse 
-                                                  *sru_res,
-                                                  Z_Records *records) const
+bool yf::SRUtoZ3950::Impl::z3950_to_srw_diagnostics_ok(
+    mp::odr &odr_en, 
+    Z_SRW_searchRetrieveResponse 
+    *sru_res,
+    Z_Records *records) const
 {
     // checking non surrogate diagnostics in Z3950 present response package
     if (records 
@@ -804,11 +807,10 @@ yf::SRUtoZ3950::Impl::z3950_to_srw_diagnostics_ok(mp::odr &odr_en,
     return true;
 }
 
-
-int 
-yf::SRUtoZ3950::Impl::z3950_to_srw_diag(mp::odr &odr_en, 
-                                        Z_SRW_searchRetrieveResponse *sru_res,
-                                        Z_DefaultDiagFormat *ddf) const
+int yf::SRUtoZ3950::Impl::z3950_to_srw_diag(
+    mp::odr &odr_en, 
+    Z_SRW_searchRetrieveResponse *sru_res,
+    Z_DefaultDiagFormat *ddf) const
 {
     int bib1_code = *ddf->condition;
     sru_res->num_diagnostics = 1;
@@ -820,8 +822,6 @@ yf::SRUtoZ3950::Impl::z3950_to_srw_diag(mp::odr &odr_en,
     return 0;
 }
 
-
-
 static mp::filter::Base* filter_creator()
 {
     return new mp::filter::SRUtoZ3950;