X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=server%2Fseshigh.c;h=568b2bc2cca133297e666b7ce431291ebccf818f;hb=fcd3a8318a95b56fa3724d800c4e6057774e0da5;hp=6484f48f6e6527b97d8bb6e5c09ee42376d20d76;hpb=2888744f98c72347a8f584f4b56dad77905d1a2b;p=yaz-moved-to-github.git diff --git a/server/seshigh.c b/server/seshigh.c index 6484f48..568b2bc 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -1,9 +1,18 @@ /* - * Copyright (c) 1995-2000, Index Data + * Copyright (c) 1995-2001, Index Data * See the file LICENSE for details. * * $Log: seshigh.c,v $ - * Revision 1.112 2001-01-29 09:38:22 adam + * Revision 1.115 2001-03-25 21:55:12 adam + * Added odr_intdup. Ztest server returns TaskPackage for ItemUpdate. + * + * Revision 1.114 2001/02/21 13:46:53 adam + * C++ fixes. + * + * Revision 1.113 2001/01/30 21:34:17 adam + * Added step-size for Scan backend interface. + * + * Revision 1.112 2001/01/29 09:38:22 adam * Fixed bug that made the frontend server crash when no attribute set * was specified for scan. * @@ -656,8 +665,8 @@ void ir_session(IOCHAN h, int event) if (!z_APDU(assoc->decode, &req->request, 0, 0)) { yaz_log(LOG_LOG, "ODR error on incoming PDU: %s [near byte %d] ", - odr_errmsg(odr_geterror(assoc->decode)), - odr_offset(assoc->decode)); + odr_errmsg(odr_geterror(assoc->decode)), + odr_offset(assoc->decode)); yaz_log(LOG_LOG, "PDU dump:"); odr_dumpBER(yaz_log_file(), assoc->input_buffer, res); do_close(assoc, Z_Close_protocolError, "Malformed package"); @@ -877,22 +886,22 @@ void backend_response(IOCHAN i, int event) static int process_response(association *assoc, request *req, Z_APDU *res) { odr_setbuf(assoc->encode, req->response, req->size_response, 1); + + if (assoc->print && !z_APDU(assoc->print, &res, 0, 0)) + { + yaz_log(LOG_WARN, "ODR print error: %s", + odr_errmsg(odr_geterror(assoc->print))); + odr_reset(assoc->print); + } if (!z_APDU(assoc->encode, &res, 0, 0)) { yaz_log(LOG_WARN, "ODR error when encoding response: %s", odr_errmsg(odr_geterror(assoc->decode))); - odr_reset(assoc->encode); return -1; } 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 */ - if (assoc->print && !z_APDU(assoc->print, &res, 0, 0)) - { - yaz_log(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); @@ -927,7 +936,7 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) char options[100]; xfree (assoc->init); - assoc->init = xmalloc (sizeof(*assoc->init)); + assoc->init = (bend_initrequest *) xmalloc (sizeof(*assoc->init)); yaz_log(LOG_LOG, "Got initRequest"); if (req->implementationId) @@ -1091,14 +1100,14 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) * These functions should be merged. */ -static void set_addinfo (Z_DefaultDiagFormat *dr, char *addinfo) +static void set_addinfo (Z_DefaultDiagFormat *dr, char *addinfo, ODR odr) { #if ASN_COMPILED dr->which = Z_DefaultDiagFormat_v2Addinfo; - dr->u.v2Addinfo = addinfo ? addinfo : ""; + dr->u.v2Addinfo = odr_strdup (odr, addinfo ? addinfo : ""); #else dr->which = Z_DiagForm_v2AddInfo; - dr->addinfo = addinfo ? addinfo : ""; + dr->addinfo = odr_strdup (odr, addinfo ? addinfo : ""); #endif } @@ -1111,8 +1120,7 @@ static Z_Records *diagrec(association *assoc, int error, char *addinfo) Z_Records *rec = (Z_Records *) odr_malloc (assoc->encode, sizeof(*rec)); oident bib1; - int *err = (int *) - odr_malloc (assoc->encode, sizeof(*err)); + int *err = odr_intdup(assoc->encode, error); Z_DiagRec *drec = (Z_DiagRec *) odr_malloc (assoc->encode, sizeof(*drec)); Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *) @@ -1124,7 +1132,6 @@ static Z_Records *diagrec(association *assoc, int error, char *addinfo) yaz_log(LOG_DEBUG, "Diagnostic: %d -- %s", error, addinfo ? addinfo : "NULL"); - *err = error; rec->which = Z_Records_NSD; #if ASN_COMPILED rec->u.nonSurrogateDiagnostic = dr; @@ -1136,7 +1143,7 @@ static Z_Records *diagrec(association *assoc, int error, char *addinfo) dr->diagnosticSetId = odr_oiddup (assoc->encode, oid_ent_to_oid(&bib1, oid)); dr->condition = err; - set_addinfo (dr, addinfo); + set_addinfo (dr, addinfo, assoc->encode); return rec; } @@ -1149,7 +1156,7 @@ static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname, int oid[OID_SIZE]; Z_NamePlusRecord *rec = (Z_NamePlusRecord *) odr_malloc (assoc->encode, sizeof(*rec)); - int *err = (int *)odr_malloc (assoc->encode, sizeof(*err)); + int *err = odr_intdup(assoc->encode, error); oident bib1; Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (assoc->encode, sizeof(*drec)); Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *) @@ -1160,7 +1167,6 @@ static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname, bib1.value = VAL_BIB1; yaz_log(LOG_DEBUG, "SurrogateDiagnotic: %d -- %s", error, addinfo); - *err = error; rec->databaseName = dbname; rec->which = Z_NamePlusRecord_surrogateDiagnostic; rec->u.surrogateDiagnostic = drec; @@ -1169,7 +1175,7 @@ static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname, dr->diagnosticSetId = odr_oiddup (assoc->encode, oid_ent_to_oid(&bib1, oid)); dr->condition = err; - set_addinfo (dr, addinfo); + set_addinfo (dr, addinfo, assoc->encode); return rec; } @@ -1181,7 +1187,7 @@ static Z_DiagRecs *diagrecs(association *assoc, int error, char *addinfo) { int oid[OID_SIZE]; Z_DiagRecs *recs = (Z_DiagRecs *)odr_malloc (assoc->encode, sizeof(*recs)); - int *err = (int *)odr_malloc (assoc->encode, sizeof(*err)); + int *err = odr_intdup(assoc->encode, error); oident bib1; Z_DiagRec **recp = (Z_DiagRec **)odr_malloc (assoc->encode, sizeof(*recp)); Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (assoc->encode, sizeof(*drec)); @@ -1192,7 +1198,6 @@ static Z_DiagRecs *diagrecs(association *assoc, int error, char *addinfo) bib1.oclass = CLASS_DIAGSET; bib1.value = VAL_BIB1; - *err = error; recs->num_diagRecs = 1; recs->diagRecs = recp; recp[0] = drec; @@ -1205,10 +1210,10 @@ static Z_DiagRecs *diagrecs(association *assoc, int error, char *addinfo) #ifdef ASN_COMPILED rec->which = Z_DefaultDiagFormat_v2Addinfo; - rec->u.v2Addinfo = addinfo ? addinfo : ""; + rec->u.v2Addinfo = odr_strdup (assoc->encode, addinfo ? addinfo : ""); #else rec->which = Z_DiagForm_v2AddInfo; - rec->addinfo = addinfo ? addinfo : ""; + rec->addinfo = odr_strdup (assoc->encode, addinfo ? addinfo : ""); #endif return recs; } @@ -1436,15 +1441,10 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu)); Z_SearchResponse *resp = (Z_SearchResponse *) odr_malloc (assoc->encode, sizeof(*resp)); - int *nulint = (int *)odr_malloc (assoc->encode, sizeof(*nulint)); - bool_t *sr = (bool_t *)odr_malloc (assoc->encode, sizeof(*sr)); - int *next = (int *)odr_malloc (assoc->encode, sizeof(*next)); - int *none = (int *)odr_malloc (assoc->encode, sizeof(*none)); - - *nulint = 0; - *sr = 1; - *next = 0; - *none = Z_RES_NONE; + int *nulint = odr_intdup (assoc->encode, 0); + bool_t *sr = odr_intdup(assoc->encode, 1); + int *next = odr_intdup(assoc->encode, 0); + int *none = odr_intdup(assoc->encode, Z_RES_NONE); apdu->which = Z_APDU_searchResponse; apdu->u.searchResponse = resp; @@ -1469,12 +1469,10 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, } else { - int *toget = (int *)odr_malloc (assoc->encode, sizeof(*toget)); - int *presst = (int *)odr_malloc (assoc->encode, sizeof(*presst)); + int *toget = odr_intdup(assoc->encode, 0); + int *presst = odr_intdup(assoc->encode, 0); Z_RecordComposition comp, *compp = 0; - *toget = 0; - *presst = 0; resp->records = 0; resp->resultCount = &bsrt->hits; @@ -1589,12 +1587,9 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb, } apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu)); resp = (Z_PresentResponse *)odr_malloc (assoc->encode, sizeof(*resp)); - presst = (int *)odr_malloc (assoc->encode, sizeof(*presst)); - next = (int *)odr_malloc (assoc->encode, sizeof(*next)); - num = (int *)odr_malloc (assoc->encode, sizeof(*num)); - *presst = 0; - *next = 0; - *num = *req->numberOfRecordsRequested; + presst = odr_intdup(assoc->encode, 0); + next = odr_intdup(assoc->encode, 0); + num = odr_intdup(assoc->encode, *req->numberOfRecordsRequested); apdu->which = Z_APDU_presentResponse; apdu->u.presentResponse = resp; @@ -1614,34 +1609,6 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb, return apdu; } -#if 0 -static int bend_default_scan (void *handle, bend_scan_rr *rr) -{ - bend_scanrequest srq; - bend_scanresult *srs; - - srq.num_bases = rr->num_bases; - srq.basenames = rr->basenames; - srq.attributeset = rr->attributeset; - srq.referenceId = rr->referenceId; - srq.term = rr->term; - srq.term_position = rr->term_position; - srq.num_entries = rr->num_entries; - srq.stream = rr->stream; - srq.print = rr->print; - - srs = bend_scan(handle, &srq, 0); - - rr->term_position = srs->term_position; - rr->num_entries = srs->num_entries; - rr->entries = srs->entries; - rr->status = srs->status; - rr->errcode = srs->errcode; - rr->errstring = srs->errstring; - return 0; -} -#endif - /* * Scan was implemented rather in a hurry, and with support for only the basic * elements of the service in the backend API. Suggestions are welcome. @@ -1652,10 +1619,8 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu)); Z_ScanResponse *res = (Z_ScanResponse *) odr_malloc (assoc->encode, sizeof(*res)); - int *scanStatus = (int *) - odr_malloc (assoc->encode, sizeof(*scanStatus)); - int *numberOfEntriesReturned = (int *) - odr_malloc (assoc->encode, sizeof(*numberOfEntriesReturned)); + int *scanStatus = odr_intdup(assoc->encode, Z_Scan_failure); + int *numberOfEntriesReturned = odr_intdup(assoc->encode, 0); Z_ListEntries *ents = (Z_ListEntries *) odr_malloc (assoc->encode, sizeof(*ents)); Z_DiagRecs *diagrecs_p = NULL; @@ -1663,13 +1628,14 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) oident *attset; yaz_log(LOG_LOG, "Got ScanRequest"); - *scanStatus = Z_Scan_failure; - *numberOfEntriesReturned = 0; apdu->which = Z_APDU_scanResponse; apdu->u.scanResponse = res; res->referenceId = req->referenceId; - res->stepSize = 0; + res->stepSize = odr_intdup(assoc->encode, 0); + + if (req->stepSize) + *res->stepSize = *req->stepSize; res->scanStatus = scanStatus; res->numberOfEntriesReturned = numberOfEntriesReturned; res->positionOfTerm = 0; @@ -1704,6 +1670,7 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) bsrr->referenceId = req->referenceId; bsrr->stream = assoc->encode; bsrr->print = assoc->print; + bsrr->step_size = res->stepSize; if (!(attset = oid_getentbyoid(req->attributeSet)) || attset->oclass != CLASS_RECSYN) bsrr->attributeset = VAL_NONE; @@ -1814,9 +1781,7 @@ static Z_APDU *process_sortRequest(association *assoc, request *reqb, (*assoc->init->bend_sort)(assoc->backend, bsrr); res->referenceId = bsrr->referenceId; - res->sortStatus = (int *) - odr_malloc (assoc->encode, sizeof(*res->sortStatus)); - *res->sortStatus = bsrr->sort_status; + res->sortStatus = odr_intdup(assoc->encode, bsrr->sort_status); res->resultSetStatus = 0; if (bsrr->errcode) { @@ -1864,8 +1829,9 @@ static Z_APDU *process_deleteRequest(association *assoc, request *reqb, if (bdrr->num_setnames > 0) { int i; - bdrr->statuses = odr_malloc(assoc->encode, sizeof(*bdrr->statuses) * - bdrr->num_setnames); + bdrr->statuses = (int*) + odr_malloc(assoc->encode, sizeof(*bdrr->statuses) * + bdrr->num_setnames); for (i = 0; i < bdrr->num_setnames; i++) bdrr->statuses[i] = 0; } @@ -1873,24 +1839,24 @@ static Z_APDU *process_deleteRequest(association *assoc, request *reqb, res->referenceId = req->referenceId; - res->deleteOperationStatus = (int *) - odr_malloc (assoc->encode, sizeof(*res->deleteOperationStatus)); - *res->deleteOperationStatus = bdrr->delete_status; + res->deleteOperationStatus = odr_intdup(assoc->encode,bdrr->delete_status); res->deleteListStatuses = 0; if (bdrr->num_setnames > 0) { int i; - res->deleteListStatuses = odr_malloc(assoc->encode, - sizeof(*res->deleteListStatuses)); + res->deleteListStatuses = (Z_ListStatuses *) + odr_malloc(assoc->encode, sizeof(*res->deleteListStatuses)); res->deleteListStatuses->num = bdrr->num_setnames; res->deleteListStatuses->elements = - odr_malloc (assoc->encode, + (Z_ListStatus **) + odr_malloc (assoc->encode, sizeof(*res->deleteListStatuses->elements) * bdrr->num_setnames); for (i = 0; inum_setnames; i++) { res->deleteListStatuses->elements[i] = + (Z_ListStatus *) odr_malloc (assoc->encode, sizeof(**res->deleteListStatuses->elements)); res->deleteListStatuses->elements[i]->status = bdrr->statuses+i; @@ -2035,6 +2001,7 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd) esrequest.errstring = NULL; esrequest.request = reqb; esrequest.association = assoc; + esrequest.taskPackage = 0; esrequest.referenceId = req->referenceId; (*assoc->init->bend_esrequest)(assoc->backend, &esrequest); @@ -2069,7 +2036,10 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd) resp->diagnostics = diagRecs->diagRecs; } /* Do something with the members of bend_extendedservice */ - + if (esrequest.taskPackage) + resp->taskPackage = z_ext_record (assoc->encode, VAL_EXTENDED, + (const char *) esrequest.taskPackage, + -1); yaz_log(LOG_DEBUG,"Send the result apdu"); return apdu; }