From 1c8e3808f2fda2c0a20f65ed8cd3e98859e15fd0 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Mon, 28 Feb 2011 15:02:51 +0100 Subject: [PATCH] Introduce spec for zebra_register_check --- include/idzebra/api.h | 2 +- index/zebraapi.c | 47 ++++++++++++++++++++++++++++++++++++----------- index/zebraidx.c | 16 +++++++++++++--- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/include/idzebra/api.h b/include/idzebra/api.h index f91a536..0b8b612 100644 --- a/include/idzebra/api.h +++ b/include/idzebra/api.h @@ -511,7 +511,7 @@ ZEBRA_RES zebra_set_break_handler(ZebraHandle zh, void *client_data); YAZ_EXPORT -ZEBRA_RES zebra_register_check(ZebraHandle zh, int message_limit); +ZEBRA_RES zebra_register_check(ZebraHandle zh, const char *spec); YAZ_END_CDECL diff --git a/index/zebraapi.c b/index/zebraapi.c index 6c3f630..4388e63 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -2194,14 +2194,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 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(); @@ -2270,6 +2273,8 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec, rec->sysno, (int) ord_len, (int) slen); } } + if ((flags & ZEBRA_CHECK_DICT) == 0) + continue; info = dict_lookup(zh->reg->dict, ord_buf); if (!info) { @@ -2282,7 +2287,7 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec, ": term do not exist in dictionary", rec->sysno); } } - else + else if (flags & ZEBRA_CHECK_ISAM) { ISAM_P pos; @@ -2398,16 +2403,30 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec, return res; } -ZEBRA_RES zebra_register_check(ZebraHandle zh, int message_limit) +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); @@ -2425,6 +2444,7 @@ ZEBRA_RES zebra_register_check(ZebraHandle zh, int message_limit) zint no_keys; if (zebra_record_check(zh, rec, &no_keys, message_limit, + flags, &no_long_dict_entries, &no_failed_dict_lookups, &no_invalid_keys, @@ -2451,15 +2471,20 @@ ZEBRA_RES zebra_register_check(ZebraHandle zh, int message_limit) 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; } diff --git a/index/zebraidx.c b/index/zebraidx.c index 3494e19..48cd1fe 100644 --- a/index/zebraidx.c +++ b/index/zebraidx.c @@ -179,9 +179,19 @@ int main(int argc, char **argv) } else if (!strncmp(arg, "check", 5)) { - if (zebra_register_check(zh, 10) != ZEBRA_OK) - yaz_log(YLOG_WARN, "register check failed"); - } + const char *spec = 0; + if (arg[5] == ':') + spec = arg + 6; + else if (arg[5] != '\0') + { + yaz_log(YLOG_FATAL, "missing colon after check"); + exit(1); + } + if (zebra_register_check(zh, spec) != ZEBRA_OK) + { + yaz_log(YLOG_WARN, "zebra_register_check failed"); + } + } else { yaz_log(YLOG_FATAL, "unknown command: %s", arg); -- 1.7.10.4