X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Fzebraapi.c;h=420861ff8c769fc80fa4bf37999ee4e14bfecf93;hp=a34301425af64bdd91beabf8e249ce04f0d098e0;hb=16853a7593f10680ea8d6895aa0720b9af3779e6;hpb=8d8fd83ac10dd174264826c11cc301002a9313c1 diff --git a/index/zebraapi.c b/index/zebraapi.c index a343014..420861f 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,5 +1,5 @@ /* This file is part of the Zebra server. - Copyright (C) 1994-2009 Index Data + Copyright (C) 1994-2010 Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -61,20 +61,24 @@ static ZEBRA_RES zebra_check_handle(ZebraHandle zh) #define ZEBRA_CHECK_HANDLE(zh) if (zebra_check_handle(zh) != ZEBRA_OK) return ZEBRA_FAIL -static void zebra_chdir(ZebraService zs) +static int zebra_chdir(ZebraService zs) { const char *dir ; + int r; ASSERTZS; yaz_log(log_level, "zebra_chdir"); dir = res_get(zs->global_res, "chdir"); if (!dir) - return; + return 0; yaz_log(YLOG_DEBUG, "chdir %s", dir); #ifdef WIN32 - _chdir(dir); + r = _chdir(dir); #else - chdir(dir); + r = chdir(dir); #endif + if (r) + yaz_log(YLOG_FATAL|YLOG_ERRNO, "chdir %s", dir); + return r; } static ZEBRA_RES zebra_flush_reg(ZebraHandle zh) @@ -239,7 +243,11 @@ ZebraService zebra_start_res(const char *configName, Res def_res, Res over_res) zh->global_res = res; zh->sessions = 0; - zebra_chdir(zh); + if (zebra_chdir(zh)) + { + xfree(zh); + return 0; + } zebra_mutex_cond_init(&zh->session_lock); passwd_plain = res_get(zh->global_res, "passwd"); @@ -326,9 +334,8 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, { struct zebra_register *reg; int record_compression = REC_COMPRESS_NONE; - const char *recordCompression = 0; + const char *compression_str = 0; const char *profilePath; - char cwd[1024]; int sort_type = ZEBRA_SORT_TYPE_FLAT; ZEBRA_RES ret = ZEBRA_OK; @@ -374,7 +381,6 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, } } - getcwd(cwd, sizeof(cwd)-1); profilePath = res_get_def(res, "profilePath", 0); data1_set_tabpath(reg->dh, profilePath); @@ -414,11 +420,25 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, zebraRankInstall(reg, rank_similarity_class); zebraRankInstall(reg, rank_static_class); - recordCompression = res_get_def(res, "recordCompression", "none"); - if (!strcmp(recordCompression, "none")) + compression_str = res_get_def(res, "recordCompression", "none"); + if (!strcmp(compression_str, "none")) record_compression = REC_COMPRESS_NONE; - if (!strcmp(recordCompression, "bzip2")) + else if (!strcmp(compression_str, "bzip2")) record_compression = REC_COMPRESS_BZIP2; + else if (!strcmp(compression_str, "zlib")) + record_compression = REC_COMPRESS_ZLIB; + else + { + yaz_log(YLOG_FATAL, "invalid recordCompression: %s", compression_str); + ret = ZEBRA_FAIL; + } + + if (!rec_check_compression_method(record_compression)) + { + yaz_log(YLOG_FATAL, "unsupported recordCompression: %s", + compression_str); + ret = ZEBRA_FAIL; + } { const char *index_fname = res_get_def(res, "index", "default.idx"); @@ -1628,7 +1648,11 @@ static void zebra_get_state(ZebraHandle zh, char *val, int *seqno) if (f) { - fscanf(f, "%c %d", val, seqno); + if (fscanf(f, "%c %d", val, seqno) != 2) + { + yaz_log(YLOG_ERRNO|YLOG_WARN, "fscan fail %s", + state_fname); + } fclose(f); } xfree(fname); @@ -2170,6 +2194,33 @@ ZEBRA_RES zebra_compact(ZebraHandle zh) return ZEBRA_OK; } +ZEBRA_RES zebra_register_check(ZebraHandle zh) +{ + ZEBRA_RES res = ZEBRA_FAIL; + if (zebra_begin_read(zh) == ZEBRA_OK) + { + zint no_records = 0; + if (zh->reg) + { + Record rec = rec_get_root(zh->reg->records); + + while (rec) + { + Record r1; + + r1 = rec_get_next(zh->reg->records, rec); + rec_free(&rec); + rec = r1; + no_records++; + } + res = ZEBRA_OK; + } + zebra_end_read(zh); + yaz_log(YLOG_LOG, ZINT_FORMAT " records scanned", no_records); + } + return res; +} + void zebra_result(ZebraHandle zh, int *code, char **addinfo) { yaz_log(log_level, "zebra_result");