Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/metaproxy
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 1 May 2012 10:22:06 +0000 (12:22 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 1 May 2012 10:22:06 +0000 (12:22 +0200)
etc/config3.xml
src/filter_multi.cpp
src/filter_virt_db.cpp
src/filter_z3950_client.cpp

index 3ae07fd..1f73053 100644 (file)
           <target>bagel.indexdata.dk:80</target>
         </virtual>
         <virtual>
+          <database>cf</database>
+          <target>connect.indexdata.com</target>
+        </virtual>
+        <virtual>
           <database>gils</database>
-          <target>indexdata.dk/gils</target>
+          <target>z3950.indexdata.dk/gils</target>
         </virtual>
         <virtual>
           <database>marc</database>
-          <target>indexdata.dk/marc</target>
+          <target>z3950.indexdata.dk/marc1</target>
         </virtual>
         <virtual>
           <database>loc</database>
index e4bea12..ccdcc4a 100644 (file)
@@ -514,7 +514,12 @@ void yf::Multi::Frontend::init(mp::Package &package, Z_GDU *gdu)
                     maximumRecordSize = *b_resp->maximumRecordSize;
             }
             else
+            {
+                if (!f_resp->userInformationField 
+                    && b_resp->userInformationField)
+                    f_resp->userInformationField = b_resp->userInformationField;
                 no_failed++;
+            }
         }
         else
             no_failed++;
index b583757..f2420bf 100644 (file)
@@ -233,7 +233,7 @@ yf::VirtualDB::BackendPtr yf::VirtualDB::Frontend::init_backend(
 
     Z_GDU *gdu = init_package.response().get();
     // we hope to get an init response
-    error_code = YAZ_BIB1_DATABASE_UNAVAILABLE;
+    error_code = 0;
     if (gdu && gdu->which == Z_GDU_Z3950
         && gdu->u.z3950->which == Z_APDU_initResponse)
     {
@@ -249,6 +249,13 @@ yf::VirtualDB::BackendPtr yf::VirtualDB::Frontend::init_backend(
         }
         mp::util::get_init_diagnostics(res, error_code, addinfo);
     }
+    if (error_code == 0)
+    {
+        std::list<std::string>::const_iterator db_it = databases.begin();
+        error_code = YAZ_BIB1_ACCESS_TO_SPECIFIED_DATABASE_DENIED;
+        if (db_it != databases.end())
+            addinfo = *db_it;
+    }
     if (!init_package.session().is_closed())
     {
         Package close_package(b->m_backend_session, package.origin());
index fe3049e..60b9390 100644 (file)
@@ -56,6 +56,7 @@ namespace metaproxy_1 {
             void timeoutNotify();
             void recv_GDU(Z_GDU *gdu, int len);
             void fixup_nsd(ODR odr, Z_Records *records);
+            void fixup_init(ODR odr, Z_InitResponse *initrs);
             yazpp_1::IPDU_Observer* sessionNotify(
                 yazpp_1::IPDU_Observable *the_PDU_Observable,
                 int fd);
@@ -178,10 +179,10 @@ void yf::Z3950Client::Assoc::fixup_nsd(ODR odr, Z_Records *records)
         
         // should really check for nsd->which.. But union has two members
         // containing almost same data
-        //  char *v2Addinfo;
+        const char *v2Addinfo = nsd->u.v2Addinfo;
        //  Z_InternationalString *v3Addinfo;
 
-        if (nsd->u.v2Addinfo)
+        if (v2Addinfo && *v2Addinfo)
         {
             addinfo.assign(nsd->u.v2Addinfo);
             addinfo += " ";
@@ -191,6 +192,53 @@ void yf::Z3950Client::Assoc::fixup_nsd(ODR odr, Z_Records *records)
     }
 }
 
+void yf::Z3950Client::Assoc::fixup_init(ODR odr, Z_InitResponse *initrs)
+{
+    Z_External *uif = initrs->userInformationField;
+
+    if (uif && uif->which == Z_External_userInfo1)
+    {
+        Z_OtherInformation *ui = uif->u.userInfo1;
+        int i;
+        for (i = 0; i < ui->num_elements; i++)
+        {
+            Z_OtherInformationUnit *unit = ui->list[i];
+            if (unit->which == Z_OtherInfo_externallyDefinedInfo &&
+                unit->information.externallyDefinedInfo &&
+                unit->information.externallyDefinedInfo->which ==
+                Z_External_diag1) 
+            {
+                Z_DiagnosticFormat *diag =
+                    unit->information.externallyDefinedInfo->u.diag1;
+                int j;
+                for (j = 0; j < diag->num; j++)
+                {
+                    Z_DiagnosticFormat_s *ds = diag->elements[j];
+                    if (ds->which == Z_DiagnosticFormat_s_defaultDiagRec)
+                    {
+                        Z_DefaultDiagFormat *r = ds->u.defaultDiagRec;
+                        char *oaddinfo = r->u.v2Addinfo;
+                        char *naddinfo = (char *) odr_malloc(
+                            odr,
+                            (oaddinfo ? strlen(oaddinfo) : 0) + 20 +
+                            m_host.length());
+                        if (oaddinfo && *oaddinfo)
+                        {
+                            strcpy(naddinfo, oaddinfo);
+                            strcat(naddinfo, " ");
+                        }
+                        strcat(naddinfo, "(backend=");
+                        strcat(naddinfo, m_host.c_str());
+                        strcat(naddinfo, ")");
+
+                        r->u.v2Addinfo = naddinfo;
+                    }
+                }
+            } 
+        }
+    }
+}
+
 void yf::Z3950Client::Assoc::recv_GDU(Z_GDU *gdu, int len)
 {
     m_waiting = false;
@@ -209,6 +257,9 @@ void yf::Z3950Client::Assoc::recv_GDU(Z_GDU *gdu, int len)
             case Z_APDU_presentResponse:
                 fixup_nsd(odr, apdu->u.presentResponse->records);
                 break;
+            case Z_APDU_initResponse:
+                fixup_init(odr, apdu->u.initResponse);
+                break;
             }
         }
         m_package->response() = gdu;