Updated WIN32 code specific sections. Changed header.
[idzebra-moved-to-github.git] / recctrl / recgrs.c
index 76e0918..d2beb77 100644 (file)
@@ -1,10 +1,32 @@
 /*
- * 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.17  1998-02-10 12:03:06  adam
+ * 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
+ * Implemented automatic EXPLAIN database maintenance.
+ * Modified Zebra to work with ASN.1 compiled version of YAZ.
+ *
+ * Revision 1.19  1998/03/11 11:19:05  adam
+ * Changed the way sequence numbers are generated.
+ *
+ * Revision 1.18  1998/03/05 08:41:31  adam
+ * Minor changes.
+ *
+ * Revision 1.17  1998/02/10 12:03:06  adam
  * Implemented Sort.
  *
  * Revision 1.16  1998/01/29 13:38:17  adam
 #include <stdio.h>
 #include <assert.h>
 #include <sys/types.h>
-#ifndef WINDOWS
+#ifndef WIN32
 #include <unistd.h>
 #endif
 
 
 #define GRS_MAX_WORD 512
 
-static int seqno = 0;
-
 static data1_node *read_grs_type (struct grs_read_info *p, const char *type)
 {
     static struct {
@@ -190,7 +210,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)
 {
 }
 
@@ -251,8 +275,9 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
            {
                printf("%*s", level * 4, "");
                printf("Data: ");
-               if (n->u.data.len > 20)
-                   printf("'%.20s...'\n", n->u.data.data);
+               if (n->u.data.len > 32)
+                   printf("'%.24s ... %.6s'\n", n->u.data.data,
+                          n->u.data.data + n->u.data.len-6);
                else if (n->u.data.len > 0)
                    printf("'%.*s'\n", n->u.data.len, n->u.data.data);
                else
@@ -287,13 +312,11 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
                else
                {
                    wrd.reg_type = *tlist->structure;
-                   wrd.seqno = seqno;
                    wrd.string = n->u.data.data;
                    wrd.length = n->u.data.len;
-                   wrd.attrSet = tlist->att->parent->ordinal;
+                   wrd.attrSet = (int) (tlist->att->parent->reference);
                    wrd.attrUse = tlist->att->locals->local;
-                   (*p->add)(&wrd);
-                   seqno = wrd.seqno;
+                   (*p->addWord)(&wrd);
                }
            }
        }
@@ -305,12 +328,28 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
     return 0;
 }
 
+int grs_extract_tree(struct recExtractCtrl *p, data1_node *n)
+{
+    oident oe;
+    int oidtmp[OID_SIZE];
+
+    oe.proto = PROTO_Z3950;
+    oe.oclass = CLASS_SCHEMA;
+    oe.value = n->u.root.absyn->reference;
+
+    if ((oid_ent_to_oid (&oe, oidtmp)))
+       (*p->addSchema)(p, oidtmp);
+
+    return dumpkeys(n, p, 0);
+}
+
 static int grs_extract(struct recExtractCtrl *p)
 {
     data1_node *n;
     NMEM mem;
     struct grs_read_info gri;
-    seqno = 0;
+    oident oe;
+    int oidtmp[OID_SIZE];
 
     mem = nmem_create (); 
     gri.readf = p->readf;
@@ -325,6 +364,13 @@ static int grs_extract(struct recExtractCtrl *p)
     n = read_grs_type (&gri, p->subType);
     if (!n)
         return -1;
+
+    oe.proto = PROTO_Z3950;
+    oe.oclass = CLASS_SCHEMA;
+    oe.value = n->u.root.absyn->reference;
+    if ((oid_ent_to_oid (&oe, oidtmp)))
+       (*p->addSchema)(p, oidtmp);
+
     if (dumpkeys(n, p, 0) < 0)
     {
        data1_free_tree(p->dh, n);
@@ -399,7 +445,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
@@ -412,7 +458,7 @@ static int process_comp(data1_handle dh, data1_node *n, Z_RecordComposition *c)
 static int grs_retrieve(struct recRetrieveCtrl *p)
 {
     data1_node *node = 0, *onode = 0;
-    data1_node *new;
+    data1_node *dnew;
     data1_maptab *map;
     int res, selected = 0;
     NMEM mem;
@@ -436,26 +482,38 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
         nmem_destroy (mem);
        return 0;
     }
+    logf (LOG_DEBUG, "grs_retrieve: size");
+    if ((dnew = data1_insert_taggeddata(p->dh, node, node,
+                                      "size", mem)))
+    {
+       dnew->u.data.what = DATA1I_text;
+       dnew->u.data.data = dnew->lbuf;
+       sprintf(dnew->u.data.data, "%d", p->recordSize);
+       dnew->u.data.len = strlen(dnew->u.data.data);
+    }
+
     logf (LOG_DEBUG, "grs_retrieve: score");
-    if (p->score >= 0 && (new =
+    if (p->score >= 0 && (dnew =
                          data1_insert_taggeddata(p->dh, node,
                                                  node, "rank",
                                                  mem)))
     {
-       new->u.data.what = DATA1I_num;
-       new->u.data.data = new->lbuf;
-       sprintf(new->u.data.data, "%d", p->score);
-       new->u.data.len = strlen(new->u.data.data);
+       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 ((new = data1_insert_taggeddata(p->dh, node, node,
+    if (p->localno > 0 && (dnew = data1_insert_taggeddata(p->dh, node, node,
                                       "localControlNumber", mem)))
     {
-       new->u.data.what = DATA1I_text;
-       new->u.data.data = new->lbuf;
-       sprintf(new->u.data.data, "%d", p->localno);
-       new->u.data.len = strlen(new->u.data.data);
+       dnew->u.data.what = DATA1I_text;
+       dnew->u.data.data = dnew->lbuf;
+       sprintf(dnew->u.data.data, "%d", p->localno);
+       dnew->u.data.len = strlen(dnew->u.data.data);
     }
+
     logf (LOG_DEBUG, "grs_retrieve: schemaIdentifier");
     if (p->input_format == VAL_GRS1 && node->u.root.absyn &&
        node->u.root.absyn->reference != VAL_NONE)
@@ -484,13 +542,13 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
            }
            *(p++) = '\0';
 
-           if ((new = data1_insert_taggeddata(dh, node, node,
+           if ((dnew = data1_insert_taggeddata(dh, node, node,
                                               "schemaIdentifier", mem)))
            {
-               new->u.data.what = DATA1I_oid;
-               new->u.data.data = nmem_malloc(mem, p - tmp);
-               memcpy(new->u.data.data, tmp, p - tmp);
-               new->u.data.len = p - tmp;
+               dnew->u.data.what = DATA1I_oid;
+               dnew->u.data.data = nmem_malloc(mem, p - tmp);
+               memcpy(dnew->u.data.data, tmp, p - tmp);
+               dnew->u.data.len = p - tmp;
            }
        }
     }
@@ -603,6 +661,7 @@ static struct recType grs_type =
 {
     "grs",
     grs_init,
+    grs_destroy,
     grs_extract,
     grs_retrieve
 };