X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=71c99d5880cea28f94e8ad2ca1d54cc13b818499;hb=2cb08a89ee65d8ae2646b91dcf27bc3883759691;hp=d4be41921268f20e1a4f91c2fabaa0269a887529;hpb=a44867f8aeac3dceaaf3e2ed01af29b6a678b471;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index d4be419..71c99d5 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,4 +1,4 @@ -/* $Id: zrpn.c,v 1.178 2005-04-25 21:40:34 adam Exp $ +/* $Id: zrpn.c,v 1.192 2005-05-24 11:35:42 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -29,24 +29,13 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #endif #include +#include #include "index.h" #include #include #include -static const struct key_control it_ctrl = -{ - sizeof(struct it_key), - 2, /* we have sysnos and seqnos in this key, nothing more */ - key_compare_it, - key_logdump_txt, /* FIXME - clean up these functions */ - key_get_seq, -}; - - -const struct key_control *key_it_ctrl = &it_ctrl; - struct rpn_char_map_info { ZebraMaps zm; @@ -533,7 +522,7 @@ static int term_104(ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term) { - const char *s0, *s1; + const char *s0; const char **map; int i = 0; int j = 0; @@ -581,17 +570,33 @@ static int term_104(ZebraMaps zebra_maps, int reg_type, } else { - s1 = s0; - map = zebra_maps_input(zebra_maps, reg_type, &s0, strlen(s0), 0); + const char *s1 = s0; + int q_map_match = 0; + map = zebra_maps_search(zebra_maps, reg_type, &s0, strlen(s0), + &q_map_match); if (space_split && **map == *CHR_SPACE) break; - while (s1 < s0) - { - if (strchr(REGEX_CHARS, *s1)) - dst[i++] = '\\'; - dst_term[j++] = *s1; - dst[i++] = *s1++; - } + + /* add non-space char */ + memcpy(dst_term+j, s1, s0 - s1); + j += (s0 - s1); + if (!q_map_match) + { + while (s1 < s0) + { + if (strchr(REGEX_CHARS, *s1)) + dst[i++] = '\\'; + dst[i++] = *s1++; + } + } + else + { + char tmpbuf[80]; + esc_str(tmpbuf, sizeof(tmpbuf), map[0], strlen(map[0])); + + strcpy(dst + i, map[0]); + i += strlen(map[0]); + } } } dst[i] = '\0'; @@ -605,7 +610,7 @@ static int term_105(ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term, int right_truncate) { - const char *s0, *s1; + const char *s0; const char **map; int i = 0; int j = 0; @@ -628,17 +633,33 @@ static int term_105(ZebraMaps zebra_maps, int reg_type, } else { - s1 = s0; - map = zebra_maps_input(zebra_maps, reg_type, &s0, strlen(s0), 0); + const char *s1 = s0; + int q_map_match = 0; + map = zebra_maps_search(zebra_maps, reg_type, &s0, strlen(s0), + &q_map_match); if (space_split && **map == *CHR_SPACE) break; - while (s1 < s0) - { - if (strchr(REGEX_CHARS, *s1)) - dst[i++] = '\\'; - dst_term[j++] = *s1; - dst[i++] = *s1++; - } + + /* add non-space char */ + memcpy(dst_term+j, s1, s0 - s1); + j += (s0 - s1); + if (!q_map_match) + { + while (s1 < s0) + { + if (strchr(REGEX_CHARS, *s1)) + dst[i++] = '\\'; + dst[i++] = *s1++; + } + } + else + { + char tmpbuf[80]; + esc_str(tmpbuf, sizeof(tmpbuf), map[0], strlen(map[0])); + + strcpy(dst + i, map[0]); + i += strlen(map[0]); + } } } if (right_truncate) @@ -954,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; @@ -968,7 +989,8 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, int num_bases, char **basenames, char *term_dst, int xpath_use); -static ZEBRA_RES term_trunc(ZebraHandle zh, Z_AttributesPlusTerm *zapt, +static ZEBRA_RES term_trunc(ZebraHandle zh, + Z_AttributesPlusTerm *zapt, const char **term_sub, oid_value attributeSet, NMEM stream, struct grep_info *grep_info, @@ -977,7 +999,8 @@ static ZEBRA_RES term_trunc(ZebraHandle zh, Z_AttributesPlusTerm *zapt, char *term_dst, const char *rank_type, int xpath_use, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { ZEBRA_RES res; *rset = 0; @@ -994,7 +1017,7 @@ static ZEBRA_RES term_trunc(ZebraHandle zh, Z_AttributesPlusTerm *zapt, grep_info->isam_p_indx, term_dst, strlen(term_dst), rank_type, 1 /* preserve pos */, zapt->term->which, rset_nmem, - key_it_ctrl, key_it_ctrl->scope); + kc, kc->scope); if (!*rset) return ZEBRA_FAIL; return ZEBRA_OK; @@ -1057,8 +1080,8 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { - zh->errCode = 109; /* 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) @@ -1111,7 +1134,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (r == -1) { /* set was found, but value wasn't defined */ - errCode = 114; + errCode = YAZ_BIB1_UNSUPP_USE_ATTRIBUTE; if (use_string) errString = nmem_strdup(stream, use_string); else @@ -1127,7 +1150,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, oident.value = curAttributeSet; oid_ent_to_oid (&oident, oid); - errCode = 121; + errCode = YAZ_BIB1_UNSUPP_ATTRIBUTE_SET; errString = nmem_strdup(stream, oident.desc); } continue; @@ -1177,7 +1200,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; @@ -1235,7 +1258,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, strcat(term_dict, ")"); break; case 103: /* Regexp-2 */ - r = 1; + regex_range = 1; term_dict[j++] = '('; init_pos = 2; if (!term_103(zh->reg->zebra_maps, reg_type, @@ -1246,6 +1269,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, return ZEBRA_OK; } strcat(term_dict, ")"); + break; case 104: /* process # and ! in term */ term_dict[j++] = '('; if (!term_104(zh->reg->zebra_maps, reg_type, @@ -1277,8 +1301,9 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, strcat(term_dict, ")"); break; default: - zh->errCode = 120; - 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) @@ -1299,8 +1324,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; @@ -1332,8 +1356,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 = 125; - return -1; + zebra_setError( + zh, + YAZ_BIB1_QUERY_TERM_INCLUDES_CHARS_THAT_DO_NOT_TRANSLATE_INTO_, + 0); + return ZEBRA_FAIL; } *outbuf = 0; } @@ -1354,7 +1381,7 @@ static ZEBRA_RES zapt_term_to_utf8(ZebraHandle zh, Z_AttributesPlusTerm *zapt, termz[sizez] = '\0'; break; default: - zh->errCode = 124; + zebra_setError(zh, YAZ_BIB1_UNSUPP_CODED_VALUE_FOR_TERM, 0); return ZEBRA_FAIL; } return ZEBRA_OK; @@ -1450,11 +1477,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; @@ -1470,7 +1496,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); @@ -1490,12 +1516,11 @@ static int grep_info_prepare(ZebraHandle zh, grep_info->termset = resultSetAdd(zh, termset_name, 1); if (!grep_info->termset) { - zh->errCode = 128; - 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; } @@ -1508,7 +1533,8 @@ static ZEBRA_RES term_list_trunc(ZebraHandle zh, const char *rank_type, int xpath_use, int num_bases, char **basenames, NMEM rset_nmem, - RSET **result_sets, int *num_result_sets) + RSET **result_sets, int *num_result_sets, + struct rset_key_control *kc) { char term_dst[IT_MAX_WORD+1]; struct grep_info grep_info; @@ -1518,7 +1544,7 @@ static ZEBRA_RES term_list_trunc(ZebraHandle zh, *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) { @@ -1540,7 +1566,8 @@ static ZEBRA_RES term_list_trunc(ZebraHandle zh, num_bases, basenames, term_dst, rank_type, xpath_use, rset_nmem, - &(*result_sets)[*num_result_sets]); + &(*result_sets)[*num_result_sets], + kc); if (res != ZEBRA_OK) { int i; @@ -1566,7 +1593,8 @@ static ZEBRA_RES rpn_search_APT_phrase(ZebraHandle zh, const char *rank_type, int xpath_use, int num_bases, char **basenames, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { RSET *result_sets = 0; int num_result_sets = 0; @@ -1576,15 +1604,15 @@ static ZEBRA_RES rpn_search_APT_phrase(ZebraHandle zh, rank_type, xpath_use, num_bases, basenames, rset_nmem, - &result_sets, &num_result_sets); + &result_sets, &num_result_sets, kc); if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, key_it_ctrl); + *rset = rsnull_create (rset_nmem, kc, 0); else if (num_result_sets == 1) *rset = result_sets[0]; else - *rset = rsprox_create(rset_nmem, key_it_ctrl, key_it_ctrl->scope, + *rset = rsprox_create(rset_nmem, kc, kc->scope, num_result_sets, result_sets, 1 /* ordered */, 0 /* exclusion */, 3 /* relation */, 1 /* distance */); @@ -1603,7 +1631,8 @@ static ZEBRA_RES rpn_search_APT_or_list(ZebraHandle zh, int xpath_use, int num_bases, char **basenames, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { RSET *result_sets = 0; int num_result_sets = 0; @@ -1613,15 +1642,15 @@ static ZEBRA_RES rpn_search_APT_or_list(ZebraHandle zh, rank_type, xpath_use, num_bases, basenames, rset_nmem, - &result_sets, &num_result_sets); + &result_sets, &num_result_sets, kc); if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, key_it_ctrl); + *rset = rsnull_create (rset_nmem, kc, 0); else if (num_result_sets == 1) *rset = result_sets[0]; else - *rset = rsmulti_or_create(rset_nmem, key_it_ctrl, key_it_ctrl->scope, + *rset = rsmulti_or_create(rset_nmem, kc, kc->scope, 0 /* termid */, num_result_sets, result_sets); if (!*rset) return ZEBRA_FAIL; @@ -1638,7 +1667,8 @@ static ZEBRA_RES rpn_search_APT_and_list(ZebraHandle zh, int xpath_use, int num_bases, char **basenames, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { RSET *result_sets = 0; int num_result_sets = 0; @@ -1648,15 +1678,16 @@ static ZEBRA_RES rpn_search_APT_and_list(ZebraHandle zh, rank_type, xpath_use, num_bases, basenames, rset_nmem, - &result_sets, &num_result_sets); + &result_sets, &num_result_sets, + kc); if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, key_it_ctrl); + *rset = rsnull_create (rset_nmem, kc, 0); else if (num_result_sets == 1) *rset = result_sets[0]; else - *rset = rsmulti_and_create(rset_nmem, key_it_ctrl, key_it_ctrl->scope, + *rset = rsmulti_and_create(rset_nmem, kc, kc->scope, num_result_sets, result_sets); if (!*rset) return ZEBRA_FAIL; @@ -1713,7 +1744,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); @@ -1786,22 +1817,22 @@ static ZEBRA_RES numeric_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, curAttributeSet, use_value, r); if (r == -1) { - errCode = 114; + errCode = YAZ_BIB1_UNSUPP_USE_ATTRIBUTE; if (use_string) errString = nmem_strdup(stream, use_string); else errString = nmem_strdup_i (stream, use_value); } else - errCode = 121; + errCode = YAZ_BIB1_UNSUPP_ATTRIBUTE_SET; continue; } } if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { - zh->errCode = 109; /* 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) @@ -1829,8 +1860,7 @@ static ZEBRA_RES numeric_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (!prefix_len) { - errCode = 114; - errString = nmem_strdup_i(stream, use_value); + zebra_setError_zint(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, use_value); continue; } bases_ok++; @@ -1845,8 +1875,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; @@ -1855,8 +1884,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; @@ -1873,7 +1901,8 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, const char *rank_type, int xpath_use, int num_bases, char **basenames, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { char term_dst[IT_MAX_WORD+1]; const char *termp = termz; @@ -1884,7 +1913,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) { @@ -1913,7 +1942,7 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, strlen(term_dst), rank_type, 0 /* preserve position */, zapt->term->which, rset_nmem, - key_it_ctrl,key_it_ctrl->scope); + kc, kc->scope); if (!result_sets[num_result_sets]) break; num_result_sets++; @@ -1927,11 +1956,11 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, return ZEBRA_FAIL; } if (num_result_sets == 0) - *rset = rsnull_create(rset_nmem, key_it_ctrl); + *rset = rsnull_create(rset_nmem, kc, 0); if (num_result_sets == 1) *rset = result_sets[0]; else - *rset = rsmulti_and_create(rset_nmem, key_it_ctrl, key_it_ctrl->scope, + *rset = rsmulti_and_create(rset_nmem, kc, kc->scope, num_result_sets, result_sets); if (!*rset) return ZEBRA_FAIL; @@ -1944,12 +1973,13 @@ static ZEBRA_RES rpn_search_APT_local(ZebraHandle zh, oid_value attributeSet, NMEM stream, const char *rank_type, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { RSFD rsfd; struct it_key key; int sys; - *rset = rstemp_create(rset_nmem,key_it_ctrl,key_it_ctrl->scope, + *rset = rstemp_create(rset_nmem, kc, kc->scope, res_get (zh->res, "setTmpDir"),0 ); rsfd = rset_open(*rset, RSETF_WRITE); @@ -1968,16 +1998,15 @@ static ZEBRA_RES rpn_sort_spec(ZebraHandle zh, Z_AttributesPlusTerm *zapt, oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, const char *rank_type, - RSET *rset) + NMEM rset_nmem, + RSET *rset, + struct rset_key_control *kc) { int i; int sort_relation_value; AttrType sort_relation_type; - int use_value; - AttrType use_type; Z_SortKeySpec *sks; Z_SortKey *sk; - Z_AttributeElement *ae; int oid[OID_SIZE]; oident oe; char termz[20]; @@ -1985,9 +2014,6 @@ static ZEBRA_RES rpn_sort_spec(ZebraHandle zh, Z_AttributesPlusTerm *zapt, attr_init(&sort_relation_type, zapt, 7); sort_relation_value = attr_find(&sort_relation_type, &attributeSet); - attr_init(&use_type, zapt, 1); - use_value = attr_find(&use_type, &attributeSet); - if (!sort_sequence->specs) { sort_sequence->num_specs = 10; @@ -2023,21 +2049,7 @@ static ZEBRA_RES rpn_sort_spec(ZebraHandle zh, Z_AttributesPlusTerm *zapt, nmem_malloc(stream, sizeof(*sk->u.sortAttributes)); sk->u.sortAttributes->id = oid; - sk->u.sortAttributes->list = (Z_AttributeList *) - nmem_malloc(stream, sizeof(*sk->u.sortAttributes->list)); - sk->u.sortAttributes->list->num_attributes = 1; - sk->u.sortAttributes->list->attributes = (Z_AttributeElement **) - nmem_malloc(stream, sizeof(*sk->u.sortAttributes->list->attributes)); - ae = *sk->u.sortAttributes->list->attributes = (Z_AttributeElement *) - nmem_malloc(stream, sizeof(**sk->u.sortAttributes->list->attributes)); - ae->attributeSet = 0; - ae->attributeType = (int *) - nmem_malloc(stream, sizeof(*ae->attributeType)); - *ae->attributeType = 1; - ae->which = Z_AttributeValue_numeric; - ae->value.numeric = (int *) - nmem_malloc(stream, sizeof(*ae->value.numeric)); - *ae->value.numeric = use_value; + sk->u.sortAttributes->list = zapt->attributes; sks->sortRelation = (int *) nmem_malloc(stream, sizeof(*sks->sortRelation)); @@ -2055,7 +2067,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, key_it_ctrl); + *rset = rsnull_create (rset_nmem, kc, 0); return ZEBRA_OK; } @@ -2081,7 +2093,8 @@ static int parse_xpath(ZebraHandle zh, Z_AttributesPlusTerm *zapt, static RSET xpath_trunc(ZebraHandle zh, NMEM stream, int reg_type, const char *term, int use, - oid_value curAttributeSet, NMEM rset_nmem) + oid_value curAttributeSet, NMEM rset_nmem, + struct rset_key_control *kc) { RSET rset; struct grep_info grep_info; @@ -2093,11 +2106,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,key_it_ctrl); + 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,key_it_ctrl); + return rsnull_create(rset_nmem, kc, 0); if (prefix_len) term_dict[prefix_len++] = '|'; else @@ -2123,24 +2136,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, - key_it_ctrl, key_it_ctrl->scope); + kc, kc->scope); 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) +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 = 109; /* 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) { @@ -2243,7 +2263,7 @@ static RSET rpn_search_xpath(ZebraHandle zh, wrbuf_puts(wbuf, ""); rset_attr = xpath_trunc( zh, stream, '0', wrbuf_buf(wbuf), 3, - curAttributeSet,rset_nmem); + curAttributeSet, rset_nmem, kc); wrbuf_free(wbuf, 1); } else @@ -2255,31 +2275,29 @@ static RSET rpn_search_xpath(ZebraHandle zh, if (strlen(xpath_rev)) { rset_start_tag = xpath_trunc(zh, stream, '0', - xpath_rev, 1, curAttributeSet, rset_nmem); + xpath_rev, 1, curAttributeSet, rset_nmem, kc); rset_end_tag = xpath_trunc(zh, stream, '0', - xpath_rev, 2, curAttributeSet, rset_nmem); + xpath_rev, 2, curAttributeSet, rset_nmem, kc); - rset = rsbetween_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, + rset = rsbetween_create(rset_nmem, kc, kc->scope, rset_start_tag, rset, rset_end_tag, rset_attr); } first_path = 0; } } - - return rset; + *rset_out = rset; + return ZEBRA_OK; } - - static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { ZEBRA_RES res = ZEBRA_OK; unsigned reg_id; @@ -2310,7 +2328,7 @@ 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); + rank_type, rset_nmem, rset, kc); xpath_len = parse_xpath(zh, zapt, attributeSet, xpath, 10, stream); if (xpath_len >= 0) { @@ -2325,7 +2343,7 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, reg_id, complete_flag, rank_type, xpath_use, num_bases, basenames, rset_nmem, - rset); + rset, kc); } else if (!strcmp(search_type, "and-list")) { @@ -2333,7 +2351,7 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, reg_id, complete_flag, rank_type, xpath_use, num_bases, basenames, rset_nmem, - rset); + rset, kc); } else if (!strcmp(search_type, "or-list")) { @@ -2341,35 +2359,33 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, reg_id, complete_flag, rank_type, xpath_use, num_bases, basenames, rset_nmem, - rset); + rset, kc); } else if (!strcmp(search_type, "local")) { res = rpn_search_APT_local(zh, zapt, termz, attributeSet, stream, - rank_type, rset_nmem, rset); + rank_type, rset_nmem, rset, kc); } else if (!strcmp(search_type, "numeric")) { res = rpn_search_APT_numeric(zh, zapt, termz, attributeSet, stream, reg_id, complete_flag, rank_type, xpath_use, - num_bases, basenames, rset_nmem, rset); + num_bases, basenames, rset_nmem, + rset, kc); } else { - zh->errCode = 118; - 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); - 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, @@ -2378,7 +2394,8 @@ static ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames, RSET **result_sets, int *num_result_sets, - Z_Operator *parent_op); + Z_Operator *parent_op, + struct rset_key_control *kc); ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs, oid_value attributeSet, @@ -2389,25 +2406,32 @@ ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs, { RSET *result_sets = 0; int num_result_sets = 0; - ZEBRA_RES res = rpn_search_structure(zh, zs, attributeSet, - stream, rset_nmem, - sort_sequence, - num_bases, basenames, - &result_sets, &num_result_sets, - 0 /* no op */); + ZEBRA_RES res; + struct rset_key_control *kc = zebra_key_control_create(zh); + + res = rpn_search_structure(zh, zs, attributeSet, + stream, rset_nmem, + sort_sequence, + num_bases, basenames, + &result_sets, &num_result_sets, + 0 /* no parent op */, + kc); if (res != ZEBRA_OK) { int i; for (i = 0; idec)(kc); + return res; } ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, @@ -2416,7 +2440,8 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames, RSET **result_sets, int *num_result_sets, - Z_Operator *parent_op) + Z_Operator *parent_op, + struct rset_key_control *kc) { *num_result_sets = 0; if (zs->which == Z_RPNStructure_complex) @@ -2433,7 +2458,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, sort_sequence, num_bases, basenames, &result_sets_l, &num_result_sets_l, - zop); + zop, kc); if (res != ZEBRA_OK) { int i; @@ -2446,7 +2471,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, sort_sequence, num_bases, basenames, &result_sets_r, &num_result_sets_r, - zop); + zop, kc); if (res != ZEBRA_OK) { int i; @@ -2476,39 +2501,40 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, switch (zop->which) { case Z_Operator_and: - rset = rsmulti_and_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, + rset = rsmulti_and_create(rset_nmem, kc, + kc->scope, *num_result_sets, *result_sets); break; case Z_Operator_or: - rset = rsmulti_or_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, + rset = rsmulti_or_create(rset_nmem, kc, + kc->scope, 0, /* termid */ *num_result_sets, *result_sets); break; case Z_Operator_and_not: - rset = rsbool_create_not(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, + rset = rsbool_create_not(rset_nmem, kc, + kc->scope, (*result_sets)[0], (*result_sets)[1]); break; case Z_Operator_prox: if (zop->u.prox->which != Z_ProximityOperator_known) { - zh->errCode = 132; + 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 = 132; - 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 { - rset = rsprox_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, + rset = rsprox_create(rset_nmem, kc, + kc->scope, *num_result_sets, *result_sets, *zop->u.prox->ordered, (!zop->u.prox->exclusion ? @@ -2518,7 +2544,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, } break; default: - zh->errCode = 110; + zebra_setError(zh, YAZ_BIB1_OPERATOR_UNSUPP, 0); return ZEBRA_FAIL; } *num_result_sets = 1; @@ -2537,7 +2563,8 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, yaz_log(YLOG_DEBUG, "rpn_search_APT"); res = rpn_search_APT(zh, zs->u.simple->u.attributesPlusTerm, attributeSet, stream, sort_sequence, - num_bases, basenames, rset_nmem, &rset); + num_bases, basenames, rset_nmem, &rset, + kc); if (res != ZEBRA_OK) return res; } @@ -2547,16 +2574,16 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, rset = resultSetRef(zh, zs->u.simple->u.resultSetId); if (!rset) { - zh->errCode = 30; - 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 = 3; + zebra_setError(zh, YAZ_BIB1_UNSUPP_SEARCH, 0); return ZEBRA_FAIL; } *num_result_sets = 1; @@ -2566,7 +2593,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, } else { - zh->errCode = 3; + zebra_setError(zh, YAZ_BIB1_UNSUPP_SEARCH, 0); return ZEBRA_FAIL; } return ZEBRA_OK; @@ -2592,9 +2619,13 @@ static int scan_handle (char *name, const char *info, int pos, void *client) len_prefix = strlen(scan_info->prefix); if (memcmp (name, scan_info->prefix, len_prefix)) return 1; - if (pos > 0) idx = scan_info->after - pos + scan_info->before; + if (pos > 0) + idx = scan_info->after - pos + scan_info->before; else idx = - pos - 1; + + if (idx < 0) + return 0; scan_info->list[idx].term = (char *) odr_malloc(scan_info->odr, strlen(name + len_prefix)+1); strcpy(scan_info->list[idx].term, name + len_prefix); @@ -2690,6 +2721,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, int complete_flag; int sort_flag; NMEM rset_nmem = NULL; + struct rset_key_control *kc = 0; *list = 0; *is_partial = 0; @@ -2733,7 +2765,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rank_type, &complete_flag, &sort_flag)) { *num_entries = 0; - zh->errCode = 113; + zebra_setError(zh, YAZ_BIB1_UNSUPP_ATTRIBUTE_TYPE, 0); return ZEBRA_FAIL; } yaz_log(YLOG_DEBUG, "use_value = %d", use_value); @@ -2748,8 +2780,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 = 109; /* Database unavailable */ + zebra_setError(zh, YAZ_BIB1_DATABASE_UNAVAILABLE, + basenames[base_no]); *num_entries = 0; return ZEBRA_FAIL; } @@ -2774,18 +2806,18 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, attributeset, use_value); if (r == -1) { - errCode = 114; + 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 = 121; + { + zebra_setError(zh, YAZ_BIB1_UNSUPP_ATTRIBUTE_SET, 0); + } continue; } } @@ -2802,8 +2834,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; } @@ -2813,8 +2844,20 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, return ZEBRA_OK; } /* prepare dictionary scanning */ + if (num < 1) + { + *num_entries = 0; + return ZEBRA_OK; + } before = pos-1; + if (before < 0) + before = 0; after = 1+num-pos; + if (after < 0) + after = 0; + yaz_log(YLOG_DEBUG, "rpn_scan pos=%d num=%d before=%d " + "after=%d before+after=%d", + pos, num, before, after, before+after); scan_info_array = (struct scan_info *) odr_malloc(stream, ord_no * sizeof(*scan_info_array)); for (i = 0; i < ord_no; i++) @@ -2850,6 +2893,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, odr_malloc(stream, (before+after)*sizeof(*glist)); rset_nmem = nmem_create(); + kc = zebra_key_control_create(zh); /* consider terms after main term */ for (i = 0; i < ord_no; i++) @@ -2861,11 +2905,13 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, int j, j0 = -1; const char *mterm = NULL; const char *tst; - RSET rset; - + RSET rset = 0; + int lo = i + pos-1; /* offset in result list */ + + /* find: j0 is the first of the minimal values */ for (j = 0; j < ord_no; j++) { - if (ptr[j] < before+after && + if (ptr[j] < before+after && ptr[j] >= 0 && (tst = scan_info_array[j].list[ptr[j]].term) && (!mterm || strcmp (tst, mterm) < 0)) { @@ -2874,52 +2920,76 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, } } if (j0 == -1) - break; - scan_term_untrans(zh, stream->mem, reg_id, - &glist[i+before].term, mterm); - rset = rset_trunc(zh, &scan_info_array[j0].list[ptr[j0]].isam_p, 1, - glist[i+before].term, strlen(glist[i+before].term), - NULL, 0, zapt->term->which, rset_nmem, - key_it_ctrl,key_it_ctrl->scope); - ptr[j0]++; + break; /* no value found, stop */ + + /* get result set for first one , but only if it's within bounds */ + if (lo >= 0) + { + /* get result set for first term */ + scan_term_untrans(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); + } + ptr[j0]++; /* move index for this set .. */ + /* get result set for remaining scan terms */ for (j = j0+1; j= 0 && (tst = scan_info_array[j].list[ptr[j]].term) && !strcmp (tst, mterm)) { - RSET rsets[2]; - - rsets[0] = rset; - rsets[1] = - rset_trunc(zh, &scan_info_array[j].list[ptr[j]].isam_p, 1, - glist[i+before].term, - strlen(glist[i+before].term), NULL, 0, - zapt->term->which,rset_nmem, - key_it_ctrl, key_it_ctrl->scope); - rset = rsmulti_or_create(rset_nmem, key_it_ctrl, - 2, key_it_ctrl->scope, rsets); + if (lo >= 0) + { + RSET rsets[2]; + + rsets[0] = rset; + rsets[1] = + rset_trunc( + zh, &scan_info_array[j].list[ptr[j]].isam_p, 1, + glist[lo].term, + strlen(glist[lo].term), NULL, 0, + zapt->term->which,rset_nmem, + kc, kc->scope); + rset = rsmulti_or_create(rset_nmem, kc, + kc->scope, 0 /* termid */, + 2, rsets); + } ptr[j]++; } } - if (limit_set) + if (lo >= 0) { - RSET rsets[2]; - rsets[0] = rset; - rsets[1] = rset_dup(limit_set); - - rset = rsmulti_and_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, 2, rsets); + /* merge with limit_set if given */ + if (limit_set) + { + RSET rsets[2]; + rsets[0] = rset; + rsets[1] = rset_dup(limit_set); + + rset = rsmulti_and_create(rset_nmem, kc, + kc->scope, + 2, rsets); + } + /* count it */ + count_set(rset, &glist[lo].occurrences); + rset_delete(rset); } - count_set(rset, &glist[i+before].occurrences); - rset_delete(rset); } if (i < after) { *num_entries -= (after-i); *is_partial = 1; + if (*num_entries < 0) + { + (*kc->dec)(kc); + nmem_destroy(rset_nmem); + *num_entries = 0; + return ZEBRA_OK; + } } - /* consider terms before main term */ for (i = 0; i= 0 && (tst = scan_info_array[j].list[before-1-ptr[j]].term) && (!mterm || strcmp (tst, mterm) > 0)) { @@ -2945,19 +3016,19 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, break; scan_term_untrans (zh, stream->mem, reg_id, - &glist[before-1-i].term, mterm); + &glist[lo].term, mterm); rset = rset_trunc (zh, &scan_info_array[j0].list[before-1-ptr[j0]].isam_p, 1, - glist[before-1-i].term, strlen(glist[before-1-i].term), + glist[lo].term, strlen(glist[lo].term), NULL, 0, zapt->term->which,rset_nmem, - key_it_ctrl,key_it_ctrl->scope); + kc, kc->scope); ptr[j0]++; for (j = j0+1; j= 0 && (tst = scan_info_array[j].list[before-1-ptr[j]].term) && !strcmp (tst, mterm)) { @@ -2967,12 +3038,12 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rsets[1] = rset_trunc( zh, &scan_info_array[j].list[before-1-ptr[j]].isam_p, 1, - glist[before-1-i].term, - strlen(glist[before-1-i].term), NULL, 0, + glist[lo].term, + strlen(glist[lo].term), NULL, 0, zapt->term->which, rset_nmem, - key_it_ctrl, key_it_ctrl->scope); - rset = rsmulti_or_create(rset_nmem, key_it_ctrl, - 2, key_it_ctrl->scope, rsets); + kc, kc->scope); + rset = rsmulti_or_create(rset_nmem, kc, + kc->scope, 0 /* termid */, 2, rsets); ptr[j]++; } @@ -2983,21 +3054,27 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rsets[0] = rset; rsets[1] = rset_dup(limit_set); - rset = rsmulti_and_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, 2, rsets); + rset = rsmulti_and_create(rset_nmem, kc, + kc->scope, 2, rsets); } - count_set (rset, &glist[before-1-i].occurrences); + count_set (rset, &glist[lo].occurrences); rset_delete (rset); } + (*kc->dec)(kc); + nmem_destroy(rset_nmem); i = before-i; if (i) { *is_partial = 1; *position -= i; *num_entries -= i; + if (*num_entries <= 0) + { + *num_entries = 0; + return ZEBRA_OK; + } } - nmem_destroy(rset_nmem); *list = glist + i; /* list is set to first 'real' entry */ yaz_log(YLOG_DEBUG, "position = %d, num_entries = %d",