326 Z_GDU *gdu_req = package.request().get();
327 Z_PresentRequest *pr_req = 0;
328 Z_SearchRequest *sr_req = 0;
330 const char *input_schema = 0;
331 Odr_oid *input_syntax = 0;
333 if (gdu_req && gdu_req->which == Z_GDU_Z3950 &&
334 gdu_req->u.z3950->which == Z_APDU_presentRequest)
336 pr_req = gdu_req->u.z3950->u.presentRequest;
339 mp_util::record_composition_to_esn(pr_req->recordComposition);
340 input_syntax = pr_req->preferredRecordSyntax;
342 else if (gdu_req && gdu_req->which == Z_GDU_Z3950 &&
343 gdu_req->u.z3950->which == Z_APDU_searchRequest)
345 sr_req = gdu_req->u.z3950->u.searchRequest;
347 input_syntax = sr_req->preferredRecordSyntax;
353 if (sr_req->smallSetElementSetNames
355 sr_req->mediumSetElementSetNames
357 sr_req->smallSetElementSetNames->which == Z_ElementSetNames_generic
359 sr_req->mediumSetElementSetNames->which == Z_ElementSetNames_generic
361 !strcmp(sr_req->smallSetElementSetNames->u.generic,
362 sr_req->mediumSetElementSetNames->u.generic))
364 input_schema = sr_req->smallSetElementSetNames->u.generic;
366 else if (*sr_req->largeSetLowerBound > 1
367 && !sr_req->smallSetElementSetNames && !sr_req->mediumSetElementSetNames)
372 *sr_req->smallSetUpperBound = 0;
373 *sr_req->largeSetLowerBound = 1;
374 *sr_req->mediumSetPresentNumber = 0;
386 mp::odr odr_en(ODR_ENCODE);
389 yaz_record_conv_t rc = 0;
391 const char *match_schema = 0;
392 Odr_oid *match_syntax = 0;
394 const char *backend_schema = 0;
395 Odr_oid *backend_syntax = 0;
399 input_schema, input_syntax,
400 &match_schema, &match_syntax,
402 &backend_schema, &backend_syntax);
407 const char *details = 0;
412 error_code = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
414 else if (ret_code == 1 || ret_code == 3)
416 details = input_schema;
417 error_code = YAZ_BIB1_ELEMENT_SET_NAMES_UNSUPP;
419 else if (ret_code == 2)
421 char oidbuf[OID_STR_MAX];
422 oid_oid_to_dotstring(input_syntax, oidbuf);
423 details = odr_strdup(odr_en, oidbuf);
424 error_code = YAZ_BIB1_RECORD_SYNTAX_UNSUPP;
428 char *tmp = (
char*) odr_malloc(odr_en, 80);
430 "record_transform: yaz_retrieval_get_error returned %d",
433 error_code = YAZ_BIB1_UNSPECIFIED_ERROR;
438 apdu = odr_en.create_searchResponse(
439 gdu_req->u.z3950, error_code, details);
443 apdu = odr_en.create_presentResponse(
444 gdu_req->u.z3950, error_code, details);
446 package.response() = apdu;
453 sr_req->preferredRecordSyntax = odr_oiddup(odr_en, backend_syntax);
455 sr_req->preferredRecordSyntax = 0;
459 sr_req->smallSetElementSetNames
460 = (Z_ElementSetNames *)
461 odr_malloc(odr_en,
sizeof(Z_ElementSetNames));
462 sr_req->smallSetElementSetNames->which = Z_ElementSetNames_generic;
463 sr_req->smallSetElementSetNames->u.generic
464 = odr_strdup(odr_en, backend_schema);
465 sr_req->mediumSetElementSetNames = sr_req->smallSetElementSetNames;
469 sr_req->smallSetElementSetNames = 0;
470 sr_req->mediumSetElementSetNames = 0;
476 pr_req->preferredRecordSyntax = odr_oiddup(odr_en, backend_syntax);
478 pr_req->preferredRecordSyntax = 0;
482 pr_req->recordComposition
483 = (Z_RecordComposition *)
484 odr_malloc(odr_en,
sizeof(Z_RecordComposition));
485 pr_req->recordComposition->which
486 = Z_RecordComp_simple;
487 pr_req->recordComposition->u.simple
488 = (Z_ElementSetNames *)
489 odr_malloc(odr_en,
sizeof(Z_ElementSetNames));
490 pr_req->recordComposition->u.simple->which = Z_ElementSetNames_generic;
491 pr_req->recordComposition->u.simple->u.generic
492 = odr_strdup(odr_en, backend_schema);
495 pr_req->recordComposition = 0;
499 package.request() = gdu_req;
503 Z_GDU *gdu_res = package.response().get();
506 Z_NamePlusRecordList *records = 0;
507 if (gdu_res && gdu_res->which == Z_GDU_Z3950 &&
508 gdu_res->u.z3950->which == Z_APDU_presentResponse)
510 Z_PresentResponse * pr_res = gdu_res->u.z3950->u.presentResponse;
513 && pr_res->numberOfRecordsReturned
514 && *(pr_res->numberOfRecordsReturned) > 0
516 && pr_res->records->which == Z_Records_DBOSD)
518 records = pr_res->records->u.databaseOrSurDiagnostics;
521 if (gdu_res && gdu_res->which == Z_GDU_Z3950 &&
522 gdu_res->u.z3950->which == Z_APDU_searchResponse)
524 Z_SearchResponse *sr_res = gdu_res->u.z3950->u.searchResponse;
527 && sr_res->numberOfRecordsReturned
528 && *(sr_res->numberOfRecordsReturned) > 0
530 && sr_res->records->which == Z_Records_DBOSD)
532 records = sr_res->records->u.databaseOrSurDiagnostics;
539 for (i = 0; i < records->num_records; i++)
541 package.response() = gdu_res;