690 assert(sru_pdu_res->u.response);
697 if (sr_req->maximumRecords)
698 max_recs = *sr_req->maximumRecords;
699 if (sr_req->startRecord)
700 start = *sr_req->startRecord;
706 bool send_z3950_present =
true;
709 if (sr_req->recordXPath)
711 send_z3950_present =
false;
712 yaz_add_srw_diagnostic(odr_en,
713 &(sru_pdu_res->u.response->diagnostics),
714 &(sru_pdu_res->u.response->num_diagnostics),
715 YAZ_SRW_XPATH_RETRIEVAL_UNSUPP, 0);
720 if (sr_req->resultSetTTL)
722 send_z3950_present =
false;
723 yaz_add_srw_diagnostic(odr_en,
724 &(sru_pdu_res->u.response->diagnostics),
725 &(sru_pdu_res->u.response->num_diagnostics),
726 YAZ_SRW_RESULT_SETS_UNSUPP, 0);
730 if (sr_req->sort_type != Z_SRW_sort_type_none)
732 send_z3950_present =
false;
733 yaz_add_srw_diagnostic(odr_en,
734 &(sru_pdu_res->u.response->diagnostics),
735 &(sru_pdu_res->u.response->num_diagnostics),
736 YAZ_SRW_SORT_UNSUPP, 0);
740 if (start < 0 || start > *sru_pdu_res->u.response->numberOfRecords)
742 send_z3950_present =
false;
743 yaz_add_srw_diagnostic(odr_en,
744 &(sru_pdu_res->u.response->diagnostics),
745 &(sru_pdu_res->u.response->num_diagnostics),
746 YAZ_SRW_FIRST_RECORD_POSITION_OUT_OF_RANGE, 0);
752 send_z3950_present =
false;
753 yaz_add_srw_diagnostic(odr_en,
754 &(sru_pdu_res->u.response->diagnostics),
755 &(sru_pdu_res->u.response->num_diagnostics),
756 YAZ_SRW_UNSUPP_PARAMETER_VALUE,
761 if (!send_z3950_present)
767 if (max_recs > *sru_pdu_res->u.response->numberOfRecords - start)
768 max_recs = *sru_pdu_res->u.response->numberOfRecords - start + 1;
770 Z_SRW_searchRetrieveResponse *sru_res = sru_pdu_res->u.response;
771 sru_res->records = (Z_SRW_record *)
772 odr_malloc(odr_en, max_recs *
sizeof(Z_SRW_record));
774 while (num < max_recs)
777 Package z3950_package(package.session(), package.origin());
778 z3950_package.copy_filter(package);
779 Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_presentRequest);
781 assert(apdu->u.presentRequest);
783 *apdu->u.presentRequest->resultSetStartPoint = start + num;
784 *apdu->u.presentRequest->numberOfRecordsRequested = max_recs - num;
787 int record_packing = Z_SRW_recordPacking_XML;
788 if (sr_req->recordPacking &&
's' == *(sr_req->recordPacking))
789 record_packing = Z_SRW_recordPacking_string;
792 apdu->u.presentRequest->preferredRecordSyntax
793 = odr_oiddup(odr_en, yaz_oid_recsyn_xml);
796 if (sr_req->recordSchema)
798 apdu->u.presentRequest->recordComposition
799 = (Z_RecordComposition *)
800 odr_malloc(odr_en,
sizeof(Z_RecordComposition));
801 apdu->u.presentRequest->recordComposition->which
802 = Z_RecordComp_simple;
803 apdu->u.presentRequest->recordComposition->u.simple
806 sr_req->recordSchema);
810 z3950_package.request() = apdu;
813 z3950_package.move();
816 Z_GDU *z3950_gdu = z3950_package.response().get();
817 if (!z3950_gdu || z3950_gdu->which != Z_GDU_Z3950
818 || z3950_gdu->u.z3950->which != Z_APDU_presentResponse
819 || !z3950_gdu->u.z3950->u.presentResponse)
822 yaz_add_srw_diagnostic(odr_en,
823 &(sru_pdu_res->u.response->diagnostics),
824 &(sru_pdu_res->u.response->num_diagnostics),
825 YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE, 0);
830 Z_PresentResponse *pr = z3950_gdu->u.z3950->u.presentResponse;
838 if (!pr->records || pr->records->which != Z_Records_DBOSD)
844 pr->records->u.databaseOrSurDiagnostics->num_records;
845 for (
int i = 0; i < returned_recs; i++)
847 int position = i + *apdu->u.presentRequest->resultSetStartPoint;
848 Z_NamePlusRecord *npr
849 = pr->records->u.databaseOrSurDiagnostics->records[i];
851 sru_res->records[i + num].recordPacking = record_packing;
853 if (npr->which == Z_NamePlusRecord_surrogateDiagnostic)
855 Z_DiagRec *p = npr->u.surrogateDiagnostic;
856 if (p->which == Z_DiagRec_defaultFormat)
858 Z_DefaultDiagFormat *df = p->u.defaultFormat;
859 int c = yaz_diag_bib1_to_srw(*df->condition);
861 yaz_mk_sru_surrogate(
862 odr_en, sru_res->records + i + num, position,
867 yaz_mk_sru_surrogate(
868 odr_en, sru_res->records + i + num, position,
869 YAZ_SRW_RECORD_TEMPORARILY_UNAVAILABLE, 0);
872 else if (npr->which == Z_NamePlusRecord_databaseRecord &&
873 npr->u.databaseRecord->direct_reference
874 && !oid_oidcmp(npr->u.databaseRecord->direct_reference,
878 Z_External *r = npr->u.databaseRecord;
879 sru_res->records[i + num].recordPosition =
880 odr_intdup(odr_en, position);
881 sru_res->records[i + num].recordSchema = sr_req->recordSchema;
882 sru_res->records[i + num].recordData_buf
883 = odr_strdupn(odr_en,
884 (
const char *)r->u.octet_aligned->buf,
885 r->u.octet_aligned->len);
886 sru_res->records[i + num].recordData_len
887 = r->u.octet_aligned->len;
892 yaz_mk_sru_surrogate(
893 odr_en, sru_res->records + i + num, position,
894 YAZ_SRW_RECORD_NOT_AVAILABLE_IN_THIS_SCHEMA, 0);
897 num += returned_recs;
900 sru_res->num_records = num;
901 if (start - 1 + num < *sru_pdu_res->u.response->numberOfRecords)
902 sru_res->nextRecordPosition =
903 odr_intdup(odr_en, start + num);