+ // copy all records if existing
+ if (pr->records && pr->records->which == Z_Records_DBOSD)
+ {
+ // srw'fy number of returned records
+ sru_res->num_records
+ = pr->records->u.databaseOrSurDiagnostics->num_records;
+
+ sru_res->records
+ = (Z_SRW_record *) odr_malloc(odr_en,
+ sru_res->num_records
+ * sizeof(Z_SRW_record));
+
+
+ // srw'fy nextRecordPosition
+ // next position never zero or behind the last z3950 record
+ if (pr->nextResultSetPosition
+ && *(pr->nextResultSetPosition) > 0
+ && *(pr->nextResultSetPosition)
+ <= *(sru_pdu_res->u.response->numberOfRecords))
+ sru_res->nextRecordPosition
+ = odr_intdup(odr_en, *(pr->nextResultSetPosition));
+
+ // inserting all records
+ for (int i = 0; i < sru_res->num_records; i++)
+ {
+ int position = i + *apdu->u.presentRequest->resultSetStartPoint;
+ Z_NamePlusRecord *npr
+ = pr->records->u.databaseOrSurDiagnostics->records[i];
+
+ sru_res->records[i].recordPacking = record_packing;
+
+ if (npr->which == Z_NamePlusRecord_databaseRecord &&
+ npr->u.databaseRecord->direct_reference
+ && !oid_oidcmp(npr->u.databaseRecord->direct_reference,
+ yaz_oid_recsyn_xml))
+ {
+ // got XML record back
+ Z_External *r = npr->u.databaseRecord;
+ sru_res->records[i].recordPosition =
+ odr_intdup(odr_en, position);
+ sru_res->records[i].recordSchema = sr_req->recordSchema;
+ sru_res->records[i].recordData_buf
+ = odr_strdupn(odr_en,
+ (const char *)r->u.octet_aligned->buf,
+ r->u.octet_aligned->len);
+ sru_res->records[i].recordData_len
+ = r->u.octet_aligned->len;
+ }
+ else
+ {
+ // not XML or no database record at all
+ yaz_mk_sru_surrogate(
+ odr_en, sru_res->records + i, position,
+ YAZ_SRW_RECORD_NOT_AVAILABLE_IN_THIS_SCHEMA, 0);
+ }
+ }
+ }
+
+ return true;
+}
+
+bool
+yf::SRUtoZ3950::Impl::z3950_scan_request(mp::Package &package,
+ mp::odr &odr_en,
+ Z_SRW_PDU *sru_pdu_res,
+ Z_SRW_scanRequest const *sr_req) const
+{
+ assert(sru_pdu_res->u.scan_response);
+
+ Package z3950_package(package.session(), package.origin());
+ z3950_package.copy_filter(package);
+ //mp::odr odr_en(ODR_ENCODE);
+ Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_scanRequest);
+
+ //TODO: add stuff in apdu
+ Z_ScanRequest *z_scanRequest = apdu->u.scanRequest;
+
+ // database repackaging
+ z_scanRequest->num_databaseNames = 1;
+ z_scanRequest->databaseNames = (char**)
+ odr_malloc(odr_en, sizeof(char *));
+ if (sr_req->database)
+ z_scanRequest->databaseNames[0]
+ = odr_strdup(odr_en, const_cast<char *>(sr_req->database));
+ else
+ z_scanRequest->databaseNames[0]
+ = odr_strdup(odr_en, "Default");
+
+
+ // query repackaging
+ // CQL or XCQL scan is not possible in Z3950, flagging a diagnostic
+ if (sr_req->query_type != Z_SRW_query_type_pqf)
+ {
+ //send_to_srw_client_error(7, "query");
+ return false;
+ }
+
+ // PQF query repackaging
+ // need to use Z_AttributesPlusTerm structure, not Z_Query
+ // this can be digget out of a
+ // Z_query->type1(Z_RPNQuery)->RPNStructure(Z_RPNStructure)
+ // ->u.simple(Z_Operand)->u.attributesPlusTerm(Z_AttributesPlusTerm )
+
+ //Z_Query *z_query = (Z_Query *) odr_malloc(odr_en, sizeof(Z_Query));
+ //z_searchRequest->query = z_query;
+
+ //if (!z3950_build_query(odr_en, z_query,
+ // (const SRW_query&)sr_req->query,
+ // sr_req->query_type))
+ //{
+ //send_to_srw_client_error(7, "query");
+ // return false;
+ //}
+
+ // TODO:
+
+ z3950_package.request() = apdu;
+ std::cout << "z3950_scan_request " << *apdu << "\n";
+
+ z3950_package.move();
+ //TODO: check success condition
+ return true;
+ return false;