+ int i;
+ for (i = 0; i < req->num_databaseNames; i++)
+ yaz_log (LOG_LOG, "Database '%s'", req->databaseNames[i]);
+ }
+ bsrr->num_bases = req->num_databaseNames;
+ bsrr->basenames = req->databaseNames;
+ bsrr->num_entries = *req->numberOfTermsRequested;
+ bsrr->term = req->termListAndStartPoint;
+ bsrr->referenceId = req->referenceId;
+ bsrr->stream = assoc->encode;
+ bsrr->print = assoc->print;
+ bsrr->step_size = res->stepSize;
+ if (req->attributeSet &&
+ (attset = oid_getentbyoid(req->attributeSet)) &&
+ (attset->oclass == CLASS_ATTSET || attset->oclass == CLASS_GENERAL))
+ bsrr->attributeset = attset->value;
+ else
+ bsrr->attributeset = VAL_NONE;
+ log_scan_term (req->termListAndStartPoint, bsrr->attributeset);
+ bsrr->term_position = req->preferredPositionInResponse ?
+ *req->preferredPositionInResponse : 1;
+ ((int (*)(void *, bend_scan_rr *))
+ (*assoc->init->bend_scan))(assoc->backend, bsrr);
+ if (bsrr->errcode)
+ diagrecs_p = diagrecs(assoc, bsrr->errcode, bsrr->errstring);
+ else
+ {
+ int i;
+ Z_Entry **tab = (Z_Entry **)
+ odr_malloc (assoc->encode, sizeof(*tab) * bsrr->num_entries);
+
+ if (bsrr->status == BEND_SCAN_PARTIAL)
+ *scanStatus = Z_Scan_partial_5;
+ else
+ *scanStatus = Z_Scan_success;
+ ents->entries = tab;
+ ents->num_entries = bsrr->num_entries;
+ res->numberOfEntriesReturned = &ents->num_entries;
+ res->positionOfTerm = &bsrr->term_position;
+ for (i = 0; i < bsrr->num_entries; i++)
+ {
+ Z_Entry *e;
+ Z_TermInfo *t;
+ Odr_oct *o;
+
+ tab[i] = e = (Z_Entry *)odr_malloc(assoc->encode, sizeof(*e));
+ if (bsrr->entries[i].occurrences >= 0)
+ {
+ e->which = Z_Entry_termInfo;
+ e->u.termInfo = t = (Z_TermInfo *)
+ odr_malloc(assoc->encode, sizeof(*t));
+ t->suggestedAttributes = 0;
+ t->displayTerm = 0;
+ t->alternativeTerm = 0;
+ t->byAttributes = 0;
+ t->otherTermInfo = 0;
+ t->globalOccurrences = &bsrr->entries[i].occurrences;
+ t->term = (Z_Term *)
+ odr_malloc(assoc->encode, sizeof(*t->term));
+ t->term->which = Z_Term_general;
+ t->term->u.general = o =
+ (Odr_oct *)odr_malloc(assoc->encode, sizeof(Odr_oct));
+ o->buf = (unsigned char *)
+ odr_malloc(assoc->encode, o->len = o->size =
+ strlen(bsrr->entries[i].term));
+ memcpy(o->buf, bsrr->entries[i].term, o->len);
+ yaz_log(LOG_DEBUG, " term #%d: '%s' (%d)", i,
+ bsrr->entries[i].term, bsrr->entries[i].occurrences);
+ }
+ else
+ {
+ Z_DiagRecs *drecs = diagrecs (assoc,
+ bsrr->entries[i].errcode,
+ bsrr->entries[i].errstring);
+ assert (drecs->num_diagRecs == 1);
+ e->which = Z_Entry_surrogateDiagnostic;
+ assert (drecs->diagRecs[0]);
+ e->u.surrogateDiagnostic = drecs->diagRecs[0];
+ }
+ }
+ }
+ if (diagrecs_p)
+ {
+ ents->num_nonsurrogateDiagnostics = diagrecs_p->num_diagRecs;
+ ents->nonsurrogateDiagnostics = diagrecs_p->diagRecs;
+ }
+ return apdu;
+}
+
+static Z_APDU *process_sortRequest(association *assoc, request *reqb,
+ int *fd)
+{
+ Z_SortRequest *req = reqb->apdu_request->u.sortRequest;
+ Z_SortResponse *res = (Z_SortResponse *)
+ odr_malloc (assoc->encode, sizeof(*res));
+ bend_sort_rr *bsrr = (bend_sort_rr *)
+ odr_malloc (assoc->encode, sizeof(*bsrr));
+
+ Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
+
+ yaz_log(LOG_LOG, "Got SortRequest.");
+
+ bsrr->num_input_setnames = req->num_inputResultSetNames;
+ bsrr->input_setnames = req->inputResultSetNames;
+ bsrr->referenceId = req->referenceId;
+ bsrr->output_setname = req->sortedResultSetName;
+ bsrr->sort_sequence = req->sortSequence;
+ bsrr->stream = assoc->encode;
+ bsrr->print = assoc->print;
+
+ bsrr->sort_status = Z_SortStatus_failure;
+ bsrr->errcode = 0;
+ bsrr->errstring = 0;
+
+ (*assoc->init->bend_sort)(assoc->backend, bsrr);
+
+ res->referenceId = bsrr->referenceId;
+ res->sortStatus = odr_intdup(assoc->encode, bsrr->sort_status);
+ res->resultSetStatus = 0;
+ if (bsrr->errcode)
+ {
+ Z_DiagRecs *dr = diagrecs (assoc, bsrr->errcode, bsrr->errstring);
+ res->diagnostics = dr->diagRecs;
+ res->num_diagnostics = dr->num_diagRecs;
+ }
+ else
+ {
+ res->num_diagnostics = 0;
+ res->diagnostics = 0;
+ }
+ res->otherInfo = 0;
+
+ apdu->which = Z_APDU_sortResponse;
+ apdu->u.sortResponse = res;
+ return apdu;
+}
+
+static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
+ int *fd)
+{
+ Z_DeleteResultSetRequest *req =
+ reqb->apdu_request->u.deleteResultSetRequest;
+ Z_DeleteResultSetResponse *res = (Z_DeleteResultSetResponse *)
+ odr_malloc (assoc->encode, sizeof(*res));
+ bend_delete_rr *bdrr = (bend_delete_rr *)
+ odr_malloc (assoc->encode, sizeof(*bdrr));
+ Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
+
+ yaz_log(LOG_LOG, "Got DeleteRequest.");
+
+ bdrr->num_setnames = req->num_resultSetList;
+ bdrr->setnames = req->resultSetList;
+ bdrr->stream = assoc->encode;
+ bdrr->print = assoc->print;
+ bdrr->function = *req->deleteFunction;
+ bdrr->referenceId = req->referenceId;
+ bdrr->statuses = 0;
+ if (bdrr->num_setnames > 0)
+ {
+ int i;
+ 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;
+ }
+ (*assoc->init->bend_delete)(assoc->backend, bdrr);
+
+ res->referenceId = req->referenceId;
+
+ res->deleteOperationStatus = odr_intdup(assoc->encode,bdrr->delete_status);
+
+ res->deleteListStatuses = 0;
+ if (bdrr->num_setnames > 0)
+ {
+ int i;
+ res->deleteListStatuses = (Z_ListStatuses *)
+ odr_malloc(assoc->encode, sizeof(*res->deleteListStatuses));
+ res->deleteListStatuses->num = bdrr->num_setnames;
+ res->deleteListStatuses->elements =
+ (Z_ListStatus **)
+ odr_malloc (assoc->encode,
+ sizeof(*res->deleteListStatuses->elements) *
+ bdrr->num_setnames);
+ for (i = 0; i<bdrr->num_setnames; i++)
+ {
+ res->deleteListStatuses->elements[i] =
+ (Z_ListStatus *)
+ odr_malloc (assoc->encode,
+ sizeof(**res->deleteListStatuses->elements));
+ res->deleteListStatuses->elements[i]->status = bdrr->statuses+i;
+ res->deleteListStatuses->elements[i]->id =
+ odr_strdup (assoc->encode, bdrr->setnames[i]);
+
+ }