X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-c.c;h=290fb2fc7fa24f7de420ba07e1768517d4add321;hp=6f6856e4527b9fc387c0d66fd13fbf8399e5425d;hb=5d493e5a4ce6300660debe3e2ad82c21592039ca;hpb=88c261910ace93cd45d25bfbb21ad32f8225ece1 diff --git a/src/zoom-c.c b/src/zoom-c.c index 6f6856e..290fb2f 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -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,10 +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) + wrbuf_destroy(rc->rec.wrbuf); } r->record_hash[i] = 0; } @@ -1631,12 +1635,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; + } } } } @@ -1772,8 +1783,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 = 0; odr_setbuf(nrec->odr, buf, size, 0); z_NamePlusRecord(nrec->odr, &nrec->npr, 0, 0); @@ -1823,10 +1833,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) + wrbuf_destroy(rec->wrbuf); odr_destroy(rec->odr); xfree(rec); } @@ -1875,14 +1883,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) @@ -1902,18 +1910,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, @@ -1924,16 +1932,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) @@ -1970,6 +1978,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, @@ -1978,13 +1989,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; @@ -2149,14 +2160,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; } @@ -2200,8 +2212,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 = 0; rc->elementSetName = odr_strdup_null(r->odr, elementSetName); rc->syntax = odr_strdup_null(r->odr, syntax); @@ -3142,7 +3153,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 =