* See the file LICENSE for details.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Id: yaz-proxy.h,v 1.5 1999-04-21 12:09:01 adam Exp $
+ * $Id: yaz-proxy.h,v 1.6 1999-04-27 07:52:13 adam Exp $
*/
#include <yaz-z-assoc.h>
+#include <yaz-z-query.h>
class Yaz_Proxy;
char m_cookie[32];
Yaz_ProxyClient *m_next;
Yaz_ProxyClient **m_prev;
+ int m_init_flag;
+ Yaz_Z_Query *m_last_query;
+ int m_last_resultCount;
};
/// Information Retrieval Proxy Server.
char *get_cookie(Z_OtherInformation **otherInfo);
char *get_proxy(Z_OtherInformation **otherInfo);
Yaz_ProxyClient *get_client(Z_APDU *apdu);
+ Z_APDU *result_set_optimize(Z_APDU *apdu);
Yaz_ProxyClient *m_client;
IYaz_PDU_Observable *m_PDU_Observable;
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: yaz-proxy.cpp,v $
- * Revision 1.5 1999-04-21 12:09:01 adam
+ * Revision 1.6 1999-04-27 07:52:13 adam
+ * Improved proxy; added query match for result set re-use.
+ *
+ * Revision 1.5 1999/04/21 12:09:01 adam
* Many improvements. Modified to proxy server to work with "sessions"
* based on cookies.
*
return c;
}
+Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu)
+{
+ if (apdu->which != Z_APDU_searchRequest)
+ return apdu;
+ Z_SearchRequest *sr = apdu->u.searchRequest;
+ Yaz_Z_Query *this_query = new Yaz_Z_Query;
+
+ this_query->set_Z_Query(sr->query);
+
+ if (m_client->m_last_query &&
+ m_client->m_last_query->match(this_query))
+ {
+ delete this_query;
+ if (*sr->smallSetUpperBound == 0)
+ {
+ Z_APDU *new_apdu;
+ logf (LOG_LOG, "query match");
+ new_apdu = create_Z_PDU(Z_APDU_searchResponse);
+ new_apdu->u.searchResponse->referenceId = sr->referenceId;
+ new_apdu->u.searchResponse->resultCount =
+ &m_client->m_last_resultCount;
+ send_Z_PDU(new_apdu);
+ return 0;
+ }
+ else
+ {
+ logf (LOG_LOG, "query match (piggy back)");
+ }
+ }
+ else
+ {
+ logf (LOG_LOG, "query doesn't match");
+ delete m_client->m_last_query;
+ m_client->m_last_query = this_query;
+ }
+ return apdu;
+}
+
void Yaz_Proxy::recv_Z_PDU(Z_APDU *apdu)
{
logf (LOG_LOG, "Yaz_Proxy::recv_Z_PDU");
Z_OtherInformation **oi;
get_otherInfoAPDU(apdu, &oi);
*oi = 0;
+ if (apdu->which == Z_APDU_initRequest)
+ {
+ if (m_client->m_init_flag)
+ {
+ Z_APDU *apdu = create_Z_PDU(Z_APDU_initResponse);
+ if (m_client->m_cookie)
+ set_otherInformationString(apdu, VAL_COOKIE, 1,
+ m_client->m_cookie);
+ send_Z_PDU(apdu);
+ return;
+ }
+ m_client->m_init_flag = 1;
+ }
+ apdu = result_set_optimize(apdu);
+ if (!apdu)
+ return;
+
logf (LOG_LOG, "Yaz_ProxyClient::send_Z_PDU");
if (m_client->send_Z_PDU(apdu) < 0)
{
logf (LOG_LOG, "failNotity server");
if (m_keepalive)
{
- // Tell client (if any) that not server connection is there..
+ // Tell client (if any) that no server connection is there..
if (m_client)
m_client->m_server = 0;
}
if (m_next)
m_next->m_prev = m_prev;
}
+ delete m_last_query;
}
void Yaz_Proxy::timeoutNotify()
m_cookie[0] = 0;
m_next = 0;
m_prev = 0;
+ m_init_flag = 0;
+ m_last_query = 0;
+ m_last_resultCount = 0;
}
void Yaz_ProxyClient::recv_Z_PDU(Z_APDU *apdu)
logf (LOG_LOG, "Yaz_ProxyClient::recv_Z_PDU");
if (m_cookie)
set_otherInformationString (apdu, VAL_COOKIE, 1, m_cookie);
+ if (apdu->which == Z_APDU_searchResponse)
+ m_last_resultCount = *apdu->u.searchResponse->resultCount;
if (m_server)
{
logf (LOG_LOG, "Yaz_Proxy::send_Z_PDU");
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: yaz-z-query.cpp,v $
- * Revision 1.4 1999-04-21 12:09:01 adam
+ * Revision 1.5 1999-04-27 07:52:13 adam
+ * Improved proxy; added query match for result set re-use.
+ *
+ * Revision 1.4 1999/04/21 12:09:01 adam
* Many improvements. Modified to proxy server to work with "sessions"
* based on cookies.
*
{
}
+
+int Yaz_Z_Query::match(Yaz_Z_Query *other)
+{
+ if (len != other->len)
+ return 0;
+ if (!buf || !other->buf)
+ return 0;
+ if (memcmp(buf, other->buf, len))
+ return 0;
+ return 1;
+}