Year 2007.
[metaproxy-moved-to-github.git] / src / filter_backend_test.cpp
index 1f60334..da2f4f5 100644 (file)
@@ -1,7 +1,7 @@
-/* $Id: filter_backend_test.cpp,v 1.16 2006-01-17 16:45:49 adam Exp $
-   Copyright (c) 2005, Index Data.
+/* $Id: filter_backend_test.cpp,v 1.22 2007-01-25 14:05:54 adam Exp $
+   Copyright (c) 2005-2007, Index Data.
 
-%LICENSE%
+   See the LICENSE file for details
  */
 
 #include "config.hpp"
 #include <yaz/otherinfo.h>
 #include <yaz/diagbib1.h>
 
-namespace yf = yp2::filter;
+namespace mp = metaproxy_1;
+namespace yf = mp::filter;
+using namespace mp;
 
-namespace yp2 {
+namespace metaproxy_1 {
     namespace filter {
         class Session_info {
             int dummy;
         };
-        class Backend_test::Rep {
-            friend class Backend_test;
+        class BackendTest::Rep {
+            friend class BackendTest;
 
             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);
 
@@ -45,7 +48,6 @@ namespace yp2 {
     }
 }
 
-using namespace yp2;
 
 static const int result_set_size = 42;
 
@@ -76,15 +78,16 @@ static const char *marc_record =
   "\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x1D";
 
 
-yf::Backend_test::Backend_test() : m_p(new Backend_test::Rep) {
+yf::BackendTest::BackendTest() : m_p(new BackendTest::Rep) {
     m_p->m_support_named_result_sets = false;
 }
 
-yf::Backend_test::~Backend_test() {
+yf::BackendTest::~BackendTest() {
 }
 
-Z_Records *yf::Backend_test::Rep::fetch(
+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)
 {
@@ -110,7 +113,25 @@ Z_Records *yf::Backend_test::Rep::fetch(
         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;
+        }
+        const char *name = esn->u.generic;
+        if (strcmp(name, "B") && strcmp(name, "F"))
+        {
+            error_code 
+                = YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
+            addinfo = std::string(name);
+            return 0;
+        }
+    }
     Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records));
     rec->which = Z_Records_DBOSD;
     rec->u.databaseOrSurDiagnostics = (Z_NamePlusRecordList *)
@@ -143,7 +164,7 @@ Z_Records *yf::Backend_test::Rep::fetch(
     return rec;
 }
 
-void yf::Backend_test::process(Package &package) const
+void yf::BackendTest::process(Package &package) const
 {
     Z_GDU *gdu = package.request().get();
 
@@ -153,7 +174,7 @@ void yf::Backend_test::process(Package &package) const
     {
         Z_APDU *apdu_req = gdu->u.z3950;
         Z_APDU *apdu_res = 0;
-        yp2::odr odr;
+        mp::odr odr;
         
         if (apdu_req->which != Z_APDU_initRequest && 
             !m_p->m_sessions.exist(package.session()))
@@ -214,30 +235,24 @@ void yf::Backend_test::process(Package &package) const
                 int next_position = 0;
                 int error_code = 0;
                 std::string addinfo;
-
-                if (result_set_size < *req->smallSetUpperBound)
-                {
-                    // small set . Return all records in set
-                    records = m_p->fetch(
-                        odr, req->preferredRecordSyntax,
-                        1, result_set_size,
-                        error_code, addinfo,
-                        &number_returned,
-                        &next_position);
-                }
-                else if (result_set_size > *req->largeSetLowerBound)
-                {
-                    // large set . Return no records
-                }
-                else
-                {
-                    // medium set .Return mediumSetPresentNumber records
-                    int to_get = *req->mediumSetPresentNumber;
-                    if (to_get > result_set_size)
-                        to_get = result_set_size;
+                
+                int number = 0;
+                mp::util::piggyback(*req->smallSetUpperBound,
+                                    *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,
-                        1, to_get,
+                        odr, req->preferredRecordSyntax, esn,
+                        1, number,
                         error_code, addinfo,
                         &number_returned,
                         &next_position);
@@ -269,8 +284,25 @@ void yf::Backend_test::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,
@@ -306,13 +338,13 @@ void yf::Backend_test::process(Package &package) const
         m_p->m_sessions.release(package.session());
 }
 
-static yp2::filter::Base* filter_creator()
+static mp::filter::Base* filter_creator()
 {
-    return new yp2::filter::Backend_test;
+    return new mp::filter::BackendTest;
 }
 
 extern "C" {
-    struct yp2_filter_struct yp2_filter_backend_test = {
+    struct metaproxy_1_filter_struct metaproxy_1_filter_backend_test = {
         0,
         "backend_test",
         filter_creator