* 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>
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");
{
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;
{
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;
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)
{
{
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)
{
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);
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);
{
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);
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;
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;
}
{
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);
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;
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;
}
{
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;
}
odr_destroy(m_init_odr);
delete m_last_query;
xfree (m_last_resultSetId);
+ xfree (m_cookie);
}
void Yaz_Proxy::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;
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);
}
}
}
{
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)
{