X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=zutil%2Fzoom-c.c;h=b2bfeead25db6378203bc144bd2d8c1d522cdd57;hb=bc9920b48da91d87e1c0e033a9151663998d6b6b;hp=aa81c141f828122e374502daefb1770a79ce7514;hpb=1848aa2ce3860c97777343e0f0f509f6c831f016;p=yaz-moved-to-github.git diff --git a/zutil/zoom-c.c b/zutil/zoom-c.c index aa81c14..b2bfeea 100644 --- a/zutil/zoom-c.c +++ b/zutil/zoom-c.c @@ -2,7 +2,7 @@ * Copyright (c) 2000-2003, Index Data * See the file LICENSE for details. * - * $Id: zoom-c.c,v 1.30 2003-04-17 19:43:41 adam Exp $ + * $Id: zoom-c.c,v 1.33 2003-04-29 21:20:34 adam Exp $ * * ZOOM layer for C, connections, result sets, queries. */ @@ -106,11 +106,13 @@ static void set_dset_error (ZOOM_connection c, int error, addinfo2 ? addinfo2 : ""); } +#if HAVE_XML2 static void set_HTTP_error (ZOOM_connection c, int error, const char *addinfo, const char *addinfo2) { set_dset_error(c, error, "HTTP", addinfo, addinfo2); } +#endif static void set_ZOOM_error (ZOOM_connection c, int error, const char *addinfo) @@ -172,6 +174,7 @@ void ZOOM_connection_remove_task (ZOOM_connection c) switch (task->which) { case ZOOM_TASK_SEARCH: + ZOOM_resultset_destroy (task->u.search.resultset); break; case ZOOM_TASK_RETRIEVE: @@ -722,7 +725,9 @@ static zoom_ret do_connect (ZOOM_connection c) c->proto = PROTO_HTTP; cs_get_host_args(c->host_port, &path); xfree(c->path); - c->path = xstrdup(path); + c->path = xmalloc(strlen(path)+2); + c->path[0] = '/'; + strcpy (c->path+1, path); #else set_ZOOM_error(c, ZOOM_ERROR_UNSUPPORTED_PROTOCOL, "SRW"); do_close(c); @@ -989,6 +994,29 @@ static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr) gdu = z_get_HTTP_Request(c->odr_out); gdu->u.HTTP_Request->path = c->path; + if (c->host_port) + { + const char *cp0 = strstr(c->host_port, "://"); + const char *cp1 = 0; + if (cp0) + cp0 = cp0+3; + else + cp0 = c->host_port; + + cp1 = strchr(cp0, '/'); + if (!cp1) + cp1 = cp0+strlen(cp0); + + if (cp0 && cp1) + { + char *h = odr_malloc(c->odr_out, cp1 - cp0 + 1); + memcpy (h, cp0, cp1 - cp0); + h[cp1-cp0] = '\0'; + z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers, + "host", h); + } + } + strcpy(ctype, "text/xml"); if (c->charset && strlen(c->charset) < 20) { @@ -1282,8 +1310,14 @@ ZOOM_resultset_record_immediate (ZOOM_resultset s,size_t pos) ZOOM_API(ZOOM_record) ZOOM_resultset_record (ZOOM_resultset r, size_t pos) { - ZOOM_resultset_retrieve (r, 1, pos, 1); - return ZOOM_resultset_record_immediate (r, pos); + ZOOM_record rec = ZOOM_resultset_record_immediate(r, pos); + + if (!rec) + { + ZOOM_resultset_retrieve (r, 1, pos, 1); + rec = ZOOM_resultset_record_immediate (r, pos); + } + return rec; } ZOOM_API(void) @@ -1501,6 +1535,9 @@ static void record_cache_add (ZOOM_resultset r, Z_NamePlusRecord *npr, const char *syntax = ZOOM_resultset_option_get (r, "preferredRecordSyntax"); + ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_RECV_RECORD); + ZOOM_connection_put_event(r->connection, event); + for (rc = r->record_cache; rc; rc = rc->next) { if (pos == rc->pos) @@ -1640,11 +1677,15 @@ static void handle_present_response (ZOOM_connection c, Z_PresentResponse *pr) static void handle_search_response (ZOOM_connection c, Z_SearchResponse *sr) { ZOOM_resultset resultset; - + ZOOM_Event event; + yaz_log (LOG_DEBUG, "got search response"); - + if (!c->tasks || c->tasks->which != ZOOM_TASK_SEARCH) return ; + + event = ZOOM_Event_create(ZOOM_EVENT_RECV_SEARCH); + ZOOM_connection_put_event(c, event); resultset = c->tasks->u.search.resultset; @@ -2091,21 +2132,26 @@ static Z_ItemOrder *encode_item_order(ZOOM_package p) req->u.esRequest->notToKeep = (Z_IOOriginPartNotToKeep *) odr_malloc(p->odr_out,sizeof(Z_IOOriginPartNotToKeep)); - req->u.esRequest->notToKeep->resultSetItem = (Z_IOResultSetItem *) - odr_malloc(p->odr_out, sizeof(Z_IOResultSetItem)); - str = ZOOM_options_get(p->options, "itemorder-setname"); if (!str) str = "default"; - req->u.esRequest->notToKeep->resultSetItem->resultSetId = - nmem_strdup (p->odr_out->mem, str); - req->u.esRequest->notToKeep->resultSetItem->item = - (int *) odr_malloc(p->odr_out, sizeof(int)); + + if (!*str) + req->u.esRequest->notToKeep->resultSetItem = 0; + else + { + req->u.esRequest->notToKeep->resultSetItem = (Z_IOResultSetItem *) + odr_malloc(p->odr_out, sizeof(Z_IOResultSetItem)); + + req->u.esRequest->notToKeep->resultSetItem->resultSetId = + nmem_strdup (p->odr_out->mem, str); + req->u.esRequest->notToKeep->resultSetItem->item = + (int *) odr_malloc(p->odr_out, sizeof(int)); - str = ZOOM_options_get(p->options, "itemorder-item"); - *req->u.esRequest->notToKeep->resultSetItem->item = - (str ? atoi(str) : 1); - + str = ZOOM_options_get(p->options, "itemorder-item"); + *req->u.esRequest->notToKeep->resultSetItem->item = + (str ? atoi(str) : 1); + } req->u.esRequest->notToKeep->itemRequest = encode_ill_request(p); return req; @@ -2419,6 +2465,7 @@ static void handle_srw_response(ZOOM_connection c, ZOOM_resultset resultset = 0; int i; NMEM nmem; + ZOOM_Event event; if (!c->tasks) return; @@ -2430,6 +2477,9 @@ static void handle_srw_response(ZOOM_connection c, else return ; + event = ZOOM_Event_create(ZOOM_EVENT_RECV_SEARCH); + ZOOM_connection_put_event(c, event); + resultset->size = 0; yaz_log(LOG_DEBUG, "got SRW response OK"); @@ -2578,6 +2628,7 @@ static int do_read (ZOOM_connection c) { Z_GDU *gdu; ZOOM_Event event; + odr_reset (c->odr_in); odr_setbuf (c->odr_in, c->buf_in, r, 0); event = ZOOM_Event_create (ZOOM_EVENT_RECV_APDU);