X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=f61eab8360065ab8ede7af765de3dd39a6d1b717;hb=6dff34312a0f7c3272f7b52c5e13af1e04f72228;hp=debe1211bc3c49666c2d8c7794d4d64cf2aae749;hpb=61c2f2afd4d873c2409ebce0bbafb616cb7393c6;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index debe121..f61eab8 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -41,6 +41,23 @@ static zoom_ret ZOOM_connection_send_init(ZOOM_connection c); static zoom_ret do_write_ex(ZOOM_connection c, char *buf_out, int len_out); static char *cql2pqf(ZOOM_connection c, const char *cql); +const char *ZOOM_get_event_str(int event) +{ + static const char *ar[] = { + "NONE", + "CONNECT", + "SEND_DATA", + "RECV_DATA", + "TIMEOUT", + "UNKNOWN", + "SEND_APDU", + "RECV_APDU", + "RECV_RECORD", + "RECV_SEARCH", + "END" + }; + return ar[event]; +} /* * This wrapper is just for logging failed lookups. It would be nicer @@ -596,7 +613,7 @@ ZOOM_API(void) ZOOM_options_get_int(c->options, "preferredMessageSize", 1024*1024); c->async = ZOOM_options_get_bool(c->options, "async", 0); - if (ZOOM_options_get_bool(c->options, "logapdu", 0)) + if (ZOOM_options_get_bool(c->options, "apdulog", 0)) { c->odr_print = odr_createmem(ODR_PRINT); odr_setprint(c->odr_print, yaz_log_file()); @@ -1454,13 +1471,15 @@ static zoom_ret send_srw(ZOOM_connection c, Z_SRW_PDU *sr) } #endif - -static Z_SRW_PDU *ZOOM_srw_get_pdu(ZOOM_connection c, int type) { +#if YAZ_HAVE_XML2 +static Z_SRW_PDU *ZOOM_srw_get_pdu(ZOOM_connection c, int type) +{ Z_SRW_PDU *sr = yaz_srw_get_pdu(c->odr_out, type, c->sru_version); sr->username = c->user; sr->password = c->password; return sr; } +#endif #if YAZ_HAVE_XML2 static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) @@ -1478,7 +1497,8 @@ static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) { case ZOOM_TASK_SEARCH: resultset = c->tasks->u.search.resultset; - resultset->setname = xstrdup("default"); + if (!resultset->setname) + resultset->setname = xstrdup("default"); ZOOM_options_set(resultset->options, "setname", resultset->setname); start = &c->tasks->u.search.start; count = &c->tasks->u.search.count; @@ -1488,7 +1508,7 @@ static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) start = &c->tasks->u.retrieve.start; count = &c->tasks->u.retrieve.count; - + if (*start >= resultset->size) return zoom_complete; if (*start + *count > resultset->size) @@ -1539,7 +1559,8 @@ static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) } sr->u.request->startRecord = odr_intdup(c->odr_out, *start + 1); sr->u.request->maximumRecords = odr_intdup( - c->odr_out, resultset->step>0 ? resultset->step : *count); + c->odr_out, (resultset->step > 0 && resultset->step < *count) ? + resultset->step : *count); sr->u.request->recordSchema = resultset->schema; option_val = ZOOM_resultset_option_get(resultset, "recordPacking"); @@ -3942,35 +3963,37 @@ static void recv_apdu(ZOOM_connection c, Z_APDU *apdu) } #if YAZ_HAVE_XML2 -static void handle_srw_response(ZOOM_connection c, - Z_SRW_searchRetrieveResponse *res) +static zoom_ret handle_srw_response(ZOOM_connection c, + Z_SRW_searchRetrieveResponse *res) { ZOOM_resultset resultset = 0; int i; NMEM nmem; ZOOM_Event event; - int *start; + int *start, *count; const char *syntax, *elementSetName; if (!c->tasks) - return; + return zoom_complete; switch(c->tasks->which) { case ZOOM_TASK_SEARCH: resultset = c->tasks->u.search.resultset; start = &c->tasks->u.search.start; + count = &c->tasks->u.search.count; syntax = c->tasks->u.search.syntax; elementSetName = c->tasks->u.search.elementSetName; break; case ZOOM_TASK_RETRIEVE: resultset = c->tasks->u.retrieve.resultset; start = &c->tasks->u.retrieve.start; + count = &c->tasks->u.retrieve.count; syntax = c->tasks->u.retrieve.syntax; elementSetName = c->tasks->u.retrieve.elementSetName; break; default: - return; + return zoom_complete; } event = ZOOM_Event_create(ZOOM_EVENT_RECV_SEARCH); ZOOM_connection_put_event(c, event); @@ -4032,11 +4055,22 @@ static void handle_srw_response(ZOOM_connection c, record_cache_add(resultset, npr, pos, syntax, elementSetName, sru_rec->recordSchema, diag); } - if (res->num_diagnostics > 0) - set_SRU_error(c, &res->diagnostics[0]); + *count -= i; + *start += i; + if (*count + *start > resultset->size) + *count = resultset->size - *start; + if (*count < 0) + *count = 0; + nmem = odr_extract_mem(c->odr_in); nmem_transfer(odr_getmem(resultset->odr), nmem); nmem_destroy(nmem); + + if (res->num_diagnostics > 0) + set_SRU_error(c, &res->diagnostics[0]); + else if (*count > 0) + return ZOOM_connection_srw_send_search(c); + return zoom_complete; } #endif @@ -4066,6 +4100,7 @@ static void handle_srw_scan_response(ZOOM_connection c, #if YAZ_HAVE_XML2 static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres) { + zoom_ret cret = zoom_complete; int ret = -1; const char *addinfo = 0; const char *connection_head = z_HTTP_header_lookup(hres->headers, @@ -4093,7 +4128,7 @@ static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres) ZOOM_options_set(c->options, "sru_version", sr->srw_version); if (sr->which == Z_SRW_searchRetrieve_response) - handle_srw_response(c, sr->u.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 @@ -4117,7 +4152,8 @@ static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres) set_ZOOM_error(c, ZOOM_ERROR_DECODE, addinfo); do_close(c); } - ZOOM_connection_remove_task(c); + if (cret == zoom_complete) + ZOOM_connection_remove_task(c); if (!strcmp(hres->version, "1.0")) { /* HTTP 1.0: only if Keep-Alive we stay alive.. */