yaz-marcdump may dump raw records separately using -s splitfname option
[yaz-moved-to-github.git] / src / zoom-c.c
index 3e5c65e..6b1d409 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: zoom-c.c,v 1.48 2005-11-01 15:08:02 adam Exp $
+ * $Id: zoom-c.c,v 1.55 2005-12-12 12:02:04 mike Exp $
  */
 /**
  * \file zoom-c.c
@@ -388,6 +388,37 @@ ZOOM_connection_connect(ZOOM_connection c,
     else
         c->host_port = xstrdup(host);
 
+    {
+        /*
+         * If the "<scheme>:" part of the host string is preceded by one
+         * or more comma-separated <name>=<value> pairs, these are taken
+         * to be options to be set on the connection object.  Among other
+         * applications, this facility can be used to embed authentication
+         * in a host string:
+         *          user=admin,password=secret,tcp:localhost:9999
+         */
+        char *remainder = c->host_port;
+        char *pcolon = strchr(remainder, ':');
+        char *pcomma;
+        char *pequals;
+        while ((pcomma = strchr(remainder, ',')) != 0 &&
+               (pcolon == 0 || pcomma < pcolon)) {
+            *pcomma = '\0';
+            if ((pequals = strchr(remainder, '=')) != 0) {
+                *pequals = '\0';
+                /*printf("# setting '%s'='%s'\n", remainder, pequals+1);*/
+                ZOOM_connection_option_set(c, remainder, pequals+1);
+            }
+            remainder = pcomma+1;
+        }
+
+        if (remainder != c->host_port) {
+            xfree(c->host_port);
+            c->host_port = xstrdup(remainder);
+            /*printf("# reset hp='%s'\n", remainder);*/
+        }
+    }
+
     ZOOM_options_set(c->options, "host", c->host_port);
 
     val = ZOOM_options_get (c->options, "cookie");
@@ -644,17 +675,34 @@ ZOOM_connection_search(ZOOM_connection c, ZOOM_query q)
     return r;
 }
 
+/*
+ * This is the old result-set sorting API, which is maintained only
+ * for the sake of binary compatibility.  There is no reason ever to
+ * use this rather than ZOOM_resultset_sort1().
+ */
 ZOOM_API(void)
-    ZOOM_resultset_sort(ZOOM_resultset r,
-                        const char *sort_type, const char *sort_spec)
+ZOOM_resultset_sort(ZOOM_resultset r,
+                    const char *sort_type, const char *sort_spec)
+{
+    (void) ZOOM_resultset_sort1(r, sort_type, sort_spec);
+}
+
+ZOOM_API(int)
+ZOOM_resultset_sort1(ZOOM_resultset r,
+                     const char *sort_type, const char *sort_spec)
 {
     ZOOM_connection c = r->connection;
     ZOOM_task task;
+    ZOOM_query newq;
+
+    newq = ZOOM_query_create();
+    if (ZOOM_query_sortby(newq, sort_spec) < 0)
+        return -1;
 
     yaz_log(log_api, "%p ZOOM_resultset_sort r=%p sort_type=%s sort_spec=%s",
             r, r, sort_type, sort_spec);
     if (!c)
-        return;
+        return 0;
 
     if (c->host_port && c->proto == PROTO_HTTP)
     {
@@ -674,8 +722,7 @@ ZOOM_API(void)
     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);
+    task->u.sort.q = newq;
 
     ZOOM_resultset_addref (r);  
 
@@ -684,6 +731,8 @@ ZOOM_API(void)
         while (ZOOM_event (1, &c))
             ;
     }
+
+    return 0;
 }
 
 ZOOM_API(void)
@@ -1045,7 +1094,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.48 $");
+    version = odr_strdup(c->odr_out, "$Revision: 1.55 $");
     if (strlen(version) > 10)   /* check for unexpanded CVS strings */
         version[strlen(version)-2] = '\0';
     ireq->implementationVersion = odr_prepend(c->odr_out,
@@ -2082,7 +2131,7 @@ static void handle_searchResult(ZOOM_connection c, ZOOM_resultset resultset,
                 
                 if (sr->num)
                     ZOOM_options_set_int(
-                        resultset->options, "SearchResult.size", sr->num);
+                        resultset->options, "searchresult.size", sr->num);
 
                 for (j = 0; j < sr->num; j++)
                 {
@@ -2090,12 +2139,12 @@ static void handle_searchResult(ZOOM_connection c, ZOOM_resultset resultset,
                         ext->u.searchResult1->elements[j];
                     char pref[80];
                     
-                    sprintf(pref, "SearchResult.%d", j);
+                    sprintf(pref, "searchresult.%d", j);
 
                     if (ent->subqueryId)
                     {
                         char opt_name[80];
-                        sprintf(opt_name, "%s.subqueryId", pref);
+                        sprintf(opt_name, "%s.id", pref);
                         ZOOM_options_set(resultset->options, opt_name,
                                          ent->subqueryId);
                     }
@@ -2123,7 +2172,7 @@ static void handle_searchResult(ZOOM_connection c, ZOOM_resultset resultset,
                     if (ent->subqueryCount)
                     {
                         char opt_name[80];
-                        sprintf(opt_name, "%s.subqueryCount", pref);
+                        sprintf(opt_name, "%s.count", pref);
                         ZOOM_options_set_int(resultset->options, opt_name,
                                              *ent->subqueryCount);
                     }                                             
@@ -3574,6 +3623,14 @@ ZOOM_connection_addinfo (ZOOM_connection c)
 }
 
 ZOOM_API(const char *)
+ZOOM_connection_diagset (ZOOM_connection c)
+{
+    const char *diagset;
+    ZOOM_connection_error_x (c, 0, 0, &diagset);
+    return diagset;
+}
+
+ZOOM_API(const char *)
 ZOOM_diag_str (int error)
 {
     switch (error)