/*
- * 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
*/
#include <stdio.h>
#include <assert.h>
-#ifdef WINDOWS
+#ifdef WIN32
#include <io.h>
#else
#include <unistd.h>
}
else
{
- strcpy (dst, "((-");
+ strcpy (dst, "(-(");
islt = 0;
}
val = -val;
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)
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]))
}
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++] = ')';
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)
{
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)
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)
{
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)
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)
{
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)
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)
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;
}
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)
{
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; i<sort_sequence->num_specs; i++)
sort_sequence->specs[i] = 0;
}
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)
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;
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)
{
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);
}
}
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)
{
#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);
#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);
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;
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; i<sort_sequence->num_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 {
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);
}
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);
}
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),
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