Allow record filters to return 'skip' this record (RECCTRL_EXTRACT_SKIP).
[idzebra-moved-to-github.git] / index / extract.c
index 614c0f1..51d2b94 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: extract.c,v 1.246 2006-12-18 23:40:07 adam Exp $
-   Copyright (C) 1995-2006
+/* $Id: extract.c,v 1.250 2007-03-01 10:35:46 adam Exp $
+   Copyright (C) 1995-2007
    Index Data ApS
 
 This file is part of the Zebra server.
@@ -59,8 +59,18 @@ static void extract_flush_sort_keys(ZebraHandle zh, zint sysno,
 static void extract_schema_add (struct recExtractCtrl *p, Odr_oid *oid);
 static void extract_token_add (RecWord *p);
 
+static void check_log_limit(ZebraHandle zh)
+{
+    if (zh->records_processed + zh->records_skipped == zh->m_file_verbose_limit)
+    {
+        yaz_log(YLOG_LOG, "More than %d file log entries. Omitting rest",
+                zh->m_file_verbose_limit);
+    }
+}
+
 static void logRecord (ZebraHandle zh)
 {
+    check_log_limit(zh);
     ++zh->records_processed;
     if (!(zh->records_processed % 1000))
     {
@@ -351,8 +361,11 @@ ZEBRA_RES zebra_extract_file(ZebraHandle zh, zint *sysno, const char *fname,
     }
     if (!zh->m_record_type)
     {
-       if (zh->records_processed < zh->m_file_verbose_limit)
+        check_log_limit(zh);
+       if (zh->records_processed + zh->records_skipped
+            < zh->m_file_verbose_limit)
             yaz_log (YLOG_LOG, "? %s", fname);
+        zh->records_skipped++;
         return 0;
     }
     /* determine match criteria */
@@ -521,7 +534,8 @@ ZEBRA_RES zebra_extract_record_stream(ZebraHandle zh,
     Record rec;
     off_t start_offset = 0, end_offset = 0;
     const char *pr_fname = fname;  /* filename to print .. */
-    int show_progress = zh->records_processed < zh->m_file_verbose_limit ? 1:0;
+    int show_progress = zh->records_processed + zh->records_skipped 
+        < zh->m_file_verbose_limit ? 1:0;
 
     zebra_init_log_level();
 
@@ -562,38 +576,48 @@ ZEBRA_RES zebra_extract_record_stream(ZebraHandle zh,
         extract_set_store_data_prepare(&extractCtrl);
         
         r = (*recType->extract)(recTypeClientData, &extractCtrl);
-        
-        if (r == RECCTRL_EXTRACT_EOF)
-            return ZEBRA_FAIL;
-        else if (r == RECCTRL_EXTRACT_ERROR_GENERIC)
+
+        switch (r)
         {
+        case RECCTRL_EXTRACT_EOF:
+            return ZEBRA_FAIL;
+        case RECCTRL_EXTRACT_ERROR_GENERIC:
             /* error occured during extraction ... */
             yaz_log (YLOG_WARN, "extract error: generic");
             return ZEBRA_FAIL;
-        }
-        else if (r == RECCTRL_EXTRACT_ERROR_NO_SUCH_FILTER)
-        {
+        case RECCTRL_EXTRACT_ERROR_NO_SUCH_FILTER:
             /* error occured during extraction ... */
             yaz_log (YLOG_WARN, "extract error: no such filter");
             return ZEBRA_FAIL;
+        case RECCTRL_EXTRACT_SKIP:
+            if (show_progress)
+                yaz_log (YLOG_LOG, "skip %s %s " ZINT_FORMAT,
+                         recordType, pr_fname, (zint) start_offset);
+            *more = 1;
+            
+            end_offset = stream->endf(stream, 0);
+            if (end_offset)
+                stream->seekf(stream, end_offset);
+
+            return ZEBRA_OK;
+        case RECCTRL_EXTRACT_OK:
+            break;
+        default:
+            yaz_log (YLOG_WARN, "extract error: unknown error: %d", r);
+            return ZEBRA_FAIL;
         }
-        
+        end_offset = stream->endf(stream, 0);
+        if (end_offset)
+            stream->seekf(stream, end_offset);
+        else
+            end_offset = stream->tellf(stream);
+
         all_matches_add(&extractCtrl);
         
         if (extractCtrl.match_criteria[0])
             match_criteria = extractCtrl.match_criteria;
-
-
-        end_offset = stream->endf(stream, 0);
-
-        if (!end_offset)
-            end_offset = stream->tellf(stream);
-        else
-            stream->seekf(stream, end_offset);
-
     }
 
-
     *more = 1;
     if (!sysno)
     {
@@ -1158,6 +1182,20 @@ static void extract_add_sort_string(RecWord *p, const char *str, int length)
     zebra_rec_keys_write(zh->reg->sortKeys, str, length, &key);
 }
 
+static void extract_add_staticrank_string(RecWord *p,
+                                          const char *str, int length)
+{
+    char valz[40];
+    struct recExtractCtrl *ctrl = p->extractCtrl;
+
+    if (length > sizeof(valz)-1)
+        length = sizeof(valz)-1;
+
+    memcpy(valz, str, length);
+    valz[length] = '\0';
+    ctrl->staticrank = atozint(valz);
+}
+
 static void extract_add_string(RecWord *p, const char *string, int length)
 {
     ZebraHandle zh = p->extractCtrl->handle;
@@ -1166,9 +1204,7 @@ static void extract_add_string(RecWord *p, const char *string, int length)
     if (!p->index_name)
         return;
 
-    if (zebra_maps_is_sort(zh->reg->zebra_maps, p->index_type))
-       extract_add_sort_string(p, string, length);
-    else
+    if (zebra_maps_is_index(zh->reg->zebra_maps, p->index_type))
     {
        extract_add_index_string(p, zinfo_index_category_index,
                                  string, length);
@@ -1182,6 +1218,14 @@ static void extract_add_string(RecWord *p, const char *string, int length)
                 &word, zinfo_index_category_alwaysmatches, "", 0);
         }
     }
+    else if (zebra_maps_is_sort(zh->reg->zebra_maps, p->index_type))
+    {
+       extract_add_sort_string(p, string, length);
+    }
+    else if (zebra_maps_is_staticrank(zh->reg->zebra_maps, p->index_type))
+    {
+       extract_add_staticrank_string(p, string, length);
+    }
 }
 
 static void extract_add_incomplete_field(RecWord *p)