- bend_fetch_rr freq;
- Z_NamePlusRecord *thisrec;
- int this_length = 0;
- /*
- * we get the number of bytes allocated on the stream before any
- * allocation done by the backend - this should give us a reasonable
- * idea of the total size of the data so far.
- */
- total_length = odr_total(a->encode) - dumped_records;
- freq.errcode = 0;
- freq.errstring = 0;
- freq.basename = 0;
- freq.len = 0;
- freq.record = 0;
- freq.last_in_set = 0;
- freq.setname = setname;
- freq.surrogate_flag = 0;
- freq.number = recno;
- freq.comp = comp;
- freq.request_format = format;
- freq.request_format_raw = oid;
- freq.output_format = format;
- freq.output_format_raw = 0;
- freq.stream = a->encode;
- freq.print = a->print;
- freq.surrogate_flag = 0;
- freq.referenceId = referenceId;
- (*a->init->bend_fetch)(a->backend, &freq);
- /* backend should be able to signal whether error is system-wide
- or only pertaining to current record */
- if (freq.errcode)
- {
- if (!freq.surrogate_flag)
- {
- *pres = Z_PRES_FAILURE;
- return diagrec(a, freq.errcode, freq.errstring);
- }
- reclist->records[reclist->num_records] =
- surrogatediagrec(a, freq.basename, freq.errcode,
- freq.errstring);
- reclist->num_records++;
- *next = freq.last_in_set ? 0 : recno + 1;
- continue;
- }
- if (freq.len >= 0)
- this_length = freq.len;
- else
- this_length = odr_total(a->encode) - total_length;
- yaz_log(LOG_DEBUG, " fetched record, len=%d, total=%d",
- this_length, total_length);
- if (this_length + total_length > a->preferredMessageSize)
- {
- /* record is small enough, really */
- if (this_length <= a->preferredMessageSize)
- {
- yaz_log(LOG_DEBUG, " Dropped last normal-sized record");
- *pres = Z_PRES_PARTIAL_2;
- break;
- }
- /* record can only be fetched by itself */
- if (this_length < a->maximumRecordSize)
- {
- yaz_log(LOG_DEBUG, " Record > prefmsgsz");
- if (toget > 1)
- {
- yaz_log(LOG_DEBUG, " Dropped it");
- reclist->records[reclist->num_records] =
- surrogatediagrec(a, freq.basename, 16, 0);
- reclist->num_records++;
- *next = freq.last_in_set ? 0 : recno + 1;
- dumped_records += this_length;
- continue;
- }
- }
- else /* too big entirely */
- {
- yaz_log(LOG_DEBUG, "Record > maxrcdsz");
- reclist->records[reclist->num_records] =
- surrogatediagrec(a, freq.basename, 17, 0);
- reclist->num_records++;
- *next = freq.last_in_set ? 0 : recno + 1;
- dumped_records += this_length;
- continue;
- }
- }