Bug fix: default storeKeys setting wasn't read when group was specified.
[idzebra-moved-to-github.git] / index / extract.c
index ca0dc46..305cc18 100644 (file)
@@ -1,10 +1,24 @@
 /*
- * Copyright (C) 1994-1999, Index Data 
+ * Copyright (C) 1994-2001, Index Data 
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: extract.c,v $
- * Revision 1.104  2000-09-05 14:04:05  adam
+ * Revision 1.108  2001-06-14 11:44:56  adam
+ * Bug fix: default storeKeys setting wasn't read when group was specified.
+ *
+ * Revision 1.107  2001/05/28 13:58:48  adam
+ * Call flushSortKeys when record is skipped to fix bad re-use of
+ * sort keys to whatever next record that comes in.
+ *
+ * Revision 1.106  2000/12/05 12:22:53  adam
+ * Termlist source implemented (so that we can index values of XML/SGML
+ * attributes).
+ *
+ * Revision 1.105  2000/12/05 10:01:44  adam
+ * Fixed bug regarding user-defined attribute sets.
+ *
+ * Revision 1.104  2000/09/05 14:04:05  adam
  * Updates for prefix 'yaz_' for YAZ log functions.
  *
  * Revision 1.103  2000/05/18 12:01:36  adam
@@ -419,6 +433,7 @@ static int records_processed = 0;
 
 static ZebraExplainInfo zti = NULL;
 
+
 static void logRecord (int showFlag)
 {
     if (!showFlag)
@@ -739,6 +754,19 @@ static void addIndexString (RecWord *p, const char *string, int length)
     
     *dst++ = lead;
 
+#if SU_SCHEME
+    if ((lead & 3) < 3)
+    {
+        int ch = zebraExplain_lookupSU (zti, attrSet, attrUse);
+        if (ch < 0)
+        {
+            ch = zebraExplain_addSU (zti, attrSet, attrUse);
+        }
+       assert (ch > 0);
+       memcpy (dst, &ch, sizeof(ch));
+       dst += sizeof(ch);
+    }
+#else
     if (!(lead & 1))
     {
         memcpy (dst, &attrSet, sizeof(attrSet));
@@ -749,6 +777,7 @@ static void addIndexString (RecWord *p, const char *string, int length)
         memcpy (dst, &attrUse, sizeof(attrUse));
         dst += sizeof(attrUse);
     }
+#endif
     *dst++ = p->reg_type;
     memcpy (dst, string, length);
     dst += length;
@@ -907,8 +936,11 @@ static void flushSortKeys (SYSNO sysno, int cmd)
     while (sk)
     {
        struct sortKey *sk_next = sk->next;
-       sortIdx_type (sortIdx, sk->attrUse);
-       sortIdx_add (sortIdx, sk->string, sk->length);
+       if (cmd >= 0)
+       {
+           sortIdx_type (sortIdx, sk->attrUse);
+           sortIdx_add (sortIdx, sk->string, sk->length);
+       }
        xfree (sk->string);
        xfree (sk);
        sk = sk_next;
@@ -918,20 +950,31 @@ static void flushSortKeys (SYSNO sysno, int cmd)
 
 static void flushRecordKeys (SYSNO sysno, int cmd, struct recKeys *reckeys)
 {
+#if SU_SCHEME
+#else
     unsigned char attrSet = (unsigned char) -1;
     unsigned short attrUse = (unsigned short) -1;
+#endif
     int seqno = 0;
     int off = 0;
+    int ch = 0;
 
     zebraExplain_recordCountIncrement (zti, cmd ? 1 : -1);
     while (off < reckeys->buf_used)
     {
         const char *src = reckeys->buf + off;
         struct it_key key;
-        int lead, ch;
+        int lead;
     
         lead = *src++;
 
+#if SU_SCHEME
+       if ((lead & 3) < 3)
+       {
+           memcpy (&ch, src, sizeof(ch));
+           src += sizeof(ch);
+       }
+#else
         if (!(lead & 1))
         {
             memcpy (&attrSet, src, sizeof(attrSet));
@@ -942,14 +985,23 @@ static void flushRecordKeys (SYSNO sysno, int cmd, struct recKeys *reckeys)
             memcpy (&attrUse, src, sizeof(attrUse));
             src += sizeof(attrUse);
         }
+#endif
         if (key_buf_used + 1024 > (ptr_top-ptr_i)*sizeof(char*))
             key_flush ();
         ++ptr_i;
+
         key_buf[ptr_top-ptr_i] = (char*)key_buf + key_buf_used;
 
+#if SU_SCHEME
+#else
         ch = zebraExplain_lookupSU (zti, attrSet, attrUse);
         if (ch < 0)
+        {
             ch = zebraExplain_addSU (zti, attrSet, attrUse);
+            yaz_log (LOG_LOG, "addSU cmd=%d set=%d use=%d SU=%d",
+                     cmd, attrSet, attrUse, ch);
+        }
+#endif
         assert (ch > 0);
        key_buf_used += key_SU_code (ch, ((char*)key_buf) + key_buf_used);
 
@@ -982,13 +1034,22 @@ static const char **searchRecordKey (struct recKeys *reckeys,
     int off = 0;
     int startSeq = -1;
     int i;
+    int seqno = 0;
+#if SU_SCHEME
+    int chS, ch;
+#else
     short attrUse;
     char attrSet;
-    int seqno = 0;
+#endif
 
     for (i = 0; i<32; i++)
         ws[i] = NULL;
-    
+
+#if SU_SCHEME
+    chS = zebraExplain_lookupSU (zti, attrSetS, attrUseS);
+    if (chS < 0)
+       return ws;
+#endif
     while (off < reckeys->buf_used)
     {
 
@@ -997,7 +1058,13 @@ static const char **searchRecordKey (struct recKeys *reckeys,
         int lead;
     
         lead = *src++;
-
+#if SU_SCHEME
+       if ((lead & 3)<3)
+       {
+           memcpy (&ch, src, sizeof(ch));
+           src += sizeof(ch);
+       }
+#else
         if (!(lead & 1))
         {
             memcpy (&attrSet, src, sizeof(attrSet));
@@ -1008,6 +1075,7 @@ static const char **searchRecordKey (struct recKeys *reckeys,
             memcpy (&attrUse, src, sizeof(attrUse));
             src += sizeof(attrUse);
         }
+#endif
         wstart = src;
         while (*src++)
             ;
@@ -1018,7 +1086,13 @@ static const char **searchRecordKey (struct recKeys *reckeys,
             memcpy (&seqno, src, sizeof(seqno));
             src += sizeof(seqno);
         }
-        if (attrUseS == attrUse && attrSetS == attrSet)
+       if (
+#if SU_SCHEME
+           ch == chS
+#else
+           attrUseS == attrUse && attrSetS == attrSet
+#endif
+           )
         {
             int woff;
 
@@ -1448,6 +1522,7 @@ static int recordExtract (SYSNO *sysno, const char *fname,
        {
            logf (LOG_LOG, "skipped %s %s " PRINTF_OFF_T, rGroup->recordType,
                  fname, recordOffset);
+           flushSortKeys (*sysno, -1);
            rec_rm (&rec);
            logRecord (0);
            return 1;
@@ -1693,11 +1768,14 @@ int fileExtract (SYSNO *sysno, const char *fname,
         const char *sval;
 
         sprintf (ext_res, "%sstoreKeys.%s", gprefix, ext);
-        if (!(sval = res_get (common_resource, ext_res)))
+        sval = res_get (common_resource, ext_res);
+       if (!sval)
         {
             sprintf (ext_res, "%sstoreKeys", gprefix);
             sval = res_get (common_resource, ext_res);
         }
+       if (!sval)
+           sval = res_get (common_resource, "storeKeys");
         if (sval)
             rGroup->flagStoreKeys = atoi (sval);
     }