X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Fyaz-proxy.cpp;h=49992a3a737623a98560f91b4cf8b89d137fecd3;hb=72422e361f3ffd16766ff80bef553de08ea2f741;hp=0f4678aec6e2c27d1b8d441e61295923084f283e;hpb=095a4b386f206f362c6cdc1fb0f05ab6442fa6ff;p=yazpp-moved-to-github.git diff --git a/src/yaz-proxy.cpp b/src/yaz-proxy.cpp index 0f4678a..49992a3 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.50 2003-10-04 06:44:16 adam Exp $ + * $Id: yaz-proxy.cpp,v 1.51 2003-10-08 08:15:01 adam Exp $ */ #include @@ -658,7 +658,7 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu) } } } - else + else // query doesn't match { delete m_client->m_last_query; m_client->m_last_query = this_query; @@ -769,13 +769,11 @@ Z_APDU *Yaz_Proxy::handle_query_validation(Z_APDU *apdu) if (err) { Z_APDU *new_apdu = create_Z_PDU(Z_APDU_searchResponse); - int *nulint = odr_intdup (odr_encode(), 0); new_apdu->u.searchResponse->referenceId = sr->referenceId; new_apdu->u.searchResponse->records = create_nonSurrogateDiagnostics(odr_encode(), err, addinfo); - new_apdu->u.searchResponse->searchStatus = nulint; - new_apdu->u.searchResponse->resultCount = nulint; + *new_apdu->u.searchResponse->searchStatus = 0; send_to_client(new_apdu); @@ -785,6 +783,59 @@ Z_APDU *Yaz_Proxy::handle_query_validation(Z_APDU *apdu) return apdu; } +Z_APDU *Yaz_Proxy::handle_syntax_validation(Z_APDU *apdu) +{ + if (apdu->which == Z_APDU_searchRequest) + { + Z_SearchRequest *sr = apdu->u.searchRequest; + if (*sr->smallSetUpperBound > 0 || *sr->largeSetLowerBound > 1) + { + int err; + char *addinfo = 0; + err = m_config.check_syntax(odr_encode(), m_default_target, + sr->preferredRecordSyntax, + &addinfo); + if (err) + { + Z_APDU *new_apdu = create_Z_PDU(Z_APDU_searchResponse); + + new_apdu->u.searchResponse->referenceId = sr->referenceId; + new_apdu->u.searchResponse->records = + create_nonSurrogateDiagnostics(odr_encode(), err, addinfo); + *new_apdu->u.searchResponse->searchStatus = 0; + + send_to_client(new_apdu); + + return 0; + } + } + } + else if (apdu->which == Z_APDU_presentRequest) + { + Z_PresentRequest *pr = apdu->u.presentRequest; + int err; + char *addinfo = 0; + err = m_config.check_syntax(odr_encode(), m_default_target, + pr->preferredRecordSyntax, + &addinfo); + if (err) + { + Z_APDU *new_apdu = create_Z_PDU(Z_APDU_presentResponse); + + new_apdu->u.presentResponse->referenceId = pr->referenceId; + new_apdu->u.presentResponse->records = + create_nonSurrogateDiagnostics(odr_encode(), err, addinfo); + *new_apdu->u.presentResponse->presentStatus = + Z_PresentStatus_failure; + + send_to_client(new_apdu); + + return 0; + } + } + return apdu; +} + void Yaz_Proxy::recv_Z_PDU_0(Z_APDU *apdu) { // Determine our client. @@ -798,6 +849,15 @@ void Yaz_Proxy::recv_Z_PDU_0(Z_APDU *apdu) if (apdu->which == Z_APDU_initRequest) { + if (apdu->u.initRequest->implementationId) + yaz_log(LOG_LOG, "%s implementationId: %s", + m_session_str, apdu->u.initRequest->implementationId); + if (apdu->u.initRequest->implementationName) + yaz_log(LOG_LOG, "%s implementationName: %s", + m_session_str, apdu->u.initRequest->implementationName); + if (apdu->u.initRequest->implementationVersion) + yaz_log(LOG_LOG, "%s implementationVersion: %s", + m_session_str, apdu->u.initRequest->implementationVersion); if (m_client->m_init_flag) { Z_APDU *apdu = m_client->m_initResponse; @@ -813,6 +873,9 @@ void Yaz_Proxy::recv_Z_PDU_0(Z_APDU *apdu) handle_max_record_retrieve(apdu); if (apdu) + apdu = handle_syntax_validation(apdu); + + if (apdu) apdu = handle_query_validation(apdu); if (apdu)