Refactor if stmt a bit
[idzebra-moved-to-github.git] / index / zebraapi.c
index 0ef006b..2e64dd0 100644 (file)
@@ -17,6 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 */
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 #include <assert.h>
 #include <stdio.h>
 #include <limits.h>
@@ -1624,7 +1627,11 @@ static void zebra_set_state(ZebraHandle zh, int val, int seqno)
     sprintf(state_fname, "state.%s.LCK", zh->reg_name);
     fname = zebra_mk_fname(res_get(zh->res, "lockDir"), state_fname);
     f = fopen(fname, "w");
-
+    if (!f)
+    {
+        yaz_log(YLOG_FATAL|YLOG_ERRNO, "open %s w", state_fname);
+        exit(1); 
+    }
     yaz_log(YLOG_DEBUG, "zebra_set_state: %c %d %ld", val, seqno, p);
     fprintf(f, "%c %d %ld\n", val, seqno, p);
     fclose(f);
@@ -1805,12 +1812,8 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw)
         zh->reg = zebra_register_open(zh->service, zh->reg_name,
                                      1, rval ? 1 : 0, zh->res,
                                      zh->path_reg);
-        if (zh->reg)
-            zh->reg->seqno = seqno;
-        else
+        if (!zh->reg)
         {
-            zebra_set_state(zh, 'o', seqno);
-            
             zebra_unlock(zh->lock_shadow);
             zebra_unlock(zh->lock_normal);
 
@@ -1822,6 +1825,7 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw)
             yaz_log(YLOG_FATAL, "%s", zh->errString);
             return ZEBRA_FAIL;
         }
+        zh->reg->seqno = seqno;
        zebraExplain_curDatabase(zh->reg->zei, zh->basenames[0]);
     }
     else
@@ -2194,14 +2198,17 @@ ZEBRA_RES zebra_compact(ZebraHandle zh)
     return ZEBRA_OK;
 }
 
+#define ZEBRA_CHECK_DICT 1
+#define ZEBRA_CHECK_ISAM 2
+
 static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec,
-                                    zint *no_keys, int verbose_level,
+                                    zint *no_keys, int message_limit,
+                                    unsigned flags,
                                     zint *no_long_dict_entries,
                                     zint *no_failed_dict_lookups,
                                     zint *no_invalid_keys,
                                     zint *no_invalid_dict_infos,
-                                    zint *no_invalid_isam_entries
-    )
+                                    zint *no_invalid_isam_entries)
 {
     ZEBRA_RES res = ZEBRA_OK;
     zebra_rec_keys_t keys = zebra_rec_keys_open();
@@ -2230,12 +2237,25 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec,
 
             (*no_keys)++;
 
+            if (key_in.len < 2 || key_in.len > IT_KEY_LEVEL_MAX)
+            {
+                res = ZEBRA_FAIL;
+                (*no_invalid_keys)++;
+                if (*no_invalid_keys <= message_limit)
+                {
+                    do_fail = 1;
+                    yaz_log(YLOG_WARN, "Record " ZINT_FORMAT
+                            ": unexpected key length %d",
+                            rec->sysno, key_in.len);
+                }
+            }
             if (ord_len + slen >= sizeof(ord_buf)-1)
             {
-                (*no_long_dict_entries)++;
                 res = ZEBRA_FAIL;
-                if (verbose_level >= 1)
+                (*no_long_dict_entries)++;
+                if (*no_long_dict_entries <= message_limit)
                 {
+                    do_fail = 1;
                     /* so bad it can not fit into our ord_buf */
                     yaz_log(YLOG_WARN, "Record " ZINT_FORMAT
                             ": long dictionary entry %d + %d",
@@ -2247,36 +2267,41 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec,
             ord_buf[ord_len + slen] = '\0'; 
             if (ord_len + slen >= IT_MAX_WORD)
             {
-                do_fail = 1;
+                res = ZEBRA_FAIL;
                 (*no_long_dict_entries)++;
-                if (verbose_level >= 1)
+                if (*no_long_dict_entries <= message_limit)
                 {
+                    do_fail = 1;
                     yaz_log(YLOG_WARN, "Record " ZINT_FORMAT 
                             ": long dictionary entry %d + %d",
                             rec->sysno, (int) ord_len, (int) slen);
                 }
             }
+            if ((flags & ZEBRA_CHECK_DICT) == 0)
+                continue;
             info = dict_lookup(zh->reg->dict, ord_buf);
             if (!info)
             {
-                do_fail = 1;
+                res = ZEBRA_FAIL;
                 (*no_failed_dict_lookups)++;
-                if (verbose_level >= 1)
+                if (*no_failed_dict_lookups <= message_limit)
                 {
+                    do_fail = 1;
                     yaz_log(YLOG_WARN, "Record " ZINT_FORMAT
                             ": term do not exist in dictionary", rec->sysno);
                 }
             }
-            else
+            else if (flags & ZEBRA_CHECK_ISAM)
             {
                 ISAM_P pos;
 
                 if (*info != sizeof(pos))
                 {
-                    do_fail = 1;
+                    res = ZEBRA_FAIL;
                     (*no_invalid_dict_infos)++;
-                    if (verbose_level >= 1)
+                    if (*no_invalid_dict_infos <= message_limit)
                     {
+                        do_fail = 1;
                         yaz_log(YLOG_WARN, "Record " ZINT_FORMAT 
                                 ": long dictionary entry %d + %d",
                                 rec->sysno, (int) ord_len, (int) slen);
@@ -2292,10 +2317,11 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec,
                                                       scope);
                         if (!ispt)
                         {
-                            do_fail = 1;
+                            res = ZEBRA_FAIL;
                             (*no_invalid_isam_entries)++;
-                            if (verbose_level >= 1)
+                            if (*no_invalid_isam_entries <= message_limit)
                             {
+                                do_fail = 1;
                                 yaz_log(YLOG_WARN, "Record " ZINT_FORMAT 
                                         ": isamb_pp_open entry " ZINT_FORMAT
                                         " not found",
@@ -2322,10 +2348,11 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec,
                             r = isamb_pp_forward(ispt, &isam_key, &until_key);
                             if (r != 1)
                             {
-                                do_fail = 1;
+                                res = ZEBRA_FAIL;
                                 (*no_invalid_isam_entries)++;
-                                if (verbose_level >= 1)
+                                if (*no_invalid_isam_entries <= message_limit)
                                 {
+                                    do_fail = 1;
                                     yaz_log(YLOG_WARN, "Record " ZINT_FORMAT 
                                             ": isamb_pp_forward " ZINT_FORMAT
                                             " returned no entry",
@@ -2337,10 +2364,12 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec,
                                 int cmp = key_compare(&until_key, &isam_key);
                                 if (cmp != 0)
                                 {
-                                    do_fail = 1;
+                                    res = ZEBRA_FAIL;
                                     (*no_invalid_isam_entries)++;
-                                    if (verbose_level >= 1)
+                                    if (*no_invalid_isam_entries
+                                        <= message_limit)
                                     {
+                                        do_fail = 1;
                                         yaz_log(YLOG_WARN, "Record "
                                                 ZINT_FORMAT 
                                                 ": isamb_pp_forward "
@@ -2365,26 +2394,11 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec,
                     }
                 }
             }
-            if (key_in.len < 2 || key_in.len > 4)
-            {
-                do_fail = 1;
-                (*no_invalid_keys)++;
-                if (verbose_level >= 1)
-                {
-                    yaz_log(YLOG_WARN, "Record " ZINT_FORMAT
-                            ": unexpected key length %d",
-                            rec->sysno, key_in.len);
-                }
-            }
             if (do_fail)
             {
-                res = ZEBRA_FAIL;
-                if (verbose_level >= 1)
-                {
-                    zebra_it_key_str_dump(zh, &key_in, str,
-                                          slen, nmem, YLOG_LOG);
-                    nmem_reset(nmem);
-                }
+                zebra_it_key_str_dump(zh, &key_in, str,
+                                      slen, nmem, YLOG_LOG);
+                nmem_reset(nmem);
             }
         }
         nmem_destroy(nmem);
@@ -2393,16 +2407,30 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec,
     return res;
 }
 
-ZEBRA_RES zebra_register_check(ZebraHandle zh, int verbose_level)
+ZEBRA_RES zebra_register_check(ZebraHandle zh, const char *spec)
 {
     ZEBRA_RES res = ZEBRA_FAIL;
+    unsigned flags = 0;
+    int message_limit = 10;
+    
+    if (!spec || *spec == '\0'
+        || !strcmp(spec, "dict") || !strcmp(spec, "default"))
+        flags = ZEBRA_CHECK_DICT;
+    else if (!strcmp(spec, "isam") || !strcmp(spec, "full"))
+        flags = ZEBRA_CHECK_DICT|ZEBRA_CHECK_ISAM;
+    else if (!strcmp(spec, "quick"))
+        flags = 0;
+    else
+        return ZEBRA_FAIL;
+
+    yaz_log(YLOG_LOG, "zebra_register_check begin flags=%u message_limit=%d",
+            flags, message_limit);
     if (zebra_begin_read(zh) == ZEBRA_OK)
     {
         zint no_records_total = 0;
         zint no_records_fail = 0;
         zint total_keys = 0;
 
-        
         if (zh->reg)
         {
             Record rec = rec_get_root(zh->reg->records);
@@ -2419,7 +2447,8 @@ ZEBRA_RES zebra_register_check(ZebraHandle zh, int verbose_level)
                 Record r1;
                 zint no_keys;
 
-                if (zebra_record_check(zh, rec, &no_keys, verbose_level,
+                if (zebra_record_check(zh, rec, &no_keys, message_limit,
+                                       flags,
                                        &no_long_dict_entries,
                                        &no_failed_dict_lookups,
                                        &no_invalid_keys,
@@ -2446,15 +2475,20 @@ ZEBRA_RES zebra_register_check(ZebraHandle zh, int verbose_level)
                     total_keys);
             yaz_log(YLOG_LOG, "long dict entries:    " ZINT_FORMAT,
                     no_long_dict_entries);
-            yaz_log(YLOG_LOG, "failed dict lookups:  " ZINT_FORMAT,
-                    no_failed_dict_lookups);
-            yaz_log(YLOG_LOG, "invalid dict infos:   " ZINT_FORMAT,
-                    no_invalid_dict_infos);
-            yaz_log(YLOG_LOG, "invalid isam entries: " ZINT_FORMAT,
-                    no_invalid_isam_entries);
+            if (flags & ZEBRA_CHECK_DICT)
+            {
+                yaz_log(YLOG_LOG, "failed dict lookups:  " ZINT_FORMAT,
+                        no_failed_dict_lookups);
+                yaz_log(YLOG_LOG, "invalid dict infos:   " ZINT_FORMAT,
+                        no_invalid_dict_infos);
+            }
+            if (flags & ZEBRA_CHECK_ISAM)
+                yaz_log(YLOG_LOG, "invalid isam entries: " ZINT_FORMAT,
+                        no_invalid_isam_entries);
         }
         zebra_end_read(zh);
     }
+    yaz_log(YLOG_LOG, "zebra_register_check end ret=%d", res);
     return res;
 }