<xslt stylesheet="MARC21slim2DC.xsl"/>
</backend>
</retrieval>
+ <retrieval syntax="xml" name="OP1">
+ <backend syntax="opac" name="F">
+ <marc inputformat="marc" outputformat="marcxml"
+ inputcharset="marc-8" outputcharset="utf-8"/>
+ </backend>
+ </retrieval>
+ <retrieval syntax="opac" name="OP2">
+ <backend syntax="opac" name="F">
+ <marc inputformat="marc" outputformat="marcxml"
+ inputcharset="marc-8" outputcharset="utf-8"/>
+ </backend>
+ </retrieval>
</retrievalinfo>
<explain xmlns="http://explain.z3950.org/dtd/2.0/">
<serverInfo>
rr->request_format = backend_syntax;
}
(*assoc->init->bend_fetch)(assoc->backend, rr);
- if (rc && rr->record && rr->errcode == 0 && rr->len > 0)
+ if (rc && rr->record && rr->errcode == 0)
{ /* post conversion must take place .. */
WRBUF output_record = wrbuf_alloc();
- 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)
+ && opac)
+ {
+ rr->len = -1;
+ rr->record = (char *) opac;
+ }
+ else
+ {
+ details = "XML to OPAC conversion failed";
+ r = 1;
+ }
+ yaz_marc_destroy(mt);
}
- else
+ else if (r == 0)
{
rr->len = wrbuf_len(output_record);
rr->record = (char *) odr_malloc(rr->stream, rr->len);
memcpy(rr->record, wrbuf_buf(output_record), rr->len);
}
+ if (r)
+ {
+ rr->errcode = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
+ if (details)
+ rr->errstring = odr_strdup(rr->stream, details);
+ }
wrbuf_destroy(output_record);
}
if (match_syntax)