disable-zoom configure option
[yazpp-moved-to-github.git] / src / yaz-proxy.cpp
index f61547a..03b8228 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * Copyright (c) 1998-2001, Index Data.
+ * Copyright (c) 1998-2003, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-proxy.cpp,v 1.37 2002-10-23 10:15:18 adam Exp $
+ * $Id: yaz-proxy.cpp,v 1.39 2003-06-09 22:20:39 adam Exp $
  */
 
 #include <assert.h>
@@ -160,6 +160,34 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
            return c;
        }
     }
+    else if (!c)
+    {
+       Yaz_ProxyClient *cc = 0;
+       
+       for (c = parent->m_clientPool; c; c = c->m_next)
+       {
+           assert (c->m_prev);
+           assert (*c->m_prev == c);
+           if (c->m_server == 0 && c->m_cookie[0] == 0 && 
+               !strcmp(m_proxyTarget, c->get_hostname()))
+           {
+               cc = c;
+           }
+       }
+       if (cc)
+       {
+           // found it in cache
+           c = cc;
+
+           c->m_seqno = parent->m_seqno;
+           assert(c->m_server == 0);
+           c->m_server = this;
+           c->m_seqno = parent->m_seqno;
+           (parent->m_seqno)++;
+           yaz_log (LOG_LOG, "get_client 10 %p %p", this, c);
+           return c;
+       }
+    }
     if (!m_client)
     {
        if (apdu->which != Z_APDU_initRequest)
@@ -265,8 +293,8 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu)
 {
     if (apdu->which != Z_APDU_searchRequest)
        return apdu;
-    if (*m_parent->m_optimize != '1')
-        return apdu;
+    if (*m_parent->m_optimize == '0')
+        return apdu;      // don't optimize result sets..
     Z_SearchRequest *sr = apdu->u.searchRequest;
     Yaz_Z_Query *this_query = new Yaz_Z_Query;
     Yaz_Z_Databases this_databases;
@@ -293,7 +321,10 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu)
            pr->referenceId = sr->referenceId;
            pr->resultSetId = sr->resultSetName;
            pr->preferredRecordSyntax = sr->preferredRecordSyntax;
-           *pr->numberOfRecordsRequested = *sr->mediumSetPresentNumber;
+            if (*sr->mediumSetPresentNumber < m_client->m_last_resultCount)
+                *pr->numberOfRecordsRequested = *sr->mediumSetPresentNumber;
+            else
+                *pr->numberOfRecordsRequested = m_client->m_last_resultCount;
            if (sr->mediumSetElementSetNames)
            {
                pr->recordComposition = (Z_RecordComposition *)
@@ -428,15 +459,14 @@ void Yaz_Proxy::connectNotify()
 
 void Yaz_Proxy::shutdown()
 {
-    // only keep if keep_alive flag and cookie is set...
-    if (m_keepalive && m_client && m_client->m_cookie[0])
+    // only keep if keep_alive flag is set...
+    if (m_keepalive && m_client)
     {
         yaz_log (LOG_LOG, "shutdown (client to proxy) keepalive %s",
                  m_client->get_hostname());
         assert (m_client->m_waiting != 2);
        // Tell client (if any) that no server connection is there..
        m_client->m_server = 0;
-
     }
     else if (m_client)
     {