Option -d dumps records to the current log file instead of stderr.
[pazpar2-moved-to-github.git] / src / logic.c
index e7f2941..f8a8f4d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: logic.c,v 1.48 2007-07-04 12:07:49 adam Exp $
+/* $Id: logic.c,v 1.52 2007-07-16 09:00:22 adam Exp $
    Copyright (c) 2006-2007, Index Data.
 
 This file is part of Pazpar2.
@@ -170,12 +170,35 @@ xmlDoc *record_to_xml(struct session_database *sdb, Z_External *rec)
             return 0;
         }
     }
+    else if (rec->which == Z_External_OPAC)
+    {
+        if (!sdb->yaz_marc)
+        {
+            yaz_log(YLOG_WARN, "MARC decoding not configured");
+            return 0;
+        }
+        else
+        {
+            /* OPAC gets converted to XML too */
+            WRBUF wrbuf_opac = wrbuf_alloc();
+            /* MARCXML inside the OPAC XML. Charset is in effect because we
+               use the yaz_marc handle */
+            yaz_marc_xml(sdb->yaz_marc, YAZ_MARC_MARCXML);
+            yaz_opac_decode_wrbuf(sdb->yaz_marc, rec->u.opac, wrbuf_opac);
+            
+            rdoc = xmlParseMemory((char*) wrbuf_buf(wrbuf_opac),
+                                  wrbuf_len(wrbuf_opac));
+            if (!rdoc)
+                yaz_log(YLOG_WARN, "Unable to parse OPAC XML");
+            wrbuf_destroy(wrbuf_opac);
+        }
+    }
     else if (oid && yaz_oid_is_iso2709(oid))
     {
         /* ISO2709 gets converted to MARCXML */
         if (!sdb->yaz_marc)
         {
-            yaz_log(YLOG_FATAL, "Unable to handle ISO2709 record");
+            yaz_log(YLOG_WARN, "MARC decoding not configured");
             return 0;
         }
         else
@@ -220,15 +243,19 @@ xmlDoc *record_to_xml(struct session_database *sdb, Z_External *rec)
         return 0;
     }
     
-    if (global_parameters.dump_records){
-        fprintf(stderr, 
-                "Input Record (normalized) from %s\n----------------\n",
-                db->url);
+    if (global_parameters.dump_records)
+    {
+        FILE *lf = yaz_log_file();
+        if (lf)
+        {
+            yaz_log(YLOG_LOG, "Normalized record from %s", db->url);
 #if LIBXML_VERSION >= 20600
-        xmlDocFormatDump(stderr, rdoc, 1);
+            xmlDocFormatDump(lf, rdoc, 1);
 #else
-        xmlDocDump(stderr, rdoc);
+            xmlDocDump(lf, rdoc);
 #endif
+            fprintf(lf, "\n");
+        }
     }
     return rdoc;
 }
@@ -922,6 +949,30 @@ void pazpar2_event_loop()
     event_loop(&channel_list);
 }
 
+static struct record_metadata *record_metadata_init(
+    NMEM nmem, char *value, enum conf_metadata_type type)
+{
+    struct record_metadata *rec_md = record_metadata_create(nmem);
+    if (type == Metadata_type_generic)
+    {
+        char * p = value;
+        p = normalize7bit_generic(p, " ,/.:([");
+        
+        rec_md->data.text = nmem_strdup(nmem, p);
+    }
+    else if (type == Metadata_type_year)
+    {
+        int first, last;
+        if (extract7bit_years((char *) value, &first, &last) < 0)
+            return 0;
+        rec_md->data.number.min = first;
+        rec_md->data.number.max = last;
+    }
+    else
+        return 0;
+    return rec_md;
+}
+
 struct record *ingest_record(struct client *cl, Z_External *rec,
                              int record_no)
 {
@@ -989,7 +1040,6 @@ struct record *ingest_record(struct client *cl, Z_External *rec,
             struct record_metadata *rec_md = 0;
             int md_field_id = -1;
             int sk_field_id = -1;
-            int first, last;
 
             type = xmlGetProp(n, (xmlChar *) "type");
             value = xmlNodeListGetString(xdoc, n->children, 1);
@@ -1013,37 +1063,22 @@ struct record *ingest_record(struct client *cl, Z_External *rec,
                 ser_sk = &service->sortkeys[sk_field_id];
             }
 
-            // Find out where we are putting it - based on merge or not
-            if (ser_md->merge == Metadata_merge_no)
-                wheretoput = &record->metadata[md_field_id];
-            else
-                wheretoput = &cluster->metadata[md_field_id];
-            
-            // create new record_metadata
-            rec_md = record_metadata_create(se->nmem);
-
-            // and polulate with data:
-            // type based charmapping decisions follow here
-            if (ser_md->type == Metadata_type_generic)
-            {
-
-                char * p = (char *) value;
-                p = normalize7bit_generic(p, " ,/.:([");
-                
-                rec_md->data.text = nmem_strdup(se->nmem, p);
-
-            }
-            else if (ser_md->type == Metadata_type_year)
+            // non-merged metadata
+            rec_md = record_metadata_init(se->nmem, (char *) value,
+                                          ser_md->type);
+            if (!rec_md)
             {
-                if (extract7bit_years((char *) value, &first, &last) < 0)
-                    continue;
-            }
-            else
-            {
-                yaz_log(YLOG_WARN, 
-                        "Unknown type in metadata element %s", type);
+                yaz_log(YLOG_WARN, "bad metadata data '%s' for element '%s'",
+                        value, type);
                 continue;
             }
+            rec_md->next = record->metadata[md_field_id];
+            record->metadata[md_field_id] = rec_md;
+
+            // merged metadata
+            rec_md = record_metadata_init(se->nmem, (char *) value,
+                                          ser_md->type);
+            wheretoput = &cluster->metadata[md_field_id];
 
             // and polulate with data:
             // assign cluster or record based on merge action
@@ -1080,8 +1115,7 @@ struct record *ingest_record(struct client *cl, Z_External *rec,
                     }
                 }
             }
-            else if (ser_md->merge == Metadata_merge_all 
-                     || ser_md->merge == Metadata_merge_no)
+            else if (ser_md->merge == Metadata_merge_all)
             {
                 rec_md->next = *wheretoput;
                 *wheretoput = rec_md;
@@ -1091,18 +1125,18 @@ struct record *ingest_record(struct client *cl, Z_External *rec,
                 if (!*wheretoput)
                 {
                     *wheretoput = rec_md;
-                    (*wheretoput)->data.number.min = first;
-                    (*wheretoput)->data.number.max = last;
                     if (ser_sk)
                         cluster->sortkeys[sk_field_id] 
                             = &rec_md->data;
                 }
                 else
                 {
-                    if (first < (*wheretoput)->data.number.min)
-                        (*wheretoput)->data.number.min = first;
-                    if (last > (*wheretoput)->data.number.max)
-                        (*wheretoput)->data.number.max = last;
+                    int this_min = rec_md->data.number.min;
+                    int this_max = rec_md->data.number.max;
+                    if (this_min < (*wheretoput)->data.number.min)
+                        (*wheretoput)->data.number.min = this_min;
+                    if (this_max > (*wheretoput)->data.number.max)
+                        (*wheretoput)->data.number.max = this_max;
                 }
 #ifdef GAGA
                 if (ser_sk)
@@ -1127,11 +1161,11 @@ struct record *ingest_record(struct client *cl, Z_External *rec,
                 if (ser_md->type == Metadata_type_year)
                 {
                     char year[64];
-                    sprintf(year, "%d", last);
+                    sprintf(year, "%d", rec_md->data.number.max);
                     add_facet(se, (char *) type, year);
-                    if (first != last)
+                    if (rec_md->data.number.max != rec_md->data.number.min)
                     {
-                        sprintf(year, "%d", first);
+                        sprintf(year, "%d", rec_md->data.number.min);
                         add_facet(se, (char *) type, year);
                     }
                 }