added target url's on some more warning log messages
[pazpar2-moved-to-github.git] / src / pazpar2.c
index 2c95075..8b2638b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: pazpar2.c,v 1.59 2007-03-31 20:24:59 marc Exp $ */
+/* $Id: pazpar2.c,v 1.63 2007-04-04 22:43:10 marc Exp $ */
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -50,6 +50,7 @@ static int client_prep_connection(struct client *cl);
 static void ingest_records(struct client *cl, Z_Records *r);
 //static struct conf_retrievalprofile *database_retrieval_profile(struct database *db);
 void session_alert_watch(struct session *s, int what);
+char *session_setting_oneval(struct session *s, struct database *db, const char *name);
 
 IOCHAN channel_list = 0;  // Master list of connections we're handling events to
 
@@ -200,6 +201,8 @@ static void send_search(IOCHAN i)
     Z_Query *zquery;
     struct ccl_rpn_node *cn;
     int ssub = 0, lslb = 100000, mspn = 10;
+    char *recsyn;
+    char *piggyback;
 
     yaz_log(YLOG_DEBUG, "Sending search");
 
@@ -228,12 +231,16 @@ static void send_search(IOCHAN i)
     for (ndb = 0; db->databases[ndb]; ndb++)
        databaselist[ndb] = db->databases[ndb];
 
-    a->u.searchRequest->preferredRecordSyntax =
-            yaz_oidval_to_z3950oid(global_parameters.odr_out,
-            CLASS_RECSYN, VAL_USMARC);
-    a->u.searchRequest->smallSetUpperBound = &ssub;
-    a->u.searchRequest->largeSetLowerBound = &lslb;
-    a->u.searchRequest->mediumSetPresentNumber = &mspn;
+    if (!(piggyback = session_setting_oneval(se, db, "pz:piggyback")) || *piggyback == '1')
+    {
+        if ((recsyn = session_setting_oneval(se, db, "pz:syntax")))
+            a->u.searchRequest->preferredRecordSyntax =
+                    yaz_str_to_z3950oid(global_parameters.odr_out,
+                    CLASS_RECSYN, recsyn);
+        a->u.searchRequest->smallSetUpperBound = &ssub;
+        a->u.searchRequest->largeSetLowerBound = &lslb;
+        a->u.searchRequest->mediumSetPresentNumber = &mspn;
+    }
     a->u.searchRequest->resultSetName = "Default";
     a->u.searchRequest->databaseNames = databaselist;
     a->u.searchRequest->num_databaseNames = ndb;
@@ -254,9 +261,12 @@ static void send_present(IOCHAN i)
 {
     struct connection *co = iochan_getdata(i);
     struct client *cl = co->client; 
+    struct session *se = cl->session;
+    struct database *db = cl->database;
     Z_APDU *a = zget_APDU(global_parameters.odr_out, Z_APDU_presentRequest);
     int toget;
     int start = cl->records + 1;
+    char *recsyn;
 
     toget = global_parameters.chunk;
     if (toget > global_parameters.toget - cl->records)
@@ -271,9 +281,10 @@ static void send_present(IOCHAN i)
 
     a->u.presentRequest->resultSetId = "Default";
 
-    a->u.presentRequest->preferredRecordSyntax =
-            yaz_oidval_to_z3950oid(global_parameters.odr_out,
-            CLASS_RECSYN, VAL_USMARC);
+    if ((recsyn = session_setting_oneval(se, db, "pz:syntax")))
+        a->u.presentRequest->preferredRecordSyntax =
+                yaz_str_to_z3950oid(global_parameters.odr_out,
+                CLASS_RECSYN, recsyn);
 
     if (send_apdu(cl, a) >= 0)
     {
@@ -291,7 +302,7 @@ static void do_initResponse(IOCHAN i, Z_APDU *a)
     struct client *cl = co->client;
     Z_InitResponse *r = a->u.initResponse;
 
-    yaz_log(YLOG_DEBUG, "Received init response");
+    yaz_log(YLOG_DEBUG, "Init response %s", cl->database->url);
 
     if (*r->result)
     {
@@ -308,7 +319,8 @@ static void do_searchResponse(IOCHAN i, Z_APDU *a)
     struct session *se = cl->session;
     Z_SearchResponse *r = a->u.searchResponse;
 
-    yaz_log(YLOG_DEBUG, "Searchresponse (status=%d)", *r->searchStatus);
+    yaz_log(YLOG_DEBUG, "Search response %s (status=%d)", 
+            cl->database->url, *r->searchStatus);
 
     if (*r->searchStatus)
     {
@@ -316,7 +328,8 @@ static void do_searchResponse(IOCHAN i, Z_APDU *a)
         se->total_hits += cl->hits;
         if (r->presentStatus && !*r->presentStatus && r->records)
         {
-            yaz_log(YLOG_DEBUG, "Records in search response");
+            yaz_log(YLOG_DEBUG, "Records in search response %s", 
+                    cl->database->url);
             ingest_records(cl, r->records);
         }
         cl->state = Client_Idle;
@@ -329,7 +342,9 @@ static void do_searchResponse(IOCHAN i, Z_APDU *a)
             Z_Records *recs = r->records;
             if (recs->which == Z_Records_NSD)
             {
-                yaz_log(YLOG_WARN, "Non-surrogate diagnostic");
+                yaz_log(YLOG_WARN, 
+                        "Search response: Non-surrogate diagnostic %s",
+                        cl->database->url);
                 cl->diagnostic = *recs->u.nonSurrogateDiagnostic->condition;
                 cl->state = Client_Error;
             }
@@ -337,6 +352,19 @@ static void do_searchResponse(IOCHAN i, Z_APDU *a)
     }
 }
 
+static void do_closeResponse(IOCHAN i, Z_APDU *a)
+{
+    struct connection *co = iochan_getdata(i);
+    struct client *cl = co->client;
+    /* Z_Close *r = a->u.close; */
+
+    yaz_log(YLOG_WARN, "Close response %s", cl->database->url);
+
+    cl->state = Client_Failed;
+    connection_destroy(co);
+}
+
+
 char *normalize_mergekey(char *buf, int skiparticle)
 {
     char *p = buf, *pout = buf;
@@ -378,42 +406,6 @@ char *normalize_mergekey(char *buf, int skiparticle)
     return buf;
 }
 
-
-#ifdef GAGA
-// FIXME needs to be generalized. Should flexibly generate X lists per search
-static void extract_subject(struct session *s, const char *rec)
-{
-    const char *field, *subfield;
-
-    while ((field = find_field(rec, "650")))
-    {
-        rec = field; 
-        if ((subfield = find_subfield(field, 'a')))
-        {
-            char *e, *ef;
-            char buf[1024];
-            int len;
-
-            ef = index(subfield, '\n');
-            if (!ef)
-                return;
-            if ((e = index(subfield, '\t')) && e < ef)
-                ef = e;
-            while (ef > subfield && !isalpha(*(ef - 1)) && *(ef - 1) != ')')
-                ef--;
-            len = ef - subfield;
-            assert(len < 1023);
-            memcpy(buf, subfield, len);
-            buf[len] = '\0';
-#ifdef FIXME
-            if (*buf)
-                termlist_insert(s->termlist, buf);
-#endif
-        }
-    }
-}
-#endif
-
 static void add_facet(struct session *s, const char *type, const char *value)
 {
     int i;
@@ -451,20 +443,23 @@ static xmlDoc *normalize_record(struct client *cl, Z_External *rec)
         int len;
         if (rec->which != Z_External_octet)
         {
-            yaz_log(YLOG_WARN, "Unexpected external branch, probably BER");
+            yaz_log(YLOG_WARN, "Unexpected external branch, probably BER %s",
+                    cl->database->url);
             return 0;
         }
         buf = (char*) rec->u.octet_aligned->buf;
         len = rec->u.octet_aligned->len;
         if (yaz_marc_read_iso2709(rprofile->yaz_marc, buf, len) < 0)
         {
-            yaz_log(YLOG_WARN, "Failed to decode MARC");
+            yaz_log(YLOG_WARN, "Failed to decode MARC %s",
+                    cl->database->url);
             return 0;
         }
         if (yaz_marc_write_xml(rprofile->yaz_marc, &res,
                     "http://www.loc.gov/MARC21/slim", 0, 0) < 0)
         {
-            yaz_log(YLOG_WARN, "Failed to encode as XML");
+            yaz_log(YLOG_WARN, "Failed to encode as XML %s",
+                    cl->database->url);
             return 0;
         }
         rdoc = xmlNewDoc((xmlChar *) "1.0");
@@ -767,6 +762,19 @@ static struct record *ingest_record(struct client *cl, Z_External *rec)
     return res;
 }
 
+// Retrieve first defined value for 'name' for given database.
+// Will be extended to take into account user associated with session
+char *session_setting_oneval(struct session *s, struct database *db, const char *name)
+{
+    int offset = settings_offset(name);
+
+    if (offset < 0)
+        return 0;
+    if (!db->settings[offset])
+        return 0;
+    return db->settings[offset]->value;
+}
+
 static void ingest_records(struct client *cl, Z_Records *r)
 {
 #if USE_TIMING
@@ -787,7 +795,9 @@ static void ingest_records(struct client *cl, Z_Records *r)
         cl->records++;
         if (npr->which != Z_NamePlusRecord_databaseRecord)
         {
-            yaz_log(YLOG_WARN, "Unexpected record type, probably diagnostic");
+            yaz_log(YLOG_WARN, 
+                    "Unexpected record type, probably diagnostic %s",
+                    cl->database->url);
             continue;
         }
 
@@ -817,7 +827,8 @@ static void do_presentResponse(IOCHAN i, Z_APDU *a)
         Z_Records *recs = r->records;
         if (recs->which == Z_Records_NSD)
         {
-            yaz_log(YLOG_WARN, "Non-surrogate diagnostic");
+            yaz_log(YLOG_WARN, "Non-surrogate diagnostic %s",
+                    cl->database->url);
             cl->diagnostic = *recs->u.nonSurrogateDiagnostic->condition;
             cl->state = Client_Error;
         }
@@ -825,13 +836,15 @@ static void do_presentResponse(IOCHAN i, Z_APDU *a)
 
     if (!*r->presentStatus && cl->state != Client_Error)
     {
-        yaz_log(YLOG_DEBUG, "Good Present response");
+        yaz_log(YLOG_DEBUG, "Good Present response %s",
+                cl->database->url);
         ingest_records(cl, r->records);
         cl->state = Client_Idle;
     }
     else if (*r->presentStatus) 
     {
-        yaz_log(YLOG_WARN, "Bad Present response");
+        yaz_log(YLOG_WARN, "Bad Present response %s",
+                cl->database->url);
         cl->state = Client_Error;
     }
 }
@@ -877,13 +890,14 @@ static void handler(IOCHAN i, int event)
 
        if (len < 0)
        {
-            yaz_log(YLOG_WARN|YLOG_ERRNO, "Error reading from Z server");
+            yaz_log(YLOG_WARN|YLOG_ERRNO, "Error reading from %s", 
+                    cl->database->url);
             connection_destroy(co);
            return;
        }
         else if (len == 0)
        {
-            yaz_log(YLOG_WARN, "EOF reading from Z server");
+            yaz_log(YLOG_WARN, "EOF reading from %s", cl->database->url);
             connection_destroy(co);
            return;
        }
@@ -913,8 +927,13 @@ static void handler(IOCHAN i, int event)
                     case Z_APDU_presentResponse:
                         do_presentResponse(i, a);
                         break;
+                    case Z_APDU_close:
+                        do_closeResponse(i, a);
+                        break;
                     default:
-                        yaz_log(YLOG_WARN, "Unexpected result from server");
+                        yaz_log(YLOG_WARN, 
+                                "Unexpected Z39.50 response from %s",  
+                                cl->database->url);
                         client_fatal(cl);
                         return;
                 }
@@ -1022,9 +1041,6 @@ static struct connection *connection_create(struct client *cl)
         yaz_log(YLOG_DEBUG, "Connection create %s proxy %s", 
                 cl->database->url, global_parameters.zproxy_override);
 
-        yaz_log(YLOG_LOG, "Connection cs_create_host %s proxy %s", 
-                cl->database->url, global_parameters.zproxy_override);
-        
         if (!(addr = cs_straddr(link, global_parameters.zproxy_override)))
             {
                 yaz_log(YLOG_WARN|YLOG_ERRNO,