X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-c.c;h=d0f504207daf031b5a8ee358d7e41d253c81b24c;hp=7e71b26b1171a44116a14505af7b5dd827375400;hb=dd6da3de6292dd8d087eac67c0c9a7eced8b88de;hpb=887e4b6664dee7210816744f92802b4d924d9a3a diff --git a/src/zoom-c.c b/src/zoom-c.c index 7e71b26..d0f5042 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-2008 Index Data + * Copyright (C) 1995-2009 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; } @@ -1362,7 +1364,6 @@ static zoom_ret ZOOM_connection_send_init(ZOOM_connection c) Z_InitRequest *ireq = apdu->u.initRequest; Z_IdAuthentication *auth = (Z_IdAuthentication *) odr_malloc(c->odr_out, sizeof(*auth)); - char *version; ODR_MASK_SET(ireq->options, Z_Options_search); ODR_MASK_SET(ireq->options, Z_Options_present); @@ -1375,11 +1376,10 @@ static zoom_ret ZOOM_connection_send_init(ZOOM_connection c) ODR_MASK_SET(ireq->protocolVersion, Z_ProtocolVersion_2); ODR_MASK_SET(ireq->protocolVersion, Z_ProtocolVersion_3); - /* Index Data's Z39.50 Implementor Id is 81 */ ireq->implementationId = odr_prepend(c->odr_out, ZOOM_options_get(c->options, "implementationId"), - odr_prepend(c->odr_out, "81", ireq->implementationId)); + ireq->implementationId); ireq->implementationName = odr_prepend(c->odr_out, @@ -1387,14 +1387,10 @@ static zoom_ret ZOOM_connection_send_init(ZOOM_connection c) odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName)); - version = odr_strdup(c->odr_out, "$Revision: 1.154 $"); - if (strlen(version) > 10) /* check for unexpanded CVS strings */ - version[strlen(version)-2] = '\0'; ireq->implementationVersion = odr_prepend(c->odr_out, ZOOM_options_get(c->options, "implementationVersion"), - odr_prepend(c->odr_out, &version[11], - ireq->implementationVersion)); + ireq->implementationVersion); *ireq->maximumRecordSize = c->maximum_record_size; *ireq->preferredMessageSize = c->preferred_message_size; @@ -1780,9 +1776,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); @@ -1832,25 +1826,18 @@ 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); } -static const char *marc_iconv_return(ZOOM_record rec, int marc_type, - int *len, - const char *buf, int sz, - const char *record_charset) + +static yaz_iconv_t iconv_create_charset(const char *record_charset) { char to[40]; char from[40]; yaz_iconv_t cd = 0; - yaz_marc_t mt = yaz_marc_create(); *from = '\0'; strcpy(to, "UTF-8"); @@ -1872,74 +1859,82 @@ static const char *marc_iconv_return(ZOOM_record rec, int marc_type, strncpy(from, record_charset, clen); from[clen] = '\0'; } - if (*from && *to) - { cd = yaz_iconv_open(to, from); - yaz_marc_iconv(mt, cd); - } + return cd; +} +static const char *return_marc_record(ZOOM_record rec, int marc_type, + int *len, + const char *buf, int sz, + const char *record_charset) +{ + yaz_iconv_t cd = iconv_create_charset(record_charset); + yaz_marc_t mt = yaz_marc_create(); + const char *ret_string = 0; + + 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) - { - yaz_marc_destroy(mt); - if (cd) - yaz_iconv_close(cd); + 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); - return wrbuf_cstr(rec->wrbuf_marc); + *len = wrbuf_len(rec->wrbuf); + ret_string = wrbuf_cstr(rec->wrbuf); } yaz_marc_destroy(mt); if (cd) yaz_iconv_close(cd); - return 0; + return ret_string; } -static const char *record_iconv_return(ZOOM_record rec, int *len, - const char *buf, int sz, - const char *record_charset) +static const char *return_opac_record(ZOOM_record rec, int marc_type, + int *len, + Z_OPACRecord *opac_rec, + const char *record_charset) { - char to[40]; - char from[40]; - yaz_iconv_t cd = 0; + yaz_iconv_t cd = iconv_create_charset(record_charset); + yaz_marc_t mt = yaz_marc_create(); - *from = '\0'; - strcpy(to, "UTF-8"); + if (cd) + yaz_marc_iconv(mt, cd); + yaz_marc_xml(mt, marc_type); - if (record_charset && *record_charset) - { - /* Use "from,to" or just "from" */ - const char *cp = strchr(record_charset, ','); - int clen = strlen(record_charset); - if (cp && cp[1]) - { - strncpy( to, cp+1, sizeof(to)-1); - to[sizeof(to)-1] = '\0'; - clen = cp - record_charset; - } - if (clen > sizeof(from)-1) - clen = sizeof(from)-1; - - if (clen) - strncpy(from, record_charset, clen); - from[clen] = '\0'; - } + if (!rec->wrbuf) + rec->wrbuf = wrbuf_alloc(); + wrbuf_rewind(rec->wrbuf); + + 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); + return wrbuf_cstr(rec->wrbuf); +} - if (*from && *to && (cd = yaz_iconv_open(to, from))) +static const char *return_string_record(ZOOM_record rec, int *len, + const char *buf, int sz, + const char *record_charset) +{ + yaz_iconv_t cd = iconv_create_charset(record_charset); + + 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) @@ -1947,6 +1942,55 @@ static const char *record_iconv_return(ZOOM_record rec, int *len, return buf; } +static const char *return_record(ZOOM_record rec, int *len, + Z_NamePlusRecord *npr, + int marctype, const char *charset) +{ + Z_External *r = (Z_External *) npr->u.databaseRecord; + const Odr_oid *oid = r->direct_reference; + + /* render bibliographic record .. */ + if (r->which == Z_External_OPAC) + { + return return_opac_record(rec, marctype, len, + r->u.opac, charset); + } + if (r->which == Z_External_sutrs) + return return_string_record(rec, len, + (char*) r->u.sutrs->buf, + r->u.sutrs->len, + charset); + else if (r->which == Z_External_octet) + { + if (yaz_oid_is_iso2709(oid)) + { + const char *ret_buf = return_marc_record( + rec, marctype, len, + (const char *) r->u.octet_aligned->buf, + r->u.octet_aligned->len, + charset); + if (ret_buf) + return ret_buf; + } + return return_string_record(rec, len, + (const char *) r->u.octet_aligned->buf, + r->u.octet_aligned->len, + charset); + } + else if (r->which == Z_External_grs1) + { + 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), + wrbuf_len(rec->wrbuf), + charset); + } + return 0; +} + ZOOM_API(int) ZOOM_record_error(ZOOM_record rec, const char **cp, @@ -2096,137 +2140,25 @@ ZOOM_API(const char *) /* from now on - we have a database record .. */ if (!strcmp(type, "render")) { - Z_External *r = (Z_External *) npr->u.databaseRecord; - const Odr_oid *oid = r->direct_reference; - - /* render bibliographic record .. */ - if (r->which == Z_External_OPAC) - { - r = r->u.opac->bibliographicRecord; - if (!r) - return 0; - oid = r->direct_reference; - } - if (r->which == Z_External_sutrs) - return record_iconv_return(rec, len, - (char*) r->u.sutrs->buf, - r->u.sutrs->len, - charset); - else if (r->which == Z_External_octet) - { - if (yaz_oid_is_iso2709(oid)) - { - const char *ret_buf = marc_iconv_return( - rec, YAZ_MARC_LINE, len, - (const char *) r->u.octet_aligned->buf, - r->u.octet_aligned->len, - charset); - if (ret_buf) - return ret_buf; - } - return record_iconv_return(rec, len, - (const char *) r->u.octet_aligned->buf, - r->u.octet_aligned->len, - charset); - } - 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); - return record_iconv_return(rec, len, - wrbuf_buf(rec->wrbuf_marc), - wrbuf_len(rec->wrbuf_marc), - charset); - } - return 0; + return return_record(rec, len, npr, YAZ_MARC_LINE, charset); } else if (!strcmp(type, "xml")) { - Z_External *r = (Z_External *) npr->u.databaseRecord; - const Odr_oid *oid = r->direct_reference; - - /* render bibliographic record .. */ - if (r->which == Z_External_OPAC) - { - r = r->u.opac->bibliographicRecord; - if (!r) - return 0; - oid = r->direct_reference; - } - - if (r->which == Z_External_sutrs) - return record_iconv_return(rec, len, - (const char *) r->u.sutrs->buf, - r->u.sutrs->len, - charset); - else if (r->which == Z_External_octet) - { - int marc_decode_type = YAZ_MARC_MARCXML; - if (yaz_oid_is_iso2709(oid)) - { - const char *ret_buf = marc_iconv_return( - rec, marc_decode_type, len, - (const char *) r->u.octet_aligned->buf, - r->u.octet_aligned->len, - charset); - if (ret_buf) - return ret_buf; - } - return record_iconv_return(rec, len, - (const char *) r->u.octet_aligned->buf, - r->u.octet_aligned->len, - charset); - } - else if (r->which == Z_External_grs1) - { - if (len) *len = 5; - return "GRS-1"; - } - return 0; + return return_record(rec, len, npr, YAZ_MARC_MARCXML, charset); } else if (!strcmp(type, "raw")) { - Z_External *r = (Z_External *) npr->u.databaseRecord; - - if (r->which == Z_External_sutrs) - { - if (len) *len = r->u.sutrs->len; - return (const char *) r->u.sutrs->buf; - } - else if (r->which == Z_External_octet) - { - if (len) *len = r->u.octet_aligned->len; - return (const char *) r->u.octet_aligned->buf; - } - else /* grs-1, explain, OPAC, ... */ - { - if (len) *len = -1; - return (const char *) npr->u.databaseRecord; - } - return 0; + 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")) { - Z_External *r = (Z_External *) npr->u.databaseRecord; - if (r->which == Z_External_OPAC) - { - if (!rec->wrbuf_opac) - rec->wrbuf_opac = wrbuf_alloc(); - wrbuf_rewind(rec->wrbuf_opac); - yaz_display_OPAC(rec->wrbuf_opac, r->u.opac, 0); - return record_iconv_return(rec, len, - wrbuf_buf(rec->wrbuf_opac), - wrbuf_len(rec->wrbuf_opac), - charset); - } + if (npr->u.databaseRecord->which == Z_External_OPAC) + return return_record(rec, len, npr, YAZ_MARC_MARCXML, charset); } return 0; } @@ -2270,9 +2202,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); @@ -3213,7 +3143,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 = @@ -4686,6 +4616,7 @@ ZOOM_API(int) ZOOM_connection_get_timeout(ZOOM_connection c) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab