Check size of off_t and adjust printf format accordingly.
[idzebra-moved-to-github.git] / index / extract.c
index 10ff2bf..e06b9ae 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: extract.c,v 1.208 2006-05-09 11:31:37 marc Exp $
-   Copyright (C) 1995-2005
+/* $Id: extract.c,v 1.212 2006-05-10 14:13:45 adam Exp $
+   Copyright (C) 1995-2006
    Index Data ApS
 
 This file is part of the Zebra server.
@@ -36,12 +36,19 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include <direntz.h>
 #include <charmap.h>
 
-#if _FILE_OFFSET_BITS == 64
-#define PRINTF_OFF_T "%Ld"
+#ifdef WIN32
+#define PRINTF_OFF_T "%I64d"
+#else
+/* !WIN32 */
+#if SIZEOF_OFF_T == SIZEOF_LONG_LONG
+#define PRINTF_OFF_T "%lld"
 #else
 #define PRINTF_OFF_T "%ld"
 #endif
 
+#endif
+
+
 #define USE_SHELLSORT 0
 
 #if USE_SHELLSORT
@@ -387,6 +394,7 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh,
                                     RecType recType,
                                     void *recTypeClientData)
 {
+    const char *match_str_to_print = "";
     RecordAttr *recordAttr;
     int r;
     const char *matchStr = 0;
@@ -475,7 +483,13 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh,
             matchStr = extractCtrl.match_criteria;     
     }
 
-    /* perform match if sysno not known and if match criteria is specified */
+    /* if matchStr is set now - we assume it's printable .
+       For internal matchStr (see below) we don't print */
+    if (matchStr)
+        match_str_to_print = matchStr;
+
+    /* perform internal match if sysno not known and if match criteria is
+       specified already */
     if (!sysno) 
     {
         sysnotmp = 0;
@@ -532,17 +546,12 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh,
         *sysno = rec->sysno;
         
         if (zh->records_processed < zh->m_file_verbose_limit)
-          if (matchStr)
+        {
             yaz_log(YLOG_LOG, "add %s %s " PRINTF_OFF_T 
                     " " ZINT_FORMAT " %s" ,
                     zh->m_record_type,
-                    fname, recordOffset, *sysno, matchStr);
-          else
-            yaz_log(YLOG_LOG, "add %s %s " PRINTF_OFF_T 
-                    " " ZINT_FORMAT , 
-                    zh->m_record_type,
-                    fname, recordOffset, *sysno);
-        
+                    fname, recordOffset, *sysno, match_str_to_print);
+        }
        recordAttr = rec_init_attr (zh->reg->zei, rec);
        recordAttr->staticrank = extractCtrl.staticrank;
 
@@ -611,19 +620,12 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh,
             else
             {
                 if (zh->records_processed < zh->m_file_verbose_limit)
-                  if (matchStr)
+                {
                     yaz_log(YLOG_LOG, "delete %s %s " PRINTF_OFF_T 
                             " " ZINT_FORMAT " %s" ,
                             zh->m_record_type,
-                            fname, recordOffset, *sysno, matchStr);
-                  else
-                    yaz_log(YLOG_LOG, "delete %s %s " PRINTF_OFF_T 
-                            " " ZINT_FORMAT , 
-                            zh->m_record_type,
-                            fname, recordOffset, *sysno);
-
-
-
+                            fname, recordOffset, *sysno, match_str_to_print);
+                }
                 zh->records_deleted++;
                 if (matchStr)
                {
@@ -640,17 +642,12 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh,
         {
            /* flush new keys for sort&search etc */
             if (zh->records_processed < zh->m_file_verbose_limit)
-                  if (matchStr)
-                    yaz_log(YLOG_LOG, "update %s %s " PRINTF_OFF_T 
-                            " " ZINT_FORMAT " %s" ,
-                            zh->m_record_type,
-                            fname, recordOffset, *sysno, matchStr);
-                  else
-                    yaz_log(YLOG_LOG, "update %s %s " PRINTF_OFF_T 
-                            " " ZINT_FORMAT , 
-                            zh->m_record_type,
-                            fname, recordOffset, *sysno);
-
+            {
+                yaz_log(YLOG_LOG, "update %s %s " PRINTF_OFF_T 
+                        " " ZINT_FORMAT " %s" ,
+                        zh->m_record_type,
+                        fname, recordOffset, *sysno, match_str_to_print);
+            }
            recordAttr->staticrank = extractCtrl.staticrank;
 #if NATTR
             extract_flushSortKeys (zh, *sysno, 1, zh->reg->sortKeys);
@@ -1350,6 +1347,58 @@ int explain_extract (void *handle, Record rec, data1_node *n)
     return 0;
 }
 
+void extract_rec_keys_adjust(ZebraHandle zh, int is_insert,
+                             zebra_rec_keys_t reckeys)
+{
+    ZebraExplainInfo zei = zh->reg->zei;
+    struct ord_stat {
+        int no;
+        int ord;
+        struct ord_stat *next;
+    };
+
+    if (zebra_rec_keys_rewind(reckeys))
+    {
+        struct ord_stat *ord_list = 0;
+        struct ord_stat *p;
+       size_t slen;
+       const char *str;
+       struct it_key key_in;
+       while(zebra_rec_keys_read(reckeys, &str, &slen, &key_in))
+        {
+            int ord = key_in.mem[0]; 
+
+            for (p = ord_list; p ; p = p->next)
+                if (p->ord == ord)
+                {
+                    p->no++;
+                    break;
+                }
+            if (!p)
+            {
+                p = xmalloc(sizeof(*p));
+                p->no = 1;
+                p->ord = ord;
+                p->next = ord_list;
+                ord_list = p;
+            }
+        }
+
+        p = ord_list;
+        while (p)
+        {
+            struct ord_stat *p1 = p;
+
+            if (is_insert)
+                zebraExplain_ord_adjust_occurrences(zei, p->ord, p->no, 1);
+            else
+                zebraExplain_ord_adjust_occurrences(zei, p->ord, - p->no, -1);
+            p = p->next;
+            xfree(p1);
+        }
+    }
+}
+
 void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno,
                               int cmd,
                              zebra_rec_keys_t reckeys,
@@ -1357,6 +1406,8 @@ void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno,
 {
     ZebraExplainInfo zei = zh->reg->zei;
 
+    extract_rec_keys_adjust(zh, cmd, reckeys);
+
     if (!zh->reg->key_buf)
     {
        int mem= 1024*1024* atoi( res_get_def( zh->res, "memmax", "8"));
@@ -1403,7 +1454,7 @@ void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno,
            zh->reg->key_buf_used +=
                key_SU_encode(ch, (char*)zh->reg->key_buf +
                              zh->reg->key_buf_used);
-           
+
            /* copy the 0-terminated stuff from str to output */
            memcpy((char*)zh->reg->key_buf + zh->reg->key_buf_used, str, slen);
            zh->reg->key_buf_used += slen;
@@ -2159,3 +2210,11 @@ void encode_key_flush (struct encode_info *i, FILE *outf)
     i->prevseq=0;
 }
 #endif
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+