X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-sru.c;h=bdfe1759ebfda6f724d5b3b3258777bb02247721;hp=836f69e87bb6e7a387b37514ae2fb844259dd5c3;hb=69b1d8e7b437179163fe97b7cbead51a56835f2a;hpb=79f02618682f616509d80665126918a07d1f9e80 diff --git a/src/zoom-sru.c b/src/zoom-sru.c index 836f69e..bdfe175 100644 --- a/src/zoom-sru.c +++ b/src/zoom-sru.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2012 Index Data + * Copyright (C) 1995-2013 Index Data * See the file LICENSE for details. */ /** @@ -18,8 +18,6 @@ #include #include -void handle_facet_list(ZOOM_resultset r, Z_FacetList *fl); - #if YAZ_HAVE_XML2 static void set_SRU_error(ZOOM_connection c, Z_SRW_diagnostic *d) { @@ -89,15 +87,15 @@ zoom_ret ZOOM_connection_srw_send_scan(ZOOM_connection c) /* SRU scan can only carry CQL and PQF */ if (z_query->which == Z_Query_type_104) { - sr->u.scan_request->query_type = Z_SRW_query_type_cql; - sr->u.scan_request->scanClause.cql = + sr->u.scan_request->queryType = "cql"; + sr->u.scan_request->scanClause = odr_strdup(c->odr_out, ZOOM_query_get_query_string(scan->query)); } else if (z_query->which == Z_Query_type_1 || z_query->which == Z_Query_type_101) { - sr->u.scan_request->query_type = Z_SRW_query_type_pqf; - sr->u.scan_request->scanClause.pqf = + sr->u.scan_request->queryType = "pqf"; + sr->u.scan_request->scanClause = odr_strdup(c->odr_out, ZOOM_query_get_query_string(scan->query)); } else @@ -132,6 +130,7 @@ zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) ZOOM_resultset resultset = 0; Z_SRW_PDU *sr = 0; const char *option_val = 0; + const char *schema = 0; Z_Query *z_query; Z_FacetList *facet_list = 0; if (c->error) /* don't continue on error */ @@ -149,9 +148,11 @@ zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) facets = ZOOM_options_get(resultset->options, "facets"); if (facets) facet_list = yaz_pqf_parse_facet_list(c->odr_out, facets); + schema = c->tasks->u.search.schema; break; case ZOOM_TASK_RETRIEVE: resultset = c->tasks->u.retrieve.resultset; + schema = c->tasks->u.retrieve.schema; start = &c->tasks->u.retrieve.start; count = &c->tasks->u.retrieve.count; @@ -166,7 +167,8 @@ zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) ZOOM_record rec = ZOOM_record_cache_lookup(resultset, i + *start, c->tasks->u.retrieve.syntax, - c->tasks->u.retrieve.elementSetName); + c->tasks->u.retrieve.elementSetName, + schema); if (!rec) break; else @@ -192,13 +194,13 @@ zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) if (z_query->which == Z_Query_type_104 && z_query->u.type_104->which == Z_External_CQL) { - sr->u.request->query_type = Z_SRW_query_type_cql; - sr->u.request->query.cql = z_query->u.type_104->u.cql; + sr->u.request->queryType = "cql"; + sr->u.request->query = z_query->u.type_104->u.cql; } else if (z_query->which == Z_Query_type_1 && z_query->u.type_1) { - sr->u.request->query_type = Z_SRW_query_type_pqf; - sr->u.request->query.pqf = + sr->u.request->queryType = "pqf"; + sr->u.request->query = odr_strdup(c->odr_out, ZOOM_query_get_query_string(resultset->query)); } @@ -218,7 +220,7 @@ zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) sr->u.request->maximumRecords = odr_intdup( c->odr_out, (resultset->step > 0 && resultset->step < *count) ? resultset->step : *count); - sr->u.request->recordSchema = resultset->schema; + sr->u.request->recordSchema = odr_strdup_null(c->odr_out, schema); sr->u.request->facetList = facet_list; option_val = ZOOM_resultset_option_get(resultset, "recordPacking"); @@ -245,7 +247,7 @@ static zoom_ret handle_srw_response(ZOOM_connection c, NMEM nmem; ZOOM_Event event; int *start, *count; - const char *syntax, *elementSetName; + const char *syntax, *elementSetName, *schema; if (!c->tasks) return zoom_complete; @@ -258,7 +260,7 @@ static zoom_ret handle_srw_response(ZOOM_connection c, count = &c->tasks->u.search.count; syntax = c->tasks->u.search.syntax; elementSetName = c->tasks->u.search.elementSetName; - + schema = c->tasks->u.search.schema; /* Required not for reporting client hit count multiple times into session */ if (!c->tasks->u.search.recv_search_fired) { yaz_log(YLOG_DEBUG, "posting ZOOM_EVENT_RECV_SEARCH"); @@ -267,7 +269,7 @@ static zoom_ret handle_srw_response(ZOOM_connection c, c->tasks->u.search.recv_search_fired = 1; } if (res->facetList) - handle_facet_list(resultset, res->facetList); + ZOOM_handle_facet_list(resultset, res->facetList); break; case ZOOM_TASK_RETRIEVE: resultset = c->tasks->u.retrieve.resultset; @@ -275,6 +277,7 @@ static zoom_ret handle_srw_response(ZOOM_connection c, count = &c->tasks->u.retrieve.count; syntax = c->tasks->u.retrieve.syntax; elementSetName = c->tasks->u.retrieve.elementSetName; + schema = c->tasks->u.retrieve.schema; break; default: return zoom_complete; @@ -328,12 +331,14 @@ static zoom_ret handle_srw_response(ZOOM_connection c, npr->u.databaseRecord->u.octet_aligned = (Odr_oct *) odr_malloc(c->odr_in, sizeof(Odr_oct)); - npr->u.databaseRecord->u.octet_aligned->buf = (unsigned char*) + npr->u.databaseRecord->u.octet_aligned->buf = sru_rec->recordData_buf; npr->u.databaseRecord->u.octet_aligned->len = - npr->u.databaseRecord->u.octet_aligned->size = sru_rec->recordData_len; - +#if OCT_SIZE + npr->u.databaseRecord->u.octet_aligned->size = + sru_rec->recordData_len; +#endif if (sru_rec->recordSchema && !strcmp(sru_rec->recordSchema, "info:srw/schema/1/diagnostics-v1.1")) @@ -344,7 +349,7 @@ static zoom_ret handle_srw_response(ZOOM_connection c, resultset->odr); } ZOOM_record_cache_add(resultset, npr, pos, syntax, elementSetName, - sru_rec->recordSchema, diag); + schema, diag); } *count -= i; *start += i; @@ -404,8 +409,12 @@ int ZOOM_handle_sru(ZOOM_connection c, Z_HTTP_Response *hres, Z_SRW_PDU *sr; ret = yaz_solr_decode_response(c->odr_in, hres, &sr); if (ret == 0) + { if (sr->which == Z_SRW_searchRetrieve_response) *cret = handle_srw_response(c, sr->u.response); + else if (sr->which == Z_SRW_scan_response) + handle_srw_scan_response(c, sr->u.scan_response); + } } else { @@ -413,7 +422,7 @@ int ZOOM_handle_sru(ZOOM_connection c, Z_HTTP_Response *hres, ODR o = c->odr_in; Z_SOAP_Handler soap_handlers[3] = { {YAZ_XMLNS_SRU_v1_response, 0, (Z_SOAP_fun) yaz_srw_codec}, - {YAZ_XMLNS_SRU_v2_response, 0, (Z_SOAP_fun) yaz_srw_codec}, + {YAZ_XMLNS_SRU_v2_mask, 0, (Z_SOAP_fun) yaz_srw_codec}, {0, 0, 0} }; ret = z_soap_codec(o, &soap_package,