-Z_Records *Yaz_Z_Server::pack_records (const char *resultSetName,
- int start, int xnum,
- Z_RecordComposition *comp,
- int *next, int *pres,
- int *format)
-{
- int recno, total_length = 0, toget = xnum, dumped_records = 0;
- Z_Records *records =
- (Z_Records *) odr_malloc (odr_encode(), sizeof(*records));
- Z_NamePlusRecordList *reclist =
- (Z_NamePlusRecordList *) odr_malloc (odr_encode(), sizeof(*reclist));
- Z_NamePlusRecord **list =
- (Z_NamePlusRecord **) odr_malloc (odr_encode(), sizeof(*list) * toget);
-
- records->which = Z_Records_DBOSD;
- records->u.databaseOrSurDiagnostics = reclist;
- reclist->num_records = 0;
- reclist->records = list;
- *pres = Z_PRES_SUCCESS;
- *next = 0;
-
- yaz_log(LOG_LOG, "Request to pack %d+%d", start, toget);
- yaz_log(LOG_LOG, "pms=%d, mrs=%d", m_preferredMessageSize,
- m_maximumRecordSize);
- for (recno = start; reclist->num_records < toget; recno++)
- {
- Z_NamePlusRecord *this_rec =
- (Z_NamePlusRecord *) odr_malloc (odr_encode(), sizeof(*this_rec));
- this_rec->databaseName = 0;
- this_rec->which = Z_NamePlusRecord_databaseRecord;
- this_rec->u.databaseRecord = 0;
-
- int this_length = 0;
-
- recv_Z_record (resultSetName, recno, format, comp, this_rec, records);
-
- if (records->which != Z_Records_DBOSD)
- {
- *pres = Z_PRES_FAILURE;
- return records;
- }
-
- if (this_rec->which == Z_NamePlusRecord_databaseRecord &&
- this_rec->u.databaseRecord == 0)
- { // handler did not return a record..
- create_surrogateDiagnostics(this_rec, 0, 14, 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(odr_encode()) - dumped_records;
- this_length = odr_total(odr_encode()) - total_length;
- yaz_log(LOG_LOG, " fetched record, len=%d, total=%d",
- this_length, total_length);
- if (this_length + total_length > m_preferredMessageSize)
- {
- /* record is small enough, really */
- if (this_length <= m_preferredMessageSize)
- {
- yaz_log(LOG_LOG, " Dropped last normal-sized record");
- *pres = Z_PRES_PARTIAL_2;
- break;
- }
- if (this_length >= m_maximumRecordSize)
- { /* too big entirely */
- yaz_log(LOG_LOG, "Record > maxrcdsz");
- reclist->records[reclist->num_records] = this_rec;
- create_surrogateDiagnostics(this_rec,
- this_rec->databaseName, 17, 0);
- reclist->num_records++;
- *next = recno + 1;
- dumped_records += this_length;
- continue;
- }
- else /* record can only be fetched by itself */
- {
- yaz_log(LOG_LOG, " Record > prefmsgsz");
- if (toget > 1)
- {
- yaz_log(LOG_DEBUG, " Dropped it");
- reclist->records[reclist->num_records] = this_rec;
- create_surrogateDiagnostics(this_rec,
- this_rec->databaseName,
- 16, 0);
- reclist->num_records++;
- // *next = freq.last_in_set ? 0 : recno + 1;
- *next = recno + 1;
- dumped_records += this_length;
- continue;
- }
- }
- }
- reclist->records[reclist->num_records] = this_rec;
- reclist->num_records++;
- *next = recno + 1;
- }
- return records;
-}
-
-void Yaz_Z_Server::fetch_via_piggyback (Z_SearchRequest *req,
- Z_SearchResponse *res)