X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fseshigh.c;h=92627c26a0e5c9fd716f5bc7748ef255446f4e7b;hp=4d5eb7e3965584c4524a955d8947c8a451c7c453;hb=2715f6522ca62ab5dbc886c21ed18945743216f0;hpb=6bf58f547a8c58ec4ce4fefda177aec9e92c197e diff --git a/src/seshigh.c b/src/seshigh.c index 4d5eb7e..92627c2 100644 --- a/src/seshigh.c +++ b/src/seshigh.c @@ -298,7 +298,9 @@ int ir_read(IOCHAN h, int event) else if (res <= 0) { yaz_log(log_session, "Connection closed by client"); - assoc->state = ASSOC_DEAD; + cs_close(conn); + destroy_association(assoc); + iochan_destroy(h); return 0; } else if (res == 1) /* incomplete read - wait for more */ @@ -755,7 +757,7 @@ static int srw_bend_fetch(association *assoc, int pos, } static int cql2pqf(ODR odr, const char *cql, cql_transform_t ct, - Z_Query *query_result) + Z_Query *query_result, char **sortkeys_p) { /* have a CQL query and CQL to PQF transform .. */ CQL_parser cp = cql_parser_create(); @@ -763,7 +765,8 @@ static int cql2pqf(ODR odr, const char *cql, cql_transform_t ct, int srw_errcode = 0; const char *add = 0; char rpn_buf[5120]; - + + *sortkeys_p = 0; r = cql_parser_string(cp, cql); if (r) { @@ -771,12 +774,29 @@ static int cql2pqf(ODR odr, const char *cql, cql_transform_t ct, } if (!r) { + struct cql_node *cn = cql_parser_result(cp); + /* Syntax OK */ - r = cql_transform_buf(ct, - cql_parser_result(cp), - rpn_buf, sizeof(rpn_buf)-1); + r = cql_transform_buf(ct, cn, rpn_buf, sizeof(rpn_buf)-1); if (r) srw_errcode = cql_transform_error(ct, &add); + else + { + char out[100]; + int r = cql_sortby_to_sortkeys_buf(cn, out, sizeof(out)-1); + + if (r == 0) + { + if (*out) + yaz_log(log_requestdetail, "srw_sortKeys '%s'", out); + *sortkeys_p = odr_strdup(odr, out); + } + else + { + yaz_log(log_requestdetail, "failed to create srw_sortKeys"); + srw_errcode = YAZ_SRW_UNSUPP_SORT_TYPE; + } + } } if (!r) { @@ -809,7 +829,8 @@ static int cql2pqf_scan(ODR odr, const char *cql, cql_transform_t ct, { Z_Query query; Z_RPNQuery *rpn; - int srw_error = cql2pqf(odr, cql, ct, &query); + char *sortkeys = 0; + int srw_error = cql2pqf(odr, cql, ct, &query, &sortkeys); if (srw_error) return srw_error; if (query.which != Z_Query_type_1 && query.which != Z_Query_type_101) @@ -883,7 +904,9 @@ static void srw_bend_search(association *assoc, { int srw_errcode = cql2pqf(assoc->encode, srw_req->query.cql, assoc->server->cql_transform, - rr.query); + rr.query, + &rr.srw_sortKeys); + if (srw_errcode) { yaz_add_srw_diagnostic(assoc->encode, @@ -942,9 +965,9 @@ static void srw_bend_search(association *assoc, rr.stream = assoc->encode; rr.decode = assoc->decode; rr.print = assoc->print; - if ( srw_req->sort.sortKeys ) + if (srw_req->sort.sortKeys) rr.srw_sortKeys = odr_strdup(assoc->encode, - srw_req->sort.sortKeys ); + srw_req->sort.sortKeys); rr.association = assoc; rr.hits = 0; rr.errcode = 0; @@ -1858,7 +1881,6 @@ static void process_http_request(association *assoc, request *req) {0, 0, 0} }; char ctype[80]; - int ret; p = z_get_HTTP_Response(o, 200); hres = p->u.HTTP_Response; @@ -1869,9 +1891,9 @@ static void process_http_request(association *assoc, request *req) if (stylesheet && *stylesheet == '\0') stylesheet = 0; - ret = z_soap_codec_enc_xsl(assoc->encode, &soap_package, - &hres->content_buf, &hres->content_len, - soap_handlers, charset, stylesheet); + z_soap_codec_enc_xsl(assoc->encode, &soap_package, + &hres->content_buf, &hres->content_len, + soap_handlers, charset, stylesheet); hres->code = http_code; strcpy(ctype, "text/xml"); @@ -2594,7 +2616,7 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb) bsrr->extra_args = 0; bsrr->extra_response_data = 0; - yaz_log (log_requestdetail, "ResultSet '%s'", req->resultSetName); + yaz_log(log_requestdetail, "ResultSet '%s'", req->resultSetName); if (req->databaseNames) { int i; @@ -2628,7 +2650,8 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb) /* have a CQL query and a CQL to PQF transform .. */ int srw_errcode = cql2pqf(bsrr->stream, req->query->u.type_104->u.cql, - assoc->server->cql_transform, bsrr->query); + assoc->server->cql_transform, bsrr->query, + &bsrr->srw_sortKeys); if (srw_errcode) bsrr->errcode = yaz_diag_srw_to_bib1(srw_errcode); } @@ -2838,7 +2861,6 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb) Odr_int *next; Odr_int *num; int errcode = 0; - const char *errstring = 0; yaz_log(log_requestdetail, "Got PresentRequest."); @@ -2867,7 +2889,6 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb) resp->records = diagrec(assoc, bprr->errcode, bprr->errstring); *resp->presentStatus = Z_PresentStatus_failure; errcode = bprr->errcode; - errstring = bprr->errstring; } } apdu = (Z_APDU *)odr_malloc(assoc->encode, sizeof(*apdu)); @@ -2946,6 +2967,7 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb) if (req->stepSize) step_size = odr_int_to_int(*req->stepSize); + res->stepSize = 0; res->scanStatus = scanStatus; res->numberOfEntriesReturned = numberOfEntriesReturned; res->positionOfTerm = 0;