Output connections set to 150
[yazpp-moved-to-github.git] / src / yaz-proxy.cpp
index 401d1c7..ab518e7 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1998-2003, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-proxy.cpp,v 1.44 2003-07-18 13:27:20 adam Exp $
+ * $Id: yaz-proxy.cpp,v 1.47 2003-09-03 11:30:26 adam Exp $
  */
 
 #include <assert.h>
@@ -22,7 +22,7 @@ Yaz_Proxy::Yaz_Proxy(IYaz_PDU_Observable *the_PDU_Observable) :
     m_keepalive = 1;
     m_proxyTarget = 0;
     m_proxy_authentication = 0;
-    m_max_clients = 50;
+    m_max_clients = 150;
     m_seed = time(0);
     m_idletime = 600;
     m_optimize = xstrdup ("1");
@@ -124,7 +124,7 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
        {
            assert (c->m_prev);
            assert (*c->m_prev == c);
-           if (!strcmp(cookie,c->m_cookie) &&
+           if (c->m_cookie && !strcmp(cookie,c->m_cookie) &&
                !strcmp(m_proxyTarget, c->get_hostname()))
            {
                cc = c;
@@ -169,7 +169,7 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
        {
            assert (c->m_prev);
            assert (*c->m_prev == c);
-           if (c->m_server == 0 && c->m_cookie[0] == 0 && 
+           if (c->m_server == 0 && c->m_cookie == 0 && 
                !strcmp(m_proxyTarget, c->get_hostname()))
            {
                cc = c;
@@ -223,8 +223,9 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
            yaz_log (LOG_LOG, "Existing sessions");
        for (c = parent->m_clientPool; c; c = c->m_next)
        {
-           yaz_log (LOG_LOG, " Session %-3d wait=%d %s", c->m_seqno,
-                              c->m_waiting, c->get_hostname());
+           yaz_log (LOG_LOG, " Session %-3d wait=%d %s cookie=%s", c->m_seqno,
+                              c->m_waiting, c->get_hostname(),
+                              c->m_cookie ? c->m_cookie : "");
            no_of_clients++;
            if (min_seq < 0 || c->m_seqno < min_seq)
            {
@@ -247,10 +248,10 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
            {
                yaz_log (LOG_LOG, "Move session %d to %d %s",
                      c->m_seqno, parent->m_seqno, c->get_hostname());
+               xfree (c->m_cookie);
+               c->m_cookie = 0;
                if (cookie)
-                   strcpy (c->m_cookie, cookie);
-               else
-                   c->m_cookie[0] = '\0';
+                   c->m_cookie = xstrdup(cookie);
                c->m_seqno = parent->m_seqno;
                if (c->m_server && c->m_server != this)
                {
@@ -273,10 +274,12 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
            parent->m_clientPool = c;
            c->m_prev = &parent->m_clientPool;
        }
+
+       xfree (c->m_cookie);
+       c->m_cookie = 0;
        if (cookie)
-           strcpy (c->m_cookie, cookie);
-       else
-           c->m_cookie[0] = '\0';
+           c->m_cookie = xstrdup(cookie);
+
        yaz_log (LOG_LOG, "Connecting to %s", m_proxyTarget);
        c->m_seqno = parent->m_seqno;
        c->client(m_proxyTarget);
@@ -306,10 +309,12 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu)
        int toget = *pr->numberOfRecordsRequested;
        int start = *pr->resultSetStartPoint;
 
-       if (!strcmp(m_client->m_last_resultSetId, pr->resultSetId))
+       if (m_client->m_last_resultSetId &&
+           !strcmp(m_client->m_last_resultSetId, pr->resultSetId))
        {
            if (m_client->m_cache.lookup (odr_encode(), &npr, start, toget,
-                                         pr->preferredRecordSyntax))
+                                         pr->preferredRecordSyntax,
+                                         pr->recordComposition))
            {
                yaz_log (LOG_LOG, "Returned cache records for present request");
                Z_APDU *new_apdu = create_Z_PDU(Z_APDU_presentResponse);
@@ -352,12 +357,21 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu)
        {
            Z_NamePlusRecordList *npr;
            int toget = *sr->mediumSetPresentNumber;
+           Z_RecordComposition *comp = 0;
 
            if (toget > m_client->m_last_resultCount)
                toget = m_client->m_last_resultCount;
+           
+           if (sr->mediumSetElementSetNames)
+           {
+               comp = (Z_RecordComposition *)
+                   odr_malloc(odr_encode(), sizeof(Z_RecordComposition));
+               comp->which = Z_RecordComp_simple;
+               comp->u.simple = sr->mediumSetElementSetNames;
+           }
  
            if (m_client->m_cache.lookup (odr_encode(), &npr, 1, toget,
-                                         sr->preferredRecordSyntax))
+                                         sr->preferredRecordSyntax, comp))
            {
                yaz_log (LOG_LOG, "Returned cache records for medium set");
                Z_APDU *new_apdu = create_Z_PDU(Z_APDU_searchResponse);
@@ -367,7 +381,9 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu)
                
                new_apdu->u.searchResponse->numberOfRecordsReturned
                    = odr_intdup(odr_encode(), toget);
-                                                                
+                                                       
+               new_apdu->u.searchResponse->presentStatus =
+                   odr_intdup(odr_encode(), Z_PresentStatus_success);
                new_apdu->u.searchResponse->records = (Z_Records*)
                    odr_malloc(odr_encode(), sizeof(Z_Records));
                new_apdu->u.searchResponse->records->which = Z_Records_DBOSD;
@@ -389,14 +405,7 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu)
                pr->resultSetId = sr->resultSetName;
                pr->preferredRecordSyntax = sr->preferredRecordSyntax;
                *pr->numberOfRecordsRequested = toget;
-               if (sr->mediumSetElementSetNames)
-               {
-                   pr->recordComposition = (Z_RecordComposition *)
-                       odr_malloc(odr_encode(), sizeof(Z_RecordComposition));
-                   pr->recordComposition->which = Z_RecordComp_simple;
-                   pr->recordComposition->u.simple =
-                       sr->mediumSetElementSetNames;
-               }
+               pr->recordComposition = comp;
                m_client->m_sr_transform = 1;
                return new_apdu;
            }
@@ -417,11 +426,20 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu)
        {
            Z_NamePlusRecordList *npr;
            int toget = m_client->m_last_resultCount;
+           Z_RecordComposition *comp = 0;
            // small set
             // send a present request (small set)
+           
+           if (sr->smallSetElementSetNames)
+           {
+               comp = (Z_RecordComposition *)
+                   odr_malloc(odr_encode(), sizeof(Z_RecordComposition));
+               comp->which = Z_RecordComp_simple;
+               comp->u.simple = sr->smallSetElementSetNames;
+           }
 
            if (m_client->m_cache.lookup (odr_encode(), &npr, 1, toget,
-                                         sr->preferredRecordSyntax))
+                                         sr->preferredRecordSyntax, comp))
            {
                yaz_log (LOG_LOG, "Returned cache records for small set");
                Z_APDU *new_apdu = create_Z_PDU(Z_APDU_searchResponse);
@@ -432,6 +450,8 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu)
                new_apdu->u.searchResponse->numberOfRecordsReturned
                    = odr_intdup(odr_encode(), toget);
                                                                 
+               new_apdu->u.searchResponse->presentStatus =
+                   odr_intdup(odr_encode(), Z_PresentStatus_success);
                new_apdu->u.searchResponse->records = (Z_Records*)
                    odr_malloc(odr_encode(), sizeof(Z_Records));
                new_apdu->u.searchResponse->records->which = Z_Records_DBOSD;
@@ -450,13 +470,7 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu)
                pr->resultSetId = sr->resultSetName;
                pr->preferredRecordSyntax = sr->preferredRecordSyntax;
                *pr->numberOfRecordsRequested = toget;
-               if (sr->smallSetElementSetNames)
-               {
-                   pr->recordComposition = (Z_RecordComposition *)
-                       odr_malloc(odr_encode(), sizeof(Z_RecordComposition));
-                   pr->recordComposition->which = Z_RecordComp_simple;
-                   pr->recordComposition->u.simple = sr->smallSetElementSetNames;
-               }
+               pr->recordComposition = comp;
                m_client->m_sr_transform = 1;
                return new_apdu;
            }
@@ -561,6 +575,7 @@ void Yaz_Proxy::recv_Z_PDU(Z_APDU *apdu)
     {
        Z_PresentRequest *pr = apdu->u.presentRequest;
        m_client->m_resultSetStartPoint = *pr->resultSetStartPoint;
+       m_client->m_cache.copy_presentRequest(apdu->u.presentRequest);
     } else {
        m_client->m_resultSetStartPoint = 0;
     }
@@ -649,6 +664,7 @@ Yaz_ProxyClient::~Yaz_ProxyClient()
     odr_destroy(m_init_odr);
     delete m_last_query;
     xfree (m_last_resultSetId);
+    xfree (m_cookie);
 }
 
 void Yaz_Proxy::timeoutNotify()
@@ -666,7 +682,7 @@ void Yaz_ProxyClient::timeoutNotify()
 Yaz_ProxyClient::Yaz_ProxyClient(IYaz_PDU_Observable *the_PDU_Observable) :
     Yaz_Z_Assoc (the_PDU_Observable)
 {
-    m_cookie[0] = 0;
+    m_cookie = 0;
     m_next = 0;
     m_prev = 0;
     m_init_flag = 0;
@@ -718,7 +734,8 @@ void Yaz_ProxyClient::recv_Z_PDU(Z_APDU *apdu)
            if (sr->records && sr->records->which == Z_Records_DBOSD)
            {
                m_cache.add(odr_decode(),
-                           sr->records->u.databaseOrSurDiagnostics, 1);
+                           sr->records->u.databaseOrSurDiagnostics, 1,
+                           *sr->resultCount);
            }
        }
     }
@@ -741,11 +758,11 @@ void Yaz_ProxyClient::recv_Z_PDU(Z_APDU *apdu)
        {
            m_cache.add(odr_decode(),
                        pr->records->u.databaseOrSurDiagnostics,
-                       m_resultSetStartPoint);
+                       m_resultSetStartPoint, -1);
            m_resultSetStartPoint = 0;
        }
     }
-    if (m_cookie && *m_cookie)
+    if (m_cookie)
        set_otherInformationString (apdu, VAL_COOKIE, 1, m_cookie);
     if (m_server)
     {