X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-proxy.cpp;h=893cc5d67201d000161b5a8fc006d4d758776625;hb=d3d51bee2100324025f7530d4e3ff3502397fd83;hp=d226e7b271bb21904e64e83297898e7a46e807fa;hpb=52c508231229ecb75e754b8eb51d5138661df6ff;p=yazpp-moved-to-github.git diff --git a/src/yaz-proxy.cpp b/src/yaz-proxy.cpp index d226e7b..893cc5d 100644 --- a/src/yaz-proxy.cpp +++ b/src/yaz-proxy.cpp @@ -2,11 +2,14 @@ * Copyright (c) 1998-2004, Index Data. * See the file LICENSE for details. * - * $Id: yaz-proxy.cpp,v 1.104 2004-02-26 23:43:07 adam Exp $ + * $Id: yaz-proxy.cpp,v 1.109 2004-03-15 22:49:13 adam Exp $ */ +#include #include #include +#include +#include #include #include @@ -128,6 +131,8 @@ Yaz_Proxy::Yaz_Proxy(IYaz_PDU_Observable *the_PDU_Observable, m_s2z_packing = Z_SRW_recordPacking_string; m_time_tv.tv_sec = 0; m_time_tv.tv_usec = 0; + if (!m_parent) + low_socket_open(); } Yaz_Proxy::~Yaz_Proxy() @@ -151,6 +156,8 @@ Yaz_Proxy::~Yaz_Proxy() odr_destroy(m_s2z_odr_init); if (m_s2z_odr_search) odr_destroy(m_s2z_odr_search); + if (!m_parent) + low_socket_close(); delete m_config; } @@ -632,13 +639,16 @@ void Yaz_Proxy::convert_xsl_delay() Z_External *r = npr->u.databaseRecord; if (r->which == Z_External_octet) { + fwrite((char*) r->u.octet_aligned->buf, 1, r->u.octet_aligned->len, stdout); xmlDocPtr res, doc = xmlParseMemory( (char*) r->u.octet_aligned->buf, r->u.octet_aligned->len); + yaz_log(LOG_LOG, "%sXSLT convert %d", m_session_str, m_stylesheet_offset); res = xsltApplyStylesheet(m_stylesheet_xsp, doc, 0); + if (res) { xmlChar *out_buf; @@ -652,6 +662,7 @@ void Yaz_Proxy::convert_xsl_delay() xmlFree(out_buf); xmlFreeDoc(res); } + xmlFreeDoc(doc); } } @@ -673,8 +684,10 @@ void Yaz_Proxy::convert_to_marcxml(Z_NamePlusRecordList *p) { int i; + yaz_iconv_t cd = yaz_iconv_open("UTF-8", "MARC-8"); yaz_marc_t mt = yaz_marc_create(); yaz_marc_xml(mt, YAZ_MARC_MARCXML); + yaz_marc_iconv(mt, cd); for (i = 0; i < p->num_records; i++) { Z_NamePlusRecord *npr = p->records[i]; @@ -689,44 +702,15 @@ void Yaz_Proxy::convert_to_marcxml(Z_NamePlusRecordList *p) r->u.octet_aligned->len, &result, &rlen)) { - yaz_iconv_t cd = yaz_iconv_open("UTF-8", "MARC-8"); - WRBUF wrbuf = wrbuf_alloc(); - - char outbuf[120]; - size_t inbytesleft = rlen; - const char *inp = result; - while (cd && inbytesleft) - { - size_t outbytesleft = sizeof(outbuf); - char *outp = outbuf; - size_t r; - - r = yaz_iconv (cd, (char**) &inp, - &inbytesleft, - &outp, &outbytesleft); - if (r == (size_t) (-1)) - { - int e = yaz_iconv_error(cd); - if (e != YAZ_ICONV_E2BIG) - { - yaz_log(LOG_WARN, "conversion failure"); - break; - } - } - wrbuf_write(wrbuf, outbuf, outp - outbuf); - } - if (cd) - yaz_iconv_close(cd); - npr->u.databaseRecord = z_ext_record(odr_encode(), VAL_TEXT_XML, - wrbuf_buf(wrbuf), - wrbuf_len(wrbuf)); - wrbuf_free(wrbuf, 1); + result, rlen); } } } } + if (cd) + yaz_iconv_close(cd); yaz_marc_destroy(mt); } @@ -1010,7 +994,7 @@ int Yaz_Proxy::send_to_client(Z_APDU *apdu) int kill_session = 0; Z_ReferenceId **new_id = get_referenceIdP(apdu); - if (new_id && m_referenceId) + if (new_id) *new_id = m_referenceId; if (apdu->which == Z_APDU_searchResponse) @@ -1567,12 +1551,17 @@ Z_APDU *Yaz_Proxy::handle_syntax_validation(Z_APDU *apdu) &addinfo, &stylesheet_name, &m_schema); if (stylesheet_name) { + m_parent->low_socket_close(); + if (m_stylesheet_xsp) xsltFreeStylesheet(m_stylesheet_xsp); + m_stylesheet_xsp = xsltParseStylesheetFile((const xmlChar*) stylesheet_name); m_stylesheet_offset = 0; xfree(stylesheet_name); + + m_parent->low_socket_open(); } if (err == -1) { @@ -1609,12 +1598,17 @@ Z_APDU *Yaz_Proxy::handle_syntax_validation(Z_APDU *apdu) &addinfo, &stylesheet_name, &m_schema); if (stylesheet_name) { + m_parent->low_socket_close(); + if (m_stylesheet_xsp) xsltFreeStylesheet(m_stylesheet_xsp); + m_stylesheet_xsp = xsltParseStylesheetFile((const xmlChar*) stylesheet_name); m_stylesheet_offset = 0; xfree(stylesheet_name); + + m_parent->low_socket_open(); } if (err == -1) { @@ -2292,7 +2286,7 @@ void Yaz_Proxy::pre_init() { if (c->m_server == 0) if (c->m_waiting) - spare_waiting; + spare_waiting++; else spare++; else @@ -2306,7 +2300,7 @@ void Yaz_Proxy::pre_init() "sparew=%d preinit=%d",m_session_str, name, zurl_in_use[j], in_use, other, spare, spare_waiting, pre_init); - if (spare < pre_init) + if (spare + spare_waiting < pre_init) { c = new Yaz_ProxyClient(m_PDU_Observable->clone(), this); c->m_next = m_clientPool; @@ -2558,6 +2552,21 @@ void Yaz_ProxyClient::recv_Z_PDU(Z_APDU *apdu, int len) } } +void Yaz_Proxy::low_socket_close() +{ + int i; + for (i = 0; i= 0) + ::close(m_lo_fd[i]); +} + +void Yaz_Proxy::low_socket_open() +{ + int i; + for (i = 0; i