+ // if anything but database or surrogate diagnostics, stop
+ if (!pr->records || pr->records->which != Z_Records_DBOSD)
+ break;
+ else
+ {
+ // inserting all records
+ int returned_recs =
+ pr->records->u.databaseOrSurDiagnostics->num_records;
+ for (int i = 0; i < returned_recs; i++)
+ {
+ int position = i + *apdu->u.presentRequest->resultSetStartPoint;
+ Z_NamePlusRecord *npr
+ = pr->records->u.databaseOrSurDiagnostics->records[i];
+
+ sru_res->records[i + num].recordPacking = record_packing;
+
+ if (npr->which == Z_NamePlusRecord_surrogateDiagnostic)
+ {
+ Z_DiagRec *p = npr->u.surrogateDiagnostic;
+ if (p->which == Z_DiagRec_defaultFormat)
+ {
+ Z_DefaultDiagFormat *df = p->u.defaultFormat;
+ int c = yaz_diag_bib1_to_srw(*df->condition);
+
+ yaz_mk_sru_surrogate(
+ odr_en, sru_res->records + i + num, position,
+ c, df->u.v2Addinfo);
+ }
+ else
+ {
+ yaz_mk_sru_surrogate(
+ odr_en, sru_res->records + i + num, position,
+ YAZ_SRW_RECORD_TEMPORARILY_UNAVAILABLE, 0);
+ }
+ }
+ else if (npr->which == Z_NamePlusRecord_databaseRecord &&
+ npr->u.databaseRecord->direct_reference
+ && !oid_oidcmp(npr->u.databaseRecord->direct_reference,
+ yaz_oid_recsyn_xml))
+ {
+ // got XML record back
+ Z_External *r = npr->u.databaseRecord;
+ sru_res->records[i + num].recordPosition =
+ odr_intdup(odr_en, position);
+ sru_res->records[i + num].recordSchema = sr_req->recordSchema;
+ sru_res->records[i + num].recordData_buf
+ = odr_strdupn(odr_en,
+ (const char *)r->u.octet_aligned->buf,
+ r->u.octet_aligned->len);
+ sru_res->records[i + num].recordData_len
+ = r->u.octet_aligned->len;
+ }
+ else
+ {
+ // not XML or no database record at all
+ yaz_mk_sru_surrogate(
+ odr_en, sru_res->records + i + num, position,
+ YAZ_SRW_RECORD_NOT_AVAILABLE_IN_THIS_SCHEMA, 0);
+ }
+ }
+ num += returned_recs;
+ }