Merge branch 'master' of ssh://git.indexdata.com:222/home/git/pub/pazpar2
authorWolfram Schneider <wosch@indexdata.dk>
Tue, 16 Dec 2008 18:10:33 +0000 (19:10 +0100)
committerWolfram Schneider <wosch@indexdata.dk>
Tue, 16 Dec 2008 18:10:33 +0000 (19:10 +0100)
NEWS
doc/pazpar2_conf.xml
src/client.c

diff --git a/NEWS b/NEWS
index 0f1f78b..45508d7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,5 @@
+Automatically computes pz:nativesyntax if not provided (works for XML and MARC)
+
 --- 1.0.13 2008/11/24
 
 Command bytarget returns name of target (if defined).
index f81464a..b3a6281 100644 (file)
        For iso2709, can also specify a native character set, e.g. "iso2709;latin-1".
        If no character set is provided, MARC-8 is assumed.
       </para>
+      <para>
+        If pz:nativesyntax is not specified, pazpar2 will attempt to determine
+       the value based on the response from the server.
+      </para>
      </listitem>
     </varlistentry>
 
index ff3c0fb..9cb5140 100644 (file)
@@ -271,7 +271,7 @@ static void client_send_raw_present(struct client *cl)
     connection_continue(co);
 }
 
-static int nativesyntax_to_type(struct session_database *sdb, char *type)
+static int nativesyntax_to_type(struct session_database *sdb, char *type, ZOOM_record rec)
 {
     const char *s = session_setting_oneval(sdb, PZ_NATIVESYNTAX);
 
@@ -290,7 +290,25 @@ static int nativesyntax_to_type(struct session_database *sdb, char *type)
             return -1;
         return 0;
     }
-    return -1;
+    else  /* attempt to deduce structure */
+    {
+        const char *syntax = ZOOM_record_get(rec, "syntax", NULL);
+        if (syntax)
+        {
+            if (!strcmp(syntax, "XML"))
+            {
+                strcpy(type, "xml");
+                return 0;
+            }
+            else if (!strcmp(syntax, "USmarc") || !strcmp(syntax, "MARC21"))
+            {
+                strcpy(type, "xml; charset=marc8-s");
+                return 0;
+            }
+            else return -1;
+        }
+        else return -1;
+    }
 }
 
 static void ingest_raw_record(struct client *cl, ZOOM_record rec)
@@ -304,7 +322,7 @@ static void ingest_raw_record(struct client *cl, ZOOM_record rec)
     else
     {
         struct session_database *sdb = client_get_database(cl);
-        nativesyntax_to_type(sdb, type);
+        nativesyntax_to_type(sdb, type, rec);
     }
 
     buf = ZOOM_record_get(rec, type, &len);
@@ -383,7 +401,8 @@ void client_record_response(struct client *cl)
                     struct session_database *sdb = client_get_database(cl);
                     const char *xmlrec;
                     char type[80];
-                    nativesyntax_to_type(sdb, type);
+                    if (nativesyntax_to_type(sdb, type, rec))
+                        yaz_log(YLOG_WARN, "Failed to determine record type");
                     if ((xmlrec = ZOOM_record_get(rec, type, NULL)))
                     {
                         if (ingest_record(cl, xmlrec, cl->record_offset))