X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=server%2Fseshigh.c;h=5ad762fd575fb4ffed8a49fab1bdea61df7e523d;hb=2156e17830e0e3ba739800d6616fa045b0fe5565;hp=fd86e0f97cd01028f1c3142cf46e20970043356e;hpb=b436ce38e1e619d2225c7c75c1f0de841aa13bad;p=yaz-moved-to-github.git diff --git a/server/seshigh.c b/server/seshigh.c index fd86e0f..5ad762f 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -4,7 +4,16 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: seshigh.c,v $ - * Revision 1.73 1998-03-31 11:07:45 adam + * Revision 1.76 1998-05-27 16:57:07 adam + * Support for surrogate diagnostic records added for bend_fetch. + * + * Revision 1.75 1998/05/18 10:13:07 adam + * Fixed call to es_request handler - extra argument was passed. + * + * Revision 1.74 1998/03/31 15:13:20 adam + * Development towards compiled ASN.1. + * + * Revision 1.73 1998/03/31 11:07:45 adam * Furhter work on UNIverse resource report. * Added Extended Services handling in frontend server. * @@ -676,13 +685,13 @@ static int process_response(association *assoc, request *req, Z_APDU *res) req->response = odr_getbuf(assoc->encode, &req->len_response, &req->size_response); odr_setbuf(assoc->encode, 0, 0, 0); /* don'txfree if we abort later */ - odr_reset(assoc->encode); if (assoc->print && !z_APDU(assoc->print, &res, 0)) { logf(LOG_WARN, "ODR print error: %s", odr_errmsg(odr_geterror(assoc->print))); odr_reset(assoc->print); } + odr_reset(assoc->encode); req->state = REQUEST_IDLE; request_enq(&assoc->outgoing, req); /* turn the work over to the ir_session handler */ @@ -829,6 +838,17 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) * These functions should be merged. */ +static void set_addinfo (Z_DefaultDiagFormat *dr, char *addinfo) +{ +#if ASN_COMPILED + dr->which = Z_DefaultDiagFormat_v2Addinfo; + dr->u.v2Addinfo = addinfo ? addinfo : ""; +#else + dr->which = Z_DiagForm_v2AddInfo; + dr->addinfo = addinfo ? addinfo : ""; +#endif +} + /* * nonsurrogate diagnostic record. */ @@ -849,6 +869,9 @@ static Z_Records *diagrec(association *assoc, int error, char *addinfo) "NULL"); *err = error; rec->which = Z_Records_NSD; +#if ASN_COMPILED + rec->u.nonSurrogateDiagnostic = dr; +#else #ifdef Z_95 rec->u.nonSurrogateDiagnostic = drec; drec->which = Z_DiagRec_defaultFormat; @@ -856,11 +879,11 @@ static Z_Records *diagrec(association *assoc, int error, char *addinfo) #else rec->u.nonSurrogateDiagnostic = dr; #endif +#endif dr->diagnosticSetId = odr_oiddup (assoc->encode, oid_ent_to_oid(&bib1, oid)); dr->condition = err; - dr->which = Z_DiagForm_v2AddInfo; - dr->addinfo = addinfo ? addinfo : ""; + set_addinfo (dr, addinfo); return rec; } @@ -868,7 +891,7 @@ static Z_Records *diagrec(association *assoc, int error, char *addinfo) * surrogate diagnostic. */ static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname, - int error, char *addinfo) + int error, char *addinfo) { int oid[OID_SIZE]; Z_NamePlusRecord *rec = (Z_NamePlusRecord *)odr_malloc (assoc->encode, sizeof(*rec)); @@ -891,8 +914,8 @@ static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname, dr->diagnosticSetId = odr_oiddup (assoc->encode, oid_ent_to_oid(&bib1, oid)); dr->condition = err; - dr->which = Z_DiagForm_v2AddInfo; - dr->addinfo = addinfo ? addinfo : ""; + set_addinfo (dr, addinfo); + return rec; } @@ -924,8 +947,14 @@ static Z_DiagRecs *diagrecs(association *assoc, int error, char *addinfo) rec->diagnosticSetId = odr_oiddup (assoc->encode, oid_ent_to_oid(&bib1, oid)); rec->condition = err; + +#ifdef ASN_COMPILED + rec->which = Z_DefaultDiagFormat_v2Addinfo; + rec->u.v2Addinfo = addinfo ? addinfo : ""; +#else rec->which = Z_DiagForm_v2AddInfo; rec->addinfo = addinfo ? addinfo : ""; +#endif return recs; } @@ -957,7 +986,7 @@ static Z_Records *pack_records(association *a, char *setname, int start, bend_fetchresult *fres; Z_NamePlusRecord *thisrec; Z_DatabaseRecord *thisext; - int this_length; + int this_length = 0; /* * we get the number of bytes allocated on the stream before any @@ -970,6 +999,7 @@ static Z_Records *pack_records(association *a, char *setname, int start, freq.comp = comp; freq.format = format; freq.stream = a->encode; + freq.surrogate_flag = 0; if (!(fres = bend_fetch(a->backend, &freq, 0))) { *pres = Z_PRES_FAILURE; @@ -979,8 +1009,17 @@ static Z_Records *pack_records(association *a, char *setname, int start, or only pertaining to current record */ if (fres->errcode) { - *pres = Z_PRES_FAILURE; - return diagrec(a, fres->errcode, fres->errstring); + if (!freq.surrogate_flag) + { + *pres = Z_PRES_FAILURE; + return diagrec(a, fres->errcode, fres->errstring); + } + reclist->records[reclist->num_records] = + surrogatediagrec(a, fres->basename, fres->errcode, + fres->errstring); + reclist->num_records++; + *next = fres->last_in_set ? 0 : recno + 1; + continue; } if (fres->len >= 0) this_length = fres->len; @@ -1023,6 +1062,7 @@ static Z_Records *pack_records(association *a, char *setname, int start, continue; } } + if (!(thisrec = (Z_NamePlusRecord *)odr_malloc(a->encode, sizeof(*thisrec)))) return 0; if (!(thisrec->databaseName = (char *)odr_malloc(a->encode, @@ -1066,6 +1106,12 @@ static Z_Records *pack_records(association *a, char *setname, int start, } else if (fres->format == VAL_SUTRS) /* SUTRS is a single-ASN.1-type */ { +#if 0 + Z_SUTRS *sutrs = (Z_SUTRS *)odr_malloc(a->encode, 1+fres->len); + + memcpy(sutrs, fres->record, fres->len); + sutrs[fres->len] = '\0'; +#else Odr_oct *sutrs = (Odr_oct *)odr_malloc(a->encode, sizeof(*sutrs)); thisext->which = Z_External_sutrs; @@ -1073,6 +1119,7 @@ static Z_Records *pack_records(association *a, char *setname, int start, sutrs->buf = (unsigned char *)odr_malloc(a->encode, fres->len); sutrs->len = sutrs->size = fres->len; memcpy(sutrs->buf, fres->record, fres->len); +#endif } else /* octet-aligned record. */ { @@ -1343,6 +1390,7 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) int *numberOfEntriesReturned = (int *)odr_malloc (assoc->encode, sizeof(*numberOfEntriesReturned)); Z_ListEntries *ents = (Z_ListEntries *)odr_malloc (assoc->encode, sizeof(*ents)); + Z_DiagRecs *diagrecs_p = NULL; oident *attent; bend_scanrequest srq; bend_scanresult *srs; @@ -1360,21 +1408,29 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) res->numberOfEntriesReturned = numberOfEntriesReturned; res->positionOfTerm = 0; res->entries = ents; - ents->which = Z_ListEntries_nonSurrogateDiagnostics; +#if ASN_COMPILED + ents->num_entries = 0; + ents->entries = NULL; + ents->num_nonsurrogateDiagnostics = 0; + ents->nonsurrogateDiagnostics = NULL; +#else + ents->which = Z_ListEntries_entries; +#endif res->attributeSet = 0; res->otherInfo = 0; if (req->attributeSet && (!(attent = oid_getentbyoid(req->attributeSet)) || - attent->oclass != CLASS_ATTSET || attent->value != VAL_BIB1)) - ents->u.nonSurrogateDiagnostics = diagrecs(assoc, 121, 0); + attent->oclass != CLASS_ATTSET + || attent->value != VAL_BIB1)) + diagrecs_p = diagrecs(assoc, 121, 0); else if (req->stepSize && *req->stepSize > 0) - ents->u.nonSurrogateDiagnostics = diagrecs(assoc, 205, 0); + diagrecs_p = diagrecs(assoc, 205, 0); else { if (req->termListAndStartPoint->term->which == Z_Term_general) logf(LOG_DEBUG, " term: '%.*s'", - req->termListAndStartPoint->term->u.general->len, - req->termListAndStartPoint->term->u.general->buf); + req->termListAndStartPoint->term->u.general->len, + req->termListAndStartPoint->term->u.general->buf); srq.num_bases = req->num_databaseNames; srq.basenames = req->databaseNames; srq.num_entries = *req->numberOfTermsRequested; @@ -1388,31 +1444,42 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) srq.term_position = req->preferredPositionInResponse ? *req->preferredPositionInResponse : 1; if (!(srs = bend_scan(assoc->backend, &srq, 0))) - ents->u.nonSurrogateDiagnostics = diagrecs(assoc, 2, 0); + diagrecs_p = diagrecs(assoc, 2, 0); else if (srs->errcode) - ents->u.nonSurrogateDiagnostics = diagrecs(assoc, - srs->errcode, srs->errstring); + diagrecs_p = diagrecs(assoc, srs->errcode, srs->errstring); else { int i; - Z_Entries *list = (Z_Entries *)odr_malloc (assoc->encode, sizeof(*list)); - Z_Entry **tab = (Z_Entry **)odr_malloc (assoc->encode, - sizeof(*tab) * srs->num_entries); - +#ifdef ASN_COMPILED +#else + Z_Entries *list = (Z_Entries *) + odr_malloc (assoc->encode, sizeof(*list)); +#endif + Z_Entry **tab = (Z_Entry **) + odr_malloc (assoc->encode, sizeof(*tab) * srs->num_entries); + if (srs->status == BEND_SCAN_PARTIAL) *scanStatus = Z_Scan_partial_5; else *scanStatus = Z_Scan_success; - ents->which = Z_ListEntries_entries; +#ifdef ASN_COMPILED + ents->entries = tab; + ents->num_entries = srs->num_entries; + res->numberOfEntriesReturned = &ents->num_entries; +#else ents->u.entries = list; list->entries = tab; + list->num_entries = srs->num_entries; + res->numberOfEntriesReturned = &list->num_entries; +#endif + res->positionOfTerm = &srs->term_position; for (i = 0; i < srs->num_entries; i++) { Z_Entry *e; Z_TermInfo *t; Odr_oct *o; - - list->entries[i] = e = (Z_Entry *)odr_malloc(assoc->encode, sizeof(*e)); + + tab[i] = e = (Z_Entry *)odr_malloc(assoc->encode, sizeof(*e)); e->which = Z_Entry_termInfo; e->u.termInfo = t = (Z_TermInfo *)odr_malloc(assoc->encode, sizeof(*t)); t->suggestedAttributes = 0; @@ -1431,12 +1498,18 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) logf(LOG_DEBUG, " term #%d: '%s' (%d)", i, srs->entries[i].term, srs->entries[i].occurrences); } - list->num_entries = i; - res->numberOfEntriesReturned = &list->num_entries; - res->positionOfTerm = &srs->term_position; } } - + if (diagrecs_p) + { +#ifdef ASN_COMPILED + ents->num_nonsurrogateDiagnostics = diagrecs_p->num_diagRecs; + ents->nonsurrogateDiagnostics = diagrecs_p->diagRecs; +#else + ents->u.nonSurrogateDiagnostics = diagrecs_p; + ents->which = Z_ListEntries_nonSurrogateDiagnostics; +#endif + } return apdu; } @@ -1451,8 +1524,13 @@ static Z_APDU *process_sortRequest(association *assoc, request *reqb, logf(LOG_LOG, "Got SortRequest."); +#ifdef ASN_COMPILED + bsrr->num_input_setnames = req->num_inputResultSetNames; + bsrr->input_setnames = req->inputResultSetNames; +#else bsrr->num_input_setnames = req->inputResultSetNames->num_strings; bsrr->input_setnames = req->inputResultSetNames->strings; +#endif bsrr->output_setname = req->sortedResultSetName; bsrr->sort_sequence = req->sortSequence; bsrr->stream = assoc->encode; @@ -1468,9 +1546,22 @@ static Z_APDU *process_sortRequest(association *assoc, request *reqb, *res->sortStatus = bsrr->sort_status; res->resultSetStatus = 0; if (bsrr->errcode) - res->diagnostics = diagrecs(assoc, bsrr->errcode, bsrr->errstring); + { + Z_DiagRecs *dr = diagrecs (assoc, bsrr->errcode, bsrr->errstring); +#ifdef ASN_COMPILED + res->diagnostics = dr->diagRecs; + res->num_diagnostics = dr->num_diagRecs; +#else + res->diagnostics = dr; +#endif + } else + { +#ifdef ASN_COMPILED + res->num_diagnostics = 0; +#endif res->diagnostics = 0; + } res->otherInfo = 0; apdu->which = Z_APDU_sortResponse; @@ -1580,11 +1671,12 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd) esrequest.stream = assoc->encode; esrequest.errcode = 0; esrequest.errstring = NULL; - esrequest.request = reqb; - esrequest.association = assoc; - - (*assoc->bend_esrequest)(assoc->backend, &esrequest, fd); - + esrequest.request = reqb; + esrequest.association = assoc; + + ((int (*)(void *, bend_esrequest_rr *))(*assoc->bend_esrequest))(assoc->backend, + &esrequest); + /* If the response is being delayed, return NULL */ if (esrequest.request == NULL) return(NULL);