User-defined retrieval records for yaz-ztest YAZ-714
[yaz-moved-to-github.git] / ztest / read-marc.c
index 9cf0a8c..7a54ddf 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2010 Index Data
+ * Copyright (C) 1995-2013 Index Data
  * See the file LICENSE for details.
  */
 /** \file
  * See the file LICENSE for details.
  */
 /** \file
@@ -9,13 +9,26 @@
 #include <config.h>
 #endif
 
 #include <config.h>
 #endif
 
-#include <ctype.h>
 #include <yaz/wrbuf.h>
 #include <yaz/marcdisp.h>
 #include <yaz/odr.h>
 
 #include "ztest.h"
 
 #include <yaz/wrbuf.h>
 #include <yaz/marcdisp.h>
 #include <yaz/odr.h>
 
 #include "ztest.h"
 
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef WIN32
+#include <sys/stat.h>
+#endif
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
 #define NO_MARC_RECORDS 24
 
 char *marc_records[NO_MARC_RECORDS] = {
 #define NO_MARC_RECORDS 24
 
 char *marc_records[NO_MARC_RECORDS] = {
@@ -1537,37 +1550,195 @@ char *marc_records[NO_MARC_RECORDS] = {
   "\x44\x42\x46\x38\x38\x34\x32\x1E\x1D"
 };
 
   "\x44\x42\x46\x38\x38\x34\x32\x1E\x1D"
 };
 
+static char *marc_record0 =
+  "00366nam  220016"
+  "98a 450000100130"
+  "0000003000400013"
+  "0050017000170080"
+  "0410003401000170"
+  "0179040001300075"
+  "0500012000881000"
+  "0170010024500300"
+  "0117260001200147"
+  "2630009001593000"
+  "01100168" "\x1E" "   1122"
+  "4466 " "\x1E" "DLC" "\x1E" "000000"
+  "00000000.0" "\x1E" "91071"
+  "0c19910701nju   "
+  "        00010 en"
+  "g  " "\x1E" "  " "\x1F" "aDLC" "\x1F" "cDLC"
+  "" "\x1E" "00" "\x1F" "a123-xyz" "\x1E" "10" "\x1F" ""
+  "aJack Collins" "\x1E" "10"
+  "" "\x1F" "aHow to program"
+  " a computer" "\x1E" "1 " "\x1F" "a"
+  "Penguin" "\x1E" "  " "\x1F" "a8710"
+  "" "\x1E" "  " "\x1F" "ap. cm." "\x1E" "  " "\x1F" "a"
+  "   11224466 " "\x1E" "" "\x1D" ""
+;
+
 /* read MARC record from offset 'num' */
 char *dummy_marc_record(int num, ODR odr)
 {
     if (num < 1)
         return 0;
 /* read MARC record from offset 'num' */
 char *dummy_marc_record(int num, ODR odr)
 {
     if (num < 1)
         return 0;
-    return marc_records[(num-1) % NO_MARC_RECORDS];
+    if (num >= NO_MARC_RECORDS)
+    {
+        char *p = odr_strdup(odr, marc_record0);
+        sprintf(p + 279, "%-5d", num);
+        p[284] = ' ';
+        return p;
+    }
+    else
+    {
+        return marc_records[(num-1) % NO_MARC_RECORDS];
+    }
+}
+
+#define PZ_CBEGIN "<pz:cluster xmlns:pz=\"http://www.indexdata.com/pazpar2/1.0\">\n"
+#define PZ_CEND "</pz:cluster>\n"
+#define PZ_BEGIN "<record xmlns=\"http://www.indexdata.com/pazpar2/1.0\">\n"
+#define PZ_END "</record>\n"
+#define PZ_METADATA(x, y) " <metadata type=\"" #x "\">" y "</metadata>\n"
+
+static char *dummy_pz2_record(int num, ODR odr)
+{
+    const char *rec[] = {
+        PZ_CBEGIN
+        PZ_BEGIN
+        PZ_METADATA(author,"Jack Collins")
+        PZ_METADATA(medium, "book")
+        PZ_METADATA(date, "1995")
+        PZ_METADATA(title, "How to program a computer vol1")
+        PZ_END
+        PZ_BEGIN
+        PZ_METADATA(author,"Jack Collins")
+        PZ_METADATA(medium, "book")
+        PZ_METADATA(date, "1995")
+        PZ_METADATA(title, "How to program a computer vol2")
+        PZ_END
+        PZ_CEND
+        ,
+        PZ_CBEGIN
+        PZ_BEGIN
+        PZ_METADATA(author,"Jack Collins")
+        PZ_METADATA(medium, "book")
+        PZ_METADATA(date, "1995")
+        PZ_METADATA(title, "How to program a computer vol3")
+        PZ_END
+        PZ_BEGIN
+        PZ_METADATA(author,"Jack Collins")
+        PZ_METADATA(medium, "book")
+        PZ_METADATA(date, "1995")
+        PZ_METADATA(title, "How to program a computer vol2")
+        PZ_END
+        PZ_CEND
+        ,
+        PZ_BEGIN
+        PZ_METADATA(author,"Jack Collins")
+        PZ_METADATA(medium, "book")
+        PZ_METADATA(date, "1995")
+        PZ_METADATA(title, "How to program a computer vol1")
+        PZ_END
+        ,
+        /* identical to first */
+        PZ_CBEGIN
+        PZ_BEGIN
+        PZ_METADATA(author,"Jack Collins")
+        PZ_METADATA(medium, "book")
+        PZ_METADATA(date, "1995")
+        PZ_METADATA(title, "How to program a computer vol1")
+        PZ_END
+        PZ_BEGIN
+        PZ_METADATA(author,"Jack Collins")
+        PZ_METADATA(medium, "book")
+        PZ_METADATA(date, "1995")
+        PZ_METADATA(title, "How to program a computer vol4")
+        PZ_END
+        PZ_CEND
+    };
+    if (num > 0 && num <= sizeof(rec)/sizeof(*rec))
+        return odr_strdup(odr, rec[num - 1]);
+    return 0;
 }
 
 /* read MARC record and convert to XML */
 }
 
 /* read MARC record and convert to XML */
-char *dummy_xml_record(int num, ODR odr)
+char *dummy_xml_record(int num, ODR odr, const char *esn)
 {
 {
-    char *rec = dummy_marc_record(num, odr);
+    if (esn && !strcmp(esn, "pz2"))
+    {
+        return dummy_pz2_record(num, odr);
+    }
+    else if (!esn || !strcmp(esn, "marcxml") || !strcmp(esn, "OP"))
+    {
+        /* MARCXML and OPACXML */
+        char *rec = dummy_marc_record(num, odr);
+        if (rec)
+        {
+            WRBUF w = wrbuf_alloc();
+            yaz_marc_t mt = yaz_marc_create();
+            yaz_marc_xml(mt, YAZ_MARC_MARCXML);
+            if (esn && !strcmp(esn, "OP"))
+            {
+                /* generate OPACXML (OPAC in XML) */
+                Z_OPACRecord *opac = dummy_opac(num, odr, rec);
+                yaz_opac_decode_wrbuf(mt, opac, w);
+            }
+            else
+            {
+                /* generate MARCXML */
+                yaz_marc_decode_wrbuf(mt, rec, -1, w);
+            }
+            rec = odr_strdup(odr, wrbuf_cstr(w));
+            yaz_marc_destroy(mt);
+            wrbuf_destroy(w);
+            return rec;
+        }
+    }
+    else
+    {
+        char *buf = 0;
+        const char *e = getenv("YAZ_ZTEST_XML_FETCH");
+        if (e)
+        {
+            WRBUF w = wrbuf_alloc();
+            struct stat sbuf;
+            FILE *file = 0;
 
 
-    if (rec)
+            wrbuf_printf(w, "%s%s.%d.xml", e, esn, num);
+            if (stat(wrbuf_cstr(w), &sbuf) == 0 &&
+                (file = fopen(wrbuf_cstr(w), "rb")))
+            {
+                buf = odr_malloc(odr, sbuf.st_size);
+                fread(buf, 1, sbuf.st_size, file);
+            }
+            if (file)
+                fclose(file);
+        }
+        return buf;
+    }
+    return 0;
+}
+
+char *dummy_json_record(int num, ODR odr, const char *esn)
+{
+    if (!esn || !strcmp(esn, "marcinjson"))
     {
     {
-        const char *result;
-        size_t rlen;
-        int len;
-        yaz_marc_t mt = yaz_marc_create();
-        yaz_marc_xml(mt, YAZ_MARC_MARCXML);
-        len = yaz_marc_decode_buf(mt, rec, -1, &result, &rlen);
-        if (len > 1)
+        char *rec = dummy_marc_record(num, odr);
+        if (rec)
         {
         {
-            rec = (char *) odr_malloc(odr, rlen+1);
-            memcpy(rec, result, rlen);
-            rec[rlen] = '\0';
+            WRBUF w = wrbuf_alloc();
+            yaz_marc_t mt = yaz_marc_create();
+            yaz_marc_xml(mt, YAZ_MARC_JSON);
+            yaz_marc_decode_wrbuf(mt, rec, -1, w);
+            rec = odr_strdup(odr, wrbuf_cstr(w));
+            yaz_marc_destroy(mt);
+            wrbuf_destroy(w);
+            return rec;
         }
         }
-        yaz_marc_destroy(mt);
     }
     }
-    return rec;
+    return 0;
 }
 }
+
 /*
  * Local variables:
  * c-basic-offset: 4
 /*
  * Local variables:
  * c-basic-offset: 4