X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=server%2Fseshigh.c;h=0fd64e9f9bd931fce2c7dda2fe188da72c2a05f7;hb=abaa7e4d8d4d9ad4a5a33e55895055a9975895aa;hp=34fb3acc3cca8351264b24eb2e78a10d04c34807;hpb=a54b78d4dfd37879e595070471ee69ab9dba64f1;p=yaz-moved-to-github.git diff --git a/server/seshigh.c b/server/seshigh.c index 34fb3ac..0fd64e9 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -4,7 +4,23 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: seshigh.c,v $ - * Revision 1.40 1995-07-31 14:34:26 quinn + * Revision 1.45 1995-08-21 09:11:00 quinn + * Smallish fixes to suppport new formats. + * + * Revision 1.44 1995/08/17 12:45:25 quinn + * Fixed minor problems with GRS-1. Added support in c&s. + * + * Revision 1.43 1995/08/15 12:00:31 quinn + * Updated External + * + * Revision 1.42 1995/08/15 11:16:50 quinn + * CV:e ---------------------------------------------------------------------- + * CV:e ---------------------------------------------------------------------- + * + * Revision 1.41 1995/08/02 10:23:06 quinn + * Smallish + * + * Revision 1.40 1995/07/31 14:34:26 quinn * Fixed bug in process_searchResponse (numberOfRecordsReturned). * * Revision 1.39 1995/06/27 13:21:00 quinn @@ -743,7 +759,14 @@ static Z_Records *pack_records(association *a, char *setname, int start, bend_fetchresult *fres; Z_NamePlusRecord *thisrec; Z_DatabaseRecord *thisext; - + int this_length; + + /* + * 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); if (reclist.num_records == MAX_RECORDS - 1) { *pres = Z_PRES_PARTIAL_2; @@ -752,6 +775,7 @@ static Z_Records *pack_records(association *a, char *setname, int start, freq.setname = setname; freq.number = recno; freq.format = format; + freq.stream = a->encode; if (!(fres = bend_fetch(a->backend, &freq, 0))) { *pres = Z_PRES_FAILURE; @@ -764,19 +788,23 @@ static Z_Records *pack_records(association *a, char *setname, int start, *pres = Z_PRES_FAILURE; return diagrec(a->proto, fres->errcode, fres->errstring); } + if (fres->len >= 0) + this_length = fres->len; + else + this_length = odr_total(a->encode) - total_length; logf(LOG_DEBUG, " fetched record, len=%d, total=%d", - fres->len, total_length); - if (fres->len + total_length > a->preferredMessageSize) + this_length, total_length); + if (this_length + total_length > a->preferredMessageSize) { /* record is small enough, really */ - if (fres->len <= a->preferredMessageSize) + if (this_length <= a->preferredMessageSize) { logf(LOG_DEBUG, " Dropped last normal-sized record"); *pres = Z_PRES_PARTIAL_2; break; } /* record can only be fetched by itself */ - if (fres->len < a->maximumRecordSize) + if (this_length < a->maximumRecordSize) { logf(LOG_DEBUG, " Record > prefmsgsz"); if (toget > 1) @@ -785,7 +813,6 @@ static Z_Records *pack_records(association *a, char *setname, int start, reclist.records[reclist.num_records] = surrogatediagrec(a->proto, fres->basename, 16, 0); reclist.num_records++; - total_length += 10; /* totally arbitrary */ continue; } } @@ -795,7 +822,6 @@ static Z_Records *pack_records(association *a, char *setname, int start, reclist.records[reclist.num_records] = surrogatediagrec(a->proto, fres->basename, 17, 0); reclist.num_records++; - total_length += 10; /* totally arbitrary */ continue; } } @@ -816,43 +842,41 @@ static Z_Records *pack_records(association *a, char *setname, int start, oid_getoidbyent(&recform)); thisext->indirect_reference = 0; thisext->descriptor = 0; - if (fres->format == VAL_SUTRS) /* SUTRS ios a single-ASN.1-type */ + if (fres->len < 0) /* Structured data */ { - Odr_oct sutrs_asn; - Odr_oct *sp = &sutrs_asn; - Odr_any *single = odr_malloc(a->encode, sizeof(*single)); - char *buf, *remember; - int len, s_remember; - - sutrs_asn.buf = (unsigned char*) fres->record; - sutrs_asn.len = sutrs_asn.size = fres->len; - /* - * we borrow the encoding stream for preparing the buffer. This - * is not the most elegant solution - a better way might have been - * to reserve a different stream, or to devise a better system - * for handling externals in general. - */ - remember = odr_getbuf(a->encode, &len, &s_remember); - buf = odr_malloc(a->encode, fres->len + 10); /* buf for encoding */ - odr_setbuf(a->encode, buf, fres->len + 10, 0); /* can_grow==0 */ - if (!z_SUTRS(a->encode, &sp, 0)) + switch (fres->format) { - logf(LOG_LOG, "ODR error encoding SUTRS: %s", - odr_errlist[odr_geterror(a->encode)]); - return 0; + case VAL_SUTRS: thisext->which = Z_External_sutrs; break; + case VAL_GRS1: thisext->which = Z_External_grs1; break; + case VAL_EXPLAIN: thisext->which = Z_External_explainRecord; + break; + + default: + logf(LOG_FATAL, "Unknown structured format from backend."); + return 0; } - thisext->which = ODR_EXTERNAL_single; - thisext->u.single_ASN1_type = single; - single->buf = (unsigned char*)odr_getbuf(a->encode, &single->len, - &single->size); - /* Now restore the encoding stream */ - odr_setbuf(a->encode, remember, s_remember, 1); - logf(LOG_DEBUG, " Format is SUTRS. len %d, encoded len %d", - fres->len, single->len); + + /* + * We cheat on the pointers here. Obviously, the record field + * of the backend-fetch structure should have been a union for + * correctness, but we're stuck with this for backwards + * compatibility. + */ + thisext->u.grs1 = (Z_GenericRecord*) fres->record; + } + else if (fres->format == VAL_SUTRS) /* SUTRS is a single-ASN.1-type */ + { + Odr_oct *sutrs = odr_malloc(a->encode, sizeof(*sutrs)); + + thisext->which = Z_External_sutrs; + thisext->u.sutrs = sutrs; + sutrs->buf = odr_malloc(a->encode, fres->len); + sutrs->len = sutrs->size = fres->len; + memcpy(sutrs->buf, fres->record, fres->len); } - else /* octet-aligned record. Easy as pie */ + else /* octet-aligned record. */ { - thisext->which = ODR_EXTERNAL_octet; + thisext->which = Z_External_octet; if (!(thisext->u.octet_aligned = odr_malloc(a->encode, sizeof(Odr_oct)))) return 0; @@ -865,7 +889,6 @@ static Z_Records *pack_records(association *a, char *setname, int start, } reclist.records[reclist.num_records] = thisrec; reclist.num_records++; - total_length += fres->len; *next = fres->last_in_set ? 0 : recno + 1; } *num = reclist.num_records; @@ -983,6 +1006,8 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, } else { + if (*resp.resultCount) + next = 1; resp.numberOfRecordsReturned = &nulint; resp.nextResultSetPosition = &next; resp.searchStatus = &sr;