Fix ZOOM_connection_connect SEGVs if host==NULL YAZ-746
[yaz-moved-to-github.git] / src / zoom-c.c
index 28eb798..1bbac7e 100644 (file)
@@ -361,7 +361,6 @@ ZOOM_API(void)
                             const char *host, int portnum)
 {
     const char *val;
-    const char *http_lead;
 
     initlog();
 
@@ -428,16 +427,18 @@ ZOOM_API(void)
     else
         c->lang = 0;
 
-    val = ZOOM_options_get(c->options, "sru");
-    if (val && *val && !strstr(host, "://"))
-        http_lead = "http://";
-    else
-        http_lead = "";
-    c->sru_mode = get_sru_mode_from_string(val);
-
     if (host)
     {
         char hostn[128];
+        const char *http_lead;
+
+        val = ZOOM_options_get(c->options, "sru");
+        if (val && *val && !strstr(host, "://"))
+            http_lead = "http://";
+        else
+            http_lead = "";
+        c->sru_mode = get_sru_mode_from_string(val);
+
         xfree(c->host_port);
         if (portnum)
         {
@@ -686,8 +687,9 @@ ZOOM_resultset ZOOM_resultset_create(void)
     r->connection = 0;
     r->databaseNames = 0;
     r->num_databaseNames = 0;
-    r->facets = 0;
-    r->num_facets = 0;
+    r->req_facets = 0;
+    r->res_facets = 0;
+    r->num_res_facets = 0;
     r->facets_names = 0;
     r->mutex = 0;
     yaz_mutex_create(&r->mutex);
@@ -720,7 +722,6 @@ ZOOM_API(ZOOM_resultset)
     ZOOM_connection_search(ZOOM_connection c, ZOOM_query q)
 {
     ZOOM_resultset r = ZOOM_resultset_create();
-    const char *cp;
     ZOOM_task task;
     int start, count;
     const char *syntax, *elementSetName, *schema;
@@ -731,6 +732,8 @@ ZOOM_API(ZOOM_resultset)
 
     r->options = ZOOM_options_create_with_parent(c->options);
 
+    r->req_facets = odr_strdup_null(r->odr,
+                                    ZOOM_options_get(r->options, "facets"));
     start = ZOOM_options_get_int(r->options, "start", 0);
     count = ZOOM_options_get_int(r->options, "count", 0);
     {
@@ -740,13 +743,11 @@ ZOOM_API(ZOOM_resultset)
                                        (cp != 0 ? "presentChunk": "step"), 0);
     }
     r->piggyback = ZOOM_options_get_bool(r->options, "piggyback", 1);
-    cp = ZOOM_options_get(r->options, "setname");
-    if (cp)
-        r->setname = xstrdup(cp);
-
-    r->databaseNames = ZOOM_connection_get_databases(c, c->options, &r->num_databaseNames,
-                                         r->odr);
-
+    r->setname = odr_strdup_null(r->odr,
+                                 ZOOM_options_get(r->options, "setname"));
+    r->databaseNames = ZOOM_connection_get_databases(c, c->options,
+                                                     &r->num_databaseNames,
+                                                     r->odr);
     r->connection = c;
     r->next = c->resultsets;
     c->resultsets = r;
@@ -869,7 +870,6 @@ static void resultset_destroy(ZOOM_resultset r)
         ZOOM_query_destroy(r->query);
         ZOOM_options_destroy(r->options);
         odr_destroy(r->odr);
-        xfree(r->setname);
         yaz_mutex_destroy(&r->mutex);
 #if SHPTR
         YAZ_SHPTR_DEC(r->record_wrbuf, wrbuf_destroy);
@@ -980,14 +980,14 @@ ZOOM_API(void)
 ZOOM_API(size_t)
     ZOOM_resultset_facets_size(ZOOM_resultset r)
 {
-    return r->num_facets;
+    return r->num_res_facets;
 }
 
 ZOOM_API(ZOOM_facet_field)
     ZOOM_resultset_get_facet_field(ZOOM_resultset r, const char *name)
 {
-    int num = r->num_facets;
-    ZOOM_facet_field *facets = r->facets;
+    int num = r->num_res_facets;
+    ZOOM_facet_field *facets = r->res_facets;
     int i;
     for (i = 0; i < num; i++)
         if (!strcmp(facets[i]->facet_name, name))
@@ -998,8 +998,8 @@ ZOOM_API(ZOOM_facet_field)
 ZOOM_API(ZOOM_facet_field)
     ZOOM_resultset_get_facet_field_by_index(ZOOM_resultset r, int idx)
 {
-    int num = r->num_facets;
-    ZOOM_facet_field *facets = r->facets;
+    int num = r->num_res_facets;
+    ZOOM_facet_field *facets = r->res_facets;
     if (idx >= 0 && idx < num)
         return facets[idx];
     return 0;
@@ -1008,7 +1008,7 @@ ZOOM_API(ZOOM_facet_field)
 ZOOM_API(ZOOM_facet_field *)
     ZOOM_resultset_facets(ZOOM_resultset r)
 {
-    return r->facets;
+    return r->res_facets;
 }
 
 ZOOM_API(const char**)
@@ -1129,7 +1129,7 @@ ZOOM_API(ZOOM_record)
     const char *schema =
         ZOOM_options_get(s->options, "schema");
 
-    return ZOOM_record_cache_lookup(s, pos, syntax, elementSetName, schema);
+    return ZOOM_record_cache_lookup_i(s, pos, syntax, elementSetName, schema);
 }
 
 ZOOM_API(ZOOM_record)