Better diagnostics for extraction process.
[idzebra-moved-to-github.git] / index / extract.c
index ebd04ac..da261e2 100644 (file)
@@ -4,7 +4,22 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: extract.c,v $
- * Revision 1.90  1999-02-02 14:50:52  adam
+ * Revision 1.95  1999-05-21 12:00:17  adam
+ * Better diagnostics for extraction process.
+ *
+ * Revision 1.94  1999/05/20 12:57:18  adam
+ * Implemented TCL filter. Updated recctrl system.
+ *
+ * Revision 1.93  1999/05/15 14:36:38  adam
+ * Updated dictionary. Implemented "compression" of dictionary.
+ *
+ * Revision 1.92  1999/03/09 16:27:49  adam
+ * More work on SDRKit integration.
+ *
+ * Revision 1.91  1999/02/12 13:29:22  adam
+ * Implemented position-flag for registers.
+ *
+ * Revision 1.90  1999/02/02 14:50:52  adam
  * Updated WIN32 code specific sections. Changed header.
  *
  * Revision 1.89  1998/10/28 10:54:38  adam
@@ -399,7 +414,7 @@ int key_open (struct recordGroup *rGroup, int mem)
     key_buf_used = 0;
     key_file_no = 0;
 
-    if (!(matchDict = dict_open (bfs, GMATCH_DICT, 50, rw)))
+    if (!(matchDict = dict_open (bfs, GMATCH_DICT, 50, rw, 0)))
     {
         logf (LOG_FATAL, "dict_open fail of %s", GMATCH_DICT);
        return -1;
@@ -426,6 +441,7 @@ int key_open (struct recordGroup *rGroup, int mem)
 struct encode_info {
     int  sysno;
     int  seqno;
+    int  cmd;
     char buf[768];
 };
 
@@ -433,6 +449,7 @@ void encode_key_init (struct encode_info *i)
 {
     i->sysno = 0;
     i->seqno = 0;
+    i->cmd = -1;
 }
 
 char *encode_key_int (int d, char *bp)
@@ -474,8 +491,11 @@ void encode_key_write (char *k, struct encode_info *i, FILE *outf)
         i->sysno = key.sysno;
         i->seqno = 0;
     }
+    else if (!i->seqno && !key.seqno && i->cmd == *k)
+       return;
     bp = encode_key_int (key.seqno - i->seqno, bp);
     i->seqno = key.seqno;
+    i->cmd = *k;
     if (fwrite (i->buf, bp - i->buf, 1, outf) != 1)
     {
         logf (LOG_FATAL|LOG_ERRNO, "fwrite");
@@ -696,7 +716,8 @@ static void addIndexString (RecWord *p, const char *string, int length)
         dst += sizeof(*pseqno);
     }
     reckeys.buf_used = dst - reckeys.buf;
-    (*pseqno)++;
+    if (*pseqno)
+       (*pseqno)++;
 }
 
 static void addSortString (RecWord *p, const char *string, int length)
@@ -1223,7 +1244,7 @@ void addSchema (struct recExtractCtrl *p, Odr_oid *oid)
 static int recordExtract (SYSNO *sysno, const char *fname,
                           struct recordGroup *rGroup, int deleteFlag,
                           struct file_read_info *fi,
-                         RecType recType, char *subType)
+                         RecType recType, char *subType, void *clientData)
 {
     RecordAttr *recordAttr;
     int r;
@@ -1258,7 +1279,12 @@ static int recordExtract (SYSNO *sysno, const char *fname,
        extractCtrl.addSchema = addSchema;
        extractCtrl.dh = rGroup->dh;
        for (i = 0; i<256; i++)
-           extractCtrl.seqno[i] = 0;
+       {
+           if (zebra_maps_is_positioned(rGroup->zebra_maps, i))
+               extractCtrl.seqno[i] = 1;
+           else
+               extractCtrl.seqno[i] = 0;
+       }
        extractCtrl.zebra_maps = rGroup->zebra_maps;
        extractCtrl.flagShowRecords = !rGroup->flagRw;
 
@@ -1270,18 +1296,20 @@ static int recordExtract (SYSNO *sysno, const char *fname,
         logInfo.rGroup = rGroup;
         log_event_start (recordLogPreamble, &logInfo);
 
-        r = (*recType->extract)(&extractCtrl);
+        r = (*recType->extract)(clientData, &extractCtrl);
 
         log_event_start (NULL, NULL);
 
-        if (r)      
-        {
+       if (r == RECCTRL_EXTRACT_EOF)
+           return 0;
+       else if (r == RECCTRL_EXTRACT_ERROR)
+       {
             /* error occured during extraction ... */
             if (rGroup->flagRw &&
                records_processed < rGroup->fileVerboseLimit)
             {
-                logf (LOG_WARN, "fail %s %s %ld code = %d", rGroup->recordType,
-                      fname, (long) recordOffset, r);
+                logf (LOG_WARN, "fail %s %s %ld", rGroup->recordType,
+                      fname, (long) recordOffset);
             }
             return 0;
         }
@@ -1509,6 +1537,7 @@ int fileExtract (SYSNO *sysno, const char *fname,
     struct recordGroup rGroupM;
     struct recordGroup *rGroup = &rGroupM;
     struct file_read_info *fi;
+    void *clientData;
 
     memcpy (rGroup, rGroupP, sizeof(*rGroupP));
    
@@ -1548,7 +1577,8 @@ int fileExtract (SYSNO *sysno, const char *fname,
     if (!*rGroup->recordType)
        return 0;
     if (!(recType =
-         recType_byName (rGroup->recTypes, rGroup->recordType, subType)))
+         recType_byName (rGroup->recTypes, rGroup->recordType, subType,
+                         &clientData)))
     {
         logf (LOG_WARN, "No such record type: %s", rGroup->recordType);
         return 0;
@@ -1620,14 +1650,17 @@ int fileExtract (SYSNO *sysno, const char *fname,
         rGroup->flagStoreKeys = 0;
 
 #if ZEBRASDR
-    if (1)
+    if (rGroup->useSDR)
     {
        ZebraSdrHandle h;
        char xname[128], *xp;
 
        strncpy (xname, fname, 127);
-       if ((xp = strchr (xname, '.')))
-           *xp = '\0';
+       if (!(xp = strchr (xname, '.')))
+           return 0;
+       *xp = '\0';
+       if (strcmp (xp+1, "sdr.bits"))
+           return 0;
 
         h = zebraSdr_open (xname);
        if (!h)
@@ -1643,9 +1676,8 @@ int fileExtract (SYSNO *sysno, const char *fname,
 
            segmentno = zebraSdr_segment (h, 0);
            sprintf (sdr_name, "%%%s.%d", xname, segmentno);
-           logf (LOG_LOG, "SDR: %s", sdr_name);
 
-#if 1
+#if 0
            if (segmentno > 20)
                break;
 #endif
@@ -1685,7 +1717,7 @@ int fileExtract (SYSNO *sysno, const char *fname,
     {
         file_begin (fi);
         r = recordExtract (sysno, fname, rGroup, deleteFlag, fi,
-                           recType, subType);
+                           recType, subType, clientData);
     } while (r && !sysno && fi->file_more);
     file_read_stop (fi);
     if (fd != -1)