X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Ffilter_backend_test.cpp;h=e025cf9429c483983e1224f79b2416c13777aa28;hb=a0158b296868f0ebccd31910eed80f2a2f5878cc;hp=e7d222fb4e71b6c3a0dad06f5e84a86eaa6cddc2;hpb=614429c1f7eb3f66e6100352dce77ddfa31a6d58;p=metaproxy-moved-to-github.git diff --git a/src/filter_backend_test.cpp b/src/filter_backend_test.cpp index e7d222f..e025cf9 100644 --- a/src/filter_backend_test.cpp +++ b/src/filter_backend_test.cpp @@ -1,5 +1,5 @@ -/* $Id: filter_backend_test.cpp,v 1.20 2006-09-28 11:56:54 marc Exp $ - Copyright (c) 2005-2006, Index Data. +/* $Id: filter_backend_test.cpp,v 1.23 2007-03-08 09:38:31 adam Exp $ + Copyright (c) 2005-2007, Index Data. See the LICENSE file for details */ @@ -37,6 +37,7 @@ namespace metaproxy_1 { Z_Records *fetch( ODR odr, Odr_oid *preferredRecordSyntax, + Z_ElementSetNames *esn, int start, int number, int &error_code, std::string &addinfo, int *number_returned, int *next_position); @@ -86,11 +87,13 @@ yf::BackendTest::~BackendTest() { Z_Records *yf::BackendTest::Rep::fetch( ODR odr, Odr_oid *preferredRecordSyntax, + Z_ElementSetNames *esn, int start, int number, int &error_code, std::string &addinfo, int *number_returned, int *next_position) { oident *prefformat; oid_value form; + const char *element_set_name = "F"; // default to use if (number + start - 1 > result_set_size || start < 1) { @@ -105,13 +108,40 @@ Z_Records *yf::BackendTest::Rep::fetch( switch(form) { case VAL_NONE: + form = VAL_USMARC; + break; case VAL_USMARC: + case VAL_TEXT_XML: break; default: error_code = YAZ_BIB1_RECORD_SYNTAX_UNSUPP; return 0; } - + + // no element set, "B" and "F" are supported + if (esn) + { + if (esn->which != Z_ElementSetNames_generic) + { + error_code + = YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_; + return 0; + } + element_set_name = esn->u.generic; + } + if (!strcmp(element_set_name, "B") && form == VAL_USMARC) + ; // Brief + else if (!strcmp(element_set_name, "F") && form == VAL_USMARC) + ; // Full + else if (!strncmp(element_set_name, "FF", 2) && form == VAL_TEXT_XML) + ; // Huge XML test record + else + { + error_code + = YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_; + addinfo = std::string(element_set_name); + return 0; + } Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records)); rec->which = Z_Records_DBOSD; rec->u.databaseOrSurDiagnostics = (Z_NamePlusRecordList *) @@ -128,12 +158,31 @@ Z_Records *yf::BackendTest::Rep::fetch( npr->databaseName = 0; npr->which = Z_NamePlusRecord_databaseRecord; - char *tmp_rec = odr_strdup(odr, marc_record); - char offset_str[30]; - sprintf(offset_str, "test__%09d_", i+start); - memcpy(tmp_rec+186, offset_str, strlen(offset_str)); - npr->u.databaseRecord = z_ext_record(odr, VAL_USMARC, - tmp_rec, strlen(tmp_rec)); + if (!strncmp(element_set_name, "FF", 2)) + { // Huge XML test record + size_t sz = 1024; + if (element_set_name[2]) + sz = atoi(element_set_name+2) * 1024; + if (sz < 10) + sz = 10; + char *tmp_rec = (char*) xmalloc(sz); + + memset(tmp_rec, 'a', sz); + memcpy(tmp_rec, "", 3); + memcpy(tmp_rec + sz - 4, "", 4); + + npr->u.databaseRecord = z_ext_record(odr, VAL_TEXT_XML, tmp_rec, sz); + xfree(tmp_rec); + } + else + { + char *tmp_rec = odr_strdup(odr, marc_record); + char offset_str[30]; + sprintf(offset_str, "test__%09d_", i+start); + memcpy(tmp_rec+186, offset_str, strlen(offset_str)); + npr->u.databaseRecord = z_ext_record(odr, VAL_USMARC, + tmp_rec, strlen(tmp_rec)); + } } *number_returned = number; @@ -218,15 +267,20 @@ void yf::BackendTest::process(Package &package) const int number = 0; mp::util::piggyback(*req->smallSetUpperBound, - *req->largeSetLowerBound, - *req->mediumSetPresentNumber, - result_set_size, - number); - - if (number) - { + *req->largeSetLowerBound, + *req->mediumSetPresentNumber, + result_set_size, + number); + + if (number) + { // not a large set for sure + Z_ElementSetNames *esn; + if (number > *req->smallSetUpperBound) + esn = req->mediumSetElementSetNames; + else + esn = req->smallSetElementSetNames; records = m_p->fetch( - odr, req->preferredRecordSyntax, + odr, req->preferredRecordSyntax, esn, 1, number, error_code, addinfo, &number_returned, @@ -259,8 +313,25 @@ void yf::BackendTest::process(Package &package) const int next_position = 0; int error_code = 0; std::string addinfo; + Z_ElementSetNames *esn = 0; + + if (req->recordComposition) + { + if (req->recordComposition->which == Z_RecordComp_simple) + esn = req->recordComposition->u.simple; + else + { + apdu_res = + odr.create_presentResponse( + apdu_req, + YAZ_BIB1_ONLY_A_SINGLE_ELEMENT_SET_NAME_SUPPORTED, + 0); + package.response() = apdu_res; + return; + } + } Z_Records *records = m_p->fetch( - odr, req->preferredRecordSyntax, + odr, req->preferredRecordSyntax, esn, *req->resultSetStartPoint, *req->numberOfRecordsRequested, error_code, addinfo, &number_returned,