Added cs_get_SSL. yaz-client-ssl prints peer info
[yaz-moved-to-github.git] / src / zoom-c.c
index 401f658..b5241f3 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 2000-2004, Index Data
  * See the file LICENSE for details.
  *
- * $Id: zoom-c.c,v 1.23 2004-02-11 13:37:17 adam Exp $
+ * $Id: zoom-c.c,v 1.26 2004-04-06 17:47:24 adam Exp $
  *
  * ZOOM layer for C, connections, result sets, queries.
  */
@@ -199,6 +199,10 @@ void ZOOM_connection_remove_task (ZOOM_connection c)
         case ZOOM_TASK_PACKAGE:
             ZOOM_package_destroy (task->u.package);
             break;
+       case ZOOM_TASK_SORT:
+           ZOOM_resultset_destroy (task->u.sort.resultset);
+           ZOOM_query_destroy(task->u.sort.q);
+           break;
        default:
            assert (0);
        }
@@ -508,6 +512,7 @@ void ZOOM_resultset_addref (ZOOM_resultset r)
                  r, r->refcount);
     }
 }
+
 ZOOM_resultset ZOOM_resultset_create ()
 {
     ZOOM_resultset r = (ZOOM_resultset) xmalloc (sizeof(*r));
@@ -605,6 +610,62 @@ ZOOM_connection_search(ZOOM_connection c, ZOOM_query q)
 }
 
 ZOOM_API(void)
+    ZOOM_resultset_sort(ZOOM_resultset r,
+                       const char *sort_type, const char *sort_spec)
+{
+    ZOOM_connection c = r->connection;
+    ZOOM_task task;
+
+    if (!c)
+       return;
+
+    if (c->host_port && c->proto == PROTO_HTTP)
+    {
+        if (!c->cs)
+        {
+            yaz_log(LOG_DEBUG, "NO COMSTACK");
+            ZOOM_connection_add_task(c, ZOOM_TASK_CONNECT);
+        }
+        else
+        {
+            yaz_log(LOG_DEBUG, "PREPARE FOR RECONNECT");
+            c->reconnect_ok = 1;
+        }
+    }
+    
+    ZOOM_resultset_cache_reset(r);
+    task = ZOOM_connection_add_task (c, ZOOM_TASK_SORT);
+    task->u.sort.resultset = r;
+    task->u.sort.q = ZOOM_query_create();
+    ZOOM_query_sortby(task->u.sort.q, sort_spec);
+
+    ZOOM_resultset_addref (r);  
+
+    if (!c->async)
+    {
+       while (ZOOM_event (1, &c))
+           ;
+    }
+}
+
+ZOOM_API(void)
+    ZOOM_resultset_cache_reset(ZOOM_resultset r)
+{
+    ZOOM_record_cache rc;
+    
+    for (rc = r->record_cache; rc; rc = rc->next)
+    {
+       if (rc->rec.wrbuf_marc)
+           wrbuf_free (rc->rec.wrbuf_marc, 1);
+       if (rc->rec.wrbuf_iconv)
+           wrbuf_free (rc->rec.wrbuf_iconv, 1);
+       if (rc->rec.wrbuf_opac)
+           wrbuf_free (rc->rec.wrbuf_opac, 1);
+    }
+    r->record_cache = 0;
+}
+
+ZOOM_API(void)
 ZOOM_resultset_destroy(ZOOM_resultset r)
 {
     if (!r)
@@ -614,17 +675,8 @@ ZOOM_resultset_destroy(ZOOM_resultset r)
              r, r->refcount);
     if (r->refcount == 0)
     {
-        ZOOM_record_cache rc;
+       ZOOM_resultset_cache_reset(r);
 
-        for (rc = r->record_cache; rc; rc = rc->next)
-       {
-            if (rc->rec.wrbuf_marc)
-                wrbuf_free (rc->rec.wrbuf_marc, 1);
-            if (rc->rec.wrbuf_iconv)
-                wrbuf_free (rc->rec.wrbuf_iconv, 1);
-            if (rc->rec.wrbuf_opac)
-                wrbuf_free (rc->rec.wrbuf_opac, 1);
-       }
        if (r->connection)
        {
            /* remove ourselves from the resultsets in connection */
@@ -935,7 +987,7 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c)
        ZOOM_options_get(c->options, "implementationName"),
        odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName));
 
-    version = odr_strdup(c->odr_out, "$Revision: 1.23 $");
+    version = odr_strdup(c->odr_out, "$Revision: 1.26 $");
     if (strlen(version) > 10)  /* check for unexpanded CVS strings */
        version[strlen(version)-2] = '\0';
     ireq->implementationVersion = odr_prepend(c->odr_out,
@@ -1537,21 +1589,23 @@ ZOOM_record_get (ZOOM_record rec, const char *type_spec, int *len)
            i++;
        if (!strncmp(type_spec+i, "charset=", 8))
        {
-           cp = type_spec+i+8;
-           for (i = 0; cp[i] && i < sizeof(charset)-1; i++)
+           int j = 0;
+           i = i + 8; /* skip charset= */
+           for (j = 0; type_spec[i]  && j < sizeof(charset)-1; i++, j++)
            {
-               if (cp[i] == ';' || cp[i] == ' ')
+               if (type_spec[i] == ';' || type_spec[i] == ' ')
                    break;
-               charset[i] = cp[i];
+               charset[j] = cp[i];
            }
-           charset[i] = '\0';
+           charset[j] = '\0';
        }
        else if (!strncmp(type_spec+i, "xpath=", 6))
        {
-           cp = type_spec+i+6;
-           for (i = 0; cp[i] && i < sizeof(xpath)-1; i++)
-               xpath[i] = cp[i];
-           xpath[i] = '\0';
+           int j = 0; 
+           i = i + 6;
+           for (j = 0; type_spec[i] && j < sizeof(xpath)-1; i++, j++)
+               xpath[j] = cp[i];
+           xpath[j] = '\0';
        } 
        while (type_spec[i] == ' ')
            i++;
@@ -1949,20 +2003,11 @@ static int scan_response (ZOOM_connection c, Z_ScanResponse *res)
     return 1;
 }
 
-static zoom_ret send_sort (ZOOM_connection c)
+static zoom_ret send_sort (ZOOM_connection c,
+                          ZOOM_resultset resultset)
 {
-    ZOOM_resultset  resultset;
-
-    if (!c->tasks || c->tasks->which != ZOOM_TASK_SEARCH)
-       return zoom_complete;
-
-    resultset = c->tasks->u.search.resultset;
-
     if (c->error)
-    {
        resultset->r_sort_spec = 0;
-       return zoom_complete;
-    }
     if (resultset->r_sort_spec)
     {
        Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_sortRequest);
@@ -2740,6 +2785,11 @@ static int ZOOM_connection_exec_task (ZOOM_connection c)
             break;
         case ZOOM_TASK_PACKAGE:
             ret = send_package(c);
+           break;
+       case ZOOM_TASK_SORT:
+           c->tasks->u.sort.resultset->r_sort_spec = 
+               c->tasks->u.sort.q->sort_spec;
+           ret = send_sort(c, c->tasks->u.sort.resultset);
             break;
         }
     }
@@ -2760,7 +2810,10 @@ static int ZOOM_connection_exec_task (ZOOM_connection c)
 
 static zoom_ret send_sort_present (ZOOM_connection c)
 {
-    zoom_ret r = send_sort (c);
+    zoom_ret r = zoom_complete;
+
+    if (c->tasks && c->tasks->which == ZOOM_TASK_SEARCH)
+       r = send_sort (c, c->tasks->u.search.resultset);
     if (r == zoom_complete)
        r = send_present (c);
     return r;
@@ -2967,14 +3020,14 @@ static void handle_srw_response(ZOOM_connection c,
     }
     if (res->num_diagnostics > 0)
     {
-       const char *code = res->diagnostics[0].code;
-       if (code)
+       const char *uri = res->diagnostics[0].uri;
+       if (uri)
        {
-           int code_int = 0;   
+           int code = 0;       
            const char *cp;
-           if ((cp = strrchr(code, '/')))
-               code_int = atoi(cp+1);
-           set_dset_error(c, code_int, code,
+           if ((cp = strrchr(uri, '/')))
+               code = atoi(cp+1);
+           set_dset_error(c, code, uri,
                           res->diagnostics[0].details, 0);
        }
     }