- // So we use present always (0 &&).
- if (0 && start <= 1) // Z39.50 piggyback
- {
- *z_searchRequest->smallSetUpperBound = max;
- *z_searchRequest->mediumSetPresentNumber = max;
- *z_searchRequest->largeSetLowerBound = 2000000000; // 2e9
-
- z_searchRequest->preferredRecordSyntax =
- yaz_oidval_to_z3950oid(m_s2z_odr_search, CLASS_RECSYN,
- VAL_TEXT_XML);
- if (srw_req->recordSchema)
- {
- z_searchRequest->smallSetElementSetNames =
- z_searchRequest->mediumSetElementSetNames =
- mk_esn_from_schema(m_s2z_odr_search,
- srw_req->recordSchema);
- }
- }
- else // Z39.50 present
- {
- m_s2z_present_apdu = zget_APDU(m_s2z_odr_search,
- Z_APDU_presentRequest);
- Z_PresentRequest *z_presentRequest =
- m_s2z_present_apdu->u.presentRequest;
- *z_presentRequest->resultSetStartPoint = start;
- *z_presentRequest->numberOfRecordsRequested = max;
- z_presentRequest->preferredRecordSyntax =
- yaz_oidval_to_z3950oid(m_s2z_odr_search, CLASS_RECSYN,
- VAL_TEXT_XML);
- if (srw_req->recordSchema)
- {
- z_presentRequest->recordComposition =
- (Z_RecordComposition *)
- odr_malloc(m_s2z_odr_search,
- sizeof(Z_RecordComposition));
- z_presentRequest->recordComposition->which =
- Z_RecordComp_simple;
- z_presentRequest->recordComposition->u.simple =
- mk_esn_from_schema(m_s2z_odr_search,
- srw_req->recordSchema);
- }
- }
- }
- if (!m_client)
- {
- m_s2z_init_apdu = zget_APDU(m_s2z_odr_init,
- Z_APDU_initRequest);
-
- // prevent m_initRequest_apdu memory from being grabbed
- // in Yaz_Proxy::handle_incoming_Z_PDU
- m_initRequest_apdu = m_s2z_init_apdu;
- handle_incoming_Z_PDU(m_s2z_init_apdu);
- return;
- }
- else
- {
- handle_incoming_Z_PDU(m_s2z_search_apdu);
- return;
- }
- }
- else if (srw_pdu->which == Z_SRW_explain_request)
- {
- Z_SRW_explainRequest *srw_req = srw_pdu->u.explain_request;
-
- const char *backend_db = srw_req->database;
- srw_get_client(srw_req->database, &backend_db);
-
- m_s2z_database = odr_strdup(m_s2z_odr_init, srw_req->database);
-
- // save stylesheet
- if (srw_req->stylesheet)
- m_s2z_stylesheet =
- odr_strdup(m_s2z_odr_init, srw_req->stylesheet);
-
- if (srw_req->recordPacking &&
- !strcmp(srw_req->recordPacking, "xml"))
- m_s2z_packing = Z_SRW_recordPacking_XML;
- else
- m_s2z_packing = Z_SRW_recordPacking_string;
-
- if (num_diagnostic)
- {
- send_srw_explain_response(diagnostic, num_diagnostic);
- return;
- }
-
- if (!m_client)
- {
- m_s2z_init_apdu = zget_APDU(m_s2z_odr_init,
- Z_APDU_initRequest);
-
- // prevent m_initRequest_apdu memory from being grabbed
- // in Yaz_Proxy::handle_incoming_Z_PDU
- m_initRequest_apdu = m_s2z_init_apdu;
- handle_incoming_Z_PDU(m_s2z_init_apdu);
- }
- else
- send_srw_explain_response(0, 0);
- return;
- }
- else if (srw_pdu->which == Z_SRW_scan_request)
- {
- m_s2z_database = odr_strdup(m_s2z_odr_init,
- srw_pdu->u.scan_request->database);
-
- yaz_add_srw_diagnostic(odr_decode(),
- &diagnostic, &num_diagnostic,
- 4, "scan");
- Z_SRW_PDU *srw_pdu =
- yaz_srw_get(odr_encode(),
- Z_SRW_scan_response);
- Z_SRW_scanResponse *srw_res = srw_pdu->u.scan_response;
-
- srw_res->diagnostics = diagnostic;
- srw_res->num_diagnostics = num_diagnostic;
- send_srw_response(srw_pdu);
- return;
- }
- else
- {
- m_s2z_database = 0;
-
- send_to_srw_client_error(4, 0);
+ // So we use present always (0 &&).
+ if (0 && start <= 1) // Z39.50 piggyback
+ {
+ *z_searchRequest->smallSetUpperBound = max;
+ *z_searchRequest->mediumSetPresentNumber = max;
+ *z_searchRequest->largeSetLowerBound = 2000000000; // 2e9
+
+ z_searchRequest->preferredRecordSyntax =
+ odr_oiddup(m_s2z_odr_search, yaz_oid_recsyn_xml);
+
+ if (srw_req->recordSchema)
+ {
+ z_searchRequest->smallSetElementSetNames =
+ z_searchRequest->mediumSetElementSetNames =
+ mk_esn_from_schema(m_s2z_odr_search,
+ srw_req->recordSchema);
+ }
+ }
+ else // Z39.50 present
+ {
+ m_s2z_present_apdu = zget_APDU(m_s2z_odr_search,
+ Z_APDU_presentRequest);
+ Z_PresentRequest *z_presentRequest =
+ m_s2z_present_apdu->u.presentRequest;
+ *z_presentRequest->resultSetStartPoint = start;
+ *z_presentRequest->numberOfRecordsRequested = max;
+
+ z_presentRequest->preferredRecordSyntax =
+ odr_oiddup(m_s2z_odr_search, yaz_oid_recsyn_xml);
+ if (srw_req->recordSchema)
+ {
+ z_presentRequest->recordComposition =
+ (Z_RecordComposition *)
+ odr_malloc(m_s2z_odr_search,
+ sizeof(Z_RecordComposition));
+ z_presentRequest->recordComposition->which =
+ Z_RecordComp_simple;
+ z_presentRequest->recordComposition->u.simple =
+ mk_esn_from_schema(m_s2z_odr_search,
+ srw_req->recordSchema);
+ }
+ }
+ }
+ if (!m_client)
+ {
+ m_s2z_init_apdu = zget_APDU(m_s2z_odr_init,
+ Z_APDU_initRequest);
+
+ ODR_MASK_SET(m_s2z_init_apdu->u.initRequest->options, Z_Options_scan);
+ m_s2z_init_apdu->u.initRequest->idAuthentication = auth;
+
+ // prevent m_initRequest_apdu memory from being grabbed
+ // in Yaz_Proxy::handle_incoming_Z_PDU
+ m_initRequest_apdu = m_s2z_init_apdu;
+ handle_incoming_Z_PDU(m_s2z_init_apdu);
+ return;
+ }
+ else
+ {
+ handle_incoming_Z_PDU(m_s2z_search_apdu);
+ return;
+ }
+ }
+ else if (srw_pdu->which == Z_SRW_explain_request)
+ {
+ Z_SRW_explainRequest *srw_req = srw_pdu->u.explain_request;
+
+ const char *backend_db = srw_req->database;
+ srw_get_client(srw_req->database, &backend_db);
+
+ m_s2z_database = odr_strdup(m_s2z_odr_init, srw_req->database);
+
+ // save stylesheet
+ if (srw_req->stylesheet)
+ m_s2z_stylesheet =
+ odr_strdup(m_s2z_odr_init, srw_req->stylesheet);
+
+ if (srw_req->recordPacking &&
+ !strcmp(srw_req->recordPacking, "xml"))
+ m_s2z_packing = Z_SRW_recordPacking_XML;
+ else
+ m_s2z_packing = Z_SRW_recordPacking_string;
+
+ if (num_diagnostic)
+ {
+ send_srw_explain_response(diagnostic, num_diagnostic);
+ return;
+ }
+
+ if (!m_client)
+ {
+ m_s2z_init_apdu = zget_APDU(m_s2z_odr_init,
+ Z_APDU_initRequest);
+
+ ODR_MASK_SET(m_s2z_init_apdu->u.initRequest->options, Z_Options_scan);
+ m_s2z_init_apdu->u.initRequest->idAuthentication = auth;
+
+ // prevent m_initRequest_apdu memory from being grabbed
+ // in Yaz_Proxy::handle_incoming_Z_PDU
+ m_initRequest_apdu = m_s2z_init_apdu;
+ handle_incoming_Z_PDU(m_s2z_init_apdu);
+ }
+ else
+ send_srw_explain_response(0, 0);
+ return;
+ }
+ else if (srw_pdu->which == Z_SRW_scan_request)
+ {
+ Z_SRW_scanRequest *srw_req = srw_pdu->u.scan_request;
+
+ const char *backend_db = srw_req->database;
+ srw_get_client(srw_req->database, &backend_db);
+
+ m_s2z_database = odr_strdup(m_s2z_odr_init,
+ srw_req->database);
+ // save stylesheet
+ if (srw_req->stylesheet)
+ m_s2z_stylesheet =
+ odr_strdup(m_s2z_odr_init, srw_req->stylesheet);
+
+ // prepare scan PDU
+ m_s2z_scan_apdu = zget_APDU(m_s2z_odr_scan,
+ Z_APDU_scanRequest);
+ Z_ScanRequest *z_scanRequest =
+ m_s2z_scan_apdu->u.scanRequest;
+
+ z_scanRequest->num_databaseNames = 1;
+ z_scanRequest->databaseNames = (char**)
+ odr_malloc(m_s2z_odr_scan, sizeof(char *));
+ z_scanRequest->databaseNames[0] = odr_strdup(m_s2z_odr_scan,
+ backend_db);
+
+ // query transformation
+ if (srw_req->query_type == Z_SRW_query_type_cql)
+ {
+ z_scanRequest->termListAndStartPoint =
+ (Z_AttributesPlusTerm *)odr_malloc(m_s2z_odr_scan, sizeof(Z_AttributesPlusTerm));
+ z_scanRequest->termListAndStartPoint->attributes = NULL;
+ z_scanRequest->termListAndStartPoint->term =
+ (Z_Term *)odr_malloc(m_s2z_odr_scan, sizeof(Z_Term));
+ z_scanRequest->termListAndStartPoint->term->which =
+ Z_Term_characterString;
+ z_scanRequest->termListAndStartPoint->term->u.characterString =
+ odr_strdup(m_s2z_odr_scan, srw_req->scanClause.cql);
+ }
+
+ if (srw_req->responsePosition)
+ z_scanRequest->preferredPositionInResponse =
+ odr_intdup(m_s2z_odr_scan, *srw_req->responsePosition);
+ if (srw_req->maximumTerms)
+ *z_scanRequest->numberOfTermsRequested = *srw_req->maximumTerms;
+
+ if (!m_client)
+ {
+ m_s2z_init_apdu = zget_APDU(m_s2z_odr_init,
+ Z_APDU_initRequest);
+
+ ODR_MASK_SET(m_s2z_init_apdu->u.initRequest->options, Z_Options_scan);
+ m_s2z_init_apdu->u.initRequest->idAuthentication = auth;
+
+ // prevent m_initRequest_apdu memory from being grabbed
+ // in Yaz_Proxy::handle_incoming_Z_PDU
+ m_initRequest_apdu = m_s2z_init_apdu;
+ handle_incoming_Z_PDU(m_s2z_init_apdu);
+ return;
+ }
+ else
+ {
+ handle_incoming_Z_PDU(m_s2z_scan_apdu);
+ return;
+ }
+ }
+ else
+ {
+ m_s2z_database = 0;
+
+ send_to_srw_client_error(4, 0);