- int r = yaz_record_conv_record(rc, rr->record, rr->len, output_record);
- if (r)
- {
- const char *details = yaz_record_conv_get_error(rc);
- rr->errcode = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
- if (details)
- rr->errstring = odr_strdup(rr->stream, details);
+ int r = 1;
+ const char *details = 0;
+ if (rr->len > 0)
+ {
+ r = yaz_record_conv_record(rc, rr->record, rr->len, output_record);
+ if (r)
+ details = yaz_record_conv_get_error(rc);
+ }
+ else if (rr->len == -1 && rr->output_format &&
+ !oid_oidcmp(rr->output_format, yaz_oid_recsyn_opac))
+ {
+ r = yaz_record_conv_opac_record(
+ rc, (Z_OPACRecord *) rr->record, output_record);
+ if (r)
+ details = yaz_record_conv_get_error(rc);
+ }
+ if (r == 0 && match_syntax &&
+ !oid_oidcmp(match_syntax, yaz_oid_recsyn_opac))
+ {
+ yaz_marc_t mt = yaz_marc_create();
+ Z_OPACRecord *opac = 0;
+ if (yaz_xml_to_opac(mt, wrbuf_buf(output_record),
+ wrbuf_len(output_record),
+ &opac, 0 /* iconv */, rr->stream->mem, 0)
+ && opac)
+ {
+ rr->len = -1;
+ rr->record = (char *) opac;
+ }
+ else
+ {
+ details = "XML to OPAC conversion failed";
+ r = 1;
+ }
+ yaz_marc_destroy(mt);