X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=0dd7110f762341c58d3dc386a542189d3a23f60c;hb=80fee38926477efd73c739731c5670d59c5d1bf7;hp=0864f3155e6653abda464849c542f3564a580345;hpb=486ea665463289f7ffb5eeabdf9c80dab3e07ee8;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index 0864f31..0dd7110 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2009 Index Data + * Copyright (C) 1995-2010 Index Data * See the file LICENSE for details. */ /** @@ -406,6 +406,7 @@ ZOOM_API(ZOOM_connection) c->odr_in = odr_createmem(ODR_DECODE); c->odr_out = odr_createmem(ODR_ENCODE); + c->odr_print = 0; c->async = 0; c->support_named_resultsets = 0; @@ -479,6 +480,11 @@ ZOOM_API(void) set_ZOOM_error(c, ZOOM_ERROR_NONE, 0); ZOOM_connection_remove_tasks(c); + if (c->odr_print) + { + odr_setprint(c->odr_print, 0); /* prevent destroy from fclose'ing */ + odr_destroy(c->odr_print); + } if (ZOOM_options_get_bool(c->options, "apdulog", 0)) { c->odr_print = odr_createmem(ODR_PRINT); @@ -1014,12 +1020,8 @@ ZOOM_API(void) ZOOM_record_cache rc; for (rc = r->record_hash[i]; rc; rc = rc->next) { - if (rc->rec.wrbuf_marc) - wrbuf_destroy(rc->rec.wrbuf_marc); - if (rc->rec.wrbuf_iconv) - wrbuf_destroy(rc->rec.wrbuf_iconv); - if (rc->rec.wrbuf_opac) - wrbuf_destroy(rc->rec.wrbuf_opac); + if (rc->rec.wrbuf) + wrbuf_destroy(rc->rec.wrbuf); } r->record_hash[i] = 0; } @@ -1069,7 +1071,7 @@ static void resultset_destroy(ZOOM_resultset r) ZOOM_API(size_t) ZOOM_resultset_size(ZOOM_resultset r) { - yaz_log(log_details, "ZOOM_resultset_size r=%p count=%d", + yaz_log(log_details, "ZOOM_resultset_size r=%p count=" ODR_INT_PRINTF, r, r->size); return r->size; } @@ -1211,14 +1213,14 @@ static zoom_ret do_connect(ZOOM_connection c) if (c->cs && c->cs->protocol == PROTO_HTTP) { #if YAZ_HAVE_XML2 - const char *path = 0; + const char *db = 0; c->proto = PROTO_HTTP; - cs_get_host_args(c->host_port, &path); + cs_get_host_args(c->host_port, &db); xfree(c->path); - c->path = (char*) xmalloc(strlen(path)+2); - c->path[0] = '/'; - strcpy(c->path+1, path); + + c->path = xmalloc(strlen(db) * 3 + 2); + yaz_encode_sru_dbpath_buf(c->path, db); #else set_ZOOM_error(c, ZOOM_ERROR_UNSUPPORTED_PROTOCOL, "SRW"); do_close(c); @@ -1443,11 +1445,7 @@ static zoom_ret send_srw(ZOOM_connection c, Z_SRW_PDU *sr) char *fdatabase = 0; if (database) - { - fdatabase = (char *) odr_malloc(c->odr_out, strlen(database)+2); - strcpy(fdatabase, "/"); - strcat(fdatabase, database); - } + fdatabase = yaz_encode_sru_dbpath_odr(c->odr_out, database); gdu = z_get_HTTP_Request_host_path(c->odr_out, c->host_port, fdatabase ? fdatabase : c->path); @@ -1633,12 +1631,19 @@ static zoom_ret ZOOM_connection_send_search(ZOOM_connection c) yaz_iconv_t cd = yaz_iconv_open(cp, "UTF-8"); if (cd) { + int r; search_req->query = yaz_copy_Z_Query(search_req->query, c->odr_out); - yaz_query_charset_convert_rpnquery(search_req->query->u.type_1, - c->odr_out, cd); + r = yaz_query_charset_convert_rpnquery_check( + search_req->query->u.type_1, + c->odr_out, cd); yaz_iconv_close(cd); + if (r) + { /* query could not be char converted */ + set_ZOOM_error(c, ZOOM_ERROR_INVALID_QUERY, 0); + return zoom_complete; + } } } } @@ -1774,9 +1779,7 @@ ZOOM_API(ZOOM_record) nrec = (ZOOM_record) xmalloc(sizeof(*nrec)); nrec->odr = odr_createmem(ODR_DECODE); - nrec->wrbuf_marc = 0; - nrec->wrbuf_iconv = 0; - nrec->wrbuf_opac = 0; + nrec->wrbuf = 0; odr_setbuf(nrec->odr, buf, size, 0); z_NamePlusRecord(nrec->odr, &nrec->npr, 0, 0); @@ -1826,12 +1829,8 @@ ZOOM_API(void) { if (!rec) return; - if (rec->wrbuf_marc) - wrbuf_destroy(rec->wrbuf_marc); - if (rec->wrbuf_iconv) - wrbuf_destroy(rec->wrbuf_iconv); - if (rec->wrbuf_opac) - wrbuf_destroy(rec->wrbuf_opac); + if (rec->wrbuf) + wrbuf_destroy(rec->wrbuf); odr_destroy(rec->odr); xfree(rec); } @@ -1880,14 +1879,14 @@ static const char *return_marc_record(ZOOM_record rec, int marc_type, if (cd) yaz_marc_iconv(mt, cd); yaz_marc_xml(mt, marc_type); - if (!rec->wrbuf_marc) - rec->wrbuf_marc = wrbuf_alloc(); - wrbuf_rewind(rec->wrbuf_marc); - if (yaz_marc_decode_wrbuf(mt, buf, sz, rec->wrbuf_marc) > 0) + if (!rec->wrbuf) + rec->wrbuf = wrbuf_alloc(); + wrbuf_rewind(rec->wrbuf); + if (yaz_marc_decode_wrbuf(mt, buf, sz, rec->wrbuf) > 0) { if (len) - *len = wrbuf_len(rec->wrbuf_marc); - ret_string = wrbuf_cstr(rec->wrbuf_marc); + *len = wrbuf_len(rec->wrbuf); + ret_string = wrbuf_cstr(rec->wrbuf); } yaz_marc_destroy(mt); if (cd) @@ -1907,18 +1906,18 @@ static const char *return_opac_record(ZOOM_record rec, int marc_type, yaz_marc_iconv(mt, cd); yaz_marc_xml(mt, marc_type); - if (!rec->wrbuf_marc) - rec->wrbuf_marc = wrbuf_alloc(); - wrbuf_rewind(rec->wrbuf_marc); + if (!rec->wrbuf) + rec->wrbuf = wrbuf_alloc(); + wrbuf_rewind(rec->wrbuf); - yaz_opac_decode_wrbuf(mt, opac_rec, rec->wrbuf_marc); + yaz_opac_decode_wrbuf(mt, opac_rec, rec->wrbuf); yaz_marc_destroy(mt); if (cd) yaz_iconv_close(cd); if (len) - *len = wrbuf_len(rec->wrbuf_marc); - return wrbuf_cstr(rec->wrbuf_marc); + *len = wrbuf_len(rec->wrbuf); + return wrbuf_cstr(rec->wrbuf); } static const char *return_string_record(ZOOM_record rec, int *len, @@ -1929,16 +1928,16 @@ static const char *return_string_record(ZOOM_record rec, int *len, if (cd) { - if (!rec->wrbuf_iconv) - rec->wrbuf_iconv = wrbuf_alloc(); + if (!rec->wrbuf) + rec->wrbuf = wrbuf_alloc(); - wrbuf_rewind(rec->wrbuf_iconv); + wrbuf_rewind(rec->wrbuf); - wrbuf_iconv_write(rec->wrbuf_iconv, cd, buf, sz); - wrbuf_iconv_reset(rec->wrbuf_iconv, cd); + wrbuf_iconv_write(rec->wrbuf, cd, buf, sz); + wrbuf_iconv_reset(rec->wrbuf, cd); - buf = wrbuf_cstr(rec->wrbuf_iconv); - sz = wrbuf_len(rec->wrbuf_iconv); + buf = wrbuf_cstr(rec->wrbuf); + sz = wrbuf_len(rec->wrbuf); yaz_iconv_close(cd); } if (len) @@ -1975,6 +1974,9 @@ static const char *return_record(ZOOM_record rec, int *len, charset); if (ret_buf) return ret_buf; + /* bad ISO2709. Return fail unless raw (ISO2709) is wanted */ + if (marctype != YAZ_MARC_ISO2709) + return 0; } return return_string_record(rec, len, (const char *) r->u.octet_aligned->buf, @@ -1983,13 +1985,13 @@ static const char *return_record(ZOOM_record rec, int *len, } else if (r->which == Z_External_grs1) { - if (!rec->wrbuf_marc) - rec->wrbuf_marc = wrbuf_alloc(); - wrbuf_rewind(rec->wrbuf_marc); - yaz_display_grs1(rec->wrbuf_marc, r->u.grs1, 0); + if (!rec->wrbuf) + rec->wrbuf = wrbuf_alloc(); + wrbuf_rewind(rec->wrbuf); + yaz_display_grs1(rec->wrbuf, r->u.grs1, 0); return return_string_record(rec, len, - wrbuf_buf(rec->wrbuf_marc), - wrbuf_len(rec->wrbuf_marc), + wrbuf_buf(rec->wrbuf), + wrbuf_len(rec->wrbuf), charset); } return 0; @@ -2154,14 +2156,15 @@ ZOOM_API(const char *) { return return_record(rec, len, npr, YAZ_MARC_ISO2709, charset); } - else if (!strcmp (type, "ext")) + else if (!strcmp(type, "ext")) { if (len) *len = -1; return (const char *) npr->u.databaseRecord; } - else if (!strcmp (type, "opac")) + else if (!strcmp(type, "opac")) { - return return_record(rec, len, npr, YAZ_MARC_MARCXML, charset); + if (npr->u.databaseRecord->which == Z_External_OPAC) + return return_record(rec, len, npr, YAZ_MARC_MARCXML, charset); } return 0; } @@ -2205,9 +2208,7 @@ static void record_cache_add(ZOOM_resultset r, Z_NamePlusRecord *npr, { rc = (ZOOM_record_cache) odr_malloc(r->odr, sizeof(*rc)); rc->rec.odr = 0; - rc->rec.wrbuf_marc = 0; - rc->rec.wrbuf_iconv = 0; - rc->rec.wrbuf_opac = 0; + rc->rec.wrbuf = 0; rc->elementSetName = odr_strdup_null(r->odr, elementSetName); rc->syntax = odr_strdup_null(r->odr, syntax); @@ -2910,7 +2911,7 @@ ZOOM_API(size_t) } static void ZOOM_scanset_term_x(ZOOM_scanset scan, size_t pos, - int *occ, + size_t *occ, const char **value_term, size_t *value_len, const char **disp_term, size_t *disp_len) { @@ -2968,7 +2969,7 @@ static void ZOOM_scanset_term_x(ZOOM_scanset scan, size_t pos, ZOOM_API(const char *) ZOOM_scanset_term(ZOOM_scanset scan, size_t pos, - int *occ, int *len) + size_t *occ, size_t *len) { const char *value_term = 0; size_t value_len = 0; @@ -2984,7 +2985,7 @@ ZOOM_API(const char *) ZOOM_API(const char *) ZOOM_scanset_display_term(ZOOM_scanset scan, size_t pos, - int *occ, int *len) + size_t *occ, size_t *len) { const char *value_term = 0; size_t value_len = 0; @@ -3148,7 +3149,7 @@ static Z_ItemOrder *encode_item_order(ZOOM_package p) req->u.esRequest->notToKeep->resultSetItem->resultSetId = odr_strdup(p->odr_out, str); req->u.esRequest->notToKeep->resultSetItem->item = - (int *) odr_malloc(p->odr_out, sizeof(int)); + odr_intdup(p->odr_out, 0); str = ZOOM_options_get(p->options, "itemorder-item"); *req->u.esRequest->notToKeep->resultSetItem->item = @@ -4082,6 +4083,8 @@ static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres) Z_SRW_PDU *sr = (Z_SRW_PDU*) soap_package->u.generic->p; ZOOM_options_set(c->options, "sru_version", sr->srw_version); + ZOOM_options_setl(c->options, "sru_extra_response_data", + sr->extraResponseData_buf, sr->extraResponseData_len); if (sr->which == Z_SRW_searchRetrieve_response) cret = handle_srw_response(c, sr->u.response); else if (sr->which == Z_SRW_scan_response)