Reformatting
[yaz-moved-to-github.git] / src / zoom-z3950.c
index bbd2e2a..9db6319 100644 (file)
@@ -1,11 +1,14 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2010 Index Data
+ * Copyright (C) 1995-2011 Index Data
  * See the file LICENSE for details.
  */
 /**
  * \file zoom-z3950.c
  * \brief Implements ZOOM Z39.50 handling
  */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <assert.h>
 #include <string.h>
@@ -321,12 +324,15 @@ static Z_APDU *create_update_package(ZOOM_package p)
                                            p->odr_out);
     }
     if (!syntax_oid)
+    { 
+        ZOOM_set_error(p->connection, ZOOM_ERROR_ES_INVALID_SYNTAX, syntax_str);
         return 0;
+    }
 
     if (num_db > 0)
         first_db = db[0];
     
-    switch(*version)
+    switch (*version)
     {
     case '1':
         package_oid = yaz_oid_extserv_database_update_first_version;
@@ -345,6 +351,7 @@ static Z_APDU *create_update_package(ZOOM_package p)
         package_oid = yaz_oid_extserv_database_update;
         break;
     default:
+        ZOOM_set_error(p->connection, ZOOM_ERROR_ES_INVALID_VERSION, version);
         return 0;
     }
     
@@ -359,7 +366,10 @@ static Z_APDU *create_update_package(ZOOM_package p)
     else if (!strcmp(action, "specialUpdate"))
         action_no = Z_IUOriginPartToKeep_specialUpdate;
     else
+    {
+        ZOOM_set_error(p->connection, ZOOM_ERROR_ES_INVALID_ACTION, action);
         return 0;
+    }
 
     apdu = create_es_package(p, package_oid);
     if (apdu)
@@ -663,10 +673,10 @@ zoom_ret ZOOM_connection_Z3950_send_search(ZOOM_connection c)
         if (facet_list) {
             Z_OtherInformation **oi;
             yaz_oi_APDU(apdu, &oi);
-            if (facet_list) {
-                yaz_oi_set_facetlist(oi, c->odr_out, facet_list);
-            }
+            yaz_oi_set_facetlist(oi, c->odr_out, facet_list);
         }
+        else
+            yaz_log(YLOG_WARN, "Unable to parse facets: %s", facets);
     }
 
     assert(r);
@@ -981,63 +991,60 @@ static void response_diag(ZOOM_connection c, Z_DiagRec *p)
 }
 
 static int es_response_taskpackage_update(ZOOM_connection c,
-               Z_IUUpdateTaskPackage *utp)
+                                          Z_IUUpdateTaskPackage *utp)
 {
-       if (utp && utp->targetPart)
-       {
-               Z_IUTargetPart *targetPart = utp->targetPart;
-               switch ( *targetPart->updateStatus ) {
-                       case Z_IUTargetPart_success:
-                               ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "success");
-                               break;
-                       case Z_IUTargetPart_partial:
-                               ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "partial");
-                               break;
-                       case Z_IUTargetPart_failure:
-                               ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "failure");
-                               if (targetPart->globalDiagnostics && targetPart->num_globalDiagnostics > 0)
-                                       response_diag(c, targetPart->globalDiagnostics[0]);
-                               break;
-               }
-               // NOTE: Individual record status, surrogate diagnostics, and supplemental diagnostics ARE NOT REPORTED.
-       }
+    if (utp && utp->targetPart)
+    {
+        Z_IUTargetPart *targetPart = utp->targetPart;
+        switch ( *targetPart->updateStatus ) {
+        case Z_IUTargetPart_success:
+            ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "success");
+            break;
+        case Z_IUTargetPart_partial:
+            ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "partial");
+            break;
+        case Z_IUTargetPart_failure:
+            ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "failure");
+            if (targetPart->globalDiagnostics && targetPart->num_globalDiagnostics > 0)
+                response_diag(c, targetPart->globalDiagnostics[0]);
+            break;
+        }
+        /* NOTE: Individual record status, surrogate diagnostics, and supplemental diagnostics ARE NOT REPORTED. */
+    }
     return 1;
 }
 
 static int es_response_taskpackage(ZOOM_connection c,
                                    Z_TaskPackage *taskPackage)
 {
-       // targetReference
-       Odr_oct *id = taskPackage->targetReference;
-       if (id)
-               ZOOM_options_setl(c->tasks->u.package->options,
-                                                       "targetReference", (char*) id->buf, id->len);
-       
-       // taskStatus
-       switch ( *taskPackage->taskStatus ) {
-               case Z_TaskPackage_pending:
-                       ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "pending");
-                       break;
-               case Z_TaskPackage_active:
-                       ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "active");
-                       break;
-               case Z_TaskPackage_complete:
-                       ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "complete");
-                       break;
-               case Z_TaskPackage_aborted:
-                       ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "aborted");
-                       if ( taskPackage->num_packageDiagnostics && taskPackage->packageDiagnostics )
-                               response_diag(c, taskPackage->packageDiagnostics[0]);
-                       break;
-       }
-       
-       // taskSpecificParameters
-       // NOTE: Only Update implemented, no others.
-       if ( taskPackage->taskSpecificParameters->which == Z_External_update ) {
-                       Z_IUUpdateTaskPackage *utp = taskPackage->taskSpecificParameters->u.update->u.taskPackage;
-                       es_response_taskpackage_update(c, utp);
-       }
-       return 1;
+    Odr_oct *id = taskPackage->targetReference;
+    if (id)
+        ZOOM_options_setl(c->tasks->u.package->options,
+                          "targetReference", (char*) id->buf, id->len);
+    
+    switch ( *taskPackage->taskStatus ) {
+    case Z_TaskPackage_pending:
+        ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "pending");
+        break;
+    case Z_TaskPackage_active:
+        ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "active");
+        break;
+    case Z_TaskPackage_complete:
+        ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "complete");
+        break;
+    case Z_TaskPackage_aborted:
+        ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "aborted");
+        if ( taskPackage->num_packageDiagnostics && taskPackage->packageDiagnostics )
+            response_diag(c, taskPackage->packageDiagnostics[0]);
+        break;
+    }
+    /* NOTE: Only Update implemented, no others. */
+    if ( taskPackage->taskSpecificParameters->which == Z_External_update )
+    {
+        Z_IUUpdateTaskPackage *utp = taskPackage->taskSpecificParameters->u.update->u.taskPackage;
+        es_response_taskpackage_update(c, utp);
+    }
+    return 1;
 }
 
 
@@ -1046,18 +1053,19 @@ static int handle_Z3950_es_response(ZOOM_connection c,
 {
     if (!c->tasks || c->tasks->which != ZOOM_TASK_PACKAGE)
         return 0;
-    switch (*res->operationStatus) {
-        case Z_ExtendedServicesResponse_done:
-            ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "done");
-            break;
-        case Z_ExtendedServicesResponse_accepted:
-            ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "accepted");
-            break;
-        case Z_ExtendedServicesResponse_failure:
-            ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "failure");
-            if (res->diagnostics && res->num_diagnostics > 0)
-                response_diag(c, res->diagnostics[0]);
-            break;
+    switch (*res->operationStatus)
+    {
+    case Z_ExtendedServicesResponse_done:
+        ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "done");
+        break;
+    case Z_ExtendedServicesResponse_accepted:
+        ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "accepted");
+        break;
+    case Z_ExtendedServicesResponse_failure:
+        ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "failure");
+        if (res->diagnostics && res->num_diagnostics > 0)
+            response_diag(c, res->diagnostics[0]);
+        break;
     }
     if (res->taskPackage &&
         res->taskPackage->which == Z_External_extendedService)
@@ -1136,6 +1144,22 @@ static ZOOM_facet_field get_zoom_facet_field(ODR odr, Z_FacetField *facet) {
     return facet_field;
 }
 
+/* Can be share with SOLR/SRU/SRW requests */
+void handle_facet_list(ZOOM_resultset r, Z_FacetList *fl) {
+    int j;
+    r->num_facets   = fl->num;
+    yaz_log(YLOG_DEBUG, "Facets found: %d", fl->num);
+    r->facets       =  odr_malloc(r->odr, r->num_facets * sizeof(*r->facets));
+    r->facets_names =  odr_malloc(r->odr, r->num_facets * sizeof(*r->facets_names));
+    for (j = 0; j < fl->num; j++)
+    {
+        r->facets[j] = get_zoom_facet_field(r->odr, fl->elements[j]);
+        if (!r->facets[j])
+            yaz_log(YLOG_DEBUG, "Facet field missing on index %d !", j);
+        r->facets_names[j] = (char *) ZOOM_facet_field_name(r->facets[j]);
+    }
+}
+
 static void handle_facet_result(ZOOM_connection c, ZOOM_resultset r,
                                 Z_OtherInformation *o)
 {
@@ -1147,19 +1171,7 @@ static void handle_facet_result(ZOOM_connection c, ZOOM_resultset r,
             Z_External *ext = o->list[i]->information.externallyDefinedInfo;
             if (ext->which == Z_External_userFacets)
             {
-                int j;
-                Z_FacetList *fl = ext->u.facetList;
-                r->num_facets   = fl->num;
-                yaz_log(YLOG_DEBUG, "Facets found: %d", fl->num);
-                r->facets       =  odr_malloc(r->odr, r->num_facets * sizeof(*r->facets));
-                r->facets_names =  odr_malloc(r->odr, r->num_facets * sizeof(*r->facets_names));
-                for (j = 0; j < fl->num; j++)
-                {
-                    r->facets[j] = get_zoom_facet_field(r->odr, fl->elements[j]);
-                    if (!r->facets[j])
-                        yaz_log(YLOG_DEBUG, "Facet field missing on index %d !", j);
-                    r->facets_names[j] = (char *) ZOOM_facet_field_name(r->facets[j]);
-                }
+                handle_facet_list(r, ext->u.facetList);
             }
         }
     }