Fixed bug #1395: Fixed size array in function hitsbytarget in logic.c.
[pazpar2-moved-to-github.git] / src / logic.c
index e9fa969..e3f5f17 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: logic.c,v 1.58 2007-07-30 23:16:33 quinn Exp $
+/* $Id: logic.c,v 1.63 2007-09-05 07:24:04 adam Exp $
    Copyright (c) 2006-2007, Index Data.
 
 This file is part of Pazpar2.
@@ -191,7 +191,18 @@ xmlDoc *record_to_xml(struct session_database *sdb, Z_External *rec)
             rdoc = xmlParseMemory((char*) wrbuf_buf(wrbuf_opac),
                                   wrbuf_len(wrbuf_opac));
             if (!rdoc)
+            {
                 yaz_log(YLOG_WARN, "Unable to parse OPAC XML");
+                /* Was used to debug bug #1348 */
+#if 0
+                FILE *f = fopen("/tmp/opac.xml.txt", "wb");
+                if (f)
+                {
+                    fwrite(wrbuf_buf(wrbuf_opac), 1, wrbuf_len(wrbuf_opac), f);
+                    fclose(f);
+                }
+#endif
+            }
             wrbuf_destroy(wrbuf_opac);
         }
     }
@@ -223,7 +234,6 @@ xmlDoc *record_to_xml(struct session_database *sdb, Z_External *rec)
                 return 0;
             }
             
-            yaz_marc_write_using_libxml2(sdb->yaz_marc, 1);
             if (yaz_marc_write_xml(sdb->yaz_marc, &res,
                                    "http://www.loc.gov/MARC21/slim", 0, 0) < 0)
             {
@@ -281,7 +291,7 @@ static void insert_settings_parameters(struct session_database *sdb,
         if (md->setting == Metadata_setting_parameter &&
                 (setting = settings_offset(md->name)) > 0)
         {
-            char *val = session_setting_oneval(sdb, setting);
+            const char *val = session_setting_oneval(sdb, setting);
             if (val && nparms < MAX_XSLT_ARGS)
             {
                 char *buf;
@@ -314,7 +324,7 @@ static void insert_settings_values(struct session_database *sdb, xmlDoc *doc)
         if (md->setting == Metadata_setting_postproc &&
                 (offset = settings_offset(md->name)) > 0)
         {
-            char *val = session_setting_oneval(sdb, offset);
+            const char *val = session_setting_oneval(sdb, offset);
             if (val)
             {
                 xmlNode *r = xmlDocGetRootElement(doc);
@@ -383,7 +393,7 @@ xmlDoc *normalize_record(struct session_database *sdb, struct session *se,
 
 // 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_database *db, int offset)
+const char *session_setting_oneval(struct session_database *db, int offset)
 {
     if (!db->settings[offset])
         return "";
@@ -395,7 +405,7 @@ char *session_setting_oneval(struct session_database *db, int offset)
 // Initialize YAZ Map structures for MARC-based targets
 static int prepare_yazmarc(struct session_database *sdb)
 {
-    char *s;
+    const char *s;
 
     if (!sdb->settings)
     {
@@ -435,7 +445,7 @@ static int prepare_yazmarc(struct session_database *sdb)
 // setting. However, this is not a realistic use scenario.
 static int prepare_map(struct session *se, struct session_database *sdb)
 {
-   char *s;
+    const char *s;
 
     if (!sdb->settings)
     {
@@ -451,8 +461,8 @@ static int prepare_map(struct session *se, struct session_database *sdb)
 
         if (!strcmp(s, "auto"))
         {
-            char *request_syntax = session_setting_oneval(sdb,
-                                                          PZ_REQUESTSYNTAX);
+            const char *request_syntax = session_setting_oneval(
+                sdb, PZ_REQUESTSYNTAX);
             if (request_syntax)
             {
                 char *cp;
@@ -637,23 +647,22 @@ enum pazpar2_error_code search(struct session *se,
 
     *addinfo = 0;
     nmem_reset(se->nmem);
+    se->relevance = 0;
+    se->total_records = se->total_hits = se->total_merged = 0;
+    se->reclist = 0;
+    se->num_termlists = 0;
     criteria = parse_filter(se->nmem, filter);
     se->requestid++;
     live_channels = select_targets(se, criteria);
     if (live_channels)
     {
         int maxrecs = live_channels * global_parameters.toget;
-        se->num_termlists = 0;
         se->reclist = reclist_create(se->nmem, maxrecs);
-        // This will be initialized in send_search()
-        se->total_records = se->total_hits = se->total_merged = 0;
         se->expected_maxrecs = maxrecs;
     }
     else
         return PAZPAR2_NO_TARGETS;
 
-    se->relevance = 0;
-
     for (cl = se->clients; cl; cl = client_next_in_session(cl))
     {
         if (prepare_session_database(se, client_get_database(cl)) < 0)
@@ -849,15 +858,21 @@ struct session *new_session(NMEM nmem)
     return session;
 }
 
-struct hitsbytarget *hitsbytarget(struct session *se, int *count)
+struct hitsbytarget *hitsbytarget(struct session *se, int *count, NMEM nmem)
 {
-    static struct hitsbytarget res[1000]; // FIXME MM
+    struct hitsbytarget *res = 0;
     struct client *cl;
+    size_t sz = 0;
 
+    for (cl = se->clients; cl; cl = client_next_in_session(cl))
+        sz++;
+
+    res = nmem_malloc(nmem, sizeof(*res) * sz);
     *count = 0;
     for (cl = se->clients; cl; cl = client_next_in_session(cl))
     {
-        char *name = session_setting_oneval(client_get_database(cl), PZ_NAME);
+        const char *name = session_setting_oneval(client_get_database(cl),
+                                                  PZ_NAME);
 
         res[*count].id = client_get_database(cl)->database->url;
         res[*count].name = *name ? name : "Unknown";
@@ -868,7 +883,6 @@ struct hitsbytarget *hitsbytarget(struct session *se, int *count)
         res[*count].connected  = client_get_connection(cl) ? 1 : 0;
         (*count)++;
     }
-
     return res;
 }
 
@@ -1149,7 +1163,7 @@ struct record *ingest_record(struct client *cl, Z_External *rec,
             type = xmlGetProp(n, (xmlChar *) "type");
             value = xmlNodeListGetString(xdoc, n->children, 1);
 
-            if (!type || !value)
+            if (!type || !value || !*value)
                 continue;
 
             md_field_id