X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=fdb31e9eb8a6c45813ebd893042b6f4eb1f9a04f;hb=6e044d5a523bb4363d07af757ebf1bcfe0ad6c04;hp=c5da5167c0a3af34293c08da80fdd37267901922;hpb=6cb93fe44be70d87286dc68385efdf9563e1849f;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index c5da516..fdb31e9 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,10 +1,41 @@ /* - * Copyright (C) 1995-1998, Index Data I/S + * Copyright (C) 1995-1999, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.82 1998-06-26 11:16:40 quinn + * 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 + * Extra parameter decode added to search routines to implement + * persistent queries. + * + * Revision 1.82 1998/06/26 11:16:40 quinn * Added support (un-optimised) for left and left/right truncation * * Revision 1.81 1998/06/24 12:16:14 adam @@ -288,7 +319,7 @@ */ #include #include -#ifdef WINDOWS +#ifdef WIN32 #include #else #include @@ -647,7 +678,7 @@ static void gen_regular_rel (char *dst, int val, int islt) } else { - strcpy (dst, "((-"); + strcpy (dst, "(-("); islt = 0; } val = -val; @@ -902,7 +933,8 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, const char **term_sub, - oid_value attributeSet, struct grep_info *grep_info, + oid_value attributeSet, NMEM stream, + struct grep_info *grep_info, int reg_type, int complete_flag, int num_bases, char **basenames, char *term_dst) @@ -941,9 +973,25 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, logf (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->errCode = 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])) @@ -977,7 +1025,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++] = ')'; @@ -1331,6 +1382,7 @@ static RSET rpn_search_APT_phrase (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) @@ -1353,7 +1405,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) @@ -1389,6 +1441,7 @@ static RSET rpn_search_APT_or_list (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) @@ -1411,7 +1464,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) @@ -1453,6 +1506,7 @@ static RSET rpn_search_APT_and_list (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) @@ -1475,7 +1529,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) @@ -1662,6 +1716,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) @@ -1725,6 +1780,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; @@ -1748,7 +1804,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) { @@ -1773,8 +1829,8 @@ 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 = nmem_malloc (stream, sort_sequence->num_specs * + sizeof(*sort_sequence->specs)); for (i = 0; inum_specs; i++) sort_sequence->specs[i] = 0; } @@ -1791,29 +1847,29 @@ 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 = nmem_malloc (stream, sizeof(*sks)); + sks->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 = nmem_malloc (stream, sizeof(*sk)); sk->which = Z_SortKey_sortAttributes; - sk->u.sortAttributes = odr_malloc (stream, sizeof(*sk->u.sortAttributes)); + sk->u.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)); + 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)); + nmem_malloc (stream, sizeof(*sk->u.sortAttributes->list->attributes)); ae = *sk->u.sortAttributes->list->attributes = - odr_malloc (stream, sizeof(**sk->u.sortAttributes->list->attributes)); + nmem_malloc (stream, sizeof(**sk->u.sortAttributes->list->attributes)); ae->attributeSet = 0; - ae->attributeType = odr_malloc (stream, sizeof(*ae->attributeType)); + ae->attributeType = 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 = nmem_malloc (stream, sizeof(*ae->value.numeric)); *ae->value.numeric = use_value; - sks->sortRelation = odr_malloc (stream, sizeof(*sks->sortRelation)); + sks->sortRelation = nmem_malloc (stream, sizeof(*sks->sortRelation)); if (sort_relation_value == 1) *sks->sortRelation = Z_SortRelation_ascending; else if (sort_relation_value == 2) @@ -1821,10 +1877,15 @@ 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 = 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; @@ -1834,7 +1895,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) { @@ -1866,30 +1927,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); } @@ -1898,7 +1959,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) { @@ -1955,7 +2016,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 = nmem_malloc (stream, 16); zh->errCode = 132; zh->errString = val; sprintf (val, "%d", *zop->u.prox->u.known); @@ -1964,7 +2025,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 = nmem_malloc (stream, 16); zh->errCode = 132; zh->errString = val; sprintf (val, "%d", *zop->u.prox->proximityUnitCode); @@ -2013,9 +2074,11 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, return r; } -void rpn_search (ZebraHandle zh, ODR stream, + +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; @@ -2023,37 +2086,43 @@ void rpn_search (ZebraHandle zh, ODR stream, 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 = nmem_malloc (nmem, sizeof(*sort_sequence)); sort_sequence->num_specs = 10; - sort_sequence->specs = odr_malloc (stream, sort_sequence->num_specs * + sort_sequence->specs = 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 { @@ -2088,14 +2157,14 @@ static int scan_handle (char *name, const char *info, int pos, void *client) 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 = nmem_malloc (stream, strlen(term_dst)+1); strcpy (*dst, term_dst); } @@ -2153,7 +2222,6 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, 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); @@ -2263,7 +2331,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), @@ -2327,7 +2395,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