X-Git-Url: http://git.indexdata.com/cgi-bin?a=blobdiff_plain;f=index%2Fzrpn.c;h=122f50e954bb47e2f8d0b34387e3702d06429336;hb=9665071018207450aaf5013a919000762e48758e;hp=a1eb701e2e06e63b5bc363383ea9b49123a8ef19;hpb=732e272a6d35533ccc89f4ccab0ea8069097b8a1;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index a1eb701..122f50e 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,5 +1,5 @@ -/* $Id: zrpn.c,v 1.132 2003-03-31 22:14:18 adam Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003 +/* $Id: zrpn.c,v 1.141.2.2 2004-11-15 21:53:45 adam Exp $ + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps This file is part of the Zebra server. @@ -38,6 +38,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include #include +#include struct rpn_char_map_info { ZebraMaps zm; @@ -52,18 +53,18 @@ typedef struct { } AttrType; -static const char **rpn_char_map_handler (void *vp, const char **from, int len) +static const char **rpn_char_map_handler(void *vp, const char **from, int len) { struct rpn_char_map_info *p = (struct rpn_char_map_info *) vp; - const char **out = zebra_maps_input (p->zm, p->reg_type, from, len); + const char **out = zebra_maps_input(p->zm, p->reg_type, from, len, 0); #if 0 if (out && *out) { const char *outp = *out; - yaz_log (LOG_LOG, "---"); + yaz_log(LOG_LOG, "---"); while (*outp) { - yaz_log (LOG_LOG, "%02X", *outp); + yaz_log(LOG_LOG, "%02X", *outp); outp++; } } @@ -71,15 +72,15 @@ static const char **rpn_char_map_handler (void *vp, const char **from, int len) return out; } -static void rpn_char_map_prepare (struct zebra_register *reg, int reg_type, +static void rpn_char_map_prepare(struct zebra_register *reg, int reg_type, struct rpn_char_map_info *map_info) { map_info->zm = reg->zebra_maps; map_info->reg_type = reg_type; - dict_grep_cmap (reg->dict, map_info, rpn_char_map_handler); + dict_grep_cmap(reg->dict, map_info, rpn_char_map_handler); } -static int attr_find_ex (AttrType *src, oid_value *attributeSetP, +static int attr_find_ex(AttrType *src, oid_value *attributeSetP, const char **string_value) { int num_attributes; @@ -100,7 +101,7 @@ static int attr_find_ex (AttrType *src, oid_value *attributeSetP, { oident *attrset; - attrset = oid_getentbyoid (element->attributeSet); + attrset = oid_getentbyoid(element->attributeSet); *attributeSetP = attrset->value; } return *element->value.numeric; @@ -112,7 +113,7 @@ static int attr_find_ex (AttrType *src, oid_value *attributeSetP, { oident *attrset; - attrset = oid_getentbyoid (element->attributeSet); + attrset = oid_getentbyoid(element->attributeSet); *attributeSetP = attrset->value; } if (element->value.complex->list[src->minor]->which == @@ -135,7 +136,7 @@ static int attr_find_ex (AttrType *src, oid_value *attributeSetP, else break; default: - assert (0); + assert(0); } } ++(src->major); @@ -143,12 +144,12 @@ static int attr_find_ex (AttrType *src, oid_value *attributeSetP, return -1; } -static int attr_find (AttrType *src, oid_value *attributeSetP) +static int attr_find(AttrType *src, oid_value *attributeSetP) { - return attr_find_ex (src, attributeSetP, 0); + return attr_find_ex(src, attributeSetP, 0); } -static void attr_init (AttrType *src, Z_AttributesPlusTerm *zapt, +static void attr_init(AttrType *src, Z_AttributesPlusTerm *zapt, int type) { src->zapt = zapt; @@ -171,13 +172,13 @@ struct grep_info { ZebraSet termset; }; -static void term_untrans (ZebraHandle zh, int reg_type, +static void term_untrans(ZebraHandle zh, int reg_type, char *dst, const char *src) { int len = 0; while (*src) { - const char *cp = zebra_maps_output (zh->reg->zebra_maps, + const char *cp = zebra_maps_output(zh->reg->zebra_maps, reg_type, &src); if (!cp && len < IT_MAX_WORD-1) dst[len++] = *src++; @@ -188,7 +189,7 @@ static void term_untrans (ZebraHandle zh, int reg_type, dst[len] = '\0'; } -static void add_isam_p (const char *name, const char *info, +static void add_isam_p(const char *name, const char *info, struct grep_info *p) { if (p->isam_p_indx == p->isam_p_size) @@ -198,30 +199,30 @@ static void add_isam_p (const char *name, const char *info, int *new_term_no; #endif p->isam_p_size = 2*p->isam_p_size + 100; - new_isam_p_buf = (ISAMS_P *) xmalloc (sizeof(*new_isam_p_buf) * + new_isam_p_buf = (ISAMS_P *) xmalloc(sizeof(*new_isam_p_buf) * p->isam_p_size); if (p->isam_p_buf) { - memcpy (new_isam_p_buf, p->isam_p_buf, + memcpy(new_isam_p_buf, p->isam_p_buf, p->isam_p_indx * sizeof(*p->isam_p_buf)); - xfree (p->isam_p_buf); + xfree(p->isam_p_buf); } p->isam_p_buf = new_isam_p_buf; #ifdef TERM_COUNT - new_term_no = (int *) xmalloc (sizeof(*new_term_no) * + new_term_no = (int *) xmalloc(sizeof(*new_term_no) * p->isam_p_size); if (p->term_no) { - memcpy (new_term_no, p->isam_p_buf, + memcpy(new_term_no, p->isam_p_buf, p->isam_p_indx * sizeof(*p->term_no)); - xfree (p->term_no); + xfree(p->term_no); } p->term_no = new_term_no; #endif } - assert (*info == sizeof(*p->isam_p_buf)); - memcpy (p->isam_p_buf + p->isam_p_indx, info+1, sizeof(*p->isam_p_buf)); + assert(*info == sizeof(*p->isam_p_buf)); + memcpy(p->isam_p_buf + p->isam_p_indx, info+1, sizeof(*p->isam_p_buf)); #if 1 if (p->termset) @@ -230,29 +231,29 @@ static void add_isam_p (const char *name, const char *info, int set, use; char term_tmp[IT_MAX_WORD]; int su_code = 0; - int len = key_SU_decode (&su_code, name); + int len = key_SU_decode(&su_code, name); - term_untrans (p->zh, p->reg_type, term_tmp, name+len+1); - logf (LOG_LOG, "grep: %d %c %s", su_code, name[len], term_tmp); - zebraExplain_lookup_ord (p->zh->reg->zei, + term_untrans(p->zh, p->reg_type, term_tmp, name+len+1); + yaz_log(LOG_LOG, "grep: %d %c %s", su_code, name[len], term_tmp); + zebraExplain_lookup_ord(p->zh->reg->zei, su_code, &db, &set, &use); - logf (LOG_LOG, "grep: set=%d use=%d db=%s", set, use, db); + yaz_log(LOG_LOG, "grep: set=%d use=%d db=%s", set, use, db); - resultSetAddTerm (p->zh, p->termset, name[len], db, + resultSetAddTerm(p->zh, p->termset, name[len], db, set, use, term_tmp); } #endif (p->isam_p_indx)++; } -static int grep_handle (char *name, const char *info, void *p) +static int grep_handle(char *name, const char *info, void *p) { - add_isam_p (name, info, (struct grep_info *) p); + add_isam_p(name, info, (struct grep_info *) p); return 0; } -static int term_pre (ZebraMaps zebra_maps, int reg_type, const char **src, - const char *ct1, const char *ct2) +static int term_pre(ZebraMaps zebra_maps, int reg_type, const char **src, + const char *ct1, const char *ct2, int first) { const char *s1, *s0 = *src; const char **map; @@ -260,12 +261,12 @@ static int term_pre (ZebraMaps zebra_maps, int reg_type, const char **src, /* skip white space */ while (*s0) { - if (ct1 && strchr (ct1, *s0)) + if (ct1 && strchr(ct1, *s0)) break; - if (ct2 && strchr (ct2, *s0)) + if (ct2 && strchr(ct2, *s0)) break; s1 = s0; - map = zebra_maps_input (zebra_maps, reg_type, &s1, strlen(s1)); + map = zebra_maps_input(zebra_maps, reg_type, &s1, strlen(s1), first); if (**map != *CHR_SPACE) break; s0 = s1; @@ -276,8 +277,8 @@ static int term_pre (ZebraMaps zebra_maps, int reg_type, const char **src, #define REGEX_CHARS " []()|.*+?!" -/* term_100: handle term, where trunc=none (no operators at all) */ -static int term_100 (ZebraMaps zebra_maps, int reg_type, +/* term_100: handle term, where trunc=none(no operators at all) */ +static int term_100(ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term) { @@ -289,13 +290,13 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type, const char *space_start = 0; const char *space_end = 0; - if (!term_pre (zebra_maps, reg_type, src, NULL, NULL)) + if (!term_pre(zebra_maps, reg_type, src, NULL, NULL, !space_split)) return 0; s0 = *src; while (*s0) { s1 = s0; - map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); + map = zebra_maps_input(zebra_maps, reg_type, &s0, strlen(s0), 0); if (space_split) { if (**map == *CHR_SPACE) @@ -313,7 +314,7 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type, { /* reload last space */ while (space_start < space_end) { - if (strchr (REGEX_CHARS, *space_start)) + if (strchr(REGEX_CHARS, *space_start)) dst[i++] = '\\'; dst_term[j++] = *space_start; dst[i++] = *space_start++; @@ -338,7 +339,7 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type, } /* term_101: handle term, where trunc=Process # */ -static int term_101 (ZebraMaps zebra_maps, int reg_type, +static int term_101(ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term) { @@ -347,7 +348,7 @@ static int term_101 (ZebraMaps zebra_maps, int reg_type, int i = 0; int j = 0; - if (!term_pre (zebra_maps, reg_type, src, "#", "#")) + if (!term_pre(zebra_maps, reg_type, src, "#", "#", !space_split)) return 0; s0 = *src; while (*s0) @@ -361,7 +362,7 @@ static int term_101 (ZebraMaps zebra_maps, int reg_type, else { s1 = s0; - map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); + map = zebra_maps_input(zebra_maps, reg_type, &s0, strlen(s0), 0); if (space_split && **map == *CHR_SPACE) break; while (s1 < s0) @@ -380,7 +381,7 @@ static int term_101 (ZebraMaps zebra_maps, int reg_type, } /* term_103: handle term, where trunc=re-2 (regular expressions) */ -static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, +static int term_103(ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int *errors, int space_split, char *dst_term) { @@ -389,11 +390,11 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, const char *s0, *s1; const char **map; - if (!term_pre (zebra_maps, reg_type, src, "^\\()[].*+?|", "(")) + if (!term_pre(zebra_maps, reg_type, src, "^\\()[].*+?|", "(", !space_split)) return 0; s0 = *src; if (errors && *s0 == '+' && s0[1] && s0[2] == '+' && s0[3] && - isdigit (s0[1])) + isdigit(s0[1])) { *errors = s0[1] - '0'; s0 += 3; @@ -402,7 +403,7 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, } while (*s0) { - if (strchr ("^\\()[].*+?|-", *s0)) + if (strchr("^\\()[].*+?|-", *s0)) { dst_term[j++] = *s0; dst[i++] = *s0++; @@ -410,7 +411,7 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, else { s1 = s0; - map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); + map = zebra_maps_input(zebra_maps, reg_type, &s0, strlen(s0), 0); if (**map == *CHR_SPACE) break; while (s1 < s0) @@ -432,13 +433,13 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, static int term_102 (ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term) { - return term_103 (zebra_maps, reg_type, src, dst, NULL, space_split, + return term_103(zebra_maps, reg_type, src, dst, NULL, space_split, dst_term); } /* term_104: handle term, where trunc=Process # and ! */ -static int term_104 (ZebraMaps zebra_maps, int reg_type, +static int term_104(ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term) { @@ -447,7 +448,7 @@ static int term_104 (ZebraMaps zebra_maps, int reg_type, int i = 0; int j = 0; - if (!term_pre (zebra_maps, reg_type, src, "?*#", "?*#")) + if (!term_pre(zebra_maps, reg_type, src, "?*#", "?*#", !space_split)) return 0; s0 = *src; while (*s0) @@ -490,7 +491,7 @@ static int term_104 (ZebraMaps zebra_maps, int reg_type, } { s1 = s0; - map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); + map = zebra_maps_input(zebra_maps, reg_type, &s0, strlen(s0), 0); if (space_split && **map == *CHR_SPACE) break; while (s1 < s0) @@ -518,7 +519,7 @@ static int term_105 (ZebraMaps zebra_maps, int reg_type, int i = 0; int j = 0; - if (!term_pre (zebra_maps, reg_type, src, "*!", "*!")) + if (!term_pre(zebra_maps, reg_type, src, "*!", "*!", !space_split)) return 0; s0 = *src; while (*s0) @@ -536,7 +537,7 @@ static int term_105 (ZebraMaps zebra_maps, int reg_type, } { s1 = s0; - map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); + map = zebra_maps_input(zebra_maps, reg_type, &s0, strlen(s0), 0); if (space_split && **map == *CHR_SPACE) break; while (s1 < s0) @@ -565,38 +566,38 @@ static int term_105 (ZebraMaps zebra_maps, int reg_type, * val: border value (inclusive) * islt: 1 if <=; 0 if >=. */ -static void gen_regular_rel (char *dst, int val, int islt) +static void gen_regular_rel(char *dst, int val, int islt) { int dst_p; int w, d, i; int pos = 0; char numstr[20]; - logf (LOG_DEBUG, "gen_regular_rel. val=%d, islt=%d", val, islt); + yaz_log(LOG_DEBUG, "gen_regular_rel. val=%d, islt=%d", val, islt); if (val >= 0) { if (islt) - strcpy (dst, "(-[0-9]+|("); + strcpy(dst, "(-[0-9]+|("); else - strcpy (dst, "(("); + strcpy(dst, "(("); } else { if (!islt) { - strcpy (dst, "([0-9]+|-("); - dst_p = strlen (dst); + strcpy(dst, "([0-9]+|-("); + dst_p = strlen(dst); islt = 1; } else { - strcpy (dst, "(-("); + strcpy(dst, "(-("); islt = 0; } val = -val; } - dst_p = strlen (dst); - sprintf (numstr, "%d", val); + dst_p = strlen(dst); + sprintf(numstr, "%d", val); for (w = strlen(numstr); --w >= 0; pos++) { d = numstr[w]; @@ -616,7 +617,7 @@ static void gen_regular_rel (char *dst, int val, int islt) } } - strcpy (dst + dst_p, numstr); + strcpy(dst + dst_p, numstr); dst_p = strlen(dst) - pos - 1; if (islt) @@ -659,21 +660,21 @@ static void gen_regular_rel (char *dst, int val, int islt) if (islt) { /* match everything less than 10^(pos-1) */ - strcat (dst, "0*"); - for (i=1; i IT_MAX_WORD) + break; } *term_tmp++ = ')'; *term_tmp = '\0'; @@ -742,7 +746,7 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, term_sub, term_component, space_split, term_dst)) return 0; - logf (LOG_DEBUG, "Relation <="); + yaz_log(LOG_DEBUG, "Relation <="); *term_tmp++ = '('; for (i = 0; term_component[i]; ) @@ -762,6 +766,9 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp++ = '*'; *term_tmp++ = '|'; + + if ((term_tmp - term_dict) > IT_MAX_WORD) + break; } for (i = 0; term_component[i]; ) string_rel_add_char (&term_tmp, term_component, &i); @@ -772,7 +779,7 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!term_100 (zh->reg->zebra_maps, reg_type, term_sub, term_component, space_split, term_dst)) return 0; - logf (LOG_DEBUG, "Relation >"); + yaz_log(LOG_DEBUG, "Relation >"); *term_tmp++ = '('; for (i = 0; term_component[i];) @@ -792,6 +799,9 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp++ = '*'; *term_tmp++ = '|'; + + if ((term_tmp - term_dict) > IT_MAX_WORD) + break; } for (i = 0; term_component[i];) string_rel_add_char (&term_tmp, term_component, &i); @@ -804,7 +814,7 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!term_100 (zh->reg->zebra_maps, reg_type, term_sub, term_component, space_split, term_dst)) return 0; - logf (LOG_DEBUG, "Relation >="); + yaz_log(LOG_DEBUG, "Relation >="); *term_tmp++ = '('; for (i = 0; term_component[i];) @@ -831,13 +841,16 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp++ = ']'; *term_tmp++ = '.'; *term_tmp++ = '*'; + + if ((term_tmp - term_dict) > IT_MAX_WORD) + break; } *term_tmp++ = ')'; *term_tmp = '\0'; break; case 3: default: - logf (LOG_DEBUG, "Relation ="); + yaz_log(LOG_DEBUG, "Relation ="); if (!term_100 (zh->reg->zebra_maps, reg_type, term_sub, term_component, space_split, term_dst)) return 0; @@ -872,14 +885,20 @@ static RSET term_trunc (ZebraHandle zh, Z_AttributesPlusTerm *zapt, term_dst, xpath_use); if (r < 1) return 0; - logf (LOG_DEBUG, "term: %s", term_dst); + yaz_log(LOG_DEBUG, "term: %s", term_dst); return rset_trunc (zh, grep_info->isam_p_buf, grep_info->isam_p_indx, term_dst, strlen(term_dst), rank_type, 1 /* preserve pos */, zapt->term->which); } - +static char *nmem_strdup_i(NMEM nmem, int v) +{ + char val_str[64]; + sprintf (val_str, "%d", v); + return nmem_strdup (nmem, val_str); +} + static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, const char **term_sub, oid_value attributeSet, NMEM stream, @@ -900,18 +919,24 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, struct rpn_char_map_info rcmi; int space_split = complete_flag ? 0 : 1; + int bases_ok = 0; /* no of databases with OK attribute */ + int errCode = 0; /* err code (if any is not OK) */ + char *errString = 0; /* addinfo */ + rpn_char_map_prepare (zh->reg, reg_type, &rcmi); attr_init (&use, zapt, 1); use_value = attr_find_ex (&use, &curAttributeSet, &use_string); - logf (LOG_DEBUG, "string_term, use value %d", use_value); + yaz_log(LOG_DEBUG, "string_term, use value %d", use_value); attr_init (&truncation, zapt, 5); truncation_value = attr_find (&truncation, NULL); - logf (LOG_DEBUG, "truncation value %d", truncation_value); + yaz_log(LOG_DEBUG, "truncation value %d", truncation_value); if (use_value == -1) /* no attribute - assumy "any" */ use_value = 1016; for (base_no = 0; base_no < num_bases; base_no++) { + int attr_ok = 0; + int regex_range = 0; attent attp; data1_local_attribute id_xpath_attr; data1_local_attribute *local_attr; @@ -925,7 +950,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, zh->errString = basenames[base_no]; return -1; } - if (use_value == -2) /* string attribute (assume IDXPATH/any) */ + if (xpath_use > 0 && use_value == -2) { use_value = xpath_use; attp.local_attributes = &id_xpath_attr; @@ -942,17 +967,19 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } else { - if ((r=att_getentbyatt (zh, &attp, curAttributeSet, use_value))) + if ((r=att_getentbyatt (zh, &attp, curAttributeSet, use_value, + use_string))) { - logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d r=%d", + yaz_log(LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d r=%d", curAttributeSet, use_value, r); if (r == -1) { /* set was found, but value wasn't defined */ - char val_str[32]; - sprintf (val_str, "%d", use_value); - zh->errCode = 114; - zh->errString = nmem_strdup (stream, val_str); + errCode = 114; + if (use_string) + errString = nmem_strdup(stream, use_string); + else + errString = nmem_strdup_i(stream, use_value); } else { @@ -964,10 +991,10 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, oident.value = curAttributeSet; oid_ent_to_oid (&oident, oid); - zh->errCode = 121; - zh->errString = nmem_strdup (stream, oident.desc); + errCode = 121; + errString = nmem_strdup (stream, oident.desc); } - return -1; + continue; } } for (local_attr = attp.local_attributes; local_attr; @@ -995,16 +1022,24 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (!prefix_len) { - char val_str[32]; - sprintf (val_str, "%d", use_value); - zh->errCode = 114; - zh->errString = nmem_strdup (stream, val_str); - return -1; +#if 1 + bases_ok++; +#else + errCode = 114; + errString = nmem_strdup_i(stream, use_value); + continue; +#endif } + else + { + attr_ok = 1; + bases_ok++; /* this has OK attributes */ + } + term_dict[prefix_len++] = ')'; term_dict[prefix_len++] = 1; term_dict[prefix_len++] = reg_type; - logf (LOG_DEBUG, "reg_type = %d", term_dict[prefix_len-1]); + yaz_log(LOG_DEBUG, "reg_type = %d", term_dict[prefix_len-1]); term_dict[prefix_len] = '\0'; j = prefix_len; switch (truncation_value) @@ -1015,11 +1050,6 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, attributeSet, reg_type, space_split, term_dst)) return 0; - logf (LOG_LOG, "dict_lookup_grep: %s", term_dict+prefix_len); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, - grep_info, &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep fail %d", r); break; case 1: /* right truncation */ term_dict[j++] = '('; @@ -1027,8 +1057,6 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ".*)"); - dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); break; case 2: /* keft truncation */ term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*'; @@ -1036,8 +1064,6 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ")"); - dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); break; case 3: /* left&right truncation */ term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*'; @@ -1045,21 +1071,13 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ".*)"); - dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); break; - zh->errCode = 120; - return -1; case 101: /* process # in term */ term_dict[j++] = '('; if (!term_101 (zh->reg->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ")"); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=#: %d", r); break; case 102: /* Regexp-1 */ term_dict[j++] = '('; @@ -1067,12 +1085,6 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ")"); - logf (LOG_DEBUG, "Regexp-1 tolerance=%d", r); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=regular: %d", - r); break; case 103: /* Regexp-2 */ r = 1; @@ -1081,12 +1093,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, &termp, term_dict + j, &r, space_split, term_dst)) return 0; strcat (term_dict, ")"); - logf (LOG_DEBUG, "Regexp-2 tolerance=%d", r); - r = dict_lookup_grep (zh->reg->dict, term_dict, r, grep_info, - &max_pos, 2, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=eregular: %d", - r); + regex_range = 2; break; case 104: /* process # and ! in term */ term_dict[j++] = '('; @@ -1094,10 +1101,6 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ")"); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=#/!: %d", r); break; case 105: /* process * and ! in term */ term_dict[j++] = '('; @@ -1105,10 +1108,6 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, &termp, term_dict + j, space_split, term_dst, 1)) return 0; strcat (term_dict, ")"); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r); break; case 106: /* process * and ! in term */ term_dict[j++] = '('; @@ -1116,15 +1115,30 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, &termp, term_dict + j, space_split, term_dst, 0)) return 0; strcat (term_dict, ")"); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r); break; + default: + zh->errCode = 120; + zh->errString = nmem_strdup_i(stream, truncation_value); + return -1; } + if (attr_ok) + { + yaz_log(LOG_DEBUG, "dict_lookup_grep: %s", term_dict+prefix_len); + r = dict_lookup_grep (zh->reg->dict, term_dict, 0, + grep_info, &max_pos, regex_range, + grep_handle); + if (r) + yaz_log(LOG_WARN, "dict_lookup_grep fail %d", r); + } + } + if (!bases_ok) + { + zh->errCode = errCode; + zh->errString = errString; + return -1; } *term_sub = termp; - logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx); + yaz_log(LOG_DEBUG, "%d positions", grep_info->isam_p_indx); return 1; } @@ -1200,7 +1214,7 @@ static int trans_scan_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, while ((len = (cp_end - cp)) > 0) { - map = zebra_maps_input (zh->reg->zebra_maps, reg_type, &cp, len); + map = zebra_maps_input (zh->reg->zebra_maps, reg_type, &cp, len, 0); if (**map == *CHR_SPACE) space_map = *map; else @@ -1218,238 +1232,6 @@ static int trans_scan_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, return 0; } -static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no, - int ordered, int exclusion, int relation, int distance) -{ - int i; - RSFD *rsfd; - int *more; - struct it_key **buf; - RSET result; - char prox_term[1024]; - int length_prox_term = 0; - int min_nn = 10000000; - int term_index; - int term_type = Z_Term_characterString; - const char *flags = NULL; - - rsfd = (RSFD *) xmalloc (sizeof(*rsfd)*rset_no); - more = (int *) xmalloc (sizeof(*more)*rset_no); - buf = (struct it_key **) xmalloc (sizeof(*buf)*rset_no); - - *prox_term = '\0'; - for (i = 0; ino_rset_terms; j++) - { - const char *nflags = rset[i]->rset_terms[j]->flags; - char *term = rset[i]->rset_terms[j]->name; - int lterm = strlen(term); - if (lterm + length_prox_term < sizeof(prox_term)-1) - { - if (length_prox_term) - prox_term[length_prox_term++] = ' '; - strcpy (prox_term + length_prox_term, term); - length_prox_term += lterm; - } - if (min_nn > rset[i]->rset_terms[j]->nn) - min_nn = rset[i]->rset_terms[j]->nn; - flags = nflags; - term_type = rset[i]->rset_terms[j]->type; - - /* only if all term types are of type characterString .. */ - /* the resulting term is of that type */ - if (term_type != Z_Term_characterString) - term_type = Z_Term_general; - } - } - for (i = 0; inn = 0; - result = rset_create (rset_kind_null, &parms); - } - else if (ordered && relation == 3 && exclusion == 0 && distance == 1) - { - /* special proximity case = phrase search ... */ - rset_temp_parms parms; - RSFD rsfd_result; - - parms.rset_term = rset_term_create (prox_term, length_prox_term, - flags, term_type); - parms.rset_term->nn = min_nn; - parms.cmp = key_compare_it; - parms.key_size = sizeof (struct it_key); - parms.temp_path = res_get (zh->res, "setTmpDir"); - result = rset_create (rset_kind_temp, &parms); - rsfd_result = rset_open (result, RSETF_WRITE); - - while (*more) - { - for (i = 1; i 1) - { - more[i-1] = rset_read (rset[i-1], rsfd[i-1], - buf[i-1], &term_index); - break; - } - else if (cmp == 1) - { - if (buf[i-1]->seqno+1 != buf[i]->seqno) - { - more[i-1] = rset_read (rset[i-1], rsfd[i-1], - buf[i-1], &term_index); - break; - } - } - else - { - more[i] = rset_read (rset[i], rsfd[i], buf[i], - &term_index); - break; - } - } - if (i == rset_no) - { - rset_write (result, rsfd_result, buf[0]); - more[0] = rset_read (*rset, *rsfd, *buf, &term_index); - } - } - rset_close (result, rsfd_result); - } - else if (rset_no == 2) - { - /* generic proximity case (two input sets only) ... */ - rset_temp_parms parms; - RSFD rsfd_result; - - yaz_log (LOG_LOG, "generic prox, dist=%d, relation=%d, ordered=%d" - ", exclusion=%d", - distance, relation, ordered, exclusion); - parms.rset_term = rset_term_create (prox_term, length_prox_term, - flags, term_type); - parms.rset_term->nn = min_nn; - parms.cmp = key_compare_it; - parms.key_size = sizeof (struct it_key); - parms.temp_path = res_get (zh->res, "setTmpDir"); - result = rset_create (rset_kind_temp, &parms); - rsfd_result = rset_open (result, RSETF_WRITE); - - while (more[0] && more[1]) - { - int cmp = key_compare_it (buf[0], buf[1]); - if (cmp < -1) - more[0] = rset_read (rset[0], rsfd[0], buf[0], &term_index); - else if (cmp > 1) - more[1] = rset_read (rset[1], rsfd[1], buf[1], &term_index); - else - { - int sysno = buf[0]->sysno; - int seqno[500]; - int n = 0; - - seqno[n++] = buf[0]->seqno; - while ((more[0] = rset_read (rset[0], rsfd[0], buf[0], - &term_index)) && - sysno == buf[0]->sysno) - if (n < 500) - seqno[n++] = buf[0]->seqno; - do - { - for (i = 0; iseqno - seqno[i]; - int excl = exclusion; - if (!ordered && diff < 0) - diff = -diff; - switch (relation) - { - case 1: /* < */ - if (diff < distance && diff >= 0) - excl = !excl; - break; - case 2: /* <= */ - if (diff <= distance && diff >= 0) - excl = !excl; - break; - case 3: /* == */ - if (diff == distance && diff >= 0) - excl = !excl; - break; - case 4: /* >= */ - if (diff >= distance && diff >= 0) - excl = !excl; - break; - case 5: /* > */ - if (diff > distance && diff >= 0) - excl = !excl; - break; - case 6: /* != */ - if (diff != distance && diff >= 0) - excl = !excl; - break; - } - if (excl) - { - rset_write (result, rsfd_result, buf[1]); - break; - } - } - } while ((more[1] = rset_read (rset[1], rsfd[1], buf[1], - &term_index)) && - sysno == buf[1]->sysno); - } - } - rset_close (result, rsfd_result); - } - else - { - rset_null_parms parms; - - parms.rset_term = rset_term_create (prox_term, length_prox_term, - flags, term_type); - parms.rset_term->nn = 0; - result = rset_create (rset_kind_null, &parms); - } - for (i = 0; itermset = resultSetAdd (zh, termset_name, 1); if (!grep_info->termset) { @@ -1562,7 +1343,7 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, { char term_dst[IT_MAX_WORD+1]; RSET rset[60], result; - int i, rset_no = 0; + int rset_no = 0; struct grep_info grep_info; char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); const char *termp = termz; @@ -1572,7 +1353,7 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, return 0; while (1) { - logf (LOG_DEBUG, "APT_phrase termp=%s", termp); + yaz_log(LOG_DEBUG, "APT_phrase termp=%s", termp); rset[rset_no] = term_trunc (zh, zapt, &termp, attributeSet, stream, &grep_info, reg_type, complete_flag, @@ -1595,9 +1376,23 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, } else if (rset_no == 1) return (rset[0]); - result = rpn_prox (zh, rset, rset_no, 1, 0, 3, 1); - for (i = 0; ireg->zebra_maps, reg_type, term_sub, term_tmp, 1, term_dst)) @@ -1741,32 +1538,32 @@ static int numeric_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, switch (relation_value) { case 1: - logf (LOG_DEBUG, "Relation <"); + yaz_log(LOG_DEBUG, "Relation <"); gen_regular_rel (term_tmp, term_value-1, 1); break; case 2: - logf (LOG_DEBUG, "Relation <="); + yaz_log(LOG_DEBUG, "Relation <="); gen_regular_rel (term_tmp, term_value, 1); break; case 4: - logf (LOG_DEBUG, "Relation >="); + yaz_log(LOG_DEBUG, "Relation >="); gen_regular_rel (term_tmp, term_value, 0); break; case 5: - logf (LOG_DEBUG, "Relation >"); + yaz_log(LOG_DEBUG, "Relation >"); gen_regular_rel (term_tmp, term_value+1, 0); break; case 3: default: - logf (LOG_DEBUG, "Relation ="); + yaz_log(LOG_DEBUG, "Relation ="); sprintf (term_tmp, "(0*%d)", term_value); } - logf (LOG_DEBUG, "dict_lookup_grep: %s", term_tmp); + yaz_log(LOG_DEBUG, "dict_lookup_grep: %s", term_tmp); r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, max_pos, 0, grep_handle); if (r) - logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r); - logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx); + yaz_log(LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r); + yaz_log(LOG_DEBUG, "%d positions", grep_info->isam_p_indx); return 1; } @@ -1786,6 +1583,10 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, const char *termp; struct rpn_char_map_info rcmi; + int bases_ok = 0; /* no of databases with OK attribute */ + int errCode = 0; /* err code (if any is not OK) */ + char *errString = 0; /* addinfo */ + rpn_char_map_prepare (zh->reg, reg_type, &rcmi); attr_init (&use, zapt, 1); use_value = attr_find_ex (&use, &curAttributeSet, &use_string); @@ -1818,20 +1619,19 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } else { - if ((r=att_getentbyatt (zh, &attp, curAttributeSet, use_value))) + if ((r=att_getentbyatt (zh, &attp, curAttributeSet, use_value, + use_string))) { - logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d r=%d", + yaz_log(LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d r=%d", curAttributeSet, use_value, r); if (r == -1) { - char val_str[32]; - sprintf (val_str, "%d", use_value); - zh->errString = nmem_strdup (stream, val_str); - zh->errCode = 114; + errString = nmem_strdup_i (stream, use_value); + errCode = 114; } else - zh->errCode = 121; - return -1; + errCode = 121; + continue; } } if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) @@ -1867,22 +1667,29 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, { char val_str[32]; sprintf (val_str, "%d", use_value); - zh->errCode = 114; - zh->errString = nmem_strdup (stream, val_str); - return -1; + errCode = 114; + errString = nmem_strdup (stream, val_str); + continue; } + bases_ok++; term_dict[prefix_len++] = ')'; term_dict[prefix_len++] = 1; term_dict[prefix_len++] = reg_type; - logf (LOG_DEBUG, "reg_type = %d", term_dict[prefix_len-1]); + yaz_log(LOG_DEBUG, "reg_type = %d", term_dict[prefix_len-1]); term_dict[prefix_len] = '\0'; if (!numeric_relation (zh, zapt, &termp, term_dict, attributeSet, grep_info, &max_pos, reg_type, term_dst)) return 0; } + if (!bases_ok) + { + zh->errCode = errCode; + zh->errString = errString; + return -1; + } *term_sub = termp; - logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx); + yaz_log(LOG_DEBUG, "%d positions", grep_info->isam_p_indx); return 1; } @@ -1905,7 +1712,7 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, return 0; while (1) { - logf (LOG_DEBUG, "APT_numeric termp=%s", termp); + yaz_log(LOG_DEBUG, "APT_numeric termp=%s", termp); grep_info.isam_p_indx = 0; r = numeric_term (zh, zapt, &termp, attributeSet, &grep_info, reg_type, complete_flag, num_bases, basenames, @@ -1913,7 +1720,7 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, stream); if (r < 1) break; - logf (LOG_DEBUG, "term: %s", term_dst); + yaz_log(LOG_DEBUG, "term: %s", term_dst); rset[rset_no] = rset_trunc (zh, grep_info.isam_p_buf, grep_info.isam_p_indx, term_dst, strlen(term_dst), rank_type, @@ -1941,6 +1748,7 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, bool_parms.rset_r = rset[i]; bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; + bool_parms.log_item = key_logdump_txt; result = rset_create (rset_kind_and, &bool_parms); } return result; @@ -2052,11 +1860,11 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, sks->sortRelation = (int *) nmem_malloc (stream, sizeof(*sks->sortRelation)); if (sort_relation_value == 1) - *sks->sortRelation = Z_SortRelation_ascending; + *sks->sortRelation = Z_SortKeySpec_ascending; else if (sort_relation_value == 2) - *sks->sortRelation = Z_SortRelation_descending; + *sks->sortRelation = Z_SortKeySpec_descending; else - *sks->sortRelation = Z_SortRelation_ascending; + *sks->sortRelation = Z_SortKeySpec_ascending; sks->caseSensitivity = (int *) nmem_malloc (stream, sizeof(*sks->caseSensitivity)); @@ -2071,33 +1879,6 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, return rset_create (rset_kind_null, &parms); } -/* pop - moved to xpath.c */ -#if 0 - -struct xpath_predicate { - int which; - union { -#define XPATH_PREDICATE_RELATION 1 - struct { - char *name; - char *op; - char *value; - } relation; -#define XPATH_PREDICATE_BOOLEAN 2 - struct { - const char *op; - struct xpath_predicate *left; - struct xpath_predicate *right; - } boolean; - } u; -}; - -struct xpath_location_step { - char *part; - struct xpath_predicate *predicate; -}; - -#endif static int parse_xpath(ZebraHandle zh, Z_AttributesPlusTerm *zapt, oid_value attributeSet, @@ -2171,8 +1952,7 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, grep_info.isam_p_indx = 0; r = dict_lookup_grep (zh->reg->dict, term_dict, 0, &grep_info, &max_pos, 0, grep_handle); - yaz_log (LOG_LOG, "%s %d positions", term, - grep_info.isam_p_indx); + yaz_log (LOG_LOG, "%s %d positions", term, grep_info.isam_p_indx); rset = rset_trunc (zh, grep_info.isam_p_buf, grep_info.isam_p_indx, term, strlen(term), flags, 1, term_type); @@ -2193,11 +1973,10 @@ static RSET rpn_search_xpath (ZebraHandle zh, if (xpath_len < 0) return rset; - yaz_log (LOG_LOG, "len=%d", xpath_len); + yaz_log (LOG_DEBUG, "len=%d", xpath_len); for (i = 0; iwhich == XPATH_PREDICATE_RELATION && xpath[level].predicate->u.relation.name[0]) { - char predicate_str[128]; - - strcpy (predicate_str, - xpath[level].predicate->u.relation.name+1); + WRBUF wbuf = wrbuf_alloc(); + wrbuf_puts(wbuf, xpath[level].predicate->u.relation.name+1); if (xpath[level].predicate->u.relation.value) { - strcat (predicate_str, "="); - strcat (predicate_str, - xpath[level].predicate->u.relation.value); + const char *cp = xpath[level].predicate->u.relation.value; + wrbuf_putc(wbuf, '='); + + while (*cp) + { + if (strchr(REGEX_CHARS, *cp)) + wrbuf_putc(wbuf, '\\'); + wrbuf_putc(wbuf, *cp); + cp++; + } } + wrbuf_puts(wbuf, ""); rset_attr = xpath_trunc ( - zh, stream, '0', predicate_str, 3, curAttributeSet); + zh, stream, '0', wrbuf_buf(wbuf), 3, curAttributeSet); + wrbuf_free(wbuf, 1); } else { if (!first_path) continue; } - yaz_log (LOG_LOG, "xpath_rev (%d) = %s", level, xpath_rev); + yaz_log (LOG_DEBUG, "xpath_rev (%d) = %s", level, xpath_rev); if (strlen(xpath_rev)) { rset_start_tag = xpath_trunc(zh, stream, @@ -2341,10 +2127,10 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, zebra_maps_attr (zh->reg->zebra_maps, zapt, ®_id, &search_type, rank_type, &complete_flag, &sort_flag); - logf (LOG_DEBUG, "reg_id=%c", reg_id); - logf (LOG_DEBUG, "complete_flag=%d", complete_flag); - logf (LOG_DEBUG, "search_type=%s", search_type); - logf (LOG_DEBUG, "rank_type=%s", rank_type); + yaz_log(LOG_DEBUG, "reg_id=%c", reg_id); + yaz_log(LOG_DEBUG, "complete_flag=%d", complete_flag); + yaz_log(LOG_DEBUG, "search_type=%s", search_type); + yaz_log(LOG_DEBUG, "rank_type=%s", rank_type); if (zapt_term_to_utf8(zh, zapt, termz)) return 0; @@ -2431,6 +2217,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, } bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; + bool_parms.log_item = key_logdump_txt; switch (zop->which) { @@ -2459,19 +2246,24 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, } else { - RSET rsets[2]; - - rsets[0] = bool_parms.rset_l; - rsets[1] = bool_parms.rset_r; + /* new / old prox */ + rset_prox_parms parms; + RSET twosets[2]; - r = rpn_prox (zh, rsets, 2, - *zop->u.prox->ordered, - (!zop->u.prox->exclusion ? 0 : - *zop->u.prox->exclusion), - *zop->u.prox->relationType, - *zop->u.prox->distance); - rset_delete (rsets[0]); - rset_delete (rsets[1]); + twosets[0] = bool_parms.rset_l; + twosets[1] = bool_parms.rset_r; + parms.rset = twosets; + parms.rset_no = 2; + parms.ordered = *zop->u.prox->ordered; + parms.exclusion = (!zop->u.prox->exclusion ? 0 : + *zop->u.prox->exclusion); + parms.relation = *zop->u.prox->relationType; + parms.distance = *zop->u.prox->distance; + parms.key_size = sizeof(struct it_key); + parms.cmp = key_compare_it; + parms.getseq = key_get_seq; + parms.log_item = key_logdump_txt; + r = rset_create(rset_kind_prox, &parms); } break; default: @@ -2483,14 +2275,14 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, { if (zs->u.simple->which == Z_Operand_APT) { - logf (LOG_DEBUG, "rpn_search_APT"); + yaz_log(LOG_DEBUG, "rpn_search_APT"); r = rpn_search_APT (zh, zs->u.simple->u.attributesPlusTerm, attributeSet, stream, sort_sequence, num_bases, basenames); } else if (zs->u.simple->which == Z_Operand_resultSetId) { - logf (LOG_DEBUG, "rpn_search_ref"); + yaz_log(LOG_DEBUG, "rpn_search_ref"); r = resultSetRef (zh, zs->u.simple->u.resultSetId); if (!r) { @@ -2550,7 +2342,7 @@ RSET rpn_search (ZebraHandle zh, NMEM nmem, return 0; if (zh->errCode) - logf (LOG_DEBUG, "search error: %d", zh->errCode); + yaz_log(LOG_DEBUG, "search error: %d", zh->errCode); for (i = 0; sort_sequence->specs[i]; i++) ; @@ -2559,12 +2351,12 @@ RSET rpn_search (ZebraHandle zh, NMEM nmem, resultSetRank (zh, sset, rset); else { - logf (LOG_DEBUG, "resultSetSortSingle in rpn_search"); + yaz_log(LOG_DEBUG, "resultSetSortSingle in rpn_search"); resultSetSortSingle (zh, nmem, sset, rset, sort_sequence, &sort_status); if (zh->errCode) { - logf (LOG_DEBUG, "resultSetSortSingle status = %d", zh->errCode); + yaz_log(LOG_DEBUG, "resultSetSortSingle status = %d", zh->errCode); } } return rset; @@ -2641,7 +2433,7 @@ static void count_set (RSET r, int *count) RSFD rfd; int term_index; - logf (LOG_DEBUG, "count_set"); + yaz_log(LOG_DEBUG, "count_set"); *count = 0; rfd = rset_open (r, RSETF_READ); @@ -2655,7 +2447,7 @@ static void count_set (RSET r, int *count) kno++; } rset_close (r, rfd); - logf (LOG_DEBUG, "%d keys, %d records", kno, *count); + yaz_log(LOG_DEBUG, "%d keys, %d records", kno, *count); } void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, @@ -2673,11 +2465,16 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, char termz[IT_MAX_WORD+20]; AttrType use; int use_value; + const char *use_string = 0; struct scan_info *scan_info_array; ZebraScanEntry *glist; int ords[32], ord_no = 0; int ptr[32]; + int bases_ok = 0; /* no of databases with OK attribute */ + int errCode = 0; /* err code (if any is not OK) */ + char *errString = 0; /* addinfo */ + unsigned reg_id; char *search_type = NULL; char rank_type[128]; @@ -2719,7 +2516,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, pos, num, attributeset); attr_init (&use, zapt, 1); - use_value = attr_find (&use, &attributeset); + use_value = attr_find_ex (&use, &attributeset, &use_string); if (zebra_maps_attr (zh->reg->zebra_maps, zapt, ®_id, &search_type, rank_type, &complete_flag, &sort_flag)) @@ -2738,21 +2535,21 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, attent attp; data1_local_attribute *local_attr; - if ((r=att_getentbyatt (zh, &attp, attributeset, use_value))) + if ((r=att_getentbyatt (zh, &attp, attributeset, use_value, + use_string))) { - logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d", + yaz_log(LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d", attributeset, use_value); if (r == -1) { char val_str[32]; sprintf (val_str, "%d", use_value); - zh->errCode = 114; - zh->errString = odr_strdup (stream, val_str); + errCode = 114; + errString = odr_strdup (stream, val_str); } else - zh->errCode = 121; - *num_entries = 0; - return; + errCode = 121; + continue; } if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { @@ -2761,6 +2558,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, *num_entries = 0; return; } + bases_ok++; for (local_attr = attp.local_attributes; local_attr && ord_no < 32; local_attr = local_attr->next) { @@ -2772,10 +2570,20 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, ords[ord_no++] = ord; } } + if (!bases_ok && errCode) + { + zh->errCode = errCode; + zh->errString = errString; + *num_entries = 0; + } if (ord_no == 0) { + char val_str[32]; + sprintf (val_str, "%d", use_value); + zh->errCode = 114; + zh->errString = odr_strdup (stream, val_str); + *num_entries = 0; - zh->errCode = 113; return; } /* prepare dictionary scanning */ @@ -2863,7 +2671,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; - bool_parms.rset_l = rset; + bool_parms.log_item = key_logdump_txt; + bool_parms.rset_l = rset; bool_parms.rset_r = rset2; rset = rset_create (rset_kind_or, &bool_parms); @@ -2877,7 +2686,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; - bool_parms.rset_l = rset; + bool_parms.log_item = key_logdump_txt; + bool_parms.rset_l = rset; bool_parms.rset_r = rset_dup(limit_set); rset = rset_create (rset_kind_and, &bool_parms); @@ -2942,7 +2752,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; - bool_parms.rset_l = rset; + bool_parms.log_item = key_logdump_txt; + bool_parms.rset_l = rset; bool_parms.rset_r = rset2; rset = rset_create (rset_kind_or, &bool_parms); @@ -2956,6 +2767,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; + bool_parms.log_item = key_logdump_txt; bool_parms.rset_l = rset; bool_parms.rset_r = rset_dup(limit_set); @@ -2973,9 +2785,9 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, } *list = glist + i; /* list is set to first 'real' entry */ - logf (LOG_DEBUG, "position = %d, num_entries = %d", + yaz_log(LOG_DEBUG, "position = %d, num_entries = %d", *position, *num_entries); if (zh->errCode) - logf (LOG_DEBUG, "scan error: %d", zh->errCode); + yaz_log(LOG_DEBUG, "scan error: %d", zh->errCode); }