X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-c.c;h=6f6856e4527b9fc387c0d66fd13fbf8399e5425d;hp=3b68593555bc1058d6638bc7c23071852e018e1a;hb=88c261910ace93cd45d25bfbb21ad32f8225ece1;hpb=2788a4851b551e1a3efb320a2878b809f2d8a9d7 diff --git a/src/zoom-c.c b/src/zoom-c.c index 3b68593..6f6856e 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -1018,8 +1018,6 @@ ZOOM_API(void) 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); } r->record_hash[i] = 0; } @@ -1776,7 +1774,6 @@ ZOOM_API(ZOOM_record) nrec->odr = odr_createmem(ODR_DECODE); nrec->wrbuf_marc = 0; nrec->wrbuf_iconv = 0; - nrec->wrbuf_opac = 0; odr_setbuf(nrec->odr, buf, size, 0); z_NamePlusRecord(nrec->odr, &nrec->npr, 0, 0); @@ -1830,21 +1827,16 @@ ZOOM_API(void) wrbuf_destroy(rec->wrbuf_marc); if (rec->wrbuf_iconv) wrbuf_destroy(rec->wrbuf_iconv); - if (rec->wrbuf_opac) - wrbuf_destroy(rec->wrbuf_opac); 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"); @@ -1866,63 +1858,71 @@ 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 (len) *len = wrbuf_len(rec->wrbuf_marc); - return wrbuf_cstr(rec->wrbuf_marc); + ret_string = wrbuf_cstr(rec->wrbuf_marc); } 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_marc) + rec->wrbuf_marc = wrbuf_alloc(); + wrbuf_rewind(rec->wrbuf_marc); + + yaz_opac_decode_wrbuf(mt, opac_rec, rec->wrbuf_marc); + yaz_marc_destroy(mt); - if (*from && *to && (cd = yaz_iconv_open(to, from))) + if (cd) + yaz_iconv_close(cd); + if (len) + *len = wrbuf_len(rec->wrbuf_marc); + return wrbuf_cstr(rec->wrbuf_marc); +} + +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(); @@ -1941,6 +1941,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_marc) + rec->wrbuf_marc = wrbuf_alloc(); + wrbuf_rewind(rec->wrbuf_marc); + yaz_display_grs1(rec->wrbuf_marc, r->u.grs1, 0); + return return_string_record(rec, len, + wrbuf_buf(rec->wrbuf_marc), + wrbuf_len(rec->wrbuf_marc), + charset); + } + return 0; +} + ZOOM_API(int) ZOOM_record_error(ZOOM_record rec, const char **cp, @@ -2090,116 +2139,15 @@ 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")) { @@ -2207,20 +2155,8 @@ ZOOM_API(const char *) return (const char *) npr->u.databaseRecord; } 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); - } + return return_record(rec, len, npr, YAZ_MARC_MARCXML, charset); } return 0; } @@ -2266,7 +2202,6 @@ static void record_cache_add(ZOOM_resultset r, Z_NamePlusRecord *npr, rc->rec.odr = 0; rc->rec.wrbuf_marc = 0; rc->rec.wrbuf_iconv = 0; - rc->rec.wrbuf_opac = 0; rc->elementSetName = odr_strdup_null(r->odr, elementSetName); rc->syntax = odr_strdup_null(r->odr, syntax); @@ -4680,6 +4615,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