X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Fzebraapi.c;h=65b91764a3672c81dd4b773bec8494a4e56e792b;hp=adc9b6a02df676ffaba957cc6e4dc7df51b25d34;hb=d71149439012fadf092321e3b507d23711715743;hpb=f3f94568869a1ae0402bfa4f0dea4d80b09695df diff --git a/index/zebraapi.c b/index/zebraapi.c index adc9b6a..65b9176 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,5 +1,5 @@ /* This file is part of the Zebra server. - Copyright (C) 1995-2008 Index Data + Copyright (C) 1994-2009 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) @@ -199,11 +203,14 @@ ZebraService zebra_start_res(const char *configName, Res def_res, Res over_res) log_level = yaz_log_module_level("zebraapi"); log_level_initialized = 1; } - + + *system_str = '\0'; + *version_str = '\0'; zebra_get_version(version_str, system_str); - yaz_log(YLOG_LOG, "zebra_start %s %s", version_str, - configName ? configName : ""); + yaz_log(YLOG_LOG, "zebra_start %s %s", version_str, system_str); + if (configName) + yaz_log(YLOG_LOG, "config %s", configName); if ((res = res_open(def_res, over_res))) { @@ -236,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"); @@ -323,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; @@ -371,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); @@ -407,14 +416,22 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, /* installing rank classes */ zebraRankInstall(reg, rank_1_class); + zebraRankInstall(reg, rank_2_class); 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, "compression_str", "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; + } { const char *index_fname = res_get_def(res, "index", "default.idx"); @@ -1427,7 +1444,6 @@ int delete_w_handle(const char *info, void *handle) { ZebraHandle zh = (ZebraHandle) handle; ISAM_P pos; - ASSERTZH; if (*info == sizeof(pos)) { @@ -1437,6 +1453,32 @@ int delete_w_handle(const char *info, void *handle) return 0; } +int delete_w_all_handle(const char *info, void *handle) +{ + ZebraHandle zh = (ZebraHandle) handle; + ISAM_P pos; + + if (*info == sizeof(pos)) + { + ISAMB_PP pt; + memcpy(&pos, info+1, sizeof(pos)); + pt = isamb_pp_open(zh->reg->isamb, pos, 2); + if (pt) + { + struct it_key key; + key.mem[0] = 0; + while (isamb_pp_read(pt, &key)) + { + Record rec; + rec = rec_get(zh->reg->records, key.mem[0]); + rec_del(zh->reg->records, &rec); + } + isamb_pp_close(pt); + } + } + return delete_w_handle(info, handle); +} + static int delete_SU_handle(void *handle, int ord, const char *index_type, const char *string_index, zinfo_index_category_t cat) @@ -1445,23 +1487,18 @@ static int delete_SU_handle(void *handle, int ord, char ord_buf[20]; int ord_len; #if 0 - const char *index_type = 0; - const char *db = 0; - const char *string_index = 0; - zebraExplain_lookup_ord(zh->reg->zei, ord, - &index_type, &db, &string_index); - yaz_log(YLOG_LOG, - "delete_SU_handle:: ord=%d index_type=%s db=%s string_index=%s", - ord, index_type, db, string_index); -#endif yaz_log(YLOG_LOG, "ord=%d index_type=%s index=%s cat=%d", ord, index_type, string_index, (int) cat); +#endif ord_len = key_SU_encode(ord, ord_buf); ord_buf[ord_len] = '\0'; assert(zh->reg->isamb); + assert(zh->reg->records); dict_delete_subtree(zh->reg->dict, ord_buf, - zh, delete_w_handle); + zh, + !strcmp(string_index, "_ALLRECORDS") ? + delete_w_all_handle : delete_w_handle); return 0; } @@ -1604,7 +1641,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); @@ -2281,7 +2322,6 @@ ZEBRA_RES zebra_update_record(ZebraHandle zh, return ZEBRA_FAIL; res = zebra_buffer_extract_record(zh, buf, buf_size, action, - 0, /* test_mode */ recordType, sysno, match, @@ -2433,6 +2473,7 @@ void zebra_lock_prefix(Res res, char *path) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab