X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-proxy.cpp;h=ab518e728cf2fb532b13336a8cfcf7f55beeaa8d;hb=3e85e9f144d417835d0a6d46bc1526ee3c655078;hp=401d1c7fb01216106666f7fc30c1af6c1a42acfa;hpb=be8de1a2cca3c7162563ddfe524ad4e389758150;p=yazpp-moved-to-github.git diff --git a/src/yaz-proxy.cpp b/src/yaz-proxy.cpp index 401d1c7..ab518e7 100644 --- a/src/yaz-proxy.cpp +++ b/src/yaz-proxy.cpp @@ -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 @@ -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) {