X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Fzrpn.c;h=9927949690ce70432bb8a6d878f98d3c848fab0d;hp=d7d2416d225132d3ba37de40914402db9bbb744c;hb=47eeb5384a8fae8bcac8afb8a84782ca094683f9;hpb=2ca7b6bfd7e8d9a2cb9c36bf2520b46511a594eb diff --git a/index/zrpn.c b/index/zrpn.c index d7d2416..9927949 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,4 +1,4 @@ -/* $Id: zrpn.c,v 1.189 2005-05-04 10:48:39 adam Exp $ +/* $Id: zrpn.c,v 1.200 2005-06-14 20:28:54 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -24,7 +24,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #ifdef WIN32 #include -#else +#endif +#if HAVE_UNISTD_H #include #endif #include @@ -50,7 +51,6 @@ typedef struct Z_AttributesPlusTerm *zapt; } AttrType; - static int log_level_set = 0; static int log_level_rpn = 0; @@ -173,8 +173,8 @@ struct grep_info { ZebraSet termset; }; -static void term_untrans(ZebraHandle zh, int reg_type, - char *dst, const char *src) +void zebra_term_untrans(ZebraHandle zh, int reg_type, + char *dst, const char *src) { int len = 0; while (*src) @@ -238,7 +238,7 @@ static void add_isam_p(const char *name, const char *info, int su_code = 0; int len = key_SU_decode (&su_code, name); - term_untrans (p->zh, p->reg_type, term_tmp, name+len+1); + zebra_term_untrans (p->zh, p->reg_type, term_tmp, name+len+1); yaz_log(log_level_rpn, "grep: %d %c %s", su_code, name[len], term_tmp); zebraExplain_lookup_ord (p->zh->reg->zei, su_code, &db, &set, &use); @@ -975,7 +975,7 @@ static int string_relation(ZebraHandle zh, Z_AttributesPlusTerm *zapt, strcat(term_tmp, ")"); break; default: - *error_code = 117; + *error_code = YAZ_BIB1_UNSUPP_RELATION_ATTRIBUTE; return 0; } return 1; @@ -987,7 +987,8 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, struct grep_info *grep_info, int reg_type, int complete_flag, int num_bases, char **basenames, - char *term_dst, int xpath_use); + char *term_dst, int xpath_use, + struct ord_list **ol); static ZEBRA_RES term_trunc(ZebraHandle zh, Z_AttributesPlusTerm *zapt, @@ -1003,11 +1004,12 @@ static ZEBRA_RES term_trunc(ZebraHandle zh, struct rset_key_control *kc) { ZEBRA_RES res; + struct ord_list *ol; *rset = 0; grep_info->isam_p_indx = 0; res = string_term(zh, zapt, term_sub, attributeSet, stream, grep_info, reg_type, complete_flag, num_bases, basenames, - term_dst, xpath_use); + term_dst, xpath_use, &ol); if (res != ZEBRA_OK) return res; if (!*term_sub) /* no more terms ? */ @@ -1017,7 +1019,7 @@ static ZEBRA_RES term_trunc(ZebraHandle zh, grep_info->isam_p_indx, term_dst, strlen(term_dst), rank_type, 1 /* preserve pos */, zapt->term->which, rset_nmem, - kc, kc->scope); + kc, kc->scope, ol, reg_type); if (!*rset) return ZEBRA_FAIL; return ZEBRA_OK; @@ -1036,7 +1038,8 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, struct grep_info *grep_info, int reg_type, int complete_flag, int num_bases, char **basenames, - char *term_dst, int xpath_use) + char *term_dst, int xpath_use, + struct ord_list **ol) { char term_dict[2*IT_MAX_WORD+4000]; int j, r, base_no; @@ -1054,6 +1057,9 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, int errCode = 0; /* err code (if any is not OK) */ char *errString = 0; /* addinfo */ + + *ol = ord_list_create(stream); + rpn_char_map_prepare (zh->reg, reg_type, &rcmi); attr_init(&use, zapt, 1); use_value = attr_find_ex(&use, &curAttributeSet, &use_string); @@ -1080,8 +1086,8 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { - zh->errCode = YAZ_BIB1_DATABASE_UNAVAILABLE; - zh->errString = basenames[base_no]; + zebra_setError(zh, YAZ_BIB1_DATABASE_UNAVAILABLE, + basenames[base_no]); return ZEBRA_FAIL; } if (xpath_use > 0 && use_value == -2) @@ -1122,6 +1128,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, term_dict[prefix_len++] = ord_buf[i]; } attp.local_attributes = 0; /* no more attributes */ + *ol = ord_list_append(stream, *ol, ord); } else { @@ -1167,6 +1174,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, local_attr->local); if (ord < 0) continue; + *ol = ord_list_append(stream, *ol, ord); if (prefix_len) term_dict[prefix_len++] = '|'; else @@ -1200,7 +1208,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, { if (relation_error) { - zh->errCode = relation_error; + zebra_setError(zh, relation_error, 0); return ZEBRA_FAIL; } *term_sub = 0; @@ -1301,8 +1309,9 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, strcat(term_dict, ")"); break; default: - zh->errCode = YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE; - zh->errString = nmem_strdup_i(stream, truncation_value); + zebra_setError_zint(zh, + YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE, + truncation_value); return ZEBRA_FAIL; } if (attr_ok) @@ -1323,8 +1332,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (!bases_ok) { - zh->errCode = errCode; - zh->errString = errString; + zebra_setError(zh, errCode, errString); return ZEBRA_FAIL; } *term_sub = termp; @@ -1356,9 +1364,11 @@ static ZEBRA_RES zapt_term_to_utf8(ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (ret == (size_t)(-1)) { ret = yaz_iconv(zh->iconv_to_utf8, 0, 0, 0, 0); - zh->errCode = - YAZ_BIB1_QUERY_TERM_INCLUDES_CHARS_THAT_DO_NOT_TRANSLATE_INTO_; - return -1; + zebra_setError( + zh, + YAZ_BIB1_QUERY_TERM_INCLUDES_CHARS_THAT_DO_NOT_TRANSLATE_INTO_, + 0); + return ZEBRA_FAIL; } *outbuf = 0; } @@ -1379,7 +1389,7 @@ static ZEBRA_RES zapt_term_to_utf8(ZebraHandle zh, Z_AttributesPlusTerm *zapt, termz[sizez] = '\0'; break; default: - zh->errCode = YAZ_BIB1_UNSUPP_CODED_VALUE_FOR_TERM; + zebra_setError(zh, YAZ_BIB1_UNSUPP_CODED_VALUE_FOR_TERM, 0); return ZEBRA_FAIL; } return ZEBRA_OK; @@ -1423,50 +1433,6 @@ static ZEBRA_RES trans_scan_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, return ZEBRA_OK; } -char *normalize_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz, NMEM stream, unsigned reg_id) -{ - WRBUF wrbuf = 0; - AttrType truncation; - int truncation_value; - char *ex_list = 0; - - attr_init(&truncation, zapt, 5); - truncation_value = attr_find(&truncation, NULL); - - switch (truncation_value) - { - default: - ex_list = ""; - break; - case 101: - ex_list = "#"; - break; - case 102: - case 103: - ex_list = 0; - break; - case 104: - ex_list = "!#"; - break; - case 105: - ex_list = "!*"; - break; - } - if (ex_list) - wrbuf = zebra_replace(zh->reg->zebra_maps, reg_id, ex_list, - termz, strlen(termz)); - if (!wrbuf) - return nmem_strdup(stream, termz); - else - { - char *buf = (char*) nmem_malloc(stream, wrbuf_len(wrbuf)+1); - memcpy (buf, wrbuf_buf(wrbuf), wrbuf_len(wrbuf)); - buf[wrbuf_len(wrbuf)] = '\0'; - return buf; - } -} - static void grep_info_delete(struct grep_info *grep_info) { #ifdef TERM_COUNT @@ -1475,11 +1441,10 @@ static void grep_info_delete(struct grep_info *grep_info) xfree(grep_info->isam_p_buf); } -static int grep_info_prepare(ZebraHandle zh, - Z_AttributesPlusTerm *zapt, - struct grep_info *grep_info, - int reg_type, - NMEM stream) +static ZEBRA_RES grep_info_prepare(ZebraHandle zh, + Z_AttributesPlusTerm *zapt, + struct grep_info *grep_info, + int reg_type) { AttrType termset; int termset_value_numeric; @@ -1495,7 +1460,7 @@ static int grep_info_prepare(ZebraHandle zh, grep_info->termset = 0; if (!zapt) - return 0; + return ZEBRA_OK; attr_init(&termset, zapt, 8); termset_value_numeric = attr_find_ex(&termset, NULL, &termset_value_string); @@ -1515,18 +1480,33 @@ static int grep_info_prepare(ZebraHandle zh, grep_info->termset = resultSetAdd(zh, termset_name, 1); if (!grep_info->termset) { - zh->errCode = YAZ_BIB1_ILLEGAL_RESULT_SET_NAME; - zh->errString = nmem_strdup(stream, termset_name); - return -1; + zebra_setError(zh, YAZ_BIB1_ILLEGAL_RESULT_SET_NAME, termset_name); + return ZEBRA_FAIL; } } - return 0; + return ZEBRA_OK; } - +/** + \brief Create result set(s) for list of terms + \param zh Zebra Handle + \param termz term as used in query but converted to UTF-8 + \param attributeSet default attribute set + \param stream memory for result + \param reg_type register type ('w', 'p',..) + \param complete_flag whether it's phrases or not + \param rank_type term flags for ranking + \param xpath_use use attribute for X-Path (-1 for no X-path) + \param num_bases number of databases + \param basenames array of databases + \param rset_mem memory for result sets + \param result_sets output result set for each term in list (output) + \param number number of output result sets + \param kc rset key control to be used for created result sets +*/ static ZEBRA_RES term_list_trunc(ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz_org, + const char *termz, oid_value attributeSet, NMEM stream, int reg_type, int complete_flag, @@ -1538,13 +1518,12 @@ static ZEBRA_RES term_list_trunc(ZebraHandle zh, { char term_dst[IT_MAX_WORD+1]; struct grep_info grep_info; - char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); const char *termp = termz; int alloc_sets = 0; *num_result_sets = 0; *term_dst = 0; - if (grep_info_prepare(zh, zapt, &grep_info, reg_type, stream)) + if (grep_info_prepare(zh, zapt, &grep_info, reg_type) == ZEBRA_FAIL) return ZEBRA_FAIL; while(1) { @@ -1608,7 +1587,7 @@ static ZEBRA_RES rpn_search_APT_phrase(ZebraHandle zh, if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, kc); + *rset = rsnull_create (rset_nmem, kc, 0); else if (num_result_sets == 1) *rset = result_sets[0]; else @@ -1646,11 +1625,11 @@ static ZEBRA_RES rpn_search_APT_or_list(ZebraHandle zh, if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, kc); + *rset = rsnull_create (rset_nmem, kc, 0); else if (num_result_sets == 1) *rset = result_sets[0]; else - *rset = rsmulti_or_create(rset_nmem, kc, kc->scope, + *rset = rsmulti_or_create(rset_nmem, kc, kc->scope, 0 /* termid */, num_result_sets, result_sets); if (!*rset) return ZEBRA_FAIL; @@ -1683,7 +1662,7 @@ static ZEBRA_RES rpn_search_APT_and_list(ZebraHandle zh, if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, kc); + *rset = rsnull_create (rset_nmem, kc, 0); else if (num_result_sets == 1) *rset = result_sets[0]; else @@ -1744,7 +1723,7 @@ static int numeric_relation(ZebraHandle zh, Z_AttributesPlusTerm *zapt, sprintf(term_tmp, "(0*%d)", term_value); break; default: - *error_code = 117; + *error_code = YAZ_BIB1_UNSUPP_RELATION_ATTRIBUTE; return 0; } yaz_log(log_level_rpn, "dict_lookup_grep: %s", term_tmp); @@ -1830,9 +1809,9 @@ static ZEBRA_RES numeric_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { - zh->errCode = YAZ_BIB1_DATABASE_UNAVAILABLE; - zh->errString = basenames[base_no]; - return -1; + zebra_setError(zh, YAZ_BIB1_DATABASE_UNAVAILABLE, + basenames[base_no]); + return ZEBRA_FAIL; } for (local_attr = attp.local_attributes; local_attr; local_attr = local_attr->next) @@ -1860,8 +1839,7 @@ static ZEBRA_RES numeric_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (!prefix_len) { - errCode = YAZ_BIB1_UNSUPP_USE_ATTRIBUTE; - errString = nmem_strdup_i(stream, use_value); + zebra_setError_zint(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, use_value); continue; } bases_ok++; @@ -1876,8 +1854,7 @@ static ZEBRA_RES numeric_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, { if (relation_error) { - zh->errCode = relation_error; - zh->errString = 0; + zebra_setError(zh, relation_error, 0); return ZEBRA_FAIL; } *term_sub = 0; @@ -1886,8 +1863,7 @@ static ZEBRA_RES numeric_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (!bases_ok) { - zh->errCode = errCode; - zh->errString = errString; + zebra_setError(zh, errCode, errString); return ZEBRA_FAIL; } *term_sub = termp; @@ -1916,7 +1892,7 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, int alloc_sets = 0; yaz_log(log_level_rpn, "APT_numeric t='%s'", termz); - if (grep_info_prepare(zh, zapt, &grep_info, reg_type, stream)) + if (grep_info_prepare(zh, zapt, &grep_info, reg_type) == ZEBRA_FAIL) return ZEBRA_FAIL; while (1) { @@ -1945,7 +1921,7 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, strlen(term_dst), rank_type, 0 /* preserve position */, zapt->term->which, rset_nmem, - kc, kc->scope); + kc, kc->scope, 0, reg_type); if (!result_sets[num_result_sets]) break; num_result_sets++; @@ -1959,7 +1935,7 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, return ZEBRA_FAIL; } if (num_result_sets == 0) - *rset = rsnull_create(rset_nmem, kc); + *rset = rsnull_create(rset_nmem, kc, 0); if (num_result_sets == 1) *rset = result_sets[0]; else @@ -2001,6 +1977,7 @@ static ZEBRA_RES rpn_sort_spec(ZebraHandle zh, Z_AttributesPlusTerm *zapt, oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, const char *rank_type, + NMEM rset_nmem, RSET *rset, struct rset_key_control *kc) { @@ -2069,7 +2046,7 @@ static ZEBRA_RES rpn_sort_spec(ZebraHandle zh, Z_AttributesPlusTerm *zapt, sks->which = Z_SortKeySpec_null; sks->u.null = odr_nullval (); sort_sequence->specs[i] = sks; - *rset = rsnull_create (NULL, kc); + *rset = rsnull_create (rset_nmem, kc, 0); return ZEBRA_OK; } @@ -2108,11 +2085,11 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, int term_type = Z_Term_characterString; const char *flags = "void"; - if (grep_info_prepare(zh, 0 /* zapt */, &grep_info, '0', stream)) - return rsnull_create(rset_nmem, kc); + if (grep_info_prepare(zh, 0 /* zapt */, &grep_info, '0') == ZEBRA_FAIL) + return rsnull_create(rset_nmem, kc, 0); if (ord < 0) - return rsnull_create(rset_nmem, kc); + return rsnull_create(rset_nmem, kc, 0); if (prefix_len) term_dict[prefix_len++] = '|'; else @@ -2138,25 +2115,30 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, rset = rset_trunc(zh, grep_info.isam_p_buf, grep_info.isam_p_indx, term, strlen(term), flags, 1, term_type,rset_nmem, - kc, kc->scope); + kc, kc->scope, 0, reg_type); grep_info_delete(&grep_info); return rset; } -static RSET rpn_search_xpath(ZebraHandle zh, - oid_value attributeSet, - int num_bases, char **basenames, - NMEM stream, const char *rank_type, RSET rset, - int xpath_len, struct xpath_location_step *xpath, - NMEM rset_nmem, - struct rset_key_control *kc) +static +ZEBRA_RES rpn_search_xpath(ZebraHandle zh, + oid_value attributeSet, + int num_bases, char **basenames, + NMEM stream, const char *rank_type, RSET rset, + int xpath_len, struct xpath_location_step *xpath, + NMEM rset_nmem, + RSET *rset_out, + struct rset_key_control *kc) { oid_value curAttributeSet = attributeSet; int base_no; int i; if (xpath_len < 0) - return rset; + { + *rset_out = rset; + return ZEBRA_OK; + } yaz_log(YLOG_DEBUG, "xpath len=%d", xpath_len); for (i = 0; ireg->zei, basenames[base_no])) { - zh->errCode = YAZ_BIB1_DATABASE_UNAVAILABLE; - zh->errString = basenames[base_no]; - return rset; + zebra_setError(zh, YAZ_BIB1_DATABASE_UNAVAILABLE, + basenames[base_no]); + *rset_out = rset; + return ZEBRA_FAIL; } while (--level >= 0) { @@ -2283,8 +2266,8 @@ static RSET rpn_search_xpath(ZebraHandle zh, first_path = 0; } } - - return rset; + *rset_out = rset; + return ZEBRA_OK; } static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, @@ -2324,15 +2307,24 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (sort_flag) return rpn_sort_spec(zh, zapt, attributeSet, stream, sort_sequence, - rank_type, rset, kc); + rank_type, rset_nmem, rset, kc); + /* consider if an X-Path query is used */ xpath_len = parse_xpath(zh, zapt, attributeSet, xpath, 10, stream); if (xpath_len >= 0) { - xpath_use = 1016; - if (xpath[xpath_len-1].part[0] == '@') - xpath_use = 1015; + xpath_use = 1016; /* searching for element by default */ + if (xpath[xpath_len-1].part[0] == '@') + xpath_use = 1015; /* last step an attribute .. */ } + /* search using one of the various search type strategies + termz is our UTF-8 search term + attributeSet is top-level default attribute set + stream is ODR for search + reg_id is the register type + complete_flag is 1 for complete subfield, 0 for incomplete + xpath_use is use-attribute to be used for X-Path search, 0 for none + */ if (!strcmp(search_type, "phrase")) { res = rpn_search_APT_phrase(zh, zapt, termz, attributeSet, stream, @@ -2372,19 +2364,16 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } else { - zh->errCode = YAZ_BIB1_UNSUPP_STRUCTURE_ATTRIBUTE; - return ZEBRA_FAIL; + zebra_setError(zh, YAZ_BIB1_UNSUPP_STRUCTURE_ATTRIBUTE, 0); + res = ZEBRA_FAIL; } if (res != ZEBRA_OK) return res; if (!*rset) return ZEBRA_FAIL; - *rset = rpn_search_xpath(zh, attributeSet, num_bases, basenames, - stream, rank_type, *rset, - xpath_len, xpath, rset_nmem, kc); - if (!*rset) - return ZEBRA_FAIL; - return ZEBRA_OK; + return rpn_search_xpath(zh, attributeSet, num_bases, basenames, + stream, rank_type, *rset, + xpath_len, xpath, rset_nmem, rset, kc); } static ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, @@ -2421,15 +2410,16 @@ ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs, for (i = 0; idec)(kc); - return ZEBRA_OK; + return res; } ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, @@ -2505,7 +2495,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, break; case Z_Operator_or: rset = rsmulti_or_create(rset_nmem, kc, - kc->scope, + kc->scope, 0, /* termid */ *num_result_sets, *result_sets); break; case Z_Operator_and_not: @@ -2517,15 +2507,16 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, case Z_Operator_prox: if (zop->u.prox->which != Z_ProximityOperator_known) { - zh->errCode = YAZ_BIB1_UNSUPP_PROX_UNIT_CODE; + zebra_setError(zh, + YAZ_BIB1_UNSUPP_PROX_UNIT_CODE, + 0); return ZEBRA_FAIL; } if (*zop->u.prox->u.known != Z_ProxUnit_word) { - char *val = (char *) nmem_malloc(stream, 16); - zh->errCode = YAZ_BIB1_UNSUPP_PROX_UNIT_CODE; - zh->errString = val; - sprintf(val, "%d", *zop->u.prox->u.known); + zebra_setError_zint(zh, + YAZ_BIB1_UNSUPP_PROX_UNIT_CODE, + *zop->u.prox->u.known); return ZEBRA_FAIL; } else @@ -2541,7 +2532,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, } break; default: - zh->errCode = YAZ_BIB1_OPERATOR_UNSUPP; + zebra_setError(zh, YAZ_BIB1_OPERATOR_UNSUPP, 0); return ZEBRA_FAIL; } *num_result_sets = 1; @@ -2571,16 +2562,16 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, rset = resultSetRef(zh, zs->u.simple->u.resultSetId); if (!rset) { - zh->errCode = YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST; - zh->errString = - nmem_strdup(stream, zs->u.simple->u.resultSetId); + zebra_setError(zh, + YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST, + zs->u.simple->u.resultSetId); return ZEBRA_FAIL; } rset_dup(rset); } else { - zh->errCode = YAZ_BIB1_UNSUPP_SEARCH; + zebra_setError(zh, YAZ_BIB1_UNSUPP_SEARCH, 0); return ZEBRA_FAIL; } *num_result_sets = 1; @@ -2590,7 +2581,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, } else { - zh->errCode = YAZ_BIB1_UNSUPP_SEARCH; + zebra_setError(zh, YAZ_BIB1_UNSUPP_SEARCH, 0); return ZEBRA_FAIL; } return ZEBRA_OK; @@ -2631,13 +2622,13 @@ static int scan_handle (char *name, const char *info, int pos, void *client) return 0; } -static void scan_term_untrans (ZebraHandle zh, NMEM stream, int reg_type, - char **dst, const char *src) +void zebra_term_untrans_iconv(ZebraHandle zh, NMEM stream, int reg_type, + char **dst, const char *src) { char term_src[IT_MAX_WORD]; char term_dst[IT_MAX_WORD]; - term_untrans (zh, reg_type, term_src, src); + zebra_term_untrans (zh, reg_type, term_src, src); if (zh->iconv_from_utf8 != 0) { @@ -2663,28 +2654,29 @@ static void scan_term_untrans (ZebraHandle zh, NMEM stream, int reg_type, *dst = nmem_strdup(stream, term_src); } -static void count_set (RSET r, int *count) +static void count_set(ZebraHandle zh, RSET rset, zint *count) { zint psysno = 0; - int kno = 0; struct it_key key; RSFD rfd; yaz_log(YLOG_DEBUG, "count_set"); + rset->hits_limit = zh->approx_limit; + *count = 0; - rfd = rset_open (r, RSETF_READ); - while (rset_read (rfd, &key,0 /* never mind terms */)) + rfd = rset_open(rset, RSETF_READ); + while (rset_read(rfd, &key,0 /* never mind terms */)) { if (key.mem[0] != psysno) { psysno = key.mem[0]; - (*count)++; + if (rfd->counted_items >= rset->hits_limit) + break; } - kno++; } rset_close (rfd); - yaz_log(YLOG_DEBUG, "%d keys, %d records", kno, *count); + *count = rset->hits_count; } ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, @@ -2762,7 +2754,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rank_type, &complete_flag, &sort_flag)) { *num_entries = 0; - zh->errCode = YAZ_BIB1_UNSUPP_ATTRIBUTE_TYPE; + zebra_setError(zh, YAZ_BIB1_UNSUPP_ATTRIBUTE_TYPE, 0); return ZEBRA_FAIL; } yaz_log(YLOG_DEBUG, "use_value = %d", use_value); @@ -2777,8 +2769,8 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { - zh->errString = basenames[base_no]; - zh->errCode = YAZ_BIB1_DATABASE_UNAVAILABLE; + zebra_setError(zh, YAZ_BIB1_DATABASE_UNAVAILABLE, + basenames[base_no]); *num_entries = 0; return ZEBRA_FAIL; } @@ -2805,16 +2797,16 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, { errCode = YAZ_BIB1_UNSUPP_USE_ATTRIBUTE; if (use_string) - errString = odr_strdup(stream, use_string); + zebra_setError(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, + use_string); else - { - char val_str[32]; - sprintf(val_str, "%d", use_value); - errString = odr_strdup(stream, val_str); - } + zebra_setError_zint(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, + use_value); } else - errCode = YAZ_BIB1_UNSUPP_ATTRIBUTE_SET; + { + zebra_setError(zh, YAZ_BIB1_UNSUPP_ATTRIBUTE_SET, 0); + } continue; } } @@ -2831,8 +2823,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, } if (!bases_ok && errCode) { - zh->errCode = errCode; - zh->errString = errString; + zebra_setError(zh, errCode, errString); *num_entries = 0; return ZEBRA_FAIL; } @@ -2924,12 +2915,12 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, if (lo >= 0) { /* get result set for first term */ - scan_term_untrans(zh, stream->mem, reg_id, - &glist[lo].term, mterm); + zebra_term_untrans_iconv(zh, stream->mem, reg_id, + &glist[lo].term, mterm); rset = rset_trunc(zh, &scan_info_array[j0].list[ptr[j0]].isam_p, 1, glist[lo].term, strlen(glist[lo].term), NULL, 0, zapt->term->which, rset_nmem, - kc, kc->scope); + kc, kc->scope, 0, reg_id); } ptr[j0]++; /* move index for this set .. */ /* get result set for remaining scan terms */ @@ -2950,15 +2941,17 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, glist[lo].term, strlen(glist[lo].term), NULL, 0, zapt->term->which,rset_nmem, - kc, kc->scope); + kc, kc->scope, 0, reg_id); rset = rsmulti_or_create(rset_nmem, kc, - 2, kc->scope, rsets); + kc->scope, 0 /* termid */, + 2, rsets); } ptr[j]++; } } if (lo >= 0) { + zint count; /* merge with limit_set if given */ if (limit_set) { @@ -2967,10 +2960,12 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rsets[1] = rset_dup(limit_set); rset = rsmulti_and_create(rset_nmem, kc, - kc->scope, 2, rsets); + kc->scope, + 2, rsets); } /* count it */ - count_set(rset, &glist[lo].occurrences); + count_set(zh, rset, &count); + glist[lo].occurrences = count; rset_delete(rset); } } @@ -2997,6 +2992,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, const char *tst; RSET rset; int lo = before-1-i; /* offset in result list */ + zint count; for (j = 0; j mem, reg_id, - &glist[lo].term, mterm); + zebra_term_untrans_iconv(zh, stream->mem, reg_id, + &glist[lo].term, mterm); rset = rset_trunc (zh, &scan_info_array[j0].list[before-1-ptr[j0]].isam_p, 1, glist[lo].term, strlen(glist[lo].term), - NULL, 0, zapt->term->which,rset_nmem, - kc, kc->scope); + NULL, 0, zapt->term->which, rset_nmem, + kc, kc->scope, 0, reg_id); ptr[j0]++; @@ -3037,9 +3033,9 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, glist[lo].term, strlen(glist[lo].term), NULL, 0, zapt->term->which, rset_nmem, - kc, kc->scope); + kc, kc->scope, 0, reg_id); rset = rsmulti_or_create(rset_nmem, kc, - 2, kc->scope, rsets); + kc->scope, 0 /* termid */, 2, rsets); ptr[j]++; } @@ -3053,7 +3049,8 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rset = rsmulti_and_create(rset_nmem, kc, kc->scope, 2, rsets); } - count_set (rset, &glist[lo].occurrences); + count_set(zh, rset, &count); + glist[lo].occurrences = count; rset_delete (rset); } (*kc->dec)(kc);