More work on SDRKit integration.
[idzebra-moved-to-github.git] / recctrl / recgrs.c
index 0b7feea..b4ef25c 100644 (file)
@@ -1,10 +1,25 @@
 /*
- * Copyright (C) 1994-1998, Index Data I/S 
+ * Copyright (C) 1994-1999, Index Data
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: recgrs.c,v $
- * Revision 1.21  1998-07-01 09:16:10  adam
+ * Revision 1.26  1999-03-02 16:15:44  quinn
+ * Added "tagsysno" and "tagrank" directives to zebra.cfg.
+ *
+ * Revision 1.25  1999/02/18 15:01:26  adam
+ * Minor changes.
+ *
+ * Revision 1.24  1999/02/02 14:51:28  adam
+ * Updated WIN32 code specific sections. Changed header.
+ *
+ * Revision 1.23  1998/10/18 07:51:10  adam
+ * Changed one logf call.
+ *
+ * Revision 1.22  1998/10/16 08:14:37  adam
+ * Updated record control system.
+ *
+ * Revision 1.21  1998/07/01 09:16:10  adam
  * Element localno only added when it's greater than 0.
  *
  * Revision 1.20  1998/05/20 10:12:26  adam
 #include <stdio.h>
 #include <assert.h>
 #include <sys/types.h>
-#ifndef WINDOWS
+#ifndef WIN32
 #include <unistd.h>
 #endif
 
@@ -201,7 +216,11 @@ static data1_node *read_grs_type (struct grs_read_info *p, const char *type)
     return NULL;
 }
 
-static void grs_init(void)
+static void grs_init(RecType recType)
+{
+}
+
+static void grs_destroy(RecType recType)
 {
 }
 
@@ -432,7 +451,7 @@ static int process_comp(data1_handle dh, data1_node *n, Z_RecordComposition *c)
     }
     if (espec)
     {
-        logf (LOG_LOG, "Element: Espec-1 match");
+        logf (LOG_DEBUG, "Element: Espec-1 match");
        return data1_doespec1(dh, n, espec);
     }
     else
@@ -450,6 +469,7 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
     int res, selected = 0;
     NMEM mem;
     struct grs_read_info gri;
+    char *tagname;
     
     mem = nmem_create();
     gri.readf = p->readf;
@@ -479,22 +499,24 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
        dnew->u.data.len = strlen(dnew->u.data.data);
     }
 
-    logf (LOG_DEBUG, "grs_retrieve: score");
-    if (p->score >= 0 && (dnew =
+    tagname = res_get_def(p->res, "tagrank", "rank");
+    if (strcmp(tagname, "0") && p->score >= 0 && (dnew =
                          data1_insert_taggeddata(p->dh, node,
-                                                 node, "rank",
+                                                 node, tagname,
                                                  mem)))
     {
+        logf (LOG_DEBUG, "grs_retrieve: %s", tagname);
        dnew->u.data.what = DATA1I_num;
        dnew->u.data.data = dnew->lbuf;
        sprintf(dnew->u.data.data, "%d", p->score);
        dnew->u.data.len = strlen(dnew->u.data.data);
     }
 
-    logf (LOG_DEBUG, "grs_retrieve: localControlNumber");
-    if (p->localno > 0 && (dnew = data1_insert_taggeddata(p->dh, node, node,
-                                      "localControlNumber", mem)))
+    tagname = res_get_def(p->res, "tagsysno", "localControlNumber");
+    if (strcmp(tagname, "0") && p->localno > 0 &&
+        (dnew = data1_insert_taggeddata(p->dh, node, node, tagname, mem)))
     {
+        logf (LOG_DEBUG, "grs_retrieve: %s", tagname);
        dnew->u.data.what = DATA1I_text;
        dnew->u.data.data = dnew->lbuf;
        sprintf(dnew->u.data.data, "%d", p->localno);
@@ -607,11 +629,23 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
            if (!(p->rec_buf = data1_nodetobuf(p->dh, node, selected,
                (int*)&p->rec_len)))
                p->diagnostic = 238;
+           else
+           {
+               char *new_buf = (char*) odr_malloc (p->odr, p->rec_len);
+               memcpy (new_buf, p->rec_buf, p->rec_len);
+               p->rec_buf = new_buf;
+           }
            break;
        case VAL_SOIF:
            if (!(p->rec_buf = data1_nodetosoif(p->dh, node, selected,
                                                (int*)&p->rec_len)))
                p->diagnostic = 238;
+           else
+           {
+               char *new_buf = (char*) odr_malloc (p->odr, p->rec_len);
+               memcpy (new_buf, p->rec_buf, p->rec_len);
+               p->rec_buf = new_buf;
+           }
            break;
        default:
             if (!node->u.root.absyn)
@@ -631,9 +665,12 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
            if (!(p->rec_buf = data1_nodetomarc(p->dh, marctab, node,
                                                selected,
                                                (int*)&p->rec_len)))
-           {
                p->diagnostic = 238;
-               break;
+           else
+           {
+               char *new_buf = (char*) odr_malloc (p->odr, p->rec_len);
+               memcpy (new_buf, p->rec_buf, p->rec_len);
+               p->rec_buf = new_buf;
            }
     }
     if (node)
@@ -648,6 +685,7 @@ static struct recType grs_type =
 {
     "grs",
     grs_init,
+    grs_destroy,
     grs_extract,
     grs_retrieve
 };