X-Git-Url: http://git.indexdata.com/?p=yazproxy-moved-to-github.git;a=blobdiff_plain;f=src%2Fyaz-proxy.cpp;h=266af40870887d8bcaac6d247c1cd8a52d6c2a03;hp=c80c99a8020672940fcac0159eec1d53b0e1abfa;hb=998f61ee781572d924d22fa9669554dc2192be50;hpb=4f79f9b5b0095b2f81b1ce583f0f82462f9ee36a diff --git a/src/yaz-proxy.cpp b/src/yaz-proxy.cpp index c80c99a..266af40 100644 --- a/src/yaz-proxy.cpp +++ b/src/yaz-proxy.cpp @@ -293,6 +293,7 @@ Yaz_Proxy::Yaz_Proxy(IPDU_Observable *the_PDU_Observable, m_usemarcon = new Yaz_usemarcon(); if (!m_parent) low_socket_open(); + m_backend_elementset = 0; m_my_thread = 0; m_ref_count = 1; m_main_ptr_dec = false; @@ -333,11 +334,14 @@ Yaz_Proxy::~Yaz_Proxy() xfree(m_backend_charset); xfree(m_usemarcon_ini_stage1); xfree(m_usemarcon_ini_stage2); + xfree(m_backend_elementset); delete m_usemarcon; if (m_s2z_odr_init) odr_destroy(m_s2z_odr_init); if (m_s2z_odr_search) odr_destroy(m_s2z_odr_search); + if (m_s2z_odr_scan) + odr_destroy(m_s2z_odr_scan); if (!m_parent) low_socket_close(); if (!m_parent) @@ -529,10 +533,8 @@ const char *Yaz_Proxy::load_balance(const char **url) } } int min_use = 100000; - int spare_for_min = 0; int max_spare = 0; const char *ret_min = 0; - const char *ret_spare = 0; for (i = 0; url[i]; i++) { yaz_log(YLOG_DEBUG, "%szurl=%s use=%d spare=%d", @@ -541,11 +543,9 @@ const char *Yaz_Proxy::load_balance(const char **url) { ret_min = url[i]; min_use = zurl_in_use[i]; - spare_for_min = zurl_in_spare[i]; } if (max_spare < zurl_in_spare[i]) { - ret_spare = url[i]; max_spare = zurl_in_spare[i]; } } @@ -803,18 +803,14 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu, const char *cookie, return c; } } - else - { - - yaz_log(YLOG_LOG, "%sNEW %d %s", - m_session_str, parent->m_seqno, m_proxyTarget); - c = new Yaz_ProxyClient(m_PDU_Observable->clone(), parent); - c->m_next = parent->m_clientPool; - if (c->m_next) - c->m_next->m_prev = &c->m_next; - parent->m_clientPool = c; - c->m_prev = &parent->m_clientPool; - } + yaz_log(YLOG_LOG, "%sNEW %d %s", + m_session_str, parent->m_seqno, m_proxyTarget); + c = new Yaz_ProxyClient(m_PDU_Observable->clone(), parent); + c->m_next = parent->m_clientPool; + if (c->m_next) + c->m_next->m_prev = &c->m_next; + parent->m_clientPool = c; + c->m_prev = &parent->m_clientPool; xfree(c->m_cookie); c->m_cookie = 0; @@ -2589,13 +2585,13 @@ Z_APDU *Yaz_Proxy::handle_query_validation(Z_APDU *apdu) int err = 0; char *addinfo = 0; +#if 0 Yaz_ProxyConfig *cfg = check_reconfigure(); // Something like this needs to be implemented later: -/* if (cfg) err = cfg->check_type_1_attributes(odr_encode(), m_default_target, sr->termListAndStartPoint->attributes, &addinfo); -*/ +#endif if (err) { Z_APDU *new_apdu = create_Z_PDU(Z_APDU_scanResponse); @@ -2723,7 +2719,8 @@ Z_APDU *Yaz_Proxy::handle_syntax_validation(Z_APDU *apdu) &addinfo, &stylesheet_name, &m_schema, &m_backend_type, &m_backend_charset, &m_usemarcon_ini_stage1, - &m_usemarcon_ini_stage2); + &m_usemarcon_ini_stage2, + &m_backend_elementset); if (stylesheet_name) { m_parent->low_socket_close(); @@ -2769,6 +2766,15 @@ Z_APDU *Yaz_Proxy::handle_syntax_validation(Z_APDU *apdu) yaz_string_to_oid_odr(yaz_oid_std(), CLASS_RECSYN, m_backend_type, odr_encode()); } + if (m_backend_elementset) + { + Z_ElementSetNames *esn = + mk_esn_from_schema( + odr_encode(), + *m_backend_elementset ? m_backend_elementset : 0); + sr->smallSetElementSetNames = esn; + sr->mediumSetElementSetNames = esn; + } } else if (apdu->which == Z_APDU_presentRequest) { @@ -2790,8 +2796,8 @@ Z_APDU *Yaz_Proxy::handle_syntax_validation(Z_APDU *apdu) &addinfo, &stylesheet_name, &m_schema, &m_backend_type, &m_backend_charset, &m_usemarcon_ini_stage1, - &m_usemarcon_ini_stage2 - ); + &m_usemarcon_ini_stage2, + &m_backend_elementset); if (stylesheet_name) { m_parent->low_socket_close(); @@ -2839,6 +2845,18 @@ Z_APDU *Yaz_Proxy::handle_syntax_validation(Z_APDU *apdu) CLASS_RECSYN, m_backend_type, odr_encode()); } + if (m_backend_elementset) + { + Z_ElementSetNames *esn = + mk_esn_from_schema( + odr_encode(), + *m_backend_elementset ? m_backend_elementset : 0); + Z_RecordComposition *comp = (Z_RecordComposition *) + odr_malloc(odr_encode(), sizeof(Z_RecordComposition)); + comp->which = Z_RecordComp_simple; + comp->u.simple = esn; + pr->recordComposition = comp; + } } return apdu; } @@ -3125,7 +3143,13 @@ void Yaz_Proxy::handle_incoming_HTTP(Z_HTTP_Request *hreq) odr_malloc(m_s2z_odr_search, sizeof(Z_Query)); z_searchRequest->query = query; - if (srw_req->query_type == Z_SRW_query_type_cql) + if ( +#ifdef Z_SRW_query_type_cql + srw_req->query_type == Z_SRW_query_type_cql +#else + !srw_req->queryType || !strcmp(srw_req->queryType, "cql") +#endif + ) { Z_External *ext = (Z_External *) odr_malloc(m_s2z_odr_search, sizeof(*ext)); @@ -3134,12 +3158,22 @@ void Yaz_Proxy::handle_incoming_HTTP(Z_HTTP_Request *hreq) ext->indirect_reference = 0; ext->descriptor = 0; ext->which = Z_External_CQL; +#ifdef Z_SRW_query_type_cql ext->u.cql = srw_req->query.cql; +#else + ext->u.cql = srw_req->query; +#endif query->which = Z_Query_type_104; query->u.type_104 = ext; } - else if (srw_req->query_type == Z_SRW_query_type_pqf) + else if ( +#ifdef Z_SRW_query_type_pqf + srw_req->query_type == Z_SRW_query_type_pqf +#else + srw_req->queryType && !strcmp(srw_req->queryType, "pqf") +#endif + ) { Z_RPNQuery *RPNquery; YAZ_PQF_Parser pqf_parser; @@ -3147,7 +3181,12 @@ void Yaz_Proxy::handle_incoming_HTTP(Z_HTTP_Request *hreq) pqf_parser = yaz_pqf_create (); RPNquery = yaz_pqf_parse (pqf_parser, m_s2z_odr_search, - srw_req->query.pqf); +#ifdef Z_SRW_query_type_pqf + srw_req->query.pqf +#else + srw_req->query +#endif + ); if (!RPNquery) { const char *pqf_msg; @@ -3315,7 +3354,13 @@ void Yaz_Proxy::handle_incoming_HTTP(Z_HTTP_Request *hreq) backend_db); // query transformation - if (srw_req->query_type == Z_SRW_query_type_cql) + if ( +#ifdef Z_SRW_query_type_cql + srw_req->query_type == Z_SRW_query_type_cql +#else + !srw_req->queryType || !strcmp(srw_req->queryType, "cql") +#endif + ) { z_scanRequest->termListAndStartPoint = (Z_AttributesPlusTerm *)odr_malloc(m_s2z_odr_scan, sizeof(Z_AttributesPlusTerm)); @@ -3325,7 +3370,13 @@ void Yaz_Proxy::handle_incoming_HTTP(Z_HTTP_Request *hreq) z_scanRequest->termListAndStartPoint->term->which = Z_Term_characterString; z_scanRequest->termListAndStartPoint->term->u.characterString = - odr_strdup(m_s2z_odr_scan, srw_req->scanClause.cql); + odr_strdup(m_s2z_odr_scan, +#ifdef Z_SRW_query_type_cql + srw_req->scanClause.cql +#else + srw_req->scanClause +#endif + ); } if (srw_req->responsePosition) @@ -3511,10 +3562,16 @@ void Yaz_Proxy::handle_incoming_Z_PDU(Z_APDU *apdu) { m_referenceId = (Z_ReferenceId *) nmem_malloc(m_referenceId_mem, sizeof(*m_referenceId)); - m_referenceId->len = m_referenceId->size = (*refid)->len; + m_referenceId->len = (*refid)->len; +#if YAZ_VERSIONL < 0x50000 + m_referenceId->size = m_referenceId->len; m_referenceId->buf = (unsigned char *) - nmem_malloc(m_referenceId_mem, (*refid)->len); - memcpy(m_referenceId->buf, (*refid)->buf, (*refid)->len); + nmem_strdupn(m_referenceId_mem, (const char *) + (*refid)->buf, (*refid)->len); +#else + m_referenceId->buf = + nmem_strdupn(m_referenceId_mem, (*refid)->buf, (*refid)->len); +#endif } else m_referenceId = 0;