X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Fzebraapi.c;h=a8e803991a54d646f6052f877d2d126acc27c43f;hp=709e291c696549801c373e084dfbb3381f02acbe;hb=0f563f23506dabd7c84bdb750d4539b2b6cacf02;hpb=f064c8e9a0d96ef7a0ab489034c59b21d1c37f84 diff --git a/index/zebraapi.c b/index/zebraapi.c index 709e291..a8e8039 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,5 +1,5 @@ -/* $Id: zebraapi.c,v 1.235 2006-11-27 09:17:01 adam Exp $ - Copyright (C) 1995-2006 +/* $Id: zebraapi.c,v 1.243 2007-01-16 15:01:15 adam Exp $ + Copyright (C) 1995-2007 Index Data ApS This file is part of the Zebra server. @@ -174,12 +174,12 @@ ZebraHandle zebra_open(ZebraService zs, Res res) return zh; } -ZebraService zebra_start (const char *configName) +ZebraService zebra_start(const char *configName) { return zebra_start_res(configName, 0, 0); } -ZebraService zebra_start_res (const char *configName, Res def_res, Res over_res) +ZebraService zebra_start_res(const char *configName, Res def_res, Res over_res) { Res res; @@ -209,7 +209,18 @@ ZebraService zebra_start_res (const char *configName, Res def_res, Res over_res) res_close(res); return 0; } + if (zebra_check_res(res)) + { + yaz_log(YLOG_FATAL, "Configuration error(s) for %s", + configName); + return 0; + } } + else + { + zebra_check_res(res); + } + zh = xmalloc(sizeof(*zh)); zh->global_res = res; zh->sessions = 0; @@ -247,6 +258,7 @@ ZebraService zebra_start_res (const char *configName, Res def_res, Res over_res) } } + zh->timing = yaz_timing_create(); zh->path_root = res_get (zh->global_res, "root"); zh->nmem = nmem_create(); zh->record_classes = recTypeClass_create (zh->global_res, zh->nmem); @@ -303,6 +315,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, const char *recordCompression = 0; const char *profilePath; char cwd[1024]; + int sort_type = ZEBRA_SORT_TYPE_FLAT; ZEBRA_RES ret = ZEBRA_OK; ASSERTZS; @@ -348,8 +361,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, } getcwd(cwd, sizeof(cwd)-1); - profilePath = res_get_def(res, "profilePath", DEFAULT_PROFILE_PATH); - yaz_log(YLOG_DEBUG, "profilePath=%s cwd=%s", profilePath, cwd); + profilePath = res_get_def(res, "profilePath", 0); data1_set_tabpath (reg->dh, profilePath); data1_set_tabroot (reg->dh, reg_path); @@ -375,7 +387,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, reg->records = 0; reg->dict = 0; - reg->sortIdx = 0; + reg->sort_index = 0; reg->isams = 0; reg->matchDict = 0; reg->isamc = 0; @@ -417,9 +429,22 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, yaz_log (YLOG_WARN, "dict_open failed"); ret = ZEBRA_FAIL; } - if (!(reg->sortIdx = sortIdx_open (reg->bfs, rw))) + + + if (res_get_match (res, "sortindex", "f", "f")) + sort_type = ZEBRA_SORT_TYPE_FLAT; + else if (res_get_match (res, "sortindex", "i", "f")) + sort_type = ZEBRA_SORT_TYPE_ISAMB; + else { - yaz_log (YLOG_WARN, "sortIdx_open failed"); + yaz_log (YLOG_WARN, "bad_value for 'sortindex'"); + ret = ZEBRA_FAIL; + } + + + if (!(reg->sort_index = zebra_sort_open(reg->bfs, rw, sort_type))) + { + yaz_log (YLOG_WARN, "zebra_sort_open failed"); ret = ZEBRA_FAIL; } if (res_get_match (res, "isam", "s", ISAM_DEFAULT)) @@ -530,7 +555,7 @@ static void zebra_register_close(ZebraService zs, struct zebra_register *reg) dict_close (reg->dict); if (reg->matchDict) dict_close (reg->matchDict); - sortIdx_close (reg->sortIdx); + zebra_sort_close(reg->sort_index); if (reg->isams) isams_close (reg->isams); if (reg->isamc) @@ -557,8 +582,6 @@ ZEBRA_RES zebra_stop(ZebraService zs) { if (!zs) return ZEBRA_OK; - yaz_log (log_level, "zebra_stop"); - while (zs->sessions) { zebra_close (zs->sessions); @@ -572,6 +595,15 @@ ZEBRA_RES zebra_stop(ZebraService zs) recTypeClass_destroy(zs->record_classes); nmem_destroy(zs->nmem); res_close (zs->global_res); + + yaz_timing_stop(zs->timing); + yaz_log (YLOG_LOG, "zebra_stop: %4.2f %4.2f %4.2f", + yaz_timing_get_real(zs->timing), + yaz_timing_get_user(zs->timing), + yaz_timing_get_sys(zs->timing)); + + + yaz_timing_destroy(&zs->timing); xfree(zs); return ZEBRA_OK; } @@ -983,8 +1015,10 @@ ZEBRA_RES zebra_set_approx_limit(ZebraHandle zh, zint approx_limit) return ZEBRA_OK; } -ZEBRA_RES zebra_search_RPN(ZebraHandle zh, ODR o, Z_RPNQuery *query, - const char *setname, zint *hits) +ZEBRA_RES zebra_search_RPN_x(ZebraHandle zh, ODR o, Z_RPNQuery *query, + const char *setname, zint *hits, + int *estimated_hit_count, + int *partial_resultset) { ZEBRA_RES r; @@ -995,19 +1029,27 @@ ZEBRA_RES zebra_search_RPN(ZebraHandle zh, ODR o, Z_RPNQuery *query, assert(hits); assert(setname); yaz_log(log_level, "zebra_search_rpn"); - zh->hits = 0; - *hits = 0; if (zebra_begin_read(zh) == ZEBRA_FAIL) return ZEBRA_FAIL; r = resultSetAddRPN(zh, odr_extract_mem(o), query, - zh->num_basenames, zh->basenames, setname); + zh->num_basenames, zh->basenames, setname, + hits, estimated_hit_count, partial_resultset); zebra_end_read(zh); - *hits = zh->hits; return r; } +ZEBRA_RES zebra_search_RPN(ZebraHandle zh, ODR o, Z_RPNQuery *query, + const char *setname, zint *hits) +{ + int estimated_hit_count; + int partial_resultset; + return zebra_search_RPN_x(zh, o, query, setname, hits, + &estimated_hit_count, + &partial_resultset); +} + ZEBRA_RES zebra_records_retrieve(ZebraHandle zh, ODR stream, const char *setname, Z_RecordComposition *comp, @@ -2355,6 +2397,7 @@ ZEBRA_RES zebra_search_PQF(ZebraHandle zh, const char *pqf_query, Z_RPNQuery *query; ODR odr; + ZEBRA_CHECK_HANDLE(zh); odr = odr_createmem(ODR_ENCODE);