Reinsert initialiser for __UNUSED_loglevel
[yaz-moved-to-github.git] / src / zoom-c.c
index cd13a01..13a63e9 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.62 2005-12-21 16:41:36 mike Exp $
+ * $Id: zoom-c.c,v 1.65 2006-03-13 10:48:14 adam Exp $
  */
 /**
  * \file zoom-c.c
@@ -54,7 +54,6 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c);
 static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out);
 static char *cql2pqf(ZOOM_connection c, const char *cql);
 
-
 static void initlog()
 {
     static int log_level_initialized = 0;
@@ -315,7 +314,7 @@ static char **set_DatabaseNames (ZOOM_connection con, ZOOM_options options,
     char **databaseNames;
     const char *cp = ZOOM_options_get (options, "databaseName");
     
-    if (!cp || !*cp)
+    if ((!cp || !*cp) && con->host_port)
     {
         if (strncmp (con->host_port, "unix:", 5) == 0)
             cp = strchr(con->host_port+5, ':');
@@ -339,6 +338,19 @@ ZOOM_connection_new (const char *host, int portnum)
     return c;
 }
 
+static zoom_sru_mode get_sru_mode_from_string(const char *s)
+{
+    if (!s || !*s)
+        return zoom_sru_soap;
+    if (!yaz_matchstr(s, "soap"))
+        return zoom_sru_soap;
+    else if (!yaz_matchstr(s, "get"))
+        return zoom_sru_get;
+    else if (!yaz_matchstr(s, "post"))
+        return zoom_sru_post;
+    return zoom_sru_error;
+}
+
 ZOOM_API(void)
 ZOOM_connection_connect(ZOOM_connection c,
                         const char *host, int portnum)
@@ -388,6 +400,9 @@ ZOOM_connection_connect(ZOOM_connection c,
     else
         c->lang = 0;
 
+    val = ZOOM_options_get (c->options, "sru");
+    c->sru_mode = get_sru_mode_from_string(val);
+
     xfree (c->host_port);
     if (portnum)
     {
@@ -1129,7 +1144,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.62 $");
+    version = odr_strdup(c->odr_out, "$Revision: 1.65 $");
     if (strlen(version) > 10)   /* check for unexpanded CVS strings */
         version[strlen(version)-2] = '\0';
     ireq->implementationVersion = odr_prepend(c->odr_out,
@@ -1225,7 +1240,6 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c)
 #if HAVE_XML2
 static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
 {
-    char ctype[50];
     Z_SOAP_Handler h[2] = {
         {"http://www.loc.gov/zing/srw/", 0, (Z_SOAP_fun) yaz_srw_codec},
         {0, 0, 0}
@@ -1262,34 +1276,40 @@ static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
         }
     }
 
-    strcpy(ctype, "text/xml");
-    if (c->charset && strlen(c->charset) < 20)
+    if (c->sru_mode == zoom_sru_get)
     {
-        strcat(ctype, "; charset=");
-        strcat(ctype, c->charset);
+        yaz_sru_get_encode(gdu->u.HTTP_Request, sr, c->odr_out, c->charset);
     }
-    z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
-                      "Content-Type", ctype);
-    z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
-                      "SOAPAction", "\"\"");
-    p->which = Z_SOAP_generic;
-    p->u.generic = (Z_SOAP_Generic *) odr_malloc(o, sizeof(*p->u.generic));
-    p->u.generic->no = 0;
-    p->u.generic->ns = 0;
-    p->u.generic->p = sr;
-    p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
+    else if (c->sru_mode == zoom_sru_post)
+    {
+        yaz_sru_post_encode(gdu->u.HTTP_Request, sr, c->odr_out, c->charset);
+    }
+    else if (c->sru_mode == zoom_sru_soap)
+    {
+        z_HTTP_header_add_content_type(c->odr_out,
+                                       &gdu->u.HTTP_Request->headers,
+                                       "text/xml", c->charset);
 
-    ret = z_soap_codec_enc(o, &p,
-                           &gdu->u.HTTP_Request->content_buf,
-                           &gdu->u.HTTP_Request->content_len, h,
-                           c->charset);
+        z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
+                          "SOAPAction", "\"\"");
+        p->which = Z_SOAP_generic;
+        p->u.generic = (Z_SOAP_Generic *) odr_malloc(o, sizeof(*p->u.generic));
+        p->u.generic->no = 0;
+        p->u.generic->ns = 0;
+        p->u.generic->p = sr;
+        p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
+        
+        ret = z_soap_codec_enc(o, &p,
+                               &gdu->u.HTTP_Request->content_buf,
+                               &gdu->u.HTTP_Request->content_len, h,
+                               c->charset);
 
+    }
     if (!z_GDU(c->odr_out, &gdu, 0, 0))
         return zoom_complete;
     c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
-
     odr_destroy(o);
-
+        
     event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
     ZOOM_connection_put_event (c, event);
     odr_reset(c->odr_out);
@@ -2715,13 +2735,10 @@ static Z_External *encode_ill_request (ZOOM_package p)
         r->descriptor = 0;
         r->which = Z_External_single;
                 
-        r->u.single_ASN1_type = (Odr_oct *)
-            odr_malloc (out, sizeof(*r->u.single_ASN1_type));
-        r->u.single_ASN1_type->buf = (unsigned char*)
-            odr_malloc (out, illRequest_size);
-        r->u.single_ASN1_type->len = illRequest_size;
-        r->u.single_ASN1_type->size = illRequest_size;
-        memcpy (r->u.single_ASN1_type->buf, illRequest_buf, illRequest_size);
+        r->u.single_ASN1_type =
+            odr_create_Odr_oct(out,
+                               (unsigned char *)illRequest_buf,
+                               illRequest_size);
     }
     return r;
 }
@@ -2843,20 +2860,18 @@ static Z_APDU *create_xmlupdate_package(ZOOM_package p)
     Z_External *ext = (Z_External *) odr_malloc(p->odr_out, sizeof(*ext));
     const char *doc = ZOOM_options_get(p->options, "doc");
 
+    if (!doc)
+        doc = "";
+
     req->taskSpecificParameters = ext;
     ext->direct_reference = req->packageType;
     ext->descriptor = 0;
     ext->indirect_reference = 0;
     
     ext->which = Z_External_octet;
-    ext->u.single_ASN1_type = (Odr_oct *)
-        odr_malloc (p->odr_out, sizeof(Odr_oct));
-
-    if (!doc)
-        doc = "";
-    ext->u.single_ASN1_type->buf = (unsigned char*)
-        odr_strdup(p->odr_out, doc);
-    ext->u.single_ASN1_type->size = ext->u.single_ASN1_type->len = strlen(doc);
+    ext->u.single_ASN1_type =
+        odr_create_Odr_oct(p->odr_out, (const unsigned char *) doc,
+                           strlen(doc));
     return apdu;
 }
 
@@ -2946,12 +2961,10 @@ static Z_APDU *create_update_package(ZOOM_package p)
         notToKeep->elements[0]->which = Z_IUSuppliedRecords_elem_opaque;
         if (recordIdOpaque)
         {
-            notToKeep->elements[0]->u.opaque = (Odr_oct *)
-                odr_malloc (p->odr_out, sizeof(Odr_oct));
-            notToKeep->elements[0]->u.opaque->size =
-                notToKeep->elements[0]->u.opaque->len = strlen(recordIdOpaque);
-            notToKeep->elements[0]->u.opaque->buf = (unsigned char*)
-                odr_strdup(p->odr_out, recordIdOpaque);
+            notToKeep->elements[0]->u.opaque = 
+                odr_create_Odr_oct(p->odr_out,
+                                   (const unsigned char *) recordIdOpaque,
+                                   strlen(recordIdOpaque));
         }
         else if (recordIdNumber)
         {
@@ -3424,6 +3437,7 @@ static void handle_srw_response(ZOOM_connection c,
         npr->u.databaseRecord->direct_reference =
             yaz_oidval_to_z3950oid(c->odr_in, CLASS_RECSYN, VAL_TEXT_XML);
         npr->u.databaseRecord->which = Z_External_octet;
+
         npr->u.databaseRecord->u.octet_aligned = (Odr_oct *)
             odr_malloc(c->odr_in, sizeof(Odr_oct));
         npr->u.databaseRecord->u.octet_aligned->buf = (unsigned char*)