X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=30b7b30b794de6c973e59e8d933d47c027b6ba36;hb=285a986588deacac089734552a7149142f7afc7d;hp=a97e265ae9d791dbb3aeb1cf283fa3dd5ad645d2;hpb=52365e1ba3d9ffe33ed10788a8a91cb4fa7d6133;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index a97e265..30b7b30 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,10 +1,52 @@ /* - * Copyright (C) 1995-1998, Index Data + * Copyright (C) 1995-1999, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.84 1998-09-18 12:41:00 adam + * Revision 1.97 1999-10-14 14:33:50 adam + * Added truncation 5=106. + * + * Revision 1.96 1999/09/23 10:05:05 adam + * Implemented structure=105 searching. + * + * Revision 1.95 1999/09/07 07:19:21 adam + * Work on character mapping. Implemented replace rules. + * + * Revision 1.94 1999/07/20 13:59:18 adam + * Fixed bug that occurred when phrases had 0 hits. + * + * Revision 1.93 1999/06/17 14:38:40 adam + * Bug fix: Scan SEGV'ed when getting unknown use attribute. + * + * Revision 1.92 1999/05/26 07:49:13 adam + * C++ compilation. + * + * Revision 1.91 1999/02/02 14:51:13 adam + * Updated WIN32 code specific sections. Changed header. + * + * Revision 1.90 1998/11/16 16:03:43 adam + * Moved loggin utilities to Yaz. Was implemented in file zlogs.c. + * + * Revision 1.89 1998/11/16 10:11:55 adam + * Added addtional info for error 114 - unsupported use attribute. + * + * Revision 1.88 1998/10/18 07:54:52 adam + * Additional info added for diagnostics 114 (Unsupported use attribute) and + * 121 (Unsupported attribute set). + * + * Revision 1.87 1998/09/28 11:19:12 adam + * Fix for Compiled ASN.1. + * + * Revision 1.86 1998/09/22 10:48:20 adam + * Minor changes in search API. + * + * Revision 1.85 1998/09/22 10:03:43 adam + * Changed result sets to be persistent in the sense that they can + * be re-searched if needed. + * Fixed memory leak in rsm_or. + * + * Revision 1.84 1998/09/18 12:41:00 adam * Fixed bug with numerical relations. * * Revision 1.83 1998/09/02 13:53:19 adam @@ -295,7 +337,7 @@ */ #include #include -#ifdef WINDOWS +#ifdef WIN32 #include #else #include @@ -316,7 +358,7 @@ struct rpn_char_map_info { static const char **rpn_char_map_handler (void *vp, const char **from, int len) { - struct rpn_char_map_info *p = vp; + struct rpn_char_map_info *p = (struct rpn_char_map_info *) vp; return zebra_maps_input (p->zm, p->reg_type, from, len); } @@ -419,8 +461,11 @@ static void term_untrans (ZebraHandle zh, int reg_type, while (*src) { const char *cp = zebra_maps_output (zh->zebra_maps, reg_type, &src); - while (*cp) - *dst++ = *cp++; + if (!cp) + *dst++ = *src++; + else + while (*cp) + *dst++ = *cp++; } *dst = '\0'; } @@ -435,8 +480,8 @@ 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 = xmalloc (sizeof(*new_isam_p_buf) * - p->isam_p_size); + new_isam_p_buf = (ISAM_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, @@ -446,8 +491,8 @@ static void add_isam_p (const char *name, const char *info, p->isam_p_buf = new_isam_p_buf; #ifdef TERM_COUNT - new_term_no = xmalloc (sizeof(*new_term_no) * - p->isam_p_size); + 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, @@ -469,7 +514,7 @@ static void add_isam_p (const char *name, const char *info, static int grep_handle (char *name, const char *info, void *p) { - add_isam_p (name, info, p); + add_isam_p (name, info, (struct grep_info *) p); return 0; } @@ -496,6 +541,7 @@ static int term_pre (ZebraMaps zebra_maps, int reg_type, const char **src, return *s0; } +/* 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) @@ -528,6 +574,7 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type, return i; } +/* term_101: handle term, where trunc=Process # */ static int term_101 (ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term) @@ -569,7 +616,7 @@ static int term_101 (ZebraMaps zebra_maps, int reg_type, return i; } - +/* term_103: handle term, where trunc=re-2 (regular expressions) */ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int *errors, int space_split, char *dst_term) @@ -618,6 +665,7 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, return i; } +/* term_103: handle term, where trunc=re-1 (regular expressions) */ static int term_102 (ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term) { @@ -625,6 +673,106 @@ static int term_102 (ZebraMaps zebra_maps, int reg_type, const char **src, dst_term); } + +/* term_104: handle term, where trunc=Process # and ! */ +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 **map; + int i = 0; + int j = 0; + + if (!term_pre (zebra_maps, reg_type, src, "#!", "#!")) + return 0; + s0 = *src; + while (*s0) + { + if (*s0 == '#') + { + dst[i++] = '.'; + dst[i++] = '*'; + dst_term[j++] = *s0++; + } + else if (*s0 == '!') + { + dst[i++] = '.'; + dst_term[j++] = *s0++; + } + { + s1 = s0; + map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); + if (space_split && **map == *CHR_SPACE) + break; + while (s1 < s0) + { + if (!isalnum (*s1)) + dst[i++] = '\\'; + dst_term[j++] = *s1; + dst[i++] = *s1++; + } + } + } + dst[i] = '\0'; + dst_term[j++] = '\0'; + *src = s0; + return i; +} + +/* term_105/106: handle term, where trunc=Process # and ! and right trunc */ +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 **map; + int i = 0; + int j = 0; + + if (!term_pre (zebra_maps, reg_type, src, "*!", "*!")) + return 0; + s0 = *src; + while (*s0) + { + if (*s0 == '*') + { + dst[i++] = '.'; + dst[i++] = '+'; + dst_term[j++] = *s0++; + } + else if (*s0 == '!') + { + dst[i++] = '.'; + dst_term[j++] = *s0++; + } + { + s1 = s0; + map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); + if (space_split && **map == *CHR_SPACE) + break; + while (s1 < s0) + { + if (!isalnum (*s1)) + dst[i++] = '\\'; + dst_term[j++] = *s1; + dst[i++] = *s1++; + } + } + } + if (right_truncate) + { + dst[i++] = '.'; + dst[i++] = '*'; + } + dst[i] = '\0'; + + dst_term[j++] = '\0'; + *src = s0; + return i; +} + + /* gen_regular_rel - generate regular expression from relation * val: border value (inclusive) * islt: 1 if <=; 0 if >=. @@ -722,11 +870,14 @@ static void gen_regular_rel (char *dst, int val, int islt) dst[dst_p] = '\0'; if (islt) { - for (i=1; ierrCode = 114; + zh->errString = nmem_strdup (stream, val_str); + } else + { + int oid[OID_SIZE]; + struct oident oident; + + oident.proto = PROTO_Z3950; + oident.oclass = CLASS_ATTSET; + oident.value = curAttributeSet; + oid_ent_to_oid (&oident, oid); + zh->errCode = 121; + zh->errString = nmem_strdup (stream, oident.desc); + } return -1; } if (zebraExplain_curDatabase (zh->zei, basenames[base_no])) @@ -984,7 +1152,10 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (!prefix_len) { - zh->errCode = 114; + char val_str[32]; + sprintf (val_str, "%d", use_value); + zh->errCode = 114; + zh->errString = nmem_strdup (stream, val_str); return -1; } term_dict[prefix_len++] = ')'; @@ -1074,6 +1245,39 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, logf (LOG_WARN, "dict_lookup_grep err, trunc=eregular: %d", r); break; + case 104: /* process # and ! in term */ + term_dict[j++] = '('; + if (!term_104 (zh->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst)) + return 0; + strcat (term_dict, ")"); + r = dict_lookup_grep (zh->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++] = '('; + if (!term_105 (zh->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst, 1)) + return 0; + strcat (term_dict, ")"); + r = dict_lookup_grep (zh->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++] = '('; + if (!term_105 (zh->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst, 0)) + return 0; + strcat (term_dict, ")"); + r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r); + break; } } *term_sub = termp; @@ -1229,31 +1433,38 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no) int term_index; const char *flags = NULL; - rsfd = xmalloc (sizeof(*rsfd)*rset_no); - more = xmalloc (sizeof(*more)*rset_no); - buf = xmalloc (sizeof(*buf)*rset_no); + 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 (length_prox_term) - prox_term[length_prox_term++] = ' '; - strcpy (prox_term + length_prox_term, term); - length_prox_term += lterm; + 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; } } + for (i = 0; inn = 0; result = rset_create (rset_kind_null, &parms); } @@ -1273,7 +1485,8 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no) rset_temp_parms parms; RSFD rsfd_result; - parms.rset_term = rset_term_create (prox_term, -1, flags); + parms.rset_term = rset_term_create (prox_term, length_prox_term, + flags); parms.rset_term->nn = min_nn; parms.key_size = sizeof (struct it_key); parms.temp_path = res_get (zh->res, "setTmpDir"); @@ -1334,19 +1547,66 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no) return result; } + +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->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 RSET rpn_search_APT_phrase (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz, + const char *termz_org, oid_value attributeSet, + NMEM stream, int reg_type, int complete_flag, const char *rank_type, int num_bases, char **basenames) { char term_dst[IT_MAX_WORD+1]; - const char *termp = termz; RSET rset[60], result; int i, r, rset_no = 0; struct grep_info grep_info; + char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); + const char *termp = termz; #ifdef TERM_COUNT grep_info.term_no = 0; @@ -1360,7 +1620,7 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, { logf (LOG_DEBUG, "APT_phrase termp=%s", termp); grep_info.isam_p_indx = 0; - r = string_term (zh, zapt, &termp, attributeSet, &grep_info, + r = string_term (zh, zapt, &termp, attributeSet, stream, &grep_info, reg_type, complete_flag, num_bases, basenames, term_dst); if (r < 1) @@ -1370,7 +1630,7 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, grep_info.isam_p_indx, term_dst, strlen(term_dst), rank_type); assert (rset[rset_no]); - if (++rset_no >= sizeof(rset)/sizeof(*rset)) + if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } #ifdef TERM_COUNT @@ -1394,18 +1654,19 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, static RSET rpn_search_APT_or_list (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz, + const char *termz_org, oid_value attributeSet, + NMEM stream, int reg_type, int complete_flag, const char *rank_type, int num_bases, char **basenames) { char term_dst[IT_MAX_WORD+1]; - const char *termp = termz; RSET rset[60], result; int i, r, rset_no = 0; struct grep_info grep_info; - + char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); + const char *termp = termz; #ifdef TERM_COUNT grep_info.term_no = 0; #endif @@ -1418,7 +1679,7 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh, { logf (LOG_DEBUG, "APT_or_list termp=%s", termp); grep_info.isam_p_indx = 0; - r = string_term (zh, zapt, &termp, attributeSet, &grep_info, + r = string_term (zh, zapt, &termp, attributeSet, stream, &grep_info, reg_type, complete_flag, num_bases, basenames, term_dst); if (r < 1) @@ -1428,7 +1689,7 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh, grep_info.isam_p_indx, term_dst, strlen(term_dst), rank_type); assert (rset[rset_no]); - if (++rset_no >= sizeof(rset)/sizeof(*rset)) + if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } #ifdef TERM_COUNT @@ -1458,17 +1719,19 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh, static RSET rpn_search_APT_and_list (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz, + const char *termz_org, oid_value attributeSet, + NMEM stream, int reg_type, int complete_flag, const char *rank_type, int num_bases, char **basenames) { char term_dst[IT_MAX_WORD+1]; - const char *termp = termz; RSET rset[60], result; int i, r, rset_no = 0; struct grep_info grep_info; + char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); + const char *termp = termz; #ifdef TERM_COUNT grep_info.term_no = 0; @@ -1482,7 +1745,7 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh, { logf (LOG_DEBUG, "APT_and_list termp=%s", termp); grep_info.isam_p_indx = 0; - r = string_term (zh, zapt, &termp, attributeSet, &grep_info, + r = string_term (zh, zapt, &termp, attributeSet, stream, &grep_info, reg_type, complete_flag, num_bases, basenames, term_dst); if (r < 1) @@ -1492,7 +1755,7 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh, grep_info.isam_p_indx, term_dst, strlen(term_dst), rank_type); assert (rset[rset_no]); - if (++rset_no >= sizeof(rset)/sizeof(*rset)) + if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } #ifdef TERM_COUNT @@ -1669,6 +1932,7 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, Z_AttributesPlusTerm *zapt, const char *termz, oid_value attributeSet, + NMEM stream, int reg_type, int complete_flag, const char *rank_type, int num_bases, char **basenames) @@ -1701,7 +1965,7 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, grep_info.isam_p_indx, term_dst, strlen(term_dst), rank_type); assert (rset[rset_no]); - if (++rset_no >= sizeof(rset)/sizeof(*rset)) + if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } #ifdef TERM_COUNT @@ -1732,6 +1996,7 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, static RSET rpn_search_APT_local (ZebraHandle zh, Z_AttributesPlusTerm *zapt, const char *termz, oid_value attributeSet, + NMEM stream, const char *rank_type) { RSET result; @@ -1755,7 +2020,7 @@ static RSET rpn_search_APT_local (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - oid_value attributeSet, ODR stream, + oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, const char *rank_type) { @@ -1780,15 +2045,17 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!sort_sequence->specs) { sort_sequence->num_specs = 10; - sort_sequence->specs = odr_malloc (stream, sort_sequence->num_specs * - sizeof(*sort_sequence->specs)); + sort_sequence->specs = (Z_SortKeySpec **) + nmem_malloc (stream, sort_sequence->num_specs * + sizeof(*sort_sequence->specs)); for (i = 0; inum_specs; i++) sort_sequence->specs[i] = 0; } if (zapt->term->which != Z_Term_general) i = 0; else - i = atoi_n (zapt->term->u.general->buf, zapt->term->u.general->len); + i = atoi_n ((char *) zapt->term->u.general->buf, + zapt->term->u.general->len); if (i >= sort_sequence->num_specs) i = 0; @@ -1798,29 +2065,35 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!oid_ent_to_oid (&oe, oid)) return 0; - sks = odr_malloc (stream, sizeof(*sks)); - sks->sortElement = odr_malloc (stream, sizeof(*sks->sortElement)); + sks = (Z_SortKeySpec *) nmem_malloc (stream, sizeof(*sks)); + sks->sortElement = (Z_SortElement *) + nmem_malloc (stream, sizeof(*sks->sortElement)); sks->sortElement->which = Z_SortElement_generic; - sk = sks->sortElement->u.generic = odr_malloc (stream, sizeof(*sk)); + sk = sks->sortElement->u.generic = (Z_SortKey *) + nmem_malloc (stream, sizeof(*sk)); sk->which = Z_SortKey_sortAttributes; - sk->u.sortAttributes = odr_malloc (stream, sizeof(*sk->u.sortAttributes)); + sk->u.sortAttributes = (Z_SortAttributes *) + nmem_malloc (stream, sizeof(*sk->u.sortAttributes)); sk->u.sortAttributes->id = oid; - sk->u.sortAttributes->list = - odr_malloc (stream, sizeof(*sk->u.sortAttributes->list)); + 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 = - odr_malloc (stream, sizeof(*sk->u.sortAttributes->list->attributes)); - ae = *sk->u.sortAttributes->list->attributes = - odr_malloc (stream, sizeof(**sk->u.sortAttributes->list->attributes)); + 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 = odr_malloc (stream, sizeof(*ae->attributeType)); + ae->attributeType = (int *) + nmem_malloc (stream, sizeof(*ae->attributeType)); *ae->attributeType = 1; ae->which = Z_AttributeValue_numeric; - ae->value.numeric = odr_malloc (stream, sizeof(*ae->value.numeric)); + ae->value.numeric = (int *) + nmem_malloc (stream, sizeof(*ae->value.numeric)); *ae->value.numeric = use_value; - sks->sortRelation = odr_malloc (stream, sizeof(*sks->sortRelation)); + sks->sortRelation = (int *) + nmem_malloc (stream, sizeof(*sks->sortRelation)); if (sort_relation_value == 1) *sks->sortRelation = Z_SortRelation_ascending; else if (sort_relation_value == 2) @@ -1828,10 +2101,16 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, else *sks->sortRelation = Z_SortRelation_ascending; - sks->caseSensitivity = odr_malloc (stream, sizeof(*sks->caseSensitivity)); + sks->caseSensitivity = (int *) + nmem_malloc (stream, sizeof(*sks->caseSensitivity)); *sks->caseSensitivity = 0; +#ifdef ASN_COMPILED + sks->which = Z_SortKeySpec_null; + sks->u.null = odr_nullval (); +#else sks->missingValueAction = 0; +#endif sort_sequence->specs[i] = sks; @@ -1841,7 +2120,7 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - oid_value attributeSet, ODR stream, + oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames) { @@ -1873,30 +2152,30 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!strcmp (search_type, "phrase")) { - return rpn_search_APT_phrase (zh, zapt, termz, attributeSet, + return rpn_search_APT_phrase (zh, zapt, termz, attributeSet, stream, reg_id, complete_flag, rank_type, num_bases, basenames); } else if (!strcmp (search_type, "and-list")) { - return rpn_search_APT_and_list (zh, zapt, termz, attributeSet, + return rpn_search_APT_and_list (zh, zapt, termz, attributeSet, stream, reg_id, complete_flag, rank_type, num_bases, basenames); } else if (!strcmp (search_type, "or-list")) { - return rpn_search_APT_or_list (zh, zapt, termz, attributeSet, + return rpn_search_APT_or_list (zh, zapt, termz, attributeSet, stream, reg_id, complete_flag, rank_type, num_bases, basenames); } else if (!strcmp (search_type, "local")) { - return rpn_search_APT_local (zh, zapt, termz, attributeSet, + return rpn_search_APT_local (zh, zapt, termz, attributeSet, stream, rank_type); } else if (!strcmp (search_type, "numeric")) { - return rpn_search_APT_numeric (zh, zapt, termz, attributeSet, + return rpn_search_APT_numeric (zh, zapt, termz, attributeSet, stream, reg_id, complete_flag, rank_type, num_bases, basenames); } @@ -1905,7 +2184,7 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, - oid_value attributeSet, ODR stream, + oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames) { @@ -1962,7 +2241,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, #ifdef ASN_COMPILED if (*zop->u.prox->u.known != Z_ProxUnit_word) { - char *val = odr_malloc (stream, 16); + char *val = (char *) nmem_malloc (stream, 16); zh->errCode = 132; zh->errString = val; sprintf (val, "%d", *zop->u.prox->u.known); @@ -1971,7 +2250,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, #else if (*zop->u.prox->proximityUnitCode != Z_ProxUnit_word) { - char *val = odr_malloc (stream, 16); + char *val = (char *) nmem_malloc (stream, 16); zh->errCode = 132; zh->errString = val; sprintf (val, "%d", *zop->u.prox->proximityUnitCode); @@ -2020,9 +2299,11 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, return r; } -void rpn_search (ZebraHandle zh, ODR stream, ODR decode, + +RSET rpn_search (ZebraHandle zh, NMEM nmem, Z_RPNQuery *rpn, int num_bases, char **basenames, - const char *setname) + const char *setname, + ZebraSet sset) { RSET rset; oident *attrset; @@ -2030,37 +2311,45 @@ void rpn_search (ZebraHandle zh, ODR stream, ODR decode, Z_SortKeySpecList *sort_sequence; int sort_status, i; - zlog_rpn (rpn); - zh->errCode = 0; zh->errString = NULL; zh->hits = 0; - sort_sequence = odr_malloc (stream, sizeof(*sort_sequence)); + sort_sequence = (Z_SortKeySpecList *) + nmem_malloc (nmem, sizeof(*sort_sequence)); sort_sequence->num_specs = 10; - sort_sequence->specs = odr_malloc (stream, sort_sequence->num_specs * - sizeof(*sort_sequence->specs)); + sort_sequence->specs = (Z_SortKeySpec **) + nmem_malloc (nmem, sort_sequence->num_specs * + sizeof(*sort_sequence->specs)); for (i = 0; inum_specs; i++) sort_sequence->specs[i] = 0; attrset = oid_getentbyoid (rpn->attributeSetId); attributeSet = attrset->value; - rset = rpn_search_structure (zh, rpn->RPNStructure, attributeSet, stream, - sort_sequence, - num_bases, basenames); + rset = rpn_search_structure (zh, rpn->RPNStructure, attributeSet, + nmem, sort_sequence, num_bases, basenames); if (!rset) - return; + return 0; - resultSetAdd (zh, setname, 1, rset, &zh->hits); if (zh->errCode) logf (LOG_DEBUG, "search error: %d", zh->errCode); - + for (i = 0; sort_sequence->specs[i]; i++) ; sort_sequence->num_specs = i; - if (i) - resultSetSort (zh, stream, 1, &setname, setname, sort_sequence, - &sort_status); + if (!i) + resultSetRank (zh, sset, rset); + else + { + logf (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); + } + } + return rset; } struct scan_info_entry { @@ -2078,31 +2367,30 @@ struct scan_info { static int scan_handle (char *name, const char *info, int pos, void *client) { int len_prefix, idx; - struct scan_info *scan_info = client; + struct scan_info *scan_info = (struct scan_info *) 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; - scan_info->list[idx].term = odr_malloc (scan_info->odr, - strlen(name + len_prefix)+1); + 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); assert (*info == sizeof(ISAM_P)); memcpy (&scan_info->list[idx].isam_p, info+1, sizeof(ISAM_P)); return 0; } -static void scan_term_untrans (ZebraHandle zh, ODR stream, int reg_type, +static void scan_term_untrans (ZebraHandle zh, NMEM stream, int reg_type, char **dst, const char *src) { char term_dst[1024]; term_untrans (zh, reg_type, term_dst, src); - *dst = odr_malloc (stream, strlen(term_dst)+1); + *dst = (char *) nmem_malloc (stream, strlen(term_dst)+1); strcpy (*dst, term_dst); } @@ -2156,11 +2444,11 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, char *rank_type = NULL; int complete_flag; int sort_flag; + *list = 0; if (attributeset == VAL_NONE) attributeset = VAL_BIB1; - zlog_scan (zapt, attributeset); logf (LOG_DEBUG, "position = %d, num = %d", pos, num); attr_init (&use, zapt, 1); @@ -2189,6 +2477,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, zh->errCode = 114; else zh->errCode = 121; + *num_entries = 0; + return; } if (zebraExplain_curDatabase (zh->zei, basenames[base_no])) { @@ -2215,7 +2505,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, /* prepare dictionary scanning */ before = pos-1; after = 1+num-pos; - scan_info_array = odr_malloc (stream, ord_no * sizeof(*scan_info_array)); + scan_info_array = (struct scan_info *) + odr_malloc (stream, ord_no * sizeof(*scan_info_array)); for (i = 0; i < ord_no; i++) { int j, prefix_len = 0; @@ -2229,8 +2520,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, scan_info->after = after; scan_info->odr = stream; - scan_info->list = odr_malloc (stream, (before+after)* - sizeof(*scan_info->list)); + scan_info->list = (struct scan_info_entry *) + odr_malloc (stream, (before+after) * sizeof(*scan_info->list)); for (j = 0; jlist[j].term = NULL; @@ -2244,7 +2535,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, dict_scan (zh->dict, termz, &before_tmp, &after_tmp, scan_info, scan_handle); } - glist = odr_malloc (stream, (before+after)*sizeof(*glist)); + glist = (ZebraScanEntry *) + odr_malloc (stream, (before+after)*sizeof(*glist)); /* consider terms after main term */ for (i = 0; i < ord_no; i++) @@ -2270,7 +2562,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, } if (j0 == -1) break; - scan_term_untrans (zh, stream, reg_id, + 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), @@ -2334,7 +2626,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, if (j0 == -1) break; - scan_term_untrans (zh, stream, reg_id, + scan_term_untrans (zh, stream->mem, reg_id, &glist[before-1-i].term, mterm); rset = rset_trunc